Contexte
Migrer un serveur Debian en production n’est jamais anodin.
Dans mon cas, le passage de Debian 12 (Bookworm) à Debian 13 (Trixie) a été beaucoup plus brutal que prévu : services cassés, configurations obsolètes, dépendances Python disparues, et même des logiciels pourtant “standards” devenus incompatibles.
Voici un retour d’expérience concret, avec tous les pièges rencontrés, leurs solutions, et une checklist post-migration pour éviter d’y passer des heures comme moi.
Situation de départ
Serveur distant (ovh) avec :
- Apache + PHP (WordPress)
- Postfix + Dovecot + Roundcube
- Webmin / Virtualmin
- Fail2Ban, firewalld / nftables
- Serveur Minecraft via Crafty
- Docker (partiel)
- ProFTPD
Migration effectuée via upgrade in-place.
1️⃣ Sites WordPress en erreur 503
🔍 Diagnostic
curl -I https://monsite.tld sudo systemctl status apache2 sudo tail -n 50 /var/log/apache2/error.log sudo systemctl status php8.4-fpm
🧠 Cause
Apache fonctionnait, mais PHP-FPM n’était pas correctement configuré / socket absent.
🛠️ Solution
sudo apt install php8.4-fpm sudo systemctl enable --now php8.4-fpm
Correction des VirtualHosts Apache :
<FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php8.4-fpm.sock|fcgi://localhost/" </FilesMatch>
2️⃣ Erreur WordPress : extension MySQL absente
🔍 Diagnostic
php -m | grep mysql php -v
🧠 Cause
PHP 8.4 installé, mais sans module MySQL.
🛠️ Solution
sudo apt install php8.4-mysql sudo systemctl restart php8.4-fpm apache2
3️⃣ Dovecot ne démarre plus
🔍 Diagnostic
sudo systemctl status dovecot sudo doveconf
🧠 Cause
Incompatibilités de syntaxe suite au passage à Dovecot 2.4 (directives obsolètes).
🛠️ Solution
- Ajout obligatoire :
dovecot_config_version = 2.4.1
Migration des directives SSL :
ssl_server {
cert_file = /etc/ssl/...
key_file = /etc/ssl/...
}
4️⃣ SMTP Roundcube – erreur 454
🔍 Diagnostic
ss -lntp | grep 587 sudo postconf -n | grep sasl ls -l /var/spool/postfix/private/auth
🧠 Cause
Socket d’authentification SASL absent.
🛠️ Solution
service auth {
unix_listener /var/spool/postfix/private/auth {
user = postfix
group = postfix
mode = 0660
}
}
5️⃣ Webmin – erreur Authentic Theme
🔍 Diagnostic
webmin -version ls /usr/share/webmin/authentic-theme
🧠 Cause
Incompatibilité thème / version Webmin après upgrade.
🛠️ Solution
- Mise à jour complète du système
- Réinstallation du thème
- Redémarrage final du serveur
6️⃣ Services secondaires cassés
Fail2Ban
Diagnostic
journalctl -xeu fail2ban
Cause : dépendances Python manquantes → résolu après upgrade complet.
Firewalld
Serveur déjà sous nftables → suppression complète de firewalld.
ProFTPD
Directives obsolètes supprimées une à une après analyse via :
proftpd -t
Crafty / Minecraft
Diagnostic
systemctl status crafty java -version
Cause : Java absent après migration.
Solution
sudo apt install openjdk-21-jre-headless
Encadré – À ne surtout pas oublier
- ✔ Toujours vérifier PHP-FPM après upgrade
- ✔ Tester Dovecot avec
doveconf - ✔ Vérifier les dépôts tiers (Docker, CrowdSec)
- ✔ Ne pas mélanger firewalld et nftables
- ✔ Redémarrer uniquement à la fin
Conclusion
Une migration Debian majeure est avant tout un exercice de diagnostic. Les erreurs sont rarement graves, mais toujours révélatrices d’un changement de paradigme.
J’y ai passé quand même 6h environ, avec l’aide dune IA…
BONUS
📐 Timeline illustrée (avant / pendant / après)
🟢 AVANT
- Debian 12 stable
- Tous services OK
- Sauvegardes faites
⬇️
🟡 PENDANT
- Upgrade système
- Redémarrage
- Découverte des services cassés
- Corrections une par une
⬇️
🔵 APRÈS
- Debian 13 propre
- Services compatibles
- Configs modernisées
🔁 Script de pré-migration Debian 14 (ready)
#!/bin/bash
echo "=== PRE-MIGRATION CHECK DEBIAN ==="
echo "[1] Version Debian"
lsb_release -a
echo "[2] Services en erreur"
systemctl --failed
echo "[3] Sauvegardes ?"
read -p "Confirmer que les sauvegardes sont OK (yes/no) : " r
[ "$r" != "yes" ] && exit 1
echo "[4] Dépôts non Debian"
grep -R ^deb /etc/apt | grep -v debian
echo "[5] PHP"
php -v || echo "PHP absent"
ls /etc/php/*/fpm || echo "PHP-FPM absent"
echo "[6] Mail"
postconf -n | grep sasl
doveconf -n | head -n 5
echo "[7] Docker"
docker --version || echo "Docker absent"
echo "=== FIN CHECK ==="