Die README nannte `node werkzeuge/konto.js`, im Abbild lag aber nur das Sicherungswerkzeug, und tsx gibt es dort nicht. Ein frisch aufgesetzter Server stand ohne jedes Konto da. Das Kontoskript wird jetzt beim Bau mit esbuild zu einer Datei gebuendelt; die nativen Module bleiben aussen vor, sie bringt die Standalone-Ausgabe mit. Aufgefallen ist das nicht, weil der Abnahmelauf gegen `next start` prueft. Neu ist deshalb `npm run abnahme:container`: Abbild bauen, mit leerem Volume starten, erstes Konto anlegen, anmelden, Passwort neu setzen, sichern. Ausserdem trennt saubererName Windows-Pfade jetzt auch unter Linux ab (path.win32.basename). Der Test dazu war nur unter Windows gruen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
73 lines
2.6 KiB
Docker
73 lines
2.6 KiB
Docker
# syntax=docker/dockerfile:1
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Lern-Bar – mehrstufiges Abbild
|
||
#
|
||
# Debian-slim statt Alpine, weil better-sqlite3 und @node-rs/argon2 dort
|
||
# fertige Binärdateien mitbringen und nichts übersetzt werden muss.
|
||
# ---------------------------------------------------------------------------
|
||
|
||
ARG NODE_VERSION=22-bookworm-slim
|
||
|
||
# --- Abhängigkeiten -------------------------------------------------------
|
||
FROM node:${NODE_VERSION} AS abhaengigkeiten
|
||
WORKDIR /app
|
||
RUN apt-get update && apt-get install -y --no-install-recommends python3 build-essential \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
COPY package.json package-lock.json ./
|
||
RUN npm ci --ignore-scripts=false --no-audit --no-fund
|
||
|
||
# --- Übersetzen -----------------------------------------------------------
|
||
FROM node:${NODE_VERSION} AS bau
|
||
WORKDIR /app
|
||
ENV NEXT_TELEMETRY_DISABLED=1
|
||
COPY --from=abhaengigkeiten /app/node_modules ./node_modules
|
||
COPY . .
|
||
RUN npm run build
|
||
# Das Kontowerkzeug als eine einzige JS-Datei – im Abbild gibt es kein tsx.
|
||
# Die nativen Module bleiben draußen, sie bringt die Standalone-Ausgabe mit.
|
||
RUN npm run werkzeuge:bauen
|
||
|
||
# --- Laufzeit -------------------------------------------------------------
|
||
FROM node:${NODE_VERSION} AS laufzeit
|
||
WORKDIR /app
|
||
|
||
ENV NODE_ENV=production \
|
||
NEXT_TELEMETRY_DISABLED=1 \
|
||
TZ=Europe/Berlin \
|
||
PORT=3000 \
|
||
HOSTNAME=0.0.0.0 \
|
||
LERNBAR_DATEN=/daten \
|
||
LERNBAR_INHALTE=/app/content \
|
||
LERNBAR_MIGRATIONEN=/app/migrationen
|
||
|
||
# tini fängt Signale ab, damit `docker stop` sauber beendet.
|
||
RUN apt-get update && apt-get install -y --no-install-recommends tini ca-certificates \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# Standalone-Ausgabe von Next.js bringt genau die nötigen node_modules mit.
|
||
COPY --from=bau /app/.next/standalone ./
|
||
COPY --from=bau /app/.next/static ./.next/static
|
||
COPY --from=bau /app/public ./public
|
||
|
||
# Inhalte und Migrationen liegen als Dateien im Abbild.
|
||
COPY --from=bau /app/content ./content
|
||
COPY --from=bau /app/src/lib/db/migrationen ./migrationen
|
||
|
||
# Werkzeuge für Sicherung, Wiederherstellung und das erste Konto.
|
||
COPY --from=bau /app/scripts/im-container ./werkzeuge
|
||
COPY --from=bau /app/build/werkzeuge/konto.js ./werkzeuge/konto.js
|
||
RUN chmod +x ./werkzeuge/*.sh
|
||
|
||
RUN mkdir -p /daten && chown -R node:node /daten /app
|
||
USER node
|
||
|
||
VOLUME ["/daten"]
|
||
EXPOSE 3000
|
||
|
||
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
|
||
CMD node -e "fetch('http://127.0.0.1:'+(process.env.PORT||3000)+'/api/gesundheit').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
|
||
|
||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||
CMD ["node", "server.js"]
|