# Development only. Not for production use.

FROM golang:1.25-alpine AS builder

RUN apk add --no-cache git build-base sqlite-dev

ENV CGO_ENABLED=1
ENV GOCACHE=/go/cache
ENV GOMODCACHE=/go/mod

WORKDIR /src

COPY go.mod go.sum ./
RUN --mount=type=cache,target=/go/cache \
    --mount=type=cache,target=/go/mod \
    go mod download

COPY . .
RUN --mount=type=cache,target=/go/cache \
    --mount=type=cache,target=/go/mod \
    go build -tags libsqlite3 -o /out/knot ./cmd/knot

FROM alpine:3.20

RUN apk add --no-cache git openssh-server tini sqlite-libs su-exec ca-certificates shadow openssl bash

RUN groupadd -g 1000 -f git && \
    useradd -u 1000 -g 1000 -d /home/git -s /bin/sh -m git && \
    echo "git:$(openssl rand -hex 16)" | chpasswd

COPY --from=builder /out/knot /usr/local/bin/knot
RUN chmod 0755 /usr/local/bin/knot

COPY <<'EOF' /usr/local/bin/knot-keys-wrapper
#!/bin/sh
exec /usr/local/bin/knot keys -output authorized-keys \
    -internal-api "http://${KNOT_SERVER_INTERNAL_LISTEN_ADDR:-127.0.0.1:5444}" \
    -git-dir "${KNOT_REPO_SCAN_PATH:-/home/git/repositories}" \
    -log-path "/tmp/knotguard.log"
EOF
RUN chmod +x /usr/local/bin/knot-keys-wrapper

# sshd config
COPY <<'EOF' /etc/ssh/sshd_config.d/knot.conf
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no

Match User git
    AuthorizedKeysCommand /usr/local/bin/knot-keys-wrapper
    AuthorizedKeysCommandUser nobody
EOF

RUN echo 'Include /etc/ssh/sshd_config.d/*.conf' >> /etc/ssh/sshd_config

COPY <<'EOF' /etc/ssh/sshd_config.d/host-keys.conf
HostKey /etc/ssh/keys/ssh_host_rsa_key
HostKey /etc/ssh/keys/ssh_host_ecdsa_key
HostKey /etc/ssh/keys/ssh_host_ed25519_key
EOF

RUN mkdir -p /home/git/.config/git
COPY <<'EOF' /home/git/.config/git/config
[user]
    name = Tangled
    email = noreply@tangled.org
[receive]
    advertisePushOptions = true
[uploadpack]
    allowFilter = true
    allowReachableSHA1InWant = true
EOF
RUN mkdir -p /home/git/repositories && chown -R git:git /home/git

COPY <<'EOF' /usr/local/bin/knot-entrypoint.sh
#!/bin/sh
set -eu
[ -z "${KNOT_SERVER_OWNER:-}" ] && [ -r /shared/owner-did ] && \
    export KNOT_SERVER_OWNER="$(cat /shared/owner-did)"
: "${KNOT_SERVER_OWNER:?set via env or /shared/owner-did}"

mkdir -p /etc/ssh/keys
[ -f /etc/ssh/keys/ssh_host_rsa_key ]     || ssh-keygen -t rsa     -f /etc/ssh/keys/ssh_host_rsa_key     -q -N ""
[ -f /etc/ssh/keys/ssh_host_ecdsa_key ]   || ssh-keygen -t ecdsa   -f /etc/ssh/keys/ssh_host_ecdsa_key   -q -N ""
[ -f /etc/ssh/keys/ssh_host_ed25519_key ] || ssh-keygen -t ed25519 -f /etc/ssh/keys/ssh_host_ed25519_key -q -N ""

if [ -f /usr/local/share/ca-certificates/caddy.crt ]; then
    update-ca-certificates
fi

/usr/sbin/sshd -D -e &
exec su-exec git /usr/local/bin/knot server
EOF
RUN chmod +x /usr/local/bin/knot-entrypoint.sh

VOLUME /home/git
EXPOSE 22 5555

WORKDIR /home/git

ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/local/bin/knot-entrypoint.sh"]
