Un homelab production-grade
sur trois Raspberry Pi.
Pas un labo qui prend la poussière : un vrai cluster Docker Swarm qui héberge des applications publiques — haute dispo jusqu'aux bases de données, SSO, secrets pilotés, sauvegardes chiffrées hors-site, observabilité complète, le tout en infrastructure-as-code. Cette page elle-même tourne dessus.
$ make status
NODE STATE MANAGER NODE STATE MANAGER
rpi4 Ready Leader rpi52 Ready Reachable
rpi51 Ready Reachable
STACK REPLICAS NOTE
ingress 9/9 traefik actif/actif ×3
pgha 3/3 etcd quorum 3/3
stickers 8/8 pg: Leader + Replica, lag 0
observability 14/14 metrics · logs · traces
backup 2/2 snapshot: cette nuit ✓
… 14 stacks, 47 services, 0 incident Docker Swarm HA
3 nœuds tous managers (quorum 2/3), ingress actif/actif, apps qui flottent — validé par une matrice de 6 drills (sortie propre + crash, sur chaque nœud).
Bases HA — Patroni
Une base Postgres dédiée par app, chacune en cluster 2 membres avec failover automatique (etcd + HAProxy). Perdre un nœud ne coupe ni ne perd les données.
0 port ouvert
Tout passe par un Cloudflare Tunnel. Aucune redirection de port sur la box.
Secrets : un seul master
Bitwarden Secrets Manager pilote ~70 secrets : plus de mot de passe en clair dans les .env, rotation en 3 commandes, reprise = un rendu.
IPS + WAF
CrowdSec sur l'ingress : réputation d'IP + pare-feu applicatif (CRS) devant les apps publiques.
SSO Authelia
Authentification unique + 2FA et fournisseur OIDC pour les apps maison — répliqué, lui aussi.
Scale-to-zero
Sablier endort les apps inactives et les réveille à la demande, page d'attente incluse.
Déploiement continu
GitHub Actions → n8n → R2 : cette vitrine se déploie toute seule à chaque push, sans coupure.
Backups offsite
restic chiffré → Cloudflare R2, dumps Postgres applicatifs, planifiés et vérifiés.
Observabilité
Métriques + logs + traces (Prometheus, Grafana, Loki, Tempo) — et la veille des releases qui pousse sur le téléphone via ntfy.
Le carnet de bord
Retours d'expérience, pannes disséquées et choix d'architecture — appris en cassant des trucs, puis en les réparant.