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:
co-authored by
Claude Opus 5
parent
6f6cd34973
commit
dfc47f91c4
@@ -0,0 +1,81 @@
|
||||
# Image für den Dienst `web`. Standalone-Build, siehe web/next.config.ts.
|
||||
#
|
||||
# Die Migration läuft im Startkommando des Containers, nicht hier und nicht in
|
||||
# einem Init-Container: Dockge zeigt beendete Container nicht dauerhaft an.
|
||||
# Begründung in docs/11-betrieb.md.
|
||||
#
|
||||
# Dafür liegt eine eigenständige Prisma-CLI unter /app/migrator im Image. Sie
|
||||
# beim Start aus dem Netz zu ziehen wäre der falsche Weg: der Container startet
|
||||
# dann nur, wenn die Registry gerade erreichbar ist.
|
||||
|
||||
ARG NODE_VERSION=22-alpine
|
||||
ARG PNPM_VERSION=9.15.4
|
||||
ARG PRISMA_VERSION=7.10.0
|
||||
|
||||
# --- Abhängigkeiten -----------------------------------------------------------
|
||||
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/web... --filter @afis/db...
|
||||
|
||||
# --- Bauen --------------------------------------------------------------------
|
||||
FROM node:${NODE_VERSION} AS build
|
||||
ARG PRISMA_VERSION
|
||||
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/web/node_modules ./web/node_modules
|
||||
COPY . .
|
||||
|
||||
# Prisma-Client erzeugen und @afis/db nach dist übersetzen.
|
||||
RUN pnpm --filter @afis/db build
|
||||
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
RUN pnpm --filter @afis/web build
|
||||
|
||||
# Eigenständige Migrations-CLI mit heruntergeladener Schema-Engine.
|
||||
RUN mkdir -p /migrator && cd /migrator && \
|
||||
npm install --no-package-lock --no-audit --no-fund "prisma@${PRISMA_VERSION}" && \
|
||||
cp -r /repo/packages/db/prisma /migrator/prisma && \
|
||||
cp /repo/packages/db/prisma.config.ts /migrator/prisma.config.ts
|
||||
|
||||
# --- Laufzeit -----------------------------------------------------------------
|
||||
FROM node:${NODE_VERSION} AS runtime
|
||||
WORKDIR /app
|
||||
|
||||
ENV NODE_ENV=production \
|
||||
NEXT_TELEMETRY_DISABLED=1 \
|
||||
PORT=3000 \
|
||||
HOSTNAME=0.0.0.0
|
||||
|
||||
RUN apk add --no-cache wget openssl && \
|
||||
addgroup -g 1001 -S afis && \
|
||||
adduser -u 1001 -S afis -G afis
|
||||
|
||||
# Standalone-Ausgabe: server.js plus die tatsächlich benutzten node_modules.
|
||||
COPY --from=build --chown=afis:afis /repo/web/.next/standalone/ ./
|
||||
COPY --from=build --chown=afis:afis /repo/web/.next/static ./web/.next/static
|
||||
COPY --from=build --chown=afis:afis /repo/web/public ./web/public
|
||||
|
||||
# Migrations-CLI samt Schema, Migrationsordner und Engine.
|
||||
COPY --from=build --chown=afis:afis /migrator ./migrator
|
||||
|
||||
USER afis
|
||||
EXPOSE 3000
|
||||
|
||||
HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \
|
||||
CMD wget -qO- http://localhost:3000/api/health || exit 1
|
||||
|
||||
# Das Startkommando setzt der Stack (Migration + Server), siehe compose.yaml.
|
||||
CMD ["node", "web/server.js"]
|
||||
Reference in New Issue
Block a user