Betrieb: Dockge-Stack, Images, Prüfung

compose.yaml aus docs/11-betrieb.md, ergänzt um Healthchecks für db-backup und
offsite-backup. Das Dokument verlangt für jeden Dienst einen, die abgedruckte
Fassung hatte für die beiden keinen, und ohne ihn zeigt Dockge nur "läuft",
auch wenn seit Wochen nichts mehr gesichert wird.

Die Migration läuft im Startkommando von web, nicht in einem Init-Container.
Die Prisma-CLI samt Schema-Engine liegt dafür unter /app/migrator im Image:
ein Container, der nur startet, wenn gerade eine Registry erreichbar ist, wäre
auf einem Homeserver die falsche Bauart.

Alle drei Images gebaut und laufen gegen eine echte Postgres-Instanz geprüft:
web wendet Migrationen an und liefert /api/health aus, worker schreibt sein
Lebenszeichen, pdf rendert ein echtes PDF.

Die CI prüft Lint, Typen, Tests und E2E gegen den Standalone-Server, also so,
wie der Container startet, und hält das Bündel-Budget aus
docs/09-performance-und-ux.md ein.

Phase 0 aus TASKS.md ist damit abgehakt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Harlekin
2026-09-01 00:02:00 +02:00
co-authored by Claude Opus 5
parent 6f6cd34973
commit dfc47f91c4
9 changed files with 766 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
# Image für den Dienst `worker`. Hängt am Discord-Gateway und hält die
# Guild-Mitgliedschaft in Postgres aktuell, siehe docs/02-architektur.md.
ARG NODE_VERSION=22-alpine
ARG PNPM_VERSION=9.15.4
FROM node:${NODE_VERSION} AS deps
ARG PNPM_VERSION
RUN npm install -g pnpm@${PNPM_VERSION}
WORKDIR /repo
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml .npmrc ./
COPY packages/db/package.json packages/db/
COPY web/package.json web/
COPY worker/package.json worker/
COPY pdf/package.json pdf/
RUN pnpm install --frozen-lockfile --filter @afis/worker... --filter @afis/db...
FROM node:${NODE_VERSION} AS build
ARG PNPM_VERSION
RUN npm install -g pnpm@${PNPM_VERSION}
WORKDIR /repo
COPY --from=deps /repo/node_modules ./node_modules
COPY --from=deps /repo/packages/db/node_modules ./packages/db/node_modules
COPY --from=deps /repo/worker/node_modules ./worker/node_modules
COPY . .
RUN pnpm --filter @afis/db build && pnpm --filter @afis/worker build && \
pnpm --filter @afis/worker --prod --no-optional deploy /bundle && \
cp -r worker/dist /bundle/dist && \
cp worker/healthcheck.js /bundle/healthcheck.js
FROM node:${NODE_VERSION} AS runtime
WORKDIR /app
ENV NODE_ENV=production
RUN apk add --no-cache openssl && \
addgroup -g 1001 -S afis && \
adduser -u 1001 -S afis -G afis
COPY --from=build --chown=afis:afis /bundle ./
USER afis
HEALTHCHECK --interval=60s --timeout=10s --start-period=30s --retries=3 \
CMD node healthcheck.js || exit 1
CMD ["node", "dist/index.js"]