Dashboard de supervision
Rôle
Interface web centralisant l'état de tous les services du homelab : version installée, version disponible, et lancement des mises à jour avec rollback automatique.
Accès
| LXC | 106 — 192.168.1.51 |
| Port | 8080 |
| URL | http://dashboard.2h15.fr (local/VPN uniquement) |
| Stack | FastAPI (Python) + HTML/JS statique |
| Code | /opt/dashboard/main.py sur LXC 106 |
Architecture du système de mise à jour
LXC 106 (main.py)
│
├─ SSH → hôte cible (update_host)
│ ├─ déploie /tmp/<service>_update.sh
│ └─ lance en arrière-plan (nohup)
│
└─ Polling /tmp/<service>_update_status
running → rolling_back → success / rolled_back / failed
Le script de mise à jour tourne sur l'hôte cible, pas sur LXC 106. Pour la plupart des services, l'hôte cible est le host Proxmox (192.168.1.215) qui utilise ensuite pct exec pour agir dans le bon LXC.
Exceptions où le script tourne directement dans le LXC :
| Service | Hôte cible |
|---|---|
| NPM | LXC 101 — 192.168.1.84 |
| Immich | LXC 104 — 192.168.1.138 |
| Tous les autres | Host Proxmox — 192.168.1.215 |
Services surveillés
| Service | LXC/VM | Source version "latest" | Méthode MAJ | MAJ auto |
|---|---|---|---|---|
| NGINX Proxy Manager | 101 | GitHub releases | apt-get | ✅ |
| Immich | 104 | GitHub releases | script officiel | ✅ |
| Home Assistant | VM 100 | Supervisor HA | ha core update |
✅ |
| WireGuard | 105 | apt-cache (Debian) | ❌ manuel | ❌ |
| Pingvin Share | 108 | GitHub releases | Docker pull | ✅ |
| ntfy | 107 | GitHub releases | .deb direct | ✅ |
| qBittorrent | 109 | linuxserver/docker-qbittorrent | Docker pull | ✅ |
| Prowlarr | 109 | linuxserver/docker-prowlarr | Docker pull | ✅ |
| Sonarr | 109 | linuxserver/docker-sonarr | Docker pull | ✅ |
| Radarr | 109 | linuxserver/docker-radarr | Docker pull | ✅ |
| Bazarr | 109 | linuxserver/docker-bazarr | Docker pull | ✅ |
| Jellyseerr | 109 | GitHub releases (seerr) | Docker pull | ✅ |
| Vaultwarden | 110 | GitHub releases | Docker pull | ✅ |
| Immich Swipe | 111 | GitHub tags (git describe) | ❌ manuel | ❌ |
| Jellyfin | 114 | GitHub releases | apt-get | ✅ |
| GigHunter | 113 | — | ❌ manuel | ❌ |
| Outil D&D | 115 | — | ❌ manuel | ❌ |
| code-server | 117 | GitHub releases | ❌ manuel | ❌ |
| Uptime Kuma | 106 | GitHub releases | Docker pull | ✅ |
Services linuxserver
qBittorrent, Prowlarr, Sonarr, Radarr et Bazarr sont comparés contre les releases linuxserver (pas les releases upstream), pour éviter les faux positifs quand l'image Docker n'est pas encore packagée.
Notifications automatiques
Cron quotidien à 7h00 sur LXC 106 : une notification ntfy (topic homelab) est envoyée pour chaque service ayant une mise à jour disponible.
Cache
Les versions "latest" sont mises en cache 1 heure. Pour forcer un recalcul : redémarrer le service dashboard.
Emplacement des logs
Tous les fichiers de log et de status sont dans /tmp/ sur l'hôte cible (voir tableau ci-dessus).
| Service | Hôte | Fichier log | Fichier status |
|---|---|---|---|
| npm | LXC 101 | /tmp/npm_update.log |
/tmp/npm_update_status |
| immich | LXC 104 | /tmp/immich_update.log |
/tmp/immich_update_status |
| ntfy | Host | /tmp/ntfy_update.log |
/tmp/ntfy_update_status |
| pingvin | Host | /tmp/pingvin_update.log |
/tmp/pingvin_update_status |
| homeassistant | Host | /tmp/homeassistant_update.log |
/tmp/homeassistant_update_status |
| qbittorrent | Host | /tmp/qbittorrent_update.log |
/tmp/qbittorrent_update_status |
| prowlarr | Host | /tmp/prowlarr_update.log |
/tmp/prowlarr_update_status |
| sonarr | Host | /tmp/sonarr_update.log |
/tmp/sonarr_update_status |
| radarr | Host | /tmp/radarr_update.log |
/tmp/radarr_update_status |
| bazarr | Host | /tmp/bazarr_update.log |
/tmp/bazarr_update_status |
| jellyseerr | Host | /tmp/jellyseerr_update.log |
/tmp/jellyseerr_update_status |
| vaultwarden | Host | /tmp/vaultwarden_update.log |
/tmp/vaultwarden_update_status |
| jellyfin | Host | /tmp/jellyfin_update.log |
/tmp/jellyfin_update_status |
| uptime-kuma | Host | /tmp/uptime-kuma_update.log |
/tmp/uptime-kuma_update_status |
Valeurs possibles du fichier status : running, rolling_back, success, rolled_back, failed.
Lire les logs depuis le host Proxmox
# Exemple : log de mise à jour qBittorrent
cat /tmp/qbittorrent_update.log
# Exemple : log NPM (sur LXC 101)
ssh root@192.168.1.84 cat /tmp/npm_update.log
# Exemple : log Immich (sur LXC 104)
ssh root@192.168.1.138 cat /tmp/immich_update.log
Procédure de mise à jour manuelle
Si le dashboard est inaccessible ou si l'on souhaite lancer une mise à jour sans passer par l'interface, les scripts peuvent être exécutés directement.
Lancer une MAJ manuellement depuis le host
# Déclencher via l'API FastAPI directement
curl -X POST http://192.168.1.51:8080/api/update/<service_id>
# Exemples :
curl -X POST http://192.168.1.51:8080/api/update/qbittorrent
curl -X POST http://192.168.1.51:8080/api/update/uptime-kuma
curl -X POST http://192.168.1.51:8080/api/update/sonarr
MAJ Docker (qBittorrent, Prowlarr, Sonarr, Radarr, Bazarr, Jellyseerr — LXC 109)
MAJ Docker — Uptime Kuma (LXC 106)
MAJ Docker — Pingvin (LXC 108)
MAJ Docker — Vaultwarden (LXC 110)
MAJ ntfy (LXC 107)
LATEST_VER=$(curl -s https://api.github.com/repos/binwiederhier/ntfy/releases/latest \
| python3 -c "import sys,json; print(json.load(sys.stdin)['tag_name'].lstrip('v'))")
curl -sL "https://github.com/binwiederhier/ntfy/releases/download/v${LATEST_VER}/ntfy_${LATEST_VER}_linux_amd64.deb" -o /tmp/ntfy_new.deb
pct push 107 /tmp/ntfy_new.deb /tmp/ntfy_new.deb
pct exec 107 -- dpkg -i /tmp/ntfy_new.deb
pct exec 107 -- systemctl restart ntfy
MAJ Home Assistant (VM 100)
Débogage
Le dashboard ne répond plus
pct exec 106 -- systemctl status dashboard
pct exec 106 -- journalctl -u dashboard -n 50
pct exec 106 -- systemctl restart dashboard
Une mise à jour est bloquée sur "En cours"
# Vérifier si le script tourne encore (host Proxmox)
ps aux | grep update.sh
# Forcer la réinitialisation du status
echo "failed" > /tmp/<service>_update_status
La version "latest" affiche "unknown" ou "error"
Si l'erreur persiste, vérifier le rate limiting GitHub (60 req/h sans token).
Rollback manuel
Le rollback automatique se déclenche si le health check échoue après une mise à jour. Si le rollback automatique a lui-même échoué (status failed), procéder manuellement.
Services Docker — rollback via image sauvegardée
Avant chaque mise à jour, le dashboard sauvegarde l'image courante avec le tag <service>-backup:rollback.
Uptime Kuma (LXC 106) :
pct exec 106 -- docker tag uptime-kuma-backup:rollback louislam/uptime-kuma:2
pct exec 106 -- bash -c "cd /opt/uptime-kuma && docker compose up -d --force-recreate"
Pingvin (LXC 108) :
pct exec 108 -- docker tag pingvin-share-backup:rollback stonith404/pingvin-share:latest
pct exec 108 -- bash -c "cd /opt/pingvin && docker compose up -d --force-recreate"
Services *arr + Jellyseerr (LXC 109) :
# Exemple pour qbittorrent — adapter le nom de l'image pour les autres
pct exec 109 -- docker tag qbittorrent-backup:rollback lscr.io/linuxserver/qbittorrent:latest
pct exec 109 -- bash -c "cd /opt/torrents && docker compose up -d --force-recreate qbittorrent"
Vaultwarden (LXC 110) :
pct exec 110 -- docker tag vaultwarden-backup:rollback vaultwarden/server:latest
pct exec 110 -- bash -c "cd /opt/vaultwarden && docker compose up -d --force-recreate"
Si l'image de backup n'existe plus
Le cleanup automatique supprime l'image de backup après un succès. Si une mise à jour a semblé réussir mais pose problème plus tard, il faudra spécifier une version explicite dans le docker-compose.yml.
ntfy — rollback via binaire sauvegardé (LXC 107)
pct exec 107 -- bash -c "cp /tmp/ntfy_backup /bin/ntfy && chmod +x /bin/ntfy && systemctl restart ntfy"
Note
Le fichier /tmp/ntfy_backup est écrasé à chaque mise à jour. Ce rollback n'est valable que juste après une mise à jour ratée.
Home Assistant — rollback (VM 100)
# Consulter le log pour retrouver la version précédente
cat /tmp/homeassistant_update.log | grep "Version actuelle"
# Depuis la console ou SSH dans HA
ha core update --version <PREV_VER>
NPM — rollback (LXC 101)
# Trouver la dernière sauvegarde DB
ssh root@192.168.1.84 ls -lt /data/database.sqlite.bak.*
# Restaurer
ssh root@192.168.1.84 bash -c "cp /data/database.sqlite.bak.<DATE> /data/database.sqlite && systemctl restart npm"