# syntax=docker/dockerfile:1

# Debian-Basis statt Alpine: better-sqlite3 ist ein natives Modul und findet
# für glibc fertige Binaries. Unter musl müsste es im Image übersetzt werden.
FROM node:22-bookworm-slim AS builder

WORKDIR /app

# Erst die Manifeste kopieren – solange sie sich nicht ändern, bleibt die
# Installationsschicht im Cache und ein Codeänderung baut in Sekunden.
COPY package.json package-lock.json ./
COPY server/package.json ./server/
COPY web/package.json ./web/

RUN npm ci

COPY server ./server
COPY web ./web

RUN npm run build

# Entwicklungsabhängigkeiten entfernen, das übersetzte better-sqlite3 bleibt
# erhalten. Ein erneutes npm ci im Laufzeit-Image würde es neu bauen müssen.
RUN npm prune --omit=dev


FROM node:22-bookworm-slim AS runtime

ENV NODE_ENV=production \
    HOST=0.0.0.0 \
    PORT=3311

WORKDIR /app

# Die Anwendung leitet ihre Pfade aus dem Ort von server/dist ab
# (siehe server/src/pfade.ts). Deshalb muss die Ordnerstruktur erhalten bleiben:
# /app/server/dist, /app/web/dist und /app/data.
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/server/package.json ./server/package.json
COPY --from=builder /app/server/dist ./server/dist
COPY --from=builder /app/web/dist ./web/dist
COPY .env.beispiel ./.env.beispiel

# Der Node-Basisimage-Benutzer hat bereits UID 1000 und passt damit zu einem
# typischen Desktop-Konto – die Dateien in ./data bleiben so dem Host gehören.
RUN mkdir -p /app/data && chown -R node:node /app/data
USER node

EXPOSE 3311

# Ohne curl im Image: die Prüfung läuft über Node selbst.
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
  CMD node -e "fetch('http://127.0.0.1:'+(process.env.PORT||3311)+'/api/gesundheit').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"

CMD ["node", "server/dist/index.js"]
