Aller au contenu

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.

pct exec 106 -- systemctl restart 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)

pct exec 109 -- bash -c "cd /opt/torrents && docker compose pull && docker compose up -d"

MAJ Docker — Uptime Kuma (LXC 106)

pct exec 106 -- bash -c "cd /opt/uptime-kuma && docker compose pull && docker compose up -d"

MAJ Docker — Pingvin (LXC 108)

pct exec 108 -- bash -c "cd /opt/pingvin && docker compose pull && docker compose up -d"

MAJ Docker — Vaultwarden (LXC 110)

pct exec 110 -- bash -c "cd /opt/vaultwarden && docker compose pull && docker compose up -d"

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)

# Via console de la VM ou SSH dans HA
ha core update

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"

pct exec 106 -- systemctl restart dashboard

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.

# Vérifier si l'image de backup existe encore
pct exec <LXC_ID> -- docker images | grep 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"

Mise à jour du dashboard lui-même

# Éditer directement sur LXC 106
pct exec 106 -- nano /opt/dashboard/main.py

# Ou depuis le host Proxmox
pct push 106 /tmp/main.py /opt/dashboard/main.py

# Redémarrer après modification
pct exec 106 -- systemctl restart dashboard