Infrastructure as Code du homelab : Kubernetes, monitoring, media stack, cloud et documentation.
  • Shell 53.7%
  • Python 46.1%
  • Dockerfile 0.2%
Find a file
2026-06-22 15:52:00 +02:00
.forgejo/workflows fix(cicd): corriger paths Dev/ manquants dans tous les workflows 2026-05-03 22:52:40 +02:00
00_docs docs(roadmap): plan de souveraineté IA et repli vérification ID Anthropic 2026-06-22 15:51:25 +02:00
10_runbooks feat(headscale): accès distant UE5 Brokkr→Surface via VPN auto-hébergé 2026-06-18 22:29:13 +02:00
20_services feat(headscale): accès distant UE5 Brokkr→Surface via VPN auto-hébergé 2026-06-18 22:29:13 +02:00
.gitignore gitignore update 2026-05-16 13:06:48 +02:00
index.md feat(headscale): accès distant UE5 Brokkr→Surface via VPN auto-hébergé 2026-06-18 22:29:13 +02:00
README.md fix(mimir): migration share media→library, NFSv3, ACL Synology UID 1000 2026-05-04 21:18:57 +02:00

Homelab — Infrastructure complète auto-hébergée

Infrastructure personnelle de production conçue selon les bonnes pratiques de l'industrie : Kubernetes multi-nœuds, observabilité complète, backups chiffrés hors-site, SSO, TLS automatique.


Architecture

Quatre nœuds physiques avec des rôles bien distincts, interconnectés en 10GbE (Mimir ↔ Yggdrasil/Bragi) et 1GbE (reste du LAN) :

