- 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>
69 lines
2.6 KiB
Docker
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"]
|