Два образи замість пʼяти: серверні команди їдуть з одного модуля й мусять ходити в схему БД однією версією, а зонд лишається окремо — у чужій мережі йому не місце з DSN і ключами шифрування. Стек піднімає БД, кеш, міграції, API, колектор і Caddy з автоматичним TLS. Міграції окремою службою, бо API піднімається в кількох примірниках і гонка за схему нікому не потрібна. deploy/README.md описує бекап як три речі: дамп, DEK і JWT-ключ. Без DEK дамп не відновлюється — у БД лише шифротекст. Дорогою виправлено .gitignore: голі "netpulse-agent" і "netpulse-server" ігнорували ще й каталоги cmd/ з кодом команд. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
71 lines
2.9 KiB
Text
71 lines
2.9 KiB
Text
# syntax=docker/dockerfile:1.7
|
||
#
|
||
# Образ серверної частини NetPulse: HTTP API з вшитим інтерфейсом,
|
||
# gRPC-колектор і допоміжні команди.
|
||
#
|
||
# Один образ на чотири бінарники, а не чотири образи: вони збираються з
|
||
# одного модуля, ділять половину коду й завжди їдуть однією версією.
|
||
# Розкласти їх по різних образах означало б чотири рази качати ту саму
|
||
# базу й отримати можливість розʼїхатись версіями там, де це найдорожче
|
||
# коштує — між API та колектором, що ходять в одну схему БД.
|
||
#
|
||
# Контекст збірки — корінь репозиторію: модулі server і agent посилаються
|
||
# на ../gen/go через replace, і вужчий контекст їх не збере.
|
||
|
||
# --- інтерфейс -------------------------------------------------------
|
||
FROM node:22-alpine AS web
|
||
WORKDIR /src/web
|
||
|
||
# Спершу маніфести, потім код: правка компонента не має інвалідувати
|
||
# шар із npm ci, а він найдовший у цій стадії.
|
||
COPY web/package.json web/package-lock.json ./
|
||
RUN npm ci
|
||
|
||
COPY web/ ./
|
||
RUN npm run build
|
||
|
||
# --- бінарники -------------------------------------------------------
|
||
FROM golang:1.25-alpine AS build
|
||
WORKDIR /src
|
||
|
||
RUN apk add --no-cache git
|
||
|
||
COPY gen/go/go.mod gen/go/go.sum gen/go/
|
||
COPY server/go.mod server/go.sum server/
|
||
WORKDIR /src/server
|
||
RUN --mount=type=cache,target=/go/pkg/mod go mod download
|
||
|
||
WORKDIR /src
|
||
COPY gen/ gen/
|
||
COPY server/ server/
|
||
|
||
# Інтерфейс лягає в дерево ДО збірки: httpapi віддає його через
|
||
# //go:embed, а embed читає файли на етапі компіляції.
|
||
COPY --from=web /src/web/dist/ server/webui/dist/
|
||
|
||
ARG VERSION=dev
|
||
ARG COMMIT=none
|
||
|
||
WORKDIR /src/server
|
||
RUN --mount=type=cache,target=/go/pkg/mod \
|
||
--mount=type=cache,target=/root/.cache/go-build \
|
||
CGO_ENABLED=0 go build -trimpath \
|
||
-ldflags "-s -w -X main.version=${VERSION} -X main.commit=${COMMIT}" \
|
||
-o /out/ ./cmd/...
|
||
|
||
# --- образ -----------------------------------------------------------
|
||
FROM alpine:3.20
|
||
|
||
# ca-certificates — для вебхуків і SMTP через TLS; tzdata — бо розклади
|
||
# бекапів і тиша сповіщень задаються в часовому поясі тенанта. wget не
|
||
# ставимо: healthcheck обходиться тим, що вже є в busybox.
|
||
RUN apk add --no-cache ca-certificates tzdata \
|
||
&& adduser -D -u 10001 netpulse
|
||
|
||
COPY --from=build /out/ /usr/local/bin/
|
||
|
||
USER netpulse
|
||
WORKDIR /home/netpulse
|
||
|
||
EXPOSE 8080 9443
|
||
ENTRYPOINT ["netpulse-api"]
|