youtubeDownloader/server/Dockerfile
Nicolas a73ead75a0
Some checks failed
Publier l'image Docker / test (pull_request) Failing after 4s
Publier l'image Docker / publish (pull_request) Has been skipped
fix: image Docker glibc + UI plus douce + placeholders génériques
- server/Dockerfile : base node:22-bookworm-slim au lieu d'alpine. Le
  binaire autonome yt-dlp_linux est lié à la glibc ; sur musl (Alpine),
  spawn échouait en prod avec ENOENT bien que le fichier soit présent et
  exécutable (interpréteur ELF introuvable). Repéré via un rapport de bug
  en conditions réelles. Même choix que mediaDrop pour un souci similaire.
- client/src/styles/base.scss : palette partagée (custom properties CSS),
  fond/texte/bordures adoucis, boutons/inputs cohérents, variante
  "secondary" pour les actions non-principales (Annuler). Remplace le
  rendu par défaut trop contrasté (fond très sombre côté navigateur non
  compensé, rouge vif sur les erreurs).
- Placeholders des champs chaîne/mots-clés rendus génériques
  (@nomdelachaine, mot-clé1/mot-clé2) au lieu d'un exemple spécifique.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 22:22:44 +02:00

69 lines
2.6 KiB
Docker

# Contexte de build = racine du dépôt (le Dockerfile copie aussi client/) :
# docker build -f server/Dockerfile -t youtubedownloader .
#
# Trois étapes : build client (esbuild + sass -> client/dist), build
# serveur (tsc -> server/dist), puis l'image runtime, qui ne contient que
# les deux dossiers dist/ compilés, les dépendances de production du
# serveur, et yt-dlp + ffmpeg (moteur d'extraction).
#
# Debian slim plutôt qu'Alpine : le binaire autonome yt-dlp_linux est lié à
# la glibc. Sur une base musl (Alpine), l'exécution échouait en prod avec
# `spawn yt-dlp ENOENT` bien que le fichier soit présent et exécutable - le
# noyau ne trouve pas l'interpréteur ELF (ld-linux) que le binaire attend.
# Même choix que mediaDrop, qui a le même souci avec une autre dépendance
# native (voir son Dockerfile).
FROM node:22-bookworm-slim AS client-build
WORKDIR /app/client
COPY client/package.json client/package-lock.json* ./
RUN npm install
COPY client/build.mjs client/tsconfig.json ./
COPY client/src ./src
RUN npm run build
FROM node:22-bookworm-slim AS server-build
WORKDIR /app/server
COPY server/package.json server/package-lock.json* ./
RUN npm install
COPY server/tsconfig.json server/tsconfig.build.json ./
COPY server/src ./src
RUN npm run build
FROM node:22-bookworm-slim
# yt-dlp (binaire autonome, sans dépendance Python) + ffmpeg : dépendances
# d'exécution du service de téléchargement. ca-certificates reste dans
# l'image finale (pas seulement pour le téléchargement du binaire) : yt-dlp
# en a besoin à l'exécution pour valider le TLS de youtube.com.
RUN apt-get update && \
apt-get install -y --no-install-recommends ffmpeg curl ca-certificates && \
rm -rf /var/lib/apt/lists/* && \
curl -fL https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux -o /usr/local/bin/yt-dlp && \
chmod +x /usr/local/bin/yt-dlp
WORKDIR /app/server
COPY server/package.json server/package-lock.json* ./
RUN npm install --omit=dev
COPY --from=server-build /app/server/dist ./dist
COPY --from=client-build /app/client/dist ../client/dist
# Dossier de travail temporaire du service de téléchargement, inscriptible
# par l'utilisateur non-root `node` (déjà présent dans l'image officielle).
RUN mkdir -p /app/server/tmp && chown -R node:node /app/server
ENV NODE_ENV=production \
PORT=3000 \
HOST=0.0.0.0 \
CLIENT_DIST_PATH=/app/client/dist
USER node
EXPOSE 3000
# GET /health ne demande aucune authentification.
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
CMD ["node", "-e", "fetch('http://127.0.0.1:3000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
CMD ["node", "dist/index.js"]