2.9 KiB
2.9 KiB
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(imagenodered/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
- Crash / redémarrages du conteneur
ndrd
- Logs :
./entrypoint.sh: ... Killed - Kernel : événements OOM (Out Of Memory) ciblant le cgroup du conteneur.
- 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
bike.pngillisible (glyphes “carrés”)
- cause : aucune police installée dans l’image Alpine.
Causes
- Le module Node.js
canvasest 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) :
docker exec -u 0 -it ndrd sh -lc 'apk add --no-cache cairo pango pixman jpeg giflib librsvg'
Validation :
docker exec -u 0 -it ndrd sh -lc 'node -e "require(\"canvas\"); console.log(\"canvas OK\")"'
2) Polices + fontconfig
docker exec -u 0 -it ndrd sh -lc 'apk add --no-cache fontconfig ttf-dejavu'
Validation :
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
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.pngaffiche du texte lisible (polices OK).- Plus de redémarrages en boucle / OOM (si la mémoire est bien augmentée).
Notes
canvasest 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.