Files
lernbar/Dockerfile
T
Florian WildeandClaude Opus 5.5 adb93a722f Kontowerkzeug ins Abbild, Containerabnahme
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>
2026-10-03 00:50:59 +02:00

73 lines
2.6 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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"]