1. Mon serveur s’arrête à chaque déploiement, quel est le problème ?
Lorsque l’on gère des projets personnels, on se retrouve souvent sur des environnements aux ressources limitées (instances micro sur GCP, Raspberry Pi, etc.). Je possède plusieurs machines : des serveurs puissants pour l’inférence et l’entraînement d’IA, ainsi que des VM minimes qui ne font que tenir un serveur de noms. Le Raspberry Pi 5 a une place particulière pour moi : il ne coûte presque rien en électricité et offre des performances solides. Si les autres serveurs vous semblent comme du bétail à gérer, le Pi ressemble plutôt à un animal de compagnie auquel on s’attache.
Mais en lui confiant trop de tâches, le CPU atteint 100 % lors d’un déploiement, à cause du Celery Worker. Lors d’un déploiement Blue‑Green, les deux groupes (Blue et Green) sont actifs simultanément, doublant ainsi le nombre de workers et surchargeant le système. Réduire le nombre de workers ralentit le traitement, mais les laisser tels quels fait exploser le serveur : une vraie impasse.

Pour surmonter ce problème, j’ai créé un script de déploiement Blue‑Green sur‑mesure qui minimise la consommation de ressources tout en garantissant la stabilité.
2. Stratégie de résolution : économiser les ressources, augmenter la fiabilité
Un déploiement Blue‑Green classique lance les deux environnements en même temps, mais j’ai adopté les mesures suivantes pour alléger la charge CPU :
- Arrêt anticipé des services en arrière‑plan (Celery) : avant de lancer la nouvelle version du serveur web, j’arrête les workers et le beat lourds de l’ancienne version afin de libérer du CPU.
- Démarrage progressif : je lance d’abord
Web + Redis, puis je réalise un health‑check avant de déployer le reste. - Human‑in‑the‑loop : une fois l’automatisation terminée, l’administrateur valide visuellement avant de supprimer l’ancienne version.
Lorsque le CPU est poussé à ses limites, les workers Celery se réinitialisent, reçoivent immédiatement de nouvelles tâches et consomment toute la capacité disponible. Baisser la concurrence du worker aurait pu résoudre le problème, mais cela aurait ralenti le traitement asynchrone pendant le déploiement, ce qui n’était pas souhaitable.
L’idée qui m’est venue : suspendre temporairement les workers Celery lors du redéploiement, libérer le CPU, puis déployer le nouveau code tout en maintenant une disponibilité sans interruption.
3. Analyse du code clé
Le code complet est disponible dans mon dépôt GitHub. Voici quelques extraits essentiels.
① Isolation du projet avec Docker Compose
En utilisant l’option docker compose -p, on crée deux projets (ou espaces de noms) nommés blue et green à partir du même fichier de configuration.
dc() {
# Définir dynamiquement le nom du projet (-p) pour isoler les environnements
docker compose -f "$COMPOSE_FILE" "$@"
}
② Vérifications de santé rigoureuses (Health Check)
On ne bascule le trafic vers la nouvelle version que lorsque les contrôles de santé sont concluants.
health_check() {
# Réessayer jusqu’à 10 fois pour vérifier qu’un port répond 200 OK
if curl -fsSIL --max-time "$HEALTH_TIMEOUT" "$url"; then
ok "Health check passed"
return 0
fi
}
③ Repli rapide en cas d’échec
Si la nouvelle version pose problème, on relance immédiatement les services de l’ancienne version afin de masquer toute interruption aux utilisateurs.
Le stop est préféré à rm -f pour les workers et le beat, ce qui permet de libérer le CPU tout en conservant la possibilité de redémarrer rapidement en cas d’incident.
4. Astuce d’exploitation : la philosophie du "vérifier avant de supprimer"
Le script se termine en affichant un message d’avertissement plutôt qu’en supprimant automatiquement l’ancienne version.
"Le déploiement a réussi. Connectez‑vous maintenant pour vérifier. Si tout est en ordre, copiez la commande ci‑dessous pour nettoyer l’ancienne version."
Cette petite précaution empêche les 1 % d’erreurs que l’automatisation pourrait négliger.
5. Conclusion
Ce script reflète les réflexions nécessaires pour obtenir le meilleur rendement avec des ressources limitées. Bien qu’il soit simple, il me satisfait pleinement et je suis convaincu que d’autres développeurs aux contraintes similaires y trouveront leur compte. J’espère que ce script aidera les petits développeurs confrontés aux mêmes défis.
Liens associés :
- Accéder au dépôt GitHub
- Déploiement automatisé avec GitHub Webhook ⑤ Nginx, HTTPS et intégration finale
- N’hésitez pas à laisser un commentaire ou à ouvrir une issue sur GitHub pour toute question !