commit 3d752e2bc2b8921b9c4229bb3c4b7e1794e97577 Author: Gsyleric Date: Fri Feb 27 10:58:20 2026 +0000 Upload files to "/" diff --git a/README-node-red-bike-png.md b/README-node-red-bike-png.md new file mode 100644 index 0000000..7f9233e --- /dev/null +++ b/README-node-red-bike-png.md @@ -0,0 +1,93 @@ +# Node-RED — Génération de `bike.png` (Calendar image) — Fix Canvas + Fonts + +## Objectif + +Cette documentation décrit l’ajout et la remise en fonctionnement de la génération d’image `bike.png` servie par Node-RED : + +- URL : `http://100.64.0.2:1880/bike.png` +- Usage : afficher une image (PNG) liée à ton calendrier local Home Assistant (ex: carte/dashboard). + +## Contexte technique + +- Node-RED tourne dans un conteneur Docker nommé `ndrd` (image `nodered/node-red:${TAG}`). +- OS du conteneur : Alpine Linux v3.23. +- Données persistantes : volume Docker monté sur `/data`. +- Limite mémoire : `mem_limit` / `memswap_limit` (au départ 1G, puis ajusté à 2G). + +## Symptômes observés + +1) Crash / redémarrages du conteneur `ndrd` +- Logs : `./entrypoint.sh: ... Killed` +- Kernel : événements OOM (Out Of Memory) ciblant le cgroup du conteneur. + +2) Erreurs Node-RED (modules externes dans Function node) +- `Error loading shared library libcairo.so.2: No such file or directory` +- puis `libpangocairo-1.0.so.0: No such file or directory` + +3) `bike.png` illisible (glyphes “carrés”) +- cause : aucune police installée dans l’image Alpine. + +## Causes + +- Le module Node.js `canvas` est utilisé dans les flows (external modules) et nécessite des libs système (cairo/pango/etc.). +- Alpine n’embarque pas ces dépendances par défaut. +- Absence de polices => rendu texte incorrect. +- Limite mémoire trop basse + charge => OOM killer => Node-RED tué par le kernel. + +## Correctifs appliqués + +### 1) Dépendances système pour `canvas` + +Installation dans le conteneur (en root) : + +```sh +docker exec -u 0 -it ndrd sh -lc 'apk add --no-cache cairo pango pixman jpeg giflib librsvg' +``` + +Validation : + +```sh +docker exec -u 0 -it ndrd sh -lc 'node -e "require(\"canvas\"); console.log(\"canvas OK\")"' +``` + +### 2) Polices + fontconfig + +```sh +docker exec -u 0 -it ndrd sh -lc 'apk add --no-cache fontconfig ttf-dejavu' +``` + +Validation : + +```sh +docker exec -u 0 -it ndrd sh -lc 'fc-list | head -n 5; echo "---"; fc-match sans' +``` + +Attendu : +- `fc-match sans` => `DejaVuSans.ttf: "DejaVu Sans" "Book"` + +### 3) Redémarrage du conteneur + +```sh +docker restart ndrd +``` + +### 4) Ajustement mémoire (OOM) + +Les logs kernel ont montré des kills OOM sur le process Node-RED dans le cgroup du conteneur. + +Action retenue (dans la stack Portainer) : +- `mem_limit: ${MEM_2G}` +- `memswap_limit: ${MEM_2G}` +avec par ex. `MEM_2G=2g`. + +## Vérifications finales + +- Node-RED démarre sans erreurs “libcairo/libpangocairo missing”. +- `require("canvas")` OK dans le conteneur. +- `bike.png` affiche du texte lisible (polices OK). +- Plus de redémarrages en boucle / OOM (si la mémoire est bien augmentée). + +## Notes + +- `canvas` est nécessaire uniquement si tes flows l’utilisent (ici : génération PNG). +- Sur Alpine, les dépendances système + fonts doivent être présentes dans l’image pour un rendu stable.