# syntax=docker/dockerfile:1

# Base images are overridable so builds behind a Docker Hub rate limit can point
# at a mirror, e.g. --build-arg GO_IMAGE=mirror.gcr.io/library/golang:1.25-alpine
ARG GO_IMAGE=golang:1.25-alpine
ARG RUNTIME_IMAGE=alpine:3.20

# ---- build stage ----------------------------------------------------------
# Pure-Go (CGO disabled) so it cross-compiles cleanly to linux/amd64 and
# linux/arm64 without a C toolchain — modernc.org/sqlite needs no CGO.
FROM --platform=$BUILDPLATFORM ${GO_IMAGE} AS build

WORKDIR /src

# Cache modules first.
COPY go.mod go.sum ./
RUN go mod download

COPY . .

# TARGETOS/TARGETARCH are provided by buildx for multi-arch builds.
ARG TARGETOS=linux
ARG TARGETARCH=amd64
ENV CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH

RUN go build -trimpath -ldflags="-s -w" -o /out/bbsd ./cmd/bbsd && \
    go build -trimpath -ldflags="-s -w" -o /out/numberduel ./cmd/numberduel

# ---- runtime stage --------------------------------------------------------
FROM ${RUNTIME_IMAGE}

# Non-root user; /data is the persistent volume (host key + SQLite DB + files).
RUN adduser -D -u 10001 bbs && mkdir -p /data && chown bbs:bbs /data

WORKDIR /app
COPY --from=build /out/bbsd      /app/bbsd
COPY --from=build /out/numberduel /app/bin/numberduel

USER bbs

ENV BBS_LISTEN=0.0.0.0:2323 \
    BBS_WEB_ADDR=0.0.0.0:8080 \
    BBS_DATA_DIR=/data \
    BBS_DOORS_DIR=/app/bin

EXPOSE 2323 8080
VOLUME ["/data"]

ENTRYPOINT ["/app/bbsd"]
