Aller au contenu

Déploiement complet : VPS sécurisé, Docker et Reverse Proxy

Infrastructure DevOps Avril 2026
4
Étapes clés
2
Conteneurs
A
SSL Rating
En production

🏗️ Problématique
#

L’objectif était d’héberger ce portfolio sur une infrastructure que je contrôle entièrement, sans dépendre d’un hébergement mutualisé opaque. Cela impliquait de :

  • Sécuriser un serveur exposé sur Internet dès le premier démarrage
  • Isoler les services via la conteneurisation
  • Gérer le HTTPS automatiquement avec Let’s Encrypt
  • Maintenir la stack facilement dans le temps

La contrainte principale : repartir de zéro sur un Debian 12 vierge.


🛡️ Étape 1 — Hardening du serveur
#

La première étape est critique : un VPS non sécurisé essuie des milliers de tentatives de connexion par jour dès son exposition sur Internet.

Actions réalisées :
  • Création d'un utilisateur non-root avec droits sudo, désactivation du compte root SSH.
  • Migration du port SSH vers un port personnalisé, (réduction du bruit automatisé).
  • Configuration UFW : uniquement ports 80, 443 et SSH (personnalisé) autorisés.
  • Installation Fail2Ban avec jail SSH active (bannissement auto après 5 échecs).
# Configuration UFW
ufw default deny incoming
ufw default allow outgoing
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow ****/tcp
ufw enable

# Vérification du statut
ufw status verbose

🐳 Étape 2 — Infrastructure Docker
#

Pour isoler les services et simplifier les déploiements futurs, j’ai opté pour Docker Compose. L’architecture repose sur deux services dans un réseau bridge dédié.

Architecture
#

Internet
[Port 80/443]
Nginx Proxy Manager ──── Réseau Docker "proxy_net"
    │                               │
    └──────────────────────────── Portfolio (nginx:alpine)
                                  /html (volume ro)

docker-compose.yml
#

version: "3.8"

networks:
  proxy_net:
    driver: bridge

services:
  nginx-proxy-manager:
    image: jc21/nginx-proxy-manager:latest
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "81:81"        # Interface d'admin NPM
    volumes:
      - ./data/npm:/data
      - ./data/letsencrypt:/etc/letsencrypt
    networks:
      - proxy_net

  portfolio:
    image: nginx:stable-alpine
    restart: unless-stopped
    volumes:
      - ./html:/usr/share/nginx/html:ro
    networks:
      - proxy_net
    # Pas d'exposition directe — uniquement via NPM

🔐 Étape 3 — SSL et Reverse Proxy
#

Nginx Proxy Manager centralise toute la gestion SSL via son interface web. La configuration d’un proxy host ne prend que 2 minutes.

Configuration Proxy Host :
  • Domain names : lucas-falvo.fr, www.lucas-falvo.fr
  • Forward hostname : portfolio (nom du service Docker)
  • Forward port : 80
  • SSL : Let's Encrypt + Force SSL + HTTP/2 activés

🚀 Étape 4 — Déploiement Hugo
#

Le portfolio est généré en fichiers statiques par Hugo, puis le dossier public/ est placé dans ./html/ sur le serveur.

# Build local
hugo --minify

# Envoi vers le VPS (depuis le poste local)
rsync -avz --delete ./public/ user@lucas-falvo.fr:/opt/portfolio/html/

# Sur le serveur — restart conteneur si besoin
docker compose restart portfolio

#

✅ Résultats & Bilan
#

0 intrusion
depuis la mise en ligne
A
SSL Labs Score
< 30 min
Temps de redéploiement

Ce projet m’a permis de consolider mes connaissances en hardening Linux, de pratiquer Docker Compose dans un contexte réel, et de comprendre la gestion SSL end-to-end. La stack est aujourd’hui utilisée en production pour ce portfolio.