Architecture — Vue d'ensemble
Ce document décrit l'architecture physique et logique du homelab DevSecOps. Elle repose sur trois principes : isolation au niveau applicatif, sécurité par couches, et reproductibilité par le code.
Cluster Proxmox — 3 nœuds identiques
Le socle de l'infrastructure est un cluster Proxmox VE 9.2 composé de trois Nab6-Lite (Intel NUC-like). Chaque nœud est rigoureusement identique :
| Composant | Spécification |
|---|---|
| CPU | Intel Core i5-12600H (12 cœurs / 16 threads) |
| RAM | 16 Go (pve01), 32 Go (pve02, pve03) |
| Stockage système | 500 Go NVMe (Proxmox OS) |
| Stockage VMs | 1 To SSD (datastore local) |
| Réseau | 1 × NIC 1 Gbps |
| Modèle | Nab6-Lite |
Pas de HA, pas de Ceph. Chaque VM vit sur le nœud où elle est créée. En cas de panne d'un nœud, ses VMs sont indisponibles jusqu'à la restauration. C'est un choix délibéré : sur 3 nœuds avec 1 GbE et pas de switch managé, un cluster Ceph ferait plus de mal que de bien.
Répartition des charges
Chaque nœud a un rôle défini :
pve01 — Control Plane & Réseau — 192.168.1.10 (16 Go)
Point d'entrée unique de l'infrastructure. Expose les services vers l'extérieur (Traefik), centralise le code (GitLab) et les secrets (Vault).
| ID | VM | vCPU | RAM | Stockage | IP |
|---|---|---|---|---|---|
| 101 | traefik |
1 | 2 Go | 20 Go | 192.168.1.20 |
| 102 | gitlab |
4 | 8 Go | 200 Go | 192.168.1.21 |
| 103 | vault |
1 | 2 Go | 20 Go | 192.168.1.22 |
| Total nœud | 6 | 12 Go | 240 Go |
pve02 — Data, Sécurité & Observabilité — 192.168.1.11 (32 Go)
Héberge les services de registre, monitoring, SSO et gestion de vulnérabilités. Aucun service exposé directement sur Internet.
| ID | VM | vCPU | RAM | Stockage | IP |
|---|---|---|---|---|---|
| 201 | harbor |
2 | 4 Go | 80 Go | 192.168.1.30 |
| 202 | monitoring |
2 | 4 Go | 100 Go | 192.168.1.31 |
| 203 | keycloak |
2 | 4 Go | 40 Go | 192.168.1.32 |
| 204 | defectdojo |
2 | 4 Go | 50 Go | 192.168.1.33 |
| Total nœud | 8 | 16 Go | 270 Go |
pve03 — Kubernetes Platform — 192.168.1.12 (32 Go)
Cluster Kubernetes k3s orchestré en GitOps via ArgoCD. Les applications Python (FastAPI, Streamlit, Flask) sont déployées ici.
| ID | VM | vCPU | RAM | Stockage | IP |
|---|---|---|---|---|---|
| 301 | k3s-master |
2 | 4 Go | 40 Go | 192.168.1.40 |
| 302 | k3s-worker01 |
3 | 6 Go | 100 Go | 192.168.1.41 |
| 303 | k3s-worker02 |
3 | 6 Go | 100 Go | 192.168.1.42 |
| Total nœud | 8 | 16 Go | 240 Go |
Contrainte réseau : pas de switch managé
Le réseau domestique est en 192.168.1.0/24 avec la passerelle Freebox en 192.168.1.254. Aucun switch manageable — donc pas de VLANs 802.1Q physiques.
Comment isoler malgré tout ?
Dans cette topologie, toutes les VMs sont sur le même segment L2. L'isolation repose sur :
| Couche | Mécanisme | Rôle |
|---|---|---|
| Firewall applicatif | UFW sur chaque VM | Blocage des ports non nécessaires, restriction des sources autorisées |
| Anti-bruteforce | Fail2Ban sur chaque VM | Bannissement temporaire après X échecs SSH ou HTTP |
| Firewall Proxmox | nftables sur l'hyperviseur | Protection du nœud Proxmox lui-même (management, API) |
Pourquoi pas nftables sur le Proxmox pour le filtrage inter-VM ? En flat network, les paquets entre VMs d'un même bridge ne traversent pas la chaîne
forwardde l'hyperviseur — le switch virtuel les délivre directement. Le seul endroit où filter est efficace, c'est sur la VM elle-même (INPUT chain via UFW).
Point d'entrée unique
Tout le trafic externe passe par traefik (192.168.1.20), ports 80 et 443 uniquement.
Internet (Freebox)
│
├── 80/443 → traefik.mounik.ovh
│ ├── gitlab.mounik.ovh → 192.168.1.21
│ ├── vault.mounik.ovh → 192.168.1.22
│ ├── harbor.mounik.ovh → 192.168.1.30
│ ├── grafana.mounik.ovh → 192.168.1.31
│ ├── keycloak.mounik.ovh → 192.168.1.32
│ ├── defectdojo.mounik.ovh → 192.168.1.33
│ ├── argocd.mounik.ovh → 192.168.1.40 (via k3s Ingress)
│ └── app-*.mounik.ovh → 192.168.1.41/42 (via k3s Ingress)
│
└── challenge DNS Let's Encrypt (API OVH)
Certificats TLS : wildcard *.mounik.ovh via Let's Encrypt en challenge DNS OVH.
CrowdSec : déployé sur la VM traefik en mode bouncer pour bannir automatiquement les IPs malveillantes.
Authentification centralisée
Keycloak (keycloak.mounik.ovh) est le fournisseur SSO OIDC unique. Tous les services exposés (GitLab, Grafana, Harbor, DefectDojo, ArgoCD) délèguent leur authentification à Keycloak. Un seul compte, un seul mot de passe, une seule session.
Gestion des secrets
Tous les credentials (clés API, tokens, mots de passe) sont dans Vault (vault.mounik.ovh) — jamais en clair dans le code ni dans les variables CI/CD. Les pipelines GitLab.com utilisent vault agent pour injecter les secrets au moment du déploiement.
Choix techniques
| Choix | Alternative | Justification |
|---|---|---|
| Proxmox VE | VMware vSphere, Hyper-V | Open-source, API REST native, intégration OpenTofu, gratuit |
| OpenTofu | Terraform | Fork open-source de Terraform après la licence BSL (2023). Syntaxe HCL identique. Supporté par la Linux Foundation. En entreprise les deux coexistent — maîtriser l'un c'est maîtriser l'autre. |
| Ansible | Puppet, SaltStack | Agentless, SSH uniquement, idéal pour un homelab sans infrastructure de gestion |
| GitLab.com | Self-hosted GitLab | Pas de负担运维. Le code IaC vit sur GitLab.com, la CI/CD déploie sur le homelab. |
| k3s | k3s standard, MicroK8s | Certifié Kubernetes, léger (binaire unique), SQLite au lieu d'etcd → économique en RAM |
| Traefik v3 | Nginx, HAProxy | Découverte auto des services, support Let's Encrypt natif, middleware CrowdSec |
| Vault | SOPS + Age, Bitwarden | PKI interne, rotation automatique, audit trail complet |
| Keycloak | Authelia, Authentik, Dex | SSO OIDC mature, gestion fine des rôles, federation, standard industriel |
| ArgoCD | Flux CD, Jenkins X | GitOps pur, interface web, sync automatique, multi-cluster |
| CrowdSec | Fail2ban | Blocklist communautaire partagée, bouncer Traefik natif, métriques Prometheus |
| UFW + Fail2Ban | nftables pur | Simplicité de gestion par VM, adapté au flat network. Fail2Ban pour la couche anti-bruteforce |
Pour aller plus loin
- Plan réseau — adressage IP, DHCP, DNS
- Dimensionnement des VMs — justifications CPU/RAM/stockage
- Matrice de flux — règles UFW par VM, hardening SSH
- Phases de déploiement — ordre de construction du homelab