2026-02-27 10:58:55 +00:00
2026-02-27 10:58:55 +00:00

Node-RED — Génération de bike.png (Calendar image) — Fix Canvas + Fonts

Objectif

Cette documentation décrit lajout et la remise en fonctionnement de la génération dimage 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.
  1. 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
  1. bike.png illisible (glyphes “carrés”)
  • cause : aucune police installée dans limage 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 nembarque 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.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 lutilisent (ici : génération PNG).
  • Sur Alpine, les dépendances système + fonts doivent être présentes dans limage pour un rendu stable.
Description
No description provided
Readme 32 KiB