Update README.md

This commit is contained in:
2026-02-27 10:58:55 +00:00
parent 3d752e2bc2
commit 0b5e1c680f

93
README.md Normal file
View File

@@ -0,0 +1,93 @@
# 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.
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 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) :
```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 lutilisent (ici : génération PNG).
- Sur Alpine, les dépendances système + fonts doivent être présentes dans limage pour un rendu stable.