# 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.