Nœud Matériel Rôle
Yggdrasil HP MicroServer Gen11 — Xeon E-2434, 64 Go DDR5 ECC, 4× SSD 4 TB ZFS Serveur principal — k3s control plane, tous les services applicatifs
Bragi Silverstone RM51 — i9-10900K, 32 Go DDR4, RTX 3080 10 Go Nœud k3s agent GPU — Jellyfin NVENC/NVDEC, workloads GPU
Heimdall Raspberry Pi 4 8 Go Gardien réseau — VPN WireGuard, firewall UFW, monitoring
Mimir Synology RS2423RP+ — 4× 16 TB SHR-2, 10GbE NAS — stockage centralisé NFS (~29 TB usable, Btrfs)
                            INTERNET
                                │
                     ┌──────────┴──────────┐
                     │ home.blanc.swiss     │  (Let's Encrypt DNS-01)
                     │ *.blanc.swiss        │
                     └──────────┬──────────┘
                                │ 443/TCP · 51820/UDP
                                ▼
                    ┌───────────────────────┐
                    │  Box (192.168.1.1)    │
                    └───────────┬───────────┘
                                │ LAN 192.168.1.0/24
          ┌─────────────────────┼───────────────────────┐
          ▼                     ▼                        ▼
┌──────────────────┐  ┌──────────────────┐   ┌──────────────────┐
│ Heimdall .12     │  │ Yggdrasil .10    │   │    Mimir .14     │
│                  │  │                  │   │                  │
│ WireGuard VPN    │  │ k3s server       │   │ NFS exports      │
│ UFW Firewall     │  │ ingress-nginx    │   │ /volume1/library   │
│ Prometheus       │  │ cert-manager     │   │ /volume1/nc      │
│ Grafana          │  │ Namespaces:      │   │ /volume1/forgejo │
│ Alertmanager     │  │  media / cloud   │   │                  │
│ NUT slave        │  │  services / ai   │   │ SHR-2 — 2 disk   │
│                  │  │  auth            │   │ fault tolerance  │
└──────────────────┘  └────────┬─────────┘   └──────────────────┘
                               │ k3s cluster
                               ▼
                    ┌──────────────────────┐
                    │  Bragi .13           │
                    │                      │
                    │  k3s agent GPU       │
                    │  taint: gpu=true     │
                    │  Jellyfin NVENC      │
                    │  nvidia-device-plugin│
                    └──────────────────────┘

Stack technique

Orchestration & Infrastructure

  • Kubernetes (k3s) — cluster multi-nœuds avec scheduling GPU via taints/tolerations
  • ingress-nginx — reverse proxy avec terminaison TLS
  • cert-manager — certificats Let's Encrypt automatiques via DNS-01 challenge (Infomaniak)
  • Authelia — SSO portal avec TOTP/WebAuthn pour les apps exposées
  • ZFS RAIDZ1 — pool local Yggdrasil pour configs et bases de données
  • NFS NFSv4.1 — stockage bulk centralisé sur Mimir (10GbE)

Services hébergés

Namespace Services
media Jellyfin (GPU Bragi), Radarr, Sonarr, Lidarr, Prowlarr, Jellyseerr, Kavita, Flow
cloud Nextcloud + PostgreSQL + Redis
services Forgejo + PostgreSQL, Vaultwarden, qBittorrent, FlareSolverr
ai Dify (api/web/worker), Qdrant (vector DB), MCP Server, PostgreSQL, Redis
auth Authelia + Redis
cert-manager cert-manager + webhook Infomaniak

Observabilité (Heimdall — Docker)

  • Prometheus — scraping de tous les nœuds et services
  • Grafana — dashboards (nœuds, GPU, UPS, Kubernetes, NAS)
  • Alertmanager — notifications email (SMTP Infomaniak)
  • Exporters : node-exporter (RPi), kube-state-metrics, NUT exporter (UPS), idrac-exporter (HP iLO), WireGuard exporter, SNMP exporter (Synology NAS), blackbox exporter, kubelet cAdvisor (endpoint natif k3s)

Réseau & Sécurité

  • WireGuard (Bifrost) — VPN site-to-any sur Heimdall, réseau 10.8.0.0/24
  • UFW — firewall Heimdall, deny by default, NAT/masquerade VPN → LAN
  • TLS — tous les services publics en HTTPS via ingress-nginx + cert-manager
  • SSO — Authelia protège kavita.blanc.swiss et flow.blanc.swiss (TOTP)

Stockage & Backups

  • ZFS RAIDZ1 (Yggdrasil) — 4× SSD 4 TB, snapshots quotidiens avec rotation 7j/4w/3m
  • Btrfs SHR-2 (Mimir) — tolérance 2 pannes disques, ~29 TB usable
  • restic — backup chiffré quotidien vers Infomaniak Swiss Backup : configs, Nextcloud, Forgejo, livres Kavita, dumps PostgreSQL (Nextcloud, Forgejo, Dify), état etcd k3s
  • Alertes Prometheus — notification si backup sans succès depuis > 25h

GPU / IA

  • NVIDIA Device Plugin k3s — expose nvidia.com/gpu comme ressource Kubernetes
  • NVENC/NVDEC — transcodage hardware H.264/H.265 dans Jellyfin (RTX 3080)
  • Dify — plateforme d'agents IA avec LLM externes (Infomaniak AI)
  • Qdrant — base vectorielle pour la mémoire des agents
  • MCP Server — serveur custom Model Context Protocol (homelab context)

Domaines publics

Domaine Service Auth
cloud.blanc.swiss Nextcloud Nextcloud native
vault.blanc.swiss Vaultwarden Vaultwarden native
git.blanc.swiss Forgejo Forgejo native
ia.blanc.swiss Dify Dify native
kavita.blanc.swiss Kavita Authelia SSO + TOTP
flow.blanc.swiss Flow — client YouTube/YouTube Music Authelia SSO + TOTP
qbit.blanc.swiss qBittorrent Ingress auth
auth.blanc.swiss Authelia portal
home.blanc.swiss Hello-world (test ingress TLS)

Structure du dépôt

homelab/
├── 00_docs/          # Documentation conceptuelle — architecture, concepts, décisions
├── 10_runbooks/      # Procédures opérationnelles — reconstruire, déployer, dépanner
└── 20_services/      # Source déclarative — manifests K8s, configs, scripts

00_docs/ — Documentation vivante, lisible, qui explique le pourquoi des choix techniques.

10_runbooks/ — Procédures pas-à-pas organisées par nœud (01_yggdrasil/, 02_heimdall/, 03_bragi/, 04_mimir/). Chaque runbook permet de reconstruire un composant de zéro.

20_services/ — Source de vérité déclarative : manifests Kubernetes, configuration Prometheus/Alertmanager, scripts systemd (backup, déduplication, métriques), configs WireGuard.

index.md — Navigation complète vers tous les runbooks et la documentation.


Thème nordique

Nom Signification
Yggdrasil L'arbre-monde — centre de tous les royaumes
Bragi Dieu de la poésie — barde d'Asgard
Heimdall Gardien du Bifrost — veille sur tout
Mimir Gardien du puits de la sagesse
Bifrost Le pont entre les mondes (tunnel WireGuard)

Projet personnel maintenu par Julien Blanc.