# syntax=docker/dockerfile:1 # ---------- web ---------- FROM node:24-bookworm-slim AS web WORKDIR /src/web COPY web/package.json web/package-lock.json ./ RUN npm ci --no-audit --no-fund COPY web/ ./ RUN npm run build # ---------- go ---------- FROM golang:1.27-bookworm AS gobuild WORKDIR /src ARG VERSION=dev ARG COMMIT=none ARG BUILD_DATE=unknown # Сети без доступа к storage.googleapis.com не могут использовать proxy.golang.org. ARG GOPROXY=https://proxy.golang.org,direct ARG GOSUMDB=sum.golang.org ENV GOPROXY=${GOPROXY} GOSUMDB=${GOSUMDB} GOTOOLCHAIN=local COPY go.mod go.sum ./ RUN go mod download COPY cmd/ ./cmd/ COPY internal/ ./internal/ RUN CGO_ENABLED=1 go build \ -tags "sqlite_omit_load_extension" \ -trimpath \ -ldflags "-s -w -X main.version=${VERSION} -X main.commit=${COMMIT} -X main.buildDate=${BUILD_DATE}" \ -o /out/glchat ./cmd/glchat # ---------- runtime ---------- FROM debian:bookworm-slim AS runtime # Корневой набор сертификатов берём из официального образа: полный пакет # ca-certificates с хэш-ссылками занимает десятки мегабайт, а нужен только # сам bundle. Рантайм не тянет apt-пакеты — образ укладывается в бюджет §9.1. COPY --from=alpine:3.22 /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt RUN groupadd --system --gid 10001 glchat \ && useradd --system --uid 10001 --gid glchat --home-dir /app --shell /usr/sbin/nologin glchat \ && mkdir -p /app/data/db /app/data/files /app/data/backups /app/web \ && chown -R glchat:glchat /app COPY --from=gobuild /out/glchat /usr/local/bin/glchat COPY --from=web /src/web/dist /app/web WORKDIR /app USER 10001:10001 ENV DATA_DIR=/app/data \ LISTEN_ADDR=0.0.0.0:8080 \ LOG_FORMAT=json \ LOG_LEVEL=info EXPOSE 8080 # healthcheck выполняется самим бинарём: curl в образе не нужен. HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ CMD ["/usr/local/bin/glchat", "healthcheck"] ENTRYPOINT ["/usr/local/bin/glchat"]