Netpulse_SasS/deploy/Dockerfile.server
byrsapty a0eb2ff5f1
Some checks are pending
CI / web (push) Waiting to run
CI / server (push) Waiting to run
CI / agent (push) Waiting to run
Пакування: образи, повний стек, TLS, CI, процедура бекапу
Два образи замість пʼяти: серверні команди їдуть з одного модуля й
мусять ходити в схему БД однією версією, а зонд лишається окремо —
у чужій мережі йому не місце з 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>
2026-08-25 12:47:54 +03:00

71 lines
2.9 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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