perf(container): образ без apt-зависимостей и встроенный healthcheck

- рантайм не тянет ca-certificates/tzdata/curl: bundle сертификатов копируется
  из официального alpine-образа, healthcheck выполняет сам бинарник
- cmd/glchat: подкоманда healthcheck (HTTP-запрос к /healthz с таймаутом)
- compose: APP_VERSION передаётся в environment (версия видна в meta без пересборки)
- бюджет §9.1: базовый слой debian-slim + 9.2 MB бинарник + 356 KB клиент
This commit is contained in:
2026-09-19 19:37:06 +03:00
parent b13f9a7479
commit 35cf719d58
3 changed files with 52 additions and 6 deletions
+8 -5
View File
@@ -31,10 +31,12 @@ RUN CGO_ENABLED=1 go build \
# ---------- runtime ----------
FROM debian:bookworm-slim AS runtime
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates tzdata curl \
&& rm -rf /var/lib/apt/lists/* \
&& groupadd --system --gid 10001 glchat \
# Корневой набор сертификатов берём из официального образа: полный пакет
# 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
@@ -52,7 +54,8 @@ ENV DATA_DIR=/app/data \
EXPOSE 8080
# healthcheck выполняется самим бинарём: curl в образе не нужен.
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
CMD curl -fsS http://127.0.0.1:8080/healthz || exit 1
CMD ["/usr/local/bin/glchat", "healthcheck"]
ENTRYPOINT ["/usr/local/bin/glchat"]