- Rust 54.9%
- Svelte 31.8%
- Python 5.9%
- TypeScript 3.4%
- Shell 2.7%
- Other 1.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
Déploiement PVE Control (LXC 137) / Build et déploiement (push) Successful in 1m1s
|
||
| .forgejo/workflows | ||
| backend | ||
| deploy | ||
| docs | ||
| frontend | ||
| tests | ||
| .env.example | ||
| .gitignore | ||
| CHANGELOG.md | ||
| nuvio-selfhost.png | ||
| pve-control.service | ||
| rakazo-icon.png | ||
| README.md | ||
| tizentube.png | ||
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) etfrontend/(Svelte 5 + Skeleton UI + Tailwind), embarqués dans un seul binaire servi sur le port 8590. Le Pythonserver.pya é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 systemdpve-control(voirpve-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 authentificationGET /api/statusles cinq blocs du contrat : pve,lxc,docker,disk,tempsPOST /api/action{"ok":…,"message":…}, toujours 200 — nœud, LXC, démarrage auto, DockerGET /icone/<nom>.pngl'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é danstests/fixtures/:python3 tests/caracterisation.py --base-url http://192.168.1.70:8590--enregistrerrejoue 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.