Solide comme idée. Pour en faire un truc fiable (et pas te coller des “urgences 24/7”), voilà une archi simple, propre et maîtrisable.
Plan d’architecture (2 sites + 1 point d’entrée OVH)
Entrée publique
-
1 (idéalement 2) VPS OVH → HAProxy terminant TLS, SNI multi-domaines.
-
Tunnels WireGuard du/vers chaque site (Saint-Bruno, Lanaudière). Aucune IP d’origine exposée.
-
Pare-feu : n’autoriser que le trafic entrant 80/443 (et ports TCP mail si tu proxifies), et sortant uniquement vers les sous-réseaux WireGuard.
Sites
-
Deux stacks indépendantes (pas de Ceph across-WAN) :
-
Services stateless en actif-actif (Keycloak web, Portails, APIs).
-
Services stateful volumineux (Nextcloud, bases, stockage) en actif-passif par défaut pour ménager ton upload 50 Mbit/s : un site “primaire” sert en temps normal, l’autre prend le relais si down.
-
-
Réplication par service, pas au niveau bloc :
-
PostgreSQL: réplication streaming + pgBackRest/PITR.
-
MariaDB/MySQL: InnoDB Cluster/async répli (selon besoin RPO/RTO).
-
Redis (Nextcloud locking/cache) local par site; éviter du cross-site en continu.
-
Fichiers Nextcloud: primaire→secondaire via rsync/rsync-daemon ou rclone programmé (Δ fréquents, pas en live).
-
-
Mail (Mailcow) : inbound via MX séparés (mx1=Site A, mx2=Site B). Ne passe pas SMTP par HAProxy web, tu réduis la surface et simplifies SPF/DMARC. Le webmail/SOGo oui, derrière HAProxy.
DNS
-
Les domaines web (cloud., login., etc.) pointent vers l’IP du/des VPS OVH.
-
TTL 300 s (ou 120 s) raisonnable.
-
Les MX pointent directement vers chaque site (priorités différentes).
SPOF
-
Un seul HAProxy = SPOF. Reco : 2 VPS (CA1 + CA2 chez OVH) + keepalived (VRRP) avec une Failover IP OVH. Si tu veux rester ultra-sobre au départ : commence avec 1, mais tout est prêt pour en ajouter un second.
Topologie WireGuard (exemple)
-
OVH (wg-sb → 10.99.10.1/24 ; wg-ma → 10.99.20.1/24)
-
Saint-Bruno : 10.99.10.2/24 (route vers 10.10.0.0/16)
-
Lanaudière : 10.99.20.2/24 (route vers 10.20.0.0/16)
HAProxy n’envoie jamais vers l’Internet “brut”, seulement vers 10.10.x.x / 10.20.x.x via WG.
HAProxy — squelette minimal viable (TLS, SNI, health, mTLS backend)
global
log /dev/log local0
stats socket /var/run/haproxy.sock mode 660 level admin
tune.ssl.default-dh-param 2048
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
ssl-default-bind-ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
defaults
log global
mode http
option httplog
option http-keep-alive
timeout connect 5s
timeout client 60s
timeout server 60s
default-server init-addr last,libc,none resolvers dns1
resolvers dns1
nameserver dns1 127.0.0.1:53
hold valid 10s
# --- Frontend HTTPS
frontend fe_https
bind :443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1
http-response set-header Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
http-request set-header X-Forwarded-Proto https
http-request set-header X-Forwarded-For %[src]
acl host_nc hdr(host) -i cloud.chezlepro.ca
acl host_auth hdr(host) -i login.chezlepro.ca
use_backend bk_nextcloud if host_nc
use_backend bk_keycloak if host_auth
default_backend bk_default
# --- Nextcloud : actif-passif (Site A actif, Site B backup)
backend bk_nextcloud
balance source
option httpchk GET /status.php HTTP/1.1\r\nHost:\ cloud.chezlepro.ca
http-check expect status 200
cookie SRV insert indirect nocache
server nc-a 10.10.10.20:443 ssl verify required ca-file /etc/haproxy/ca.pem sni str(cloud.chezlepro.ca) check cookie A
server nc-b 10.20.10.20:443 ssl verify required ca-file /etc/haproxy/ca.pem sni str(cloud.chezlepro.ca) check cookie B backup
# --- Keycloak : actif-actif (sessions sticky par cookie)
backend bk_keycloak
balance leastconn
option httpchk GET /realms/master/.well-known/openid-configuration
http-check expect status 200
cookie KC insert indirect nocache
server kc-a 10.10.20.30:8443 ssl verify required ca-file /etc/haproxy/ca.pem sni str(login.chezlepro.ca) check cookie A
server kc-b 10.20.20.30:8443 ssl verify required ca-file /etc/haproxy/ca.pem sni str(login.chezlepro.ca) check cookie B
# --- Par défaut (autres VHosts)
backend bk_default
errorfile 503 /etc/haproxy/errors/maintenance.http
Notes clés
-
mTLS backend :
ssl verify required ca-file
→ HAProxy vérifie les certifs serveurs internes signés par ta CA privée. -
Nextcloud en backup cross-site par défaut → zéro flux croisé inutile. Basculera automatiquement si le primaire est down.
-
Keycloak en actif-actif avec cookie stickiness.
-
Prépare un /healthz par service pour des checks encore plus propres.
TCP (si tu proxifies IMAP/SMTP — facultatif)
frontend fe_smtp
bind :25
mode tcp
option tcplog
default_backend bk_smtp
backend bk_smtp
mode tcp
balance source
option smtpchk HELO haproxy.chezlepro.ca
server mx-a 10.10.30.25:25 check
server mx-b 10.20.30.25:25 check backup
Mais je recommande de laisser SMTP en DNS (MX) et de ne proxifier que le webmail.
Sécurité & résilience
-
DDoS: tirer parti de la mitigation OVH, + stick-tables pour rate-limiter (p.ex. 100 req/10s/src) et bloquer les floods.
-
Géoblocage (si tu veux limiter hors Amérique du Nord) via maps MaxMind dans HAProxy.
-
Certificats : Let’s Encrypt DNS-01 (acme.sh avec API OVH) → un seul endroit (VPS) gère tous les certs; reload Haproxy sans coupure.
-
Journaux: exporter en Rsyslog + Icinga/Prometheus (exporter HAProxy).
-
Runbook clair : bascule manuelle de “site actif” via socket admin (enable/disable server).
Réplication/backup (pragmatique, peu de babysitting)
-
Bases: primaire au site A, réplique asynchrone au site B; backups chiffrés vers l’autre site (pgBackRest/Borg).
-
Nextcloud: fichiers synchronisés pull site B depuis A via cron (rclone/rsync) + checksum; base répliquée; Redis local.
-
Monitoring: Icinga2 depuis ton nœud de supervision sur :
-
/healthz des services côté sites,
-
endpoints HAProxy,
-
latence/perte sur les tunnels WG.
-
Pourquoi ça te va bien
-
Aucune alerte 24/7 imposée : bascule auto pour l’essentiel; manual override simple si nécessaire.
-
Sobre en bande passante : actif-passif sur le lourd; actif-actif sur le léger.
-
Souverain : pas de SaaS tiers opaque; seulement OVH comme “pointe” réseau.
-
Évolutif : en 30 minutes tu ajoutes un 2e HAProxy (keepalived) et tu supprimes le SPOF.
Si tu veux, je te fournis dans le prochain message :
-
les fichiers wg-quick (OVH↔SB, OVH↔MA),
-
un haproxy.cfg complet avec 3 VHosts (Nextcloud, Keycloak, Webmail),
-
un petit playbook Ansible pour déployer tout ça propre sur un Debian minimal.
Oh oui, SteelHead… SDR + “TCP magic” + QoS finement dosée. On ne va pas racheter des appliances, mais on peut recréer 70–85% de l’effet en libre + bon design, adapté à tes 50 Mb/s up.
Voici le “SteelHead-like kit” pragmatique pour tes 2 sites + OVH :
1) Anti-bufferbloat & QoS (prioriser l’interactif, calmer le bulk)
Linux routeur (si ton edge est Linux) :
# Sysctl: BBR + fq
cat >/etc/sysctl.d/90-net.conf <<'EOF'
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
net.ipv4.tcp_fastopen=3
EOF
sysctl --system
# Shaping egress avec CAKE (idéal) – adapte if et débit (-10%)
tc qdisc replace dev eth_wan root cake bandwidth 45mbit diffserv4 nat
OPNsense/pfSense (FreeBSD) : active Smart Queue / FQ-CoDel sur l’interface WAN avec un cap à ~45 Mb/s (10% sous le max réel).
DiffServ : marque Keycloak/health/API en AF31/AF41, Nextcloud “bulk” en CS1 (scavenger). Marquage côté firewall (règles mangle/nftables ou floating rules). Résultat : latence stable, UI snappy même en sync lourde.
2) Compression & delta au bon endroit (pas dans le tunnel)
WireGuard n’a pas de compression (by design). On compresse par service :
-
Réplication Nextcloud (fichiers) : évite SMB/rsync en live chatty. Fais du pull périodique :
# Sur le site B (secondaire) rsync -aH --delete --info=stats2 --compress --compress-choice=zstd \ --skip-compress=jpg,jpeg,png,mp4,mov,zip,gz,7z,iso \ user@siteA:/data/nextcloud/ /data/nextcloud/
Cron la nuit + une petite passe horaire. (Delta-blocs + zstd = “effet SDR” sur fichiers… sans boîte magique.)
-
Bases PostgreSQL : réplication streaming + WAL compressé.
wal_compression=on
(ou lz4 si dispo),max_wal_senders=5
,wal_keep_size=512MB
. Sauvegardes pgBackRest (chiffre + compresse) vers l’autre site. -
Docker & paquets : mets des caches locaux pour apt (tu as déjà apt-cacher-ng), pip (devpi), npm (Verdaccio), Docker registry mirror. Zéro re-download inutile.
3) Protocole & patterns “WAN-friendly”
-
Évite SMB/NFS cross-site. Préfère WebDAV/SFTP (déjà le cas via Nextcloud) ou rsync scripté.
-
Mail: MX directs par site (priorités), pas via HAProxy. Webmail oui via HAProxy.
-
HTTP/2 + compression côté HAProxy :
compression algo zstd gzip compression type text/html text/css application/javascript application/json
(réduit l’egress web public, gratuit en perf.)
4) Contrôle fin des flux (façon QoS “savante”)
-
Marquage applicatif au bord (firewall) :
-
Keycloak
/auth/*
→ AF31 -
APIs légères → AF21
-
Nextcloud
/remote.php/dav
&/ocs/v2.php/apps/files_sharing
(sync lourde) → CS1
-
-
Rate-limit par IP/route pour la sync Nextcloud (tc classes / FQ-CoDel per-class) : cap à, disons, 30 Mb/s quand quelqu’un pousse un gros lot, pour garder 15 Mb/s “temps réel”.
5) Stack TCP solide
Sur tous les serveurs exposés au WAN :
cat >/etc/sysctl.d/91-tcp.conf <<'EOF'
net.ipv4.tcp_rmem=4096 131072 134217728
net.ipv4.tcp_wmem=4096 131072 134217728
net.ipv4.tcp_mtu_probing=1
EOF
sysctl --system
BBR + fq = démarrages plus rapides, files réduites, “ressenti” SteelHead sans proxy TCP propriétaire.
6) Ordonnancement “no babysitting”
-
Nextcloud : cron système (toutes les 5 min), pré-génération des previews en heures creuses, throttle (limiter la concurrence, éviter le CPU en journée).
-
Rsync/rclone : fenêtres nocturnes + petite passe delta en journée (5–10 min), bande passante bwlimit si besoin.
-
Bascules : Nextcloud en actif-passif (HAProxy backup), Keycloak en actif-actif avec sticky cookie. Tu évites le cross-talk permanent.
7) Observabilité (= pas d’urgences 24/7)
-
Icinga2 : checks
/healthz
applicatifs + latence/perte sur tunnels WG. -
Flent (RRUL) ponctuel pour valider le tuning (avant/après).
-
HAProxy stick-tables pour rate-limit propres (ex: 100 req/10s/src).
8) Bonus “SteelHead spirit” pour demain
-
Si un jour tu as 2 liens Internet/site, on active MPTCP (côté Linux) ou une box open-source type OpenMPTCProuter pour l’agrégation/bonding — dans WireGuard (inside) pour la crypto et la simplicité d’IP.
Si tu veux, je te prépare :
-
un bundle Ansible “edge-qos” (BBR, fq/CAKE, classes CS1/AF*),
-
des règles nftables de marquage par URL/port (OVH & sites),
-
les unit files & crons pour rsync/rclone (zstd + skip-compress),
-
et les snippets HAProxy (compression, maps DSCP, rate-limit).
Tu me dis sur quoi tourne ton edge (OPNsense vs Linux), et je te sors ça clé-en-main.