Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
Auf einer frischen Datenbank lief nur `migrate deploy`. Die Tabellen standen damit, aber leer: keine Freigabestufen, keine Status-Etiketten, keine Fallarten, keine Nummernkreise. Die Anwendung startet so zwar, aber es laesst sich keine Akte anlegen - es gibt keine Vorlage. Der Seed besteht ausschliesslich aus upserts und darf deshalb bei jedem Start mitlaufen. Dafuer liegen jetzt tsx, der Prisma-Client und der Quelltext des db-Pakets mit im Migrator-Verzeichnis des Images, statt beim Start aus dem Netz geholt zu werden.
93 lines
3.5 KiB
Docker
93 lines
3.5 KiB
Docker
# 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.
|
|
# Dazu der Seed: er legt den Grundzustand an - Freigabestufen, Status-Etiketten,
|
|
# Fallarten, Nummernkreise. Ohne ihn startet die Anwendung zwar, aber es laesst
|
|
# sich keine Akte anlegen, weil es keine Vorlage gibt. Er besteht ausschliesslich
|
|
# aus upserts und darf deshalb bei jedem Start mitlaufen.
|
|
RUN mkdir -p /migrator && cd /migrator && \
|
|
npm install --no-package-lock --no-audit --no-fund \
|
|
"prisma@${PRISMA_VERSION}" \
|
|
"@prisma/client@${PRISMA_VERSION}" \
|
|
"@prisma/adapter-pg@${PRISMA_VERSION}" \
|
|
pg tsx && \
|
|
cp -r /repo/packages/db/prisma /migrator/prisma && \
|
|
cp -r /repo/packages/db/src /migrator/src && \
|
|
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
|
|
|
|
# qpdf säubert hochgeladene PDF-Dateien, siehe docs/07-dateien-und-sicherheit.md.
|
|
# Fehlt es, bleiben PDF-Uploads in der Quarantäne statt ungeprüft durchzugehen.
|
|
RUN apk add --no-cache wget openssl qpdf && \
|
|
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"]
|