Files
Node-RED-Generation-de-bike…/README.md
2026-02-27 11:00:13 +00:00

95 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.