# Étape 1 : compilation de l'interface
FROM node:22.22-alpine AS build

WORKDIR /app
# package-lock.json d'abord : la couche npm ci ne se refait que si les
# dépendances changent, pas à chaque modification de code.
COPY package.json package-lock.json* ./
RUN npm ci --no-audit --no-fund

COPY tsconfig*.json vite.config.ts index.html ./
COPY src ./src
RUN npm run build

# ---------------------------------------------------------------------------
# Étape 2 : service des fichiers statiques
#
# Image « unprivileged » officielle plutôt que nginx:alpine retouché au sed.
# Elle écoute déjà sur 8080, tourne en UID 101, place le PID et les répertoires
# temporaires dans /tmp, et supprime la directive `user` de nginx.conf.
#
# Motif du changement : nginx 1.27.5 a déplacé le PID de /var/run/nginx.pid vers
# /run/nginx.pid. Un sed sur l'ancien chemin ne correspond plus à rien, la
# substitution passe en silence, et nginx échoue au démarrage sur
# « open() "/run/nginx.pid" failed (13: Permission denied) ». Le projet nginx
# amont a rencontré exactement ce cas et a dû corriger son propre sed : autant
# s'appuyer sur leur image plutôt que refaire le travail à côté.
FROM nginxinc/nginx-unprivileged:1.27-alpine

USER root
RUN apk add --no-cache tzdata \
 && ln -snf /usr/share/zoneinfo/Europe/Paris /etc/localtime \
 && echo "Europe/Paris" > /etc/timezone

COPY --from=build --chown=101:101 /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf

USER 101

EXPOSE 8080

# wget (busybox) et non curl : l'image Alpine ne l'embarque pas, et l'installer
# pour une sonde de santé alourdirait l'image sans raison.
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
  CMD wget -q -O /dev/null http://127.0.0.1:8080/ || exit 1
