1. Achat du VPS
Achat chez OVH d’un VPS-1 avec la distribution Debian 12 et Docker installé.
2. Première connexion SSH
Récupérer le mot de passe généré sur l’interface d’OVH et ensuite se connecter en SSH via la commande :
ssh debian@IP_DU_VPS
Puis créer un nouveau mot de passe sur le VPS.
3. Sécurisation du VPS
3.1 Security update
sudo apt update && sudo apt upgrade -y
3.2 Installation des locales
sudo apt install locales -y
sudo dpkg-reconfigure locales
Sélectionner :
- fr_BE.UTF-8
- C.UTF-8
3.3 Créer un utilisateur avec des droits restreints
sudo adduser deploy
sudo usermod -aG sudo deploy
sudo usermod -aG docker deploy
→ On évite de travailler en root.
3.4 Configuration SSH
3.4.1 Sur ton Mac (local)
ssh-keygen -t ed25519 -f ~/.ssh/id_ovh_vps
3.4.2 Copier la clé vers le VPS
ssh-copy-id -i ~/.ssh/id_ovh_vps.pub deploy@IP_DU_VPS
Ensuite, on ajoute la clé dans notre agent SSH sur Mac :
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ovh_vps
Cela doit fonctionner :
ssh deploy@IP_DU_VPS
3.4.3 Désactiver le login par mot de passe
Sur le VPS :
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
Modifier tout par :
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
PermitRootLogin no
UsePAM no
Puis :
sudo systemctl restart ssh
Du coup maintenant, le VPS est accessible en SSH uniquement avec la clé privée du Mac et l’utilisateur deploy.
ssh debian@IP_DU_VPS
ssh debian@IP_DU_VPS
debian@IP_DU_VPS: Permission denied (publickey).
Il faut aussi ajouter dans la configuration SSH de notre Mac le host et quelle clé privée utiliser :
nano ~/.ssh/config
Et ajouter :
Host IP_DU_VPS
HostName IP_DU_VPS
User deploy
IdentityFile ~/.ssh/id_ovh_vps
IdentitiesOnly yes
ssh deploy@IP_DU_VPS
→ OK
🔥 ÉTAPE 4 — Firewall UFW (ESSENTIEL)
sudo apt install ufw -y
Règles de base :
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
AJOUT IMPORTANT pour Docker
Créer une règle spéciale :
sudo nano /etc/ufw/after.rules
Ajouter à la fin :
# Docker integration
*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -j RETURN
COMMIT
Si il faut recharger les règles du firewall :
sudo ufw reload
→ Cela évite que Docker bypass complètement le firewall.
Pour vérifier si tout est OK :
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80 ALLOW IN Anywhere
443 ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80 (v6) ALLOW IN Anywhere (v6)
443 (v6) ALLOW IN Anywhere (v6)
→ Tout le reste est bloqué par défaut.
🛡️ ÉTAPE 5 — Fail2ban (anti brute force)
sudo apt install fail2ban -y
Vous pouvez personnaliser les fichiers de configuration Fail2ban pour protéger les services exposés à Internet public contre les tentatives de connexion répétées.
Comme le recommande Fail2ban, créez un fichier de configuration local de vos services en copiant le fichier "jail" :
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
→ Protège SSH automatiquement.
🧱 ÉTAPE 6 — Sécuriser Docker (important)
Créer la configuration du daemon :
sudo nano /etc/docker/daemon.json
Mettre :
{
"icc": false,
"live-restore": true,
"userland-proxy": false
}
Redémarrer :
sudo systemctl restart docker
📦 ÉTAPE 8 — Installer les outils utiles
sudo apt install -y \
git \
curl \
htop \
nano \
ca-certificates \
gnupg
🧪 ÉTAPE 9 — Test sécurité réseau
Vérifier les ports ouverts :
ss -tulnp
→ Tu dois voir uniquement SSH + rien d’exotique.
🧭 ÉTAPE 10 — Préparer Docker runtime
Même si préinstallé :
docker --version
docker compose version
🚨 CHECK FINAL AVANT DÉPLOIEMENT
Ton VPS est OK si :
- ✔ SSH key only actif
- ✔ Root login désactivé
- ✔ UFW actif
- ✔ Ports 80/443 ouverts
- ✔ Fail2ban actif
- ✔ Docker OK
- ✔ Aucune DB exposée
🧠 ARCHITECTURE SÉCURISÉE FINALE
Internet
↓
UFW Firewall
↓
SSH (clé uniquement)
↓
Docker Engine
↓
Traefik (reverse proxy)
↓
Applications isolées
🧭 ÉTAPE 11 — DÉPLOIEMENT APPLICATIONS
Sur le VPS, d’abord on crée l’environnement avec les fichiers Docker nécessaires :
sudo mkdir -p /var/www/myhomehub
sudo chown -R deploy:deploy /var/www/myhomehub
Ensuite depuis le local :
scp -r docker deploy@IP_DU_VPS:/var/www/myhomehub/
Maintenant on se place dans :
cd /var/www/myhomehub/docker/prod
docker compose up -d
Et on doit créer un PAT (Personal Access Token) dans GitHub pour récupérer nos images Docker sur GitHub :
https://github.com/settings/tokens
Scopes obligatoires :
- read:packages
- repo (si dépôt privé)
Solution provisoire car expire dans le temps.
Et maintenant, docker compose up -d doit récupérer nos images sur GitHub correctement.
Étape deployment
Il faut aussi définir les variables d’environnement GitHub Actions dans GitHub ici :
https://github.com/Pistonman33/MyHomeHub/settings/secrets/actions
Il faudra aussi créer une clé publique/privée localement comme client et ensuite copier la clé publique sur le VPS et la clé privée dans GitHub Actions :
ssh-keygen -t ed25519 -C "github-actions-myhomehub"
Tu vas obtenir 2 fichiers :
~/.ssh/github_actions_myhomehub ← PRIVATE KEY
~/.ssh/github_actions_myhomehub.pub ← PUBLIC KEY
cat ~/.ssh/github_actions_myhomehub.pub
Sur le VPS :
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
sudo chmod 600 ~/.ssh/authorized_keys
sudo chmod 700 ~/.ssh
On ajoute la clé publique pour GitHub Actions :
cat ~/.ssh/github_actions_myhomehub
Maintenant nous pouvons utiliser GitHub Actions pour déployer en production sur notre VPS OVH.