# 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_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"]