homelab / changelog
Journal des versions
Historique complet des déploiements, correctifs et évolutions de l'infrastructure.
En cours actif
v0.4
Login JWT + Dashboard sécurisé
Mai 2026
▾
nouveauPage
login.html — formulaire de connexionnouveauStockage token JWT dans
localStoragenouveauGarde d'accès sur
index.html — redirect si non connecténouveauBouton logout dans le header du dashboard
nouveauPage
devinfo.html — documentation techniqueen coursConnexion live du dashboard à l'API
v0.3
API FastAPI + PostgreSQL + Authentification
Mai 2026
▾
nouveauAPI FastAPI dockerisée sur réseau
proxynouveauEndpoints
/health /system /links — protégés JWTnouveauAuthentification :
/auth/register /auth/login /auth/logout /auth/change-passwordnouveauPostgreSQL 16-alpine — volume SSD
/mnt/nas/docker/postgresnouveauTables
users et sessions — passwords hashés bcryptnouveauExposition via Cloudflare Tunnel →
api.petitblaise.frnouveauRestart policy
unless-stopped — persistance après rebootfixRésolution conflit réseau Docker → containers sur réseau
proxy partagéfixRemplacement passlib par bcrypt natif (bug version)
v0.2
Pipeline CI/CD + Dashboard statique
Avril–Mai 2026
▾
nouveauWorkflow Gitea Actions
deploy.yml → Wrangler → Cloudflare PagesnouveauProjet
homelab-dashboard Cloudflare Pages en Direct UploadnouveauDomaine custom
dashboard.petitblaise.fr via CNAMEnouveauGitea Runner enregistré sur le Pi
fixActions mirrorées
gitea.com/actions/checkout@v3 — GitHub inaccessible depuis le runnerfixRemplacement
cloudflare/pages-action par Wrangler CLI direct
v0.1
Infrastructure de base
Début 2026
▾
nouveauRaspberry Pi 4 · Docker · SSD externe
/mnt/nas 1.8 TonouveauCloudflare Tunnel
pi4-tunnel · domaine petitblaise.frnouveauVaultwarden · Gitea · Pihole + Unbound · Tailscale VPN
nouveauStack média : Jellyfin · Sonarr · Radarr · Bazarr · Jackett · qBittorrent · Jellyseerr · FlareSolverr
nouveauNginx + SSL Certbot local · SSL Cloudflare pour tunnel
Roadmap
Dashboard dynamique
Connexion live à l'API — statuts containers et métriques en temps réel
Alertes service down
Notification si un container tombe (email / webhook)
Schéma BDD complet
Tables metrics, events, logs dans PostgreSQL
Docker Compose global
Consolidation de tous les services en fichiers .yml versionnés
Grafana / Prometheus
Monitoring avancé avec historique des métriques
Backups automatiques
Sauvegarde BDD et configs vers Gitea
homelab / sécurité
Système JWT & Sessions
Fonctionnement du système d'authentification — du login au token, des sessions à la BDD.
Flux d'authentification complet
Login → Token → Accès protégé
Anatomie du token JWT
Structure du token
HeaderAlgorithme
HS256 + type JWTPayload
sub (username) + exp (expiration)SignatureHMAC-SHA256 avec
SECRET_KEYDurée24 heures
Format
header.payload.signature (base64)Double vérification
1Décodage et vérification de la signature avec
SECRET_KEY2Vérification de l'expiration
exp3Recherche en BDD : token + user_id +
expires_at > NOW()4Si l'une des 3 vérifications échoue →
401 UnauthorizedRègles de sécurité en place
Passwords hashés bcrypt
Le mot de passe n'est jamais stocké en clair. bcrypt ajoute un salt unique par hash, rendant les rainbow tables inutiles.
Aucun port ouvert sur Internet
Tout le trafic passe par le Cloudflare Tunnel. Aucun port n'est exposé directement sur la box.
PostgreSQL non exposé
Le port
5432 n'est pas mappé publiquement. Accessible uniquement via Tailscale ou depuis le réseau Docker proxy.Invalidation des sessions
Logout et change-password suppriment les sessions en BDD. Un token volé après logout devient inutilisable.
SECRET_KEY via variable d'env
La clé de signature JWT est injectée via
docker-compose.yml, jamais committée dans le code source Gitea.CORS restreint
L'API n'accepte des requêtes que depuis
dashboard.petitblaise.fr — tout autre domaine est rejeté.Points d'amélioration identifiés
Token stocké dans localStorage
Vulnérable aux attaques XSS. Alternative plus sûre : cookies
httpOnly. Acceptable pour un homelab solo, à améliorer.Pas de rate limiting
L'endpoint
/auth/login n'a pas de limite de tentatives. Un attaquant peut bruteforcer. À ajouter avec slowapi.Pas de refresh token
Après 24h le token expire et l'utilisateur est déconnecté. Un système de refresh token éviterait ça.
Carte SD à 78%
Les images Docker s'accumulent sur la carte SD. Nettoyage régulier conseillé :
docker image prune -f.homelab / architecture
Architecture Front / API / BDD
Articulation complète des couches applicatives et des flux de données.
Vue d'ensemble — 3 couches
Stack applicatif complet
Détail des tables BDD
Table users
idSERIAL PRIMARY KEY
usernameVARCHAR(50) UNIQUE NOT NULL
emailVARCHAR(255) UNIQUE NOT NULL
password_hashTEXT — bcrypt hash
roleVARCHAR(20) DEFAULT 'admin'
created_atTIMESTAMP DEFAULT NOW()
last_loginTIMESTAMP (mis à jour au login)
Table sessions
idSERIAL PRIMARY KEY
user_idFK → users(id) CASCADE DELETE
tokenTEXT UNIQUE — le JWT complet
created_atTIMESTAMP DEFAULT NOW()
expires_atTIMESTAMP — NOW() + 24h
ip_addressVARCHAR(45) — IPv4/IPv6
Réseaux Docker
proxycloudflared · homelab-api · vaultwarden · gitea · gitea-runner · postgres
media-stackjellyfin · sonarr · radarr · bazarr · jackett · qbittorrent · jellyseerr · flaresolverr
dev_pihole_netpihole
unbound_internalunbound
homelab / opérations
Ops & Commandes
Référence opérationnelle — commandes essentielles pour administrer et dépanner l'infrastructure.
API homelab-api
Statut & logs
vérifier
docker ps | grep homelab-api curl https://api.petitblaise.fr/health
logs temps réel
docker logs homelab-api --follow
Rebuild après modification
rebuild
cd ~/homelab-api docker compose up -d --build
PostgreSQL
Connexion & admin
psql
docker exec -it postgres \ psql -U petitblaise -d homelab
changer mot de passe
ALTER USER petitblaise WITH PASSWORD 'nouveau_mdp';
Backup & restore
backup
docker exec postgres pg_dump \ -U petitblaise homelab \ > /mnt/nas/backup_homelab.sql
restore
docker exec -i postgres psql \ -U petitblaise homelab \ < /mnt/nas/backup_homelab.sql
Docker général
Inspection
inspecter un container
docker inspect <nom> docker stats <nom> docker logs <nom> --tail 50
ports et réseaux
docker inspect <nom> | grep -A 10 Ports docker network inspect proxy
Nettoyage
nettoyer images orphelines
docker image prune -f docker system df
nettoyage complet (attention)
docker system prune -f
Cloudflare Tunnel
Ajouter un service
1Éditer
/opt/cloudflared/config.yml2Ajouter hostname + service
3CNAME dans Cloudflare DNS (nuage orange)
4
docker restart cloudflaredConfig actuelle
/opt/cloudflared/config.yml
tunnel: 54e97e12-…
ingress:
- hostname: vaultwarden…
service: http://vaultwarden:80
- hostname: gitea…
service: http://gitea:3000
- hostname: api…
service: http://homelab-api:8000
- service: http_status:404