Setup VPS Debian de A à Z : du premier login à la production

Setup VPS Debian de A à Z : du premier login à la production

La checklist complète pour préparer un VPS Debian 12 fraîchement livré chez VeryCloud. User non-root, SSH par clé, firewall, mises à jour auto, NTP, timezone, swap, monitoring de base. Suivez ce guide une fois et copiez-collez-le pour chaque nouveau VPS.

Introduction

Un VPS fraîchement provisionné chez n'importe quel hébergeur arrive dans un état brut : login en root, mot de passe, aucun firewall, locale par défaut, pas de monitoring. Avant de déployer quoi que ce soit dessus, il faut le préparer.

Ce tuto est la checklist exhaustive que vous lancez systématiquement sur tout nouveau VPS Debian 12 / Ubuntu 22.04+. Compte 30-45 minutes la première fois, 10-15 minutes une fois la routine prise.

Prérequis

  • Un VPS livré par VeryCloud (Linux Debian 12 ou Ubuntu 22.04+)
  • Les credentials root reçus par email
  • Votre clé SSH publique locale prête (sinon générez-en une, voir le tuto SSH hardening)

Étape 1 : Premier login en root

ssh root@IP_DU_VPS

Acceptez la signature SSH. Mettez à jour immédiatement :

apt update && apt upgrade -y
apt autoremove --purge -y

Étape 2 : Définir le hostname

hostnamectl set-hostname srv-web-01.verycloud.fr
echo "127.0.1.1 srv-web-01.verycloud.fr srv-web-01" >> /etc/hosts

Vérifiez :

hostname -f
# srv-web-01.verycloud.fr

Étape 3 : Locale et timezone

# Timezone
timedatectl set-timezone Europe/Paris

# Locale
apt install -y locales
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' /etc/locale.gen
sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
update-locale LANG=fr_FR.UTF-8

Vérifiez :

date
# samedi 16 mai 2026, 15:30:42 (UTC+02:00)

Étape 4 : Synchronisation horaire (NTP)

Crucial pour les certificats SSL, les logs corrélés, et le 2FA :

apt install -y chrony
systemctl enable --now chrony
chronyc tracking

Étape 5 : Créer un user non-root

Ne jamais utiliser root au quotidien. Créez un user avec sudo :

adduser mathys
# (mot de passe + infos optionnelles)

usermod -aG sudo mathys

Copiez votre clé SSH publique pour cet user :

mkdir -p /home/mathys/.ssh
nano /home/mathys/.ssh/authorized_keys
# (collez votre clé publique ssh-ed25519 AAAAC...)

chown -R mathys:mathys /home/mathys/.ssh
chmod 700 /home/mathys/.ssh
chmod 600 /home/mathys/.ssh/authorized_keys

Testez la connexion sans fermer la session root :

# Depuis votre PC
ssh mathys@IP_DU_VPS
sudo -i  # Doit fonctionner

Étape 6 : Hardening SSH

⚠️ Ne fermez pas la session root tant que vous n'avez pas validé que vous pouvez vous connecter via le nouvel user.

sudo nano /etc/ssh/sshd_config

Modifiez :

Port 22022                          # Port custom
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
X11Forwarding no
AllowUsers mathys

Testez :

sudo sshd -t
sudo systemctl reload sshd

Pour aller plus loin, voir le tuto SSH hardening complet (Ed25519, 2FA TOTP, port knocking).

Étape 7 : Firewall UFW

sudo apt install -y ufw

# Politique par défaut
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Autoriser SSH (port custom)
sudo ufw allow 22022/tcp

# Autoriser web si nécessaire
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Activer
sudo ufw enable
sudo ufw status verbose

Étape 8 : Fail2ban (anti brute-force)

sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Activez la jail SSH :

[sshd]
enabled = true
port = 22022
maxretry = 3
bantime = 1h
findtime = 10m
sudo systemctl restart fail2ban
sudo fail2ban-client status

Pour une protection plus moderne, voir le tuto CrowdSec.

Étape 9 : Mises à jour automatiques

sudo apt install -y unattended-upgrades apt-listchanges

sudo dpkg-reconfigure -plow unattended-upgrades
# Choisir "Yes"
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

Activez les mises à jour security + stable :

Unattended-Upgrade::Origins-Pattern {
    "origin=Debian,codename=${distro_codename}-security";
    "origin=Debian,codename=${distro_codename}-updates";
};

Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";

Configurez la fréquence :

sudo nano /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

Testez :

sudo unattended-upgrades --dry-run --debug

Étape 10 : Swap (si pas déjà configuré)

Vérifiez :

free -h
swapon --show

Si pas de swap et < 4 Go RAM, ajoutez-en (utile en cas de pic) :

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab

Optimisez l'usage :

echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.d/99-tuning.conf
sudo sysctl --system

