🏗️ 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.
- ›Création d'un utilisateur non-root avec droits
sudo, désactivation du compterootSSH. - ›Migration du port SSH de 22 → 4915 (port personnalisé, réduction du bruit automatisé).
- ›Configuration UFW : uniquement ports 80, 443 et 4915 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 4915/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.
- ›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 #
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.