Tableau de bord du homelab Proxmox (état du nœud, LXC, Docker, raccourcis)
  • Rust 54.9%
  • Svelte 31.8%
  • Python 5.9%
  • TypeScript 3.4%
  • Shell 2.7%
  • Other 1.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
foXaCe ecc2c4010d
All checks were successful
Déploiement PVE Control (LXC 137) / Build et déploiement (push) Successful in 1m1s
Merge pull request 'Carte LXC : la barre du disque retrouve sa largeur' (#52) from fix/barre-disque-carte into main
2026-10-18 14:15:46 +02:00
.forgejo/workflows fix(ci) : forcer le relink quand seul le front change 2026-10-18 13:59:24 +02:00
backend fix(ui) : en-tetes de cache, sinon le navigateur garde l'ancien front 2026-10-18 14:07:49 +02:00
deploy fix(déploiement) : le contrôle de santé utilise wget, pas curl 2026-10-17 11:22:23 +02:00
docs fix(securite) : authentification HTTP Basic du tableau de bord 2026-10-17 10:28:55 +02:00
frontend fix(ui) : la barre du disque n'avait aucune largeur sur les cartes 2026-10-18 14:15:45 +02:00
tests feat(conso) : voir qui consomme, et laisser de quoi l'exploiter 2026-10-17 13:35:47 +02:00
.env.example chore(pve-control) : retrait du service Python 2026-10-17 14:40:06 +02:00
.gitignore Import initial depuis le homelab 2026-10-15 10:48:05 +02:00
CHANGELOG.md fix(securite) : authentification HTTP Basic du tableau de bord 2026-10-17 10:28:55 +02:00
nuvio-selfhost.png Import initial depuis le homelab 2026-10-15 10:48:05 +02:00
pve-control.service Paquet unique : front intégré, service durci, déploiement continu 2026-10-16 10:45:12 +02:00
rakazo-icon.png Import initial depuis le homelab 2026-10-15 10:48:05 +02:00
README.md chore(pve-control) : retrait du service Python 2026-10-17 14:40:06 +02:00
tizentube.png Import initial depuis le homelab 2026-10-15 10:48:05 +02:00

PVE Control

Tableau de bord du homelab : état du nœud Proxmox pve (CPU, RAM, disques, températures), des LXC et des conteneurs Docker, plus les raccourcis vers chaque service.

  • Code actuel : backend/ (Rust, axum + tokio) et frontend/ (Svelte 5 + Skeleton UI + Tailwind), embarqués dans un seul binaire servi sur le port 8590. Le Python server.py a été retiré le 2026-10-17 : la réécriture est en service, la référence n'a plus lieu d'être.
  • Déploiement : LXC 137 (pve-control, 192.168.1.90), /opt/pve-control, service systemd pve-control (voir pve-control.service). Depuis le 2026-10-17, le conteneur est dédié au tableau de bord ; il partageait auparavant le LXC 115 de Forgejo.
  • Accès : http://192.168.1.90:8590 (réseau local), protégé au minimum par le réseau local et un mot de passe, idéalement devant Caddy.

Backend Rust (backend/)

Espace Cargo à deux membres :

  • crates/pve-client — client typé de l'API Proxmox VE : authentification par jeton d'API uniquement (aucun mot de passe root), erreurs typées (thiserror). Le nœud est un paramètre.
  • crates/pve-api — le service HTTP (axum + tokio). Routes du socle :
    Méthode Chemin Réponse
    GET /api/sante {"etat":"ok"}, sans interroger Proxmox, sans authentification
    GET /api/status les cinq blocs du contrat : pve, lxc, docker, disk, temps
    POST /api/action {"ok":…,"message":…}, toujours 200 — nœud, LXC, démarrage auto, Docker
    GET /icone/<nom>.png l'icône du disque, 404 nu sinon

Toutes les routes sauf /api/sante exigent l'authentification HTTP Basic (PVE_AUTH_USER / PVE_AUTH_PASS). Sans en-tête acceptable, la réponse est 401 avec WWW-Authenticate. Le contrôle de santé reste ouvert pour que le déploiement puisse sonder le service sans identifiants.

`/api/status` et `/api/action` **sont des champs de l'API** : le front en dépend. La forme suit `docs/COMPORTEMENT.md` et les fixtures du ticket 1 (`tests/fixtures/`). Chaque bloc de `/api/status` a sa valeur de repli, la réponse reste 200 même quand l'amont est muet.

  cd backend
  cargo run -p pve-api            # lit l'environnement, écoute sur PVE_CONTROL_ECOUTE
  cargo test                      # bancs : faux Proxmox (wiremock), parité du ticket 1
  cargo clippy --all-targets -- -D warnings

Configuration

Variables d'environnement (voir .env.example) : PVE_URL, PVE_NOEUD, PVE_TOKEN_ID et PVE_TOKEN_SECRET (seul mode accepté, aucun mot de passe root), PVE_AUTH_USER et PVE_AUTH_PASS (compte du tableau de bord, HTTP Basic ; obligatoire, le service refuse de démarrer sans lui), PVE_TLS_VERIFIE, PVE_DELAI_SECONDES, PVE_CONTROL_ECOUTE, puis les sources locales de l'API : PVE_DOCKER_SOCKET, PVE_TEMPERATURES, PVE_ICONES, PVE_STOCKAGE_RACINE, PVE_STOCKAGE_POOL, PVE_GROUPE_VOLUMES, PVE_STOCKAGE_PARTAGE, PVE_PARTAGE_MONTAGE.\n\nLes en-têtes de sécurité (X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Content-Security-Policy) sont posés par le service sur toutes les réponses.

Aucun secret ne doit être écrit en dur dans le code ni déposé dans ce dépôt : le service refuse de démarrer sans identifiants plutôt que d'en inventer un.

Documentation

  • docs/COMPORTEMENT.md : le comportement relevé de la version Python, route par route, avec les appels Proxmox et Docker, la configuration codée en dur et les fragilités observées. C'est le contrat que la réécriture doit respecter.

  • tests/caracterisation.py : banc de caractérisation (bibliothèque standard uniquement). Il interroge une instance en marche et la compare au contrat enregistré dans tests/fixtures/ :

    python3 tests/caracterisation.py --base-url http://192.168.1.70:8590
    

    --enregistrer rejoue le relevé et réécrit les fixtures (réponses anonymisées). Code de sortie : 0 vert, 1 contrat rompu, 2 service injoignable.

  • CHANGELOG.md : ce qui change, ticket par ticket.

Intégration continue

.forgejo/workflows/ci.yml, sur chaque branche et chaque PR : cargo fmt --check, cargo clippy --all-targets -- -D warnings, cargo test, puis la couverture (cargo-llvm-cov, seuil de 80 % sur les lignes de la logique métier). Exécutant pc-studio, étiquette pc-lourd, mode hôte : aucun conteneur, aucun secret.

Feuille de route

Réécriture en Rust (backend) + Svelte (frontend) avec tests : voir le tableau kanban « Forgejo foX » de Hermes.