Étape 11 : Outils de base sysadmin

sudo apt install -y \
    htop iotop iftop nethogs \
    curl wget git vim nano \
    rsync rclone \
    tree ncdu \
    jq net-tools dnsutils \
    tmux screen \
    unzip zip \
    lsof tcpdump \
    sudo bash-completion

Étape 12 : Logs et journald

# Limiter la taille des logs systemd à 500 MB
sudo nano /etc/systemd/journald.conf
SystemMaxUse=500M
SystemMaxFileSize=50M
ForwardToSyslog=no
sudo systemctl restart systemd-journald

Étape 13 : MOTD propre (optionnel)

Le message à la connexion. Pour quelque chose de propre :

sudo apt install -y figlet
sudo nano /etc/update-motd.d/00-custom
#!/bin/bash
figlet "VeryCloud"
echo ""
echo "  Hostname  : $(hostname -f)"
echo "  IP        : $(curl -s ifconfig.me)"
echo "  OS        : $(lsb_release -d | cut -f2)"
echo "  Kernel    : $(uname -r)"
echo "  Uptime    : $(uptime -p)"
echo "  Load      : $(cut -d' ' -f1-3 < /proc/loadavg)"
echo "  Memory    : $(free -h | awk '/^Mem:/ {print $3 "/" $2}')"
echo "  Disk /    : $(df -h / | awk 'NR==2 {print $3 "/" $2}')"
echo ""
sudo chmod +x /etc/update-motd.d/00-custom

Étape 14 : Bannière SSH dissuasive

sudo nano /etc/issue.net
*****************************************************
*  Authorized access only. This system is monitored.  *
*  Unauthorized access is prohibited and prosecuted.  *
*****************************************************
sudo nano /etc/ssh/sshd_config
Banner /etc/issue.net
sudo systemctl reload sshd

Étape 15 : Reboot final

Pour valider tout :

sudo reboot

Reconnectez-vous :

ssh -p 22022 mathys@IP_DU_VPS

Vérifiez :

sudo systemctl status fail2ban
sudo ufw status
free -h
df -h

Tout doit être OK.

Étape 16 : Documentation interne

Créez un fichier de notes :

nano ~/server-info.md

Notez :

  • Date d'installation
  • Hostname, IP, OS
  • Port SSH custom
  • Services installés
  • Mots de passe (à stocker hors VPS, dans Bitwarden/KeePass)
  • Backups configurés
  • Dernière mise à jour majeure

Étape 17 : Monitoring de base

Pour aller plus loin tout de suite, installez Netdata (5 minutes) ou Prometheus + Grafana (30 minutes). Voir les tutos dédiés.

Pour du minimal sans stack supplémentaire :

# Log centralisé des sessions
sudo apt install -y auditd

# Voir les changements de fichiers critiques
sudo auditctl -w /etc/passwd -p wa -k passwd_changes
sudo auditctl -w /etc/sudoers -p wa -k sudoers_changes

Checklist finale

[ ] Hostname configuré
[ ] Timezone et locale OK
[ ] User non-root créé avec sudo
[ ] Clé SSH installée et password désactivé
[ ] Port SSH custom configuré
[ ] UFW activé (allow SSH, 80, 443)
[ ] Fail2ban actif
[ ] unattended-upgrades configuré
[ ] Swap si nécessaire
[ ] NTP/chrony synchronisé
[ ] Outils sysadmin installés
[ ] MOTD propre
[ ] Reboot validé
[ ] Notes d'installation sauvegardées

Dépannage

Verrouillé après changement SSH

Utilisez le noVNC depuis l'espace client VeryCloud pour reprendre la main.

Erreur "locale not generated"

sudo dpkg-reconfigure locales

UFW bloque SSH après activation

Le port custom n'était pas autorisé. Au noVNC :

sudo ufw allow 22022/tcp

Commandes utiles

# Récapitulatif système
uname -a
lsb_release -a
hostnamectl
timedatectl

# État des services
systemctl list-units --type=service --state=running

# Voir qui est connecté
who
w
last -10

# Charge système
top
htop
uptime

# Disques
df -h
ncdu /  # navigateur visuel
du -sh /var/log/*

# Réseau
ip a
ss -tlnp  # ports en écoute

Conclusion

Votre VPS est maintenant prêt pour la production. La base est posée :

  • Accès sécurisé (clé + port custom + fail2ban + UFW)
  • Système à jour automatiquement
  • Outils sysadmin présents
  • Locale/heure correctes

À partir de là, vous pouvez installer ce que vous voulez : Nginx, MySQL, Docker, n8n... Voir les tutos dédiés.

Ressources

Rejoignez notre serveur communautaire Discord

Pour toute question, suggestion ou simplement pour discuter avec la communauté, rejoignez-nous sur Discord !

900+Membres