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