# Warp homeserver — single binary, no cgo.
#
#   docker build -t warp .
#   docker run -p 8008:8008 -v warp-data:/data \
#     -e WARP_SERVER_NAME=warp.example warp

FROM golang:1.26-alpine AS build

WORKDIR /src

# Dependencies first, so the module cache survives source changes.
COPY server/go.mod server/go.sum ./server/
RUN cd server && go mod download

COPY server ./server

ARG VERSION=0.0.0-dev
ARG COMMIT=unknown
ARG BUILD_DATE=unknown

ENV CGO_ENABLED=0
RUN cd server && go build -trimpath \
    -ldflags "-s -w \
      -X github.com/dariuszjaniak/warp/server/internal/buildinfo.Version=${VERSION} \
      -X github.com/dariuszjaniak/warp/server/internal/buildinfo.Commit=${COMMIT} \
      -X github.com/dariuszjaniak/warp/server/internal/buildinfo.BuildDate=${BUILD_DATE}" \
    -o /out/warp ./cmd/warp


FROM alpine:3.21

RUN apk add --no-cache ca-certificates tzdata curl && \
    adduser -D -u 10001 -h /data warp

COPY --from=build /out/warp /usr/local/bin/warp
COPY warp.yaml.example /etc/warp/warp.yaml.example

# Database file, signing key and media live here; mount a volume on it.
WORKDIR /data
RUN chown warp:warp /data
USER warp

ENV WARP_LISTEN_ADDRESS=":8008" \
    WARP_PRIVATE_KEY="/data/signing.key" \
    WARP_DB_DRIVER="sqlite" \
    WARP_DB_CONNECTION_STRING="file:/data/warp.db?_pragma=journal_mode(WAL)&_pragma=busy_timeout(10000)&_pragma=foreign_keys(1)" \
    WARP_MEDIA_BASE_PATH="/data/media" \
    WARP_LOG_FORMAT="json"

EXPOSE 8008

HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
    CMD curl -fsS http://127.0.0.1:8008/healthz || exit 1

ENTRYPOINT ["warp"]
CMD ["serve"]
