Docker, CI/CD et Coolify : une usine automatisée de releases

Docker, CI/CD et Coolify : une usine automatisée de releases

Mis à jour: 14 min de lecture
  • Docker
  • CI/CD
  • Coolify
  • DevOps
  • Laravel
  • WordPress

Imaginez une usine où chaque produit sort avec le même moule, la même étiquette et un contrôle qualité avant d’atteindre le client. C’est un bon pipeline Docker + CI/CD + Coolify : pas « envoyer à la main ce qui marchait sur mon laptop », mais un processus répétable qui transforme le code en release fiable.

Cet article explique, en langage clair et avec des étapes concrètes, comment déployer des APIs Laravel, des apps Node et des sites WordPress conteneurisés. Il sert aux responsables produit qui veulent moins d’incidents, et aux équipes techniques qui ont besoin d’un vrai runbook — pas seulement d’un Dockerfile isolé.

Pourquoi c’est important pour le business

Chaque deploy improvisé est un risque : un paiement qui ne facture plus, un formulaire qui tombe un vendredi, ou un rollback impossible parce que personne ne se souvient de la version en cours. Un bon pipeline réduit le time-to-ship, rend le staging crédible et transforme le deploy en opération mesurable — pas en rituel de minuit.

  • Moins de « ça marche chez moi » : le même artefact est testé puis promu.
  • Rollback prévisible : vous revenez au tag précédent en minutes, sans deviner.
  • Audit : vous savez quel commit est en production et qui l’a promu.
  • Passage à l’échelle de l’équipe : un junior peut déployer sans casser le rituel du senior.

Concepts clés (simple + technique)

Docker : la boîte scellée

Docker empaquette l’app avec ses dépendances dans une image. Pensez à un conteneur maritime : le quai (serveur) peut changer, le contenu voyage de la même façon. Techniquement : couches, Dockerfile multi-stage et un runtime sans toolchain de build ni secrets.

CI/CD : la chaîne d’assemblage

CI (intégration continue) valide chaque changement : lint, tests, build. CD (livraison/déploiement continu) amène l’artefact en staging puis, avec des portes qualité, en production. Coolify excelle au deploy (SSL, variables, redémarrages) ; le CI reste dans GitHub Actions, GitLab CI ou un autre runner.

Tags immuables vs latest

N’étiqueter qu’en latest, c’est comme écrire « version actuelle » sans numéro de lot. Utilisez registry/app:gitsha : vous savez exactement ce qui tourne et pouvez redéployer ce digest.

PièceAnalogieCe que ça fait en pratique
Image DockerProduit emballéMême binaire/artefact en staging et prod
Pipeline CIContrôle qualitéLint, tests, scan, build
CoolifyEntrepôt + expéditionDeploy, SSL, env vars, healthcheck
Tag SHANuméro de lotRollback exact et traçabilité

Guide pratique : pipeline minimum

  1. PR : lint + typecheck + tests unitaires (et e2e critiques s’il y a un checkout).
  2. Build multi-stage : deps → build → runtime léger.
  3. Tag immuable : registry/app:gitsha (jamais seulement latest).
  4. Scan basique de l’image (CVE évidentes, utilisateur root, secrets dans les couches).
  5. Deploy en staging sur Coolify avec les mêmes variables (valeurs différentes).
  6. Smoke / healthcheck : route peu coûteuse qui vérifie app + DB.
  7. Promote en production du même digest/tag — pas un rebuild différent.

Multi-stage pour Laravel / Node

  • deps : Composer/npm avec cache de couches ordonnées.
  • build : npm ci + npm run build, php artisan optimize, assets.
  • runtime : utilisateur non-root, sans toolchain, sans .env cuit dans l’image.
  • Permissions correctes sur storage et bootstrap/cache (Laravel).

WordPress dans Docker

  • Volume persistant pour wp-content/uploads.
  • Secrets via env / wp-config généré au runtime — jamais dans l’image.
  • Object cache (Redis) comme service séparé quand le trafic l’exige.
  • Multisite : domaines, cookies et chemins documentés.
  • Backup DB + uploads avant les mises à jour majeures.

Configuration Coolify

  • Variables et secrets hors du Dockerfile.
  • Healthcheck réel (HTTP 200 sur une route stable, pas seulement « le processus existe »).
  • Domaine apex canonique ; www avec redirect 301.
  • SSL Let's Encrypt sur les deux hôtes.
  • Staging et production séparés ; restart policies et logs accessibles.

Erreurs fréquentes

  • Rebuild différent en prod : on ne sait plus ce qui tourne ni comment reproduire le bug.
  • Healthcheck sur / avec redirect 301 → boucle unhealthy.
  • Volumes WordPress appartenant à root → uploads cassés.
  • Lancer migrate --force deux fois en parallèle.
  • Oublier le worker de files : le web répond, les webhooks ne traitent pas.
  • Secrets dans Git ou dans les couches Docker « pour la commodité ».

Checklist pré-production

  • Tag = git SHA (pas seulement latest).
  • Secrets absents du repo et des couches Docker.
  • Healthcheck vert en staging avec la même image.
  • Migrations répétées + backup récent.
  • Apex / www et SSL vérifiés.
  • Workers et cron vivants après le deploy.
  • Plan de rollback écrit (redeploy du SHA précédent).
  • Noms de variables alignés entre staging et prod ; valeurs différentes.

Un checkout mal déployé est une bombe. Le pipeline se connecte à les paiements et l'audit de sécurité .

Questions fréquentes

Coolify remplace-t-il un pipeline CI ?

Pas entièrement. Coolify excelle au deploy, SSL, variables et redémarrages. Le CI (lint, tests, build) reste dans GitHub Actions, GitLab CI ou un autre runner. L’habitude est de les combiner : le CI produit l’artefact ; Coolify l’exécute.

Peut-on mettre WordPress dans Docker ?

Oui, avec soin : volumes pour les uploads, permissions correctes, et jamais de secrets dans l’image. Pour des sites très simples, ce n’est parfois pas rentable ; pour les équipes déjà en containers, oui.

Pourquoi éviter le tag latest en production ?

Parce que `latest` bouge. Un tag avec git SHA permet un rollback exact et répond à « quel commit est en prod ? » sans archéologie.

Comment gérer les migrations de base de données ?

Comme une étape explicite et contrôlée du release, avec backup récent et répétition en staging. Pas comme « quelqu’un lance artisan à la main en production » sans trace.

Que doit inclure le healthcheck ?

Une route peu coûteuse qui confirme que l’app répond et, le cas échéant, que la DB est joignable. Évitez de frapper une home avec redirects ou une page dépendante d’un CDN lent.