Aller au contenu

Réplique d'urgence : comment avoir votre serveur domestique sauvegardé sur un VPS

Rogelio Guerra Riverón
Auteur
Rogelio Guerra Riverón
Construction de ma propre infrastructure web depuis zéro. Je documente chaque étape : serveurs, réseaux, conteneurs et tout ce qui se présente.

Avoir un serveur à la maison présente un point faible évident : s’il y a une coupure d’électricité, le routeur tombe en panne, ou le disque meurt, ton site disparaît. La solution est d’avoir une réplique dans le cloud prête à s’activer en quelques minutes.

L’architecture
#

[servidor-casa]  →  rsync cada 6h  →  [VPS réplica]
  servicios activos                    réplica en espera
  TTL DNS: 5 min                       Uptime Kuma vigilando

Le serveur de la maison envoie le contenu au VPS toutes les 6 heures. Si le serveur tombe en panne, je change le DNS et en 5 minutes le VPS diffuse le site.

Pourquoi push et pas pull ?
#

Le serveur de la maison se trouve derrière un routeur domestique (Digi). Le routeur n’a que les ports 80 et 443 ouverts. Le VPS ne peut pas se connecter en SSH au serveur de la maison directement.

La solution : le serveur de la maison envoie au VPS (il a la sortie SSH libre), le VPS reçoit uniquement.

Préparation du VPS
#

Le VPS (Debian 12, 2 CPUs, 4 GB RAM, 30 GB disque) avait déjà Docker installé. D’abord, la sécurité :

# UFW: solo lo necesario
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

# Fail2ban SSH
sudo apt-get install -y fail2ban
# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 7d
findtime = 1h
maxretry = 3
ignoreip = 127.0.0.1/8 <IP_PUBLICA_CASA>

[sshd]
enabled = true
# SSH: solo clave pública
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl reload sshd

Traefik comme proxy inverse
#

Même Traefik v2.11 que sur le serveur de la maison, avec Let’s Encrypt automatique :

services:
  traefik:
    image: traefik:v2.11
    command:
      - --providers.docker=true
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.letsencrypt.acme.email=tu@email.com
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
    ports:
      - "80:80"
      - "443:443"

Uptime Kuma : surveillance externe
#

Uptime Kuma surveille le serveur de la maison de l’extérieur. S’il ne répond pas, alerte immédiate par email :

  uptime-kuma:
    image: louislam/uptime-kuma:1
    volumes:
      - ./data:/app/data
    labels:
      - traefik.enable=true
      - traefik.http.routers.uptime.rule=Host(`uptime.serviciosrogeliowar.com`)
      - traefik.http.routers.uptime.entrypoints=websecure
      - traefik.http.routers.uptime.tls.certresolver=letsencrypt

Répliques en attente
#

Les services web et blog s’exécutent sur le VPS mais avec traefik.enable=false — Traefik les ignore, ils ne sont pas accessibles depuis internet. Ils ne s’activent qu’en cas d’urgence :

  web-replica:
    image: nginx:alpine
    labels:
      - traefik.enable=false  # ← cambiar a true en emergencia

Script rsync depuis le serveur de la maison
#

#!/bin/bash
# ~/infra/sync-to-vps.sh
VPS="usuario@<IP_PUBLICA_VPS>"
SSH_KEY="~/.ssh/id_ed25519"

rsync -az --delete \
  -e "ssh -i $SSH_KEY -o StrictHostKeyChecking=no" \
  ~/infra/blog/public/ \
  ${VPS}:~/infra/blog/public/

rsync -az --delete \
  -e "ssh -i $SSH_KEY -o StrictHostKeyChecking=no" \
  ~/infra/web/html/ \
  ${VPS}:~/infra/web/html/

Crontab sur le serveur de la maison :

0 */6 * * * ~/infra/sync-to-vps.sh

Procédure de basculement en cas d’urgence
#

Quand le serveur de la maison tombe en panne :

  1. Éditer sur le VPS : changer traefik.enable=false à traefik.enable=true dans web et blog
  2. docker compose up -d dans chaque répertoire
  3. Dans le panneau DNS, changer l’enregistrement A de ton domaine de l’IP du serveur de la maison à l’IP du VPS
  4. Avec un TTL de 5 minutes, en moins de 10 minutes le site est rétabli

Quand le serveur de la maison se rétablit, processus inverse : restaurer le DNS, revenir à traefik.enable=false sur le VPS.

Résultat
#

  • Uptime Kuma surveillant de l’extérieur sur uptime.serviciosrogeliowar.com
  • rsync automatique toutes les 6 heures — maximum 6 heures de contenu perdu en cas de défaillance
  • Temps de récupération (RTO) : ~5 minutes
  • Perte maximale de données (RPO) : ~6 heures
  • Coût supplémentaire : uniquement le VPS (je l’avais déjà)

Pour un serveur domestique, cette architecture est plus que suffisante.


Équipement recommandé
#

Liens d’affiliation. Aucun frais supplémentaire pour toi.