perf: fiabiliser et réduire la taille du build (465MB -> 267MB)#331
Merged
Conversation
… dédup images, garde-fou mémoire)
Le build (4 locales, Docusaurus) tournait directement sur le VPS de prod
(1 vCPU/2GB, partagé avec 13 autres conteneurs) et avait déjà échoué deux
fois faute de ressources. Quatre correctifs indépendants, aucun ne touche
au contenu :
- npm ci au lieu de npm install : plus rapide et déterministe, s'appuie
sur package-lock.json au lieu de re-résoudre les versions.
- .dockerignore (absent jusqu'ici) : exclut .git/ (67MB), node_modules,
et les fichiers résidus (duplicates.txt, FilesNotFound*.txt, Test).
- maxThreads: 1 sur docusaurus-lunr-search : le plugin utilise os.cpus()
par défaut, qui peut renvoyer le nombre de coeurs du host physique
plutôt que la limite réelle du conteneur (1 vCPU ici) — plusieurs
threads se battaient pour un seul coeur au lieu d'aider.
- NODE_OPTIONS=--max-old-space-size=1024 : force V8 à garbage-collecter
plus tôt plutôt que de laisser le kernel OOM-killer intervenir
brutalement en pleine compilation webpack.
- Dédup des images dupliquées par locale : static/img/ (67MB) est copié
intégralement par Docusaurus dans le build de CHAQUE locale
(comportement natif de staticDirectories, pas un bug applicatif) —
build/fr/img, build/ru/img, build/de/img sont 4 copies identiques du
même contenu. Remplacées par des liens symboliques vers build/img
(vérifié : busybox httpd les suit nativement, et Docker COPY préserve
les symlinks entre stages).
Piste explorée et abandonnée : builder chaque locale séparément
(docusaurus build --locale X) pour réduire le pic mémoire. Testé
directement — --locale fr --out-dir build écrase la racine au lieu de
nicher sous build/fr/, contrairement à un build multi-locale classique.
Recomposer correctement l'arborescence (routing, sitemap, recherche par
langue) est un vrai chantier, pas un réglage — hors du périmètre
"tuning" de ce soir.
Testé sur le VPS (build --no-cache complet, 4 locales) :
- symlinks confirmés dans build/{fr,ru,de}/img, contenu accessible via
Docker COPY --from
- conteneur démarré réellement : / , /fr/ , /ru/ , /de/ répondent 200,
une image testée via /fr/img/... et /img/... répond 200 dans les deux
cas (même contenu, symlink suivi correctement)
Taille de l'image : 465MB -> 267MB (-43%).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Contexte
Le build (4 locales, Docusaurus) tourne directement sur le VPS de prod (1 vCPU/2GB, partagé avec 13 autres conteneurs) et avait déjà échoué deux fois faute de ressources. Quatre correctifs indépendants, aucun ne touche au contenu.
Changements
npm ciau lieu denpm install: plus rapide et déterministe..dockerignore(absent jusqu'ici) : exclut.git/(67MB),node_modules, fichiers résidus.maxThreads: 1surdocusaurus-lunr-search: le plugin utiliseos.cpus()par défaut, qui peut renvoyer le nombre de cœurs du host physique plutôt que la limite réelle du conteneur (1 vCPU ici) — plusieurs threads se battaient pour un seul cœur.NODE_OPTIONS=--max-old-space-size=1024: force V8 à garbage-collecter plus tôt plutôt que de laisser le kernel OOM-killer intervenir brutalement en pleine compilation.static/img/(67MB) est copié intégralement par Docusaurus dans le build de CHAQUE locale (comportement natif destaticDirectories, pas un bug applicatif) —build/fr/img,build/ru/img,build/de/imgétaient 4 copies identiques. Remplacées par des liens symboliques versbuild/img(vérifié : busybox httpd les suit nativement, DockerCOPYpréserve les symlinks entre stages).Piste explorée et abandonnée
Builder chaque locale séparément (
docusaurus build --locale X) pour réduire le pic mémoire. Testé directement —--locale fr --out-dir buildécrase la racine au lieu de nicher sousbuild/fr/, contrairement à un build multi-locale classique. Recomposer correctement l'arborescence est un vrai chantier, pas un réglage.Mesures
Taille de l'image : 465MB -> 267MB (-43%)
Test plan
--no-cache, 4 locales) réussi sur le VPSbuild/{fr,ru,de}/img/,/fr/,/ru/,/de/répondent 200/fr/img/...et/img/...répond 200 dans les deux cas (symlink suivi correctement)Closes #332