Skip to content

perf: fiabiliser et réduire la taille du build (465MB -> 267MB)#331

Merged
mortifia merged 1 commit into
mainfrom
perf/wiki-build-tuning
Jul 15, 2026
Merged

perf: fiabiliser et réduire la taille du build (465MB -> 267MB)#331
mortifia merged 1 commit into
mainfrom
perf/wiki-build-tuning

Conversation

@mortifia

@mortifia mortifia commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

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 ci au lieu de npm install : plus rapide et déterministe.
  • .dockerignore (absent jusqu'ici) : exclut .git/ (67MB), node_modules, fichiers résidus.
  • maxThreads: 1 sur docusaurus-lunr-search : le plugin utilise os.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.
  • 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 étaient 4 copies identiques. Remplacées par des liens symboliques vers build/img (vérifié : busybox httpd les suit nativement, 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 est un vrai chantier, pas un réglage.

Mesures

Taille de l'image : 465MB -> 267MB (-43%)

Test plan

  • Build complet (--no-cache, 4 locales) réussi sur le VPS
  • Symlinks confirmés dans build/{fr,ru,de}/img
  • 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 (symlink suivi correctement)

Closes #332

… 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%).
@mortifia
mortifia merged commit 0a8a6a4 into main Jul 15, 2026
1 check passed
@mortifia
mortifia deleted the perf/wiki-build-tuning branch July 15, 2026 06:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fiabiliser et réduire la taille du build du wiki

1 participant