Blog

Déploiement Docker sur Clever Cloud : du Dockerfile au pipeline CI/CD

Remplacez vos abonnements SaaS par des outils open-source, hébergez-les sur votre infrastructure Clever Cloud et reprenez la souveraineté de vos données.

Mathieu Ducrot Mathieu Ducrot
|
|
Mis à jour le
|
13 min de lecture
| Tech
Résumez cette page avec votre IA préférée :
Comment déployer facilement avec Docker sur Clever Cloud ?

Introduction

Clever Cloud supporte nativement PHP, Node.js, Python et bien d’autres runtimes. Mais il est souvent plus pratique de rassembler toute la configuration dans une image Docker pour simplifier le déploiement.

Derrière la question technique se cache souvent un choix stratégique : remplacer un outil SaaS payant par son équivalent open-source. Au lieu de payer un abonnement mensuel par utilisateur pour un outil de feedback, de monitoring ou de capture d’emails, vous déployez une image Docker hébergée sur votre propre infrastructure. Vos données restent sur des serveurs européens, sous votre contrôle, et le coût est fixe quel que soit le nombre d’utilisateurs.

Nous allons prendre en exemple deux cas concrets que nous utilisons chez SmartBooster : Maildev pour capturer les emails de test et Fider pour la gestion des feedbacks clients. Dans les deux cas, le workflow est identique.

1. Pourquoi remplacer un SaaS par un outil open-source ?

Pour les outils transverses (capture d’emails, gestion de feedbacks, monitoring…), vous avez deux options : payer un abonnement SaaS ou héberger vous-même un équivalent open-source.

Le problème du modèle SaaS par utilisateur

La plupart des SaaS facturent par siège. Un outil de feedback à 25 €/utilisateur/mois devient rapidement coûteux dès que votre équipe ou votre base clients grandit. À cela s’ajoute la dépendance aux conditions tarifaires de l’éditeur : une augmentation de prix ou un changement de plans et vous êtes contraint de migrer dans l’urgence.

La question de la souveraineté des données

Les SaaS américains sont soumis au Cloud Act, qui autorise les autorités américaines à accéder aux données stockées par des entreprises américaines, même sur des serveurs européens. Pour des données clients ou des retours produit sensibles, l’auto-hébergement est la seule garantie réelle de maîtrise.

Le cas CapRenov : de Canny à Fider

Pour le logiciel CapRenov+, nous utilisions Canny pour collecter les demandes d’amélioration des utilisateurs. Canny est un SaaS américain efficace, mais dont le coût devient significatif à mesure que la base d’utilisateurs grandit.

Nous avons migré vers Fider en 2026, un outil open-source équivalent, déployé sur Clever Cloud. La migration a permis de reprendre la propriété complète des données et d’aller plus loin : nous avons activé la connexion SSO avec l’application CapRenov. Les utilisateurs se connectent directement avec leur compte CapRenov, sans créer un second compte.

Résultat : demandesutilisateurs.cap-renov.fr, une expérience utilisateur cohérente avec le reste de l’application, des données hébergées en France et un coût fixe.

C’est un exemple concret d’alternative au logiciel SaaS : utiliser l’open-source non par idéologie, mais pour des raisons économiques et de souveraineté des données.

2. La stratégie “utiliser plutôt que construire”

Pour les outils transverses, développer une solution maison est rarement justifié. Des images Docker open-source couvrent ces besoins avec fiabilité.

La capture d’emails est un excellent exemple : en développement et en recette, vous ne voulez surtout pas que vos emails de test arrivent chez de vrais utilisateurs. Maildev intercepte tous les envois SMTP et les rend visibles dans une interface web, sans jamais les transmettre aux destinataires réels.

C’est une bonne pratique de qualité logicielle à mettre en place dès le début de tout projet.

L’approche consiste à créer un dépôt Git contenant uniquement un Dockerfile qui référence l’image publique, puis à déployer ce dépôt sur Clever Cloud comme n’importe quelle application.

3. Créer l’application Docker sur Clever Cloud

Depuis la console Clever Cloud, créez une nouvelle application en choisissant le runtime Docker.

Sélection du runtime Docker dans la console Clever Cloud

Quelques réglages à faire immédiatement après la création :

  • Scaling : une instance Nano suffit pour les outils légers comme Maildev. Pour un outil avec base de données comme Fider, passez en XS.
  • Force HTTPS : activez cette option dans l’onglet Information pour forcer le HTTPS sur toutes les requêtes. Forcer le HTTPS sur CleverCloud
  • Domain name : supprimez le domaine généré par défaut et ajoutez un sous-domaine personnalisé (ex: maildev.votreprojet.cleverapps.io).

Ajouter les add-ons nécessaires

Si l’outil requiert une base de données ou du stockage fichier, Clever Cloud propose des add-ons à lier directement à l’application :

  • PostgreSQL pour les outils avec persistance relationnelle (Fider utilise un plan XXS_SML minimum)
  • Cellar (compatible S3) pour le stockage de fichiers (images, pièces jointes)

Addons CleverCloud

4. Gérer l’exposition réseau

Le port 8080

Clever Cloud attend que votre application écoute sur le port 8080. Pour les images Docker qui exposent un autre port par défaut, vous devrez soit remapper dans le Dockerfile, soit configurer via variable d’environnement. Pour Fider, c’est simple : PORT=8080 dans les variables d’environnement suffit.

Les redirections TCP

Certains outils nécessitent un accès via un protocole autre que HTTP, comme le SMTP pour Maildev. Clever Cloud propose des redirections TCP : la plateforme attribue un port aléatoire (ex: 20425) qui redirige vers le port interne de votre conteneur.

TCP Redirect écran CleverCloud

Après avoir créé la redirection, copiez le port attribué et ajoutez la variable d’environnement CC_DOCKER_EXPOSED_TCP_PORT avec cette valeur dans la configuration de l’application.

5. Configurer via les variables d’environnement

Les variables d’environnement sont le seul mécanisme de configuration à utiliser. Elles permettent d’adapter le comportement de l’image sans modifier le Dockerfile, et de gérer proprement les secrets.

Clever Cloud injecte automatiquement les variables des add-ons liés (ex: POSTGRESQL_ADDON_DIRECT_URI, CELLAR_ADDON_KEY_ID). Référencez-les directement dans vos variables applicatives.

Pour Fider, le bloc de variables minimal ressemble à ceci :

BASE_URL="https://fider.votreprojet.fr"
DATABASE_URL="%POSTGRESQL_ADDON_DIRECT_URI%"
PORT="8080"
JWT_SECRET="votre_secret_64_caractères"
EMAIL_NOREPLY="no-reply@votreprojet.fr"

Et pour Maildev votre liste de variable d’environnement est minime avec juste le port HTTP et la redirection TCP :

Les variables d’environnement peuvent aussi être gérées directement en ligne de commande via la CLI Clever Cloud, ce qui est utile pour scripter une configuration initiale ou mettre à jour un secret sans passer par la console. Voir la documentation de configuration via CLI.

Variable d'environnement PORT et TCP

6. Le Dockerfile et l’automatisation CI/CD

Dockerfile minimal : utiliser une image pré-construite

Le Dockerfile est volontairement minimal : il référence l’image publique et expose les ports nécessaires. Voici le fichier complet pour Maildev, avec le relay vers Tipimail pour les envois réels depuis la recette :

FROM maildev/maildev:1.1.1
LABEL maintainer="dev@email.fr"

EXPOSE 8080 {PORT_TCP}

CMD ["--web-user", "{USER}", "--web-pass", "{PASSWORD}",
     "--web", "8080",
     "--smtp", "{PORT_TCP}",
     "--hide-extensions", "STARTTLS",
     "--outgoing-host", "{SMTP_HOST}",
     "--outgoing-port", "{SMTP_PORT}",
     "--outgoing-user", "{SMTP_USER}",
     "--outgoing-pass", "{SMTP_PASS}"]

Détail des paramètres :

  • --web-user / --web-pass : identifiants HTTP Basic pour protéger l’interface web de visualisation des emails
  • --web 8080 : port d’écoute de l’interface web (obligatoire sur Clever Cloud)
  • --smtp {PORT_TCP} : port d’écoute SMTP, à remplacer par la valeur de votre redirection TCP Clever Cloud
  • --hide-extensions STARTTLS : désactive STARTTLS pour éviter les erreurs de handshake TLS sur les connexions internes
  • --outgoing-host / --outgoing-port / --outgoing-user / --outgoing-pass : configuration du relay SMTP sortant vers votre service d’envoi d’email (Mailgun, Brevo, Tipimail…) pour les emails que vous choisissez explicitement de laisser partir en recette

Pour Fider, le Dockerfile est encore plus direct :

FROM getfider/fider:v0.33.0

EXPOSE 8080 3000

HEALTHCHECK --timeout=5s CMD ./fider ping

CMD ./fider migrate && ./fider

La ligne CMD ./fider migrate && ./fider joue un rôle clé : elle exécute les migrations de base de données à chaque démarrage du conteneur, puis lance le serveur. Pas besoin de script séparé pour la migration initiale. Le HEALTHCHECK permet à Clever Cloud de détecter que l’application est prête à recevoir du trafic.

Quand utiliser un post_build.sh ?

Certains projets nécessitent une étape de build des assets frontend avant de démarrer. Clever Cloud propose la variable CC_POST_BUILD_HOOK qui exécute un script shell après le build Docker et avant le démarrage du conteneur. C’est utile quand votre image embarque les sources et doit compiler le frontend au déploiement :

# post_build.sh — exécuté via CC_POST_BUILD_HOOK
set -e

# Frontend build
npm install
make build-ssr
make build-ui

Pour les images pré-construites comme getfider/fider:v0.33.0, ce hook n’est pas nécessaire : tout est déjà compilé dans l’image. Réservez ce mécanisme aux projets qui buildent depuis les sources.

Automatiser les déploiements depuis GitLab

Pour automatiser les déploiements depuis GitLab, ajoutez un job utilisant l’image clevercloud/clever-tools :

deploy:
  stage: deploy
  image:
    name: clevercloud/clever-tools:latest
    entrypoint: ["/bin/sh", "-c"]
  when: manual
  script:
    - clever deploy -f -a nom-de-votre-app

L’option when: manual est recommandée pour les environnements de production : le déploiement se déclenche sur action volontaire depuis l’interface GitLab, pas à chaque push. La commande clever deploy et ses options sont documentées dans le cycle de vie du déploiement via CLI.

Le job restart : quand un déploiement échoue

Clever Cloud peut se retrouver dans un état instable après un déploiement en erreur : l’instance ne répond plus mais la plateforme ne relance pas le conteneur automatiquement. Dans ce cas, un simple clever restart suffit, sans repousser le code. Le paramètre --commit $CI_COMMIT_SHA force Clever Cloud à utiliser le commit exact du pipeline, ce qui évite les ambiguités quand plusieurs déploiements se sont enchaînés.

restart:
  stage: deploy
  image:
    name: clevercloud/clever-tools:latest
    entrypoint: ["/bin/sh", "-c"]
  when: manual
  script:
    - clever restart --commit $CI_COMMIT_SHA -a nom-de-votre-app
  cache: {}

Avoir ce job à portée dans le pipeline évite de passer par la console Clever Cloud manuellement et garde une trace de qui a redémarré l’application et à quel moment.

7. Le .dockerignore : ne pas exposer ce qu’on n’a pas à déployer

Comme .gitignore empêche de versionner certains fichiers dans Git, .dockerignore empêche de les inclure dans le contexte de build Docker.

La différence clé entre .gitignore et .dockerignore

Quand vous lancez docker build, Docker envoie au daemon l’ensemble des fichiers du répertoire courant : c’est le “contexte de build”. Sans .dockerignore, tout est envoyé, y compris votre dossier .git (parfois plusieurs centaines de Mo), vos node_modules, vos fichiers .env et votre documentation.

.gitignore contrôle ce qui entre dans Git. .dockerignore contrôle ce qui entre dans l’image Docker. Les deux ne sont pas synchronisés automatiquement : un fichier peut être ignoré par Git et quand même se retrouver copié dans l’image si vous ne l’excluez pas explicitement.

Pour un dépôt qui contient uniquement un Dockerfile (cas typique de Maildev ou Fider), un .dockerignore minimal suffit :

.git
.gitignore
README.md
docs/
*.log
.env
.env.local
.DS_Store

L’impact est double : les builds sont plus rapides (moins de données à transférer au daemon) et vous évitez d’inclure accidentellement des secrets dans l’image si votre workflow évolue.

8. Ajouter un robots.txt pour bloquer l’indexation

Les outils déployés en interne (Maildev, tableau de bord de monitoring, Fider en accès restreint…) ne doivent pas être indexés par les moteurs de recherche. Si votre outil expose un sous-domaine public, pensez à bloquer son indexation.

Fider sert automatiquement un robots.txt configurable depuis l’interface d’administration. Pour les outils qui ne le gèrent pas nativement, deux options existent : soit ajouter un fichier robots.txt dans le répertoire de fichiers statiques de l’application, soit configurer un en-tête HTTP X-Robots-Tag: noindex au niveau de votre reverse proxy.

L’essentiel : ne laissez pas Googlebot indexer vos environnements internes par défaut. Une page d’authentification publiquement accessible suffit à ce que Google commence à la visiter régulièrement.

9. Maintenir l’application

Les logs sont accessibles directement depuis la console Clever Cloud ou via la CLI avec clever logs. Ils sont indispensables pour diagnostiquer les erreurs au démarrage du conteneur, notamment les problèmes de connexion aux add-ons ou de configuration manquante.

Pour les tâches d’initialisation complexes (migrations de base de données, création de bucket…), Clever Cloud propose la variable CC_POST_BUILD_HOOK qui exécute un script shell après le build et avant le démarrage du conteneur.

10. Les mises à jour : comment et à quelle fréquence

Mettre à jour un outil Docker sur Clever Cloud se résume à trois étapes :

  1. Consulter le changelog du projet (GitHub Releases ou CHANGELOG.md) pour identifier les ruptures de compatibilité et les migrations nécessaires
  2. Modifier le tag de l’image dans le Dockerfile (ex: v0.33.0v0.34.0)
  3. Commiter, pousser et déployer via le pipeline CI/CD

À quelle fréquence mettre à jour ?

  • Patches de sécurité : dès leur publication. Abonnez-vous aux notifications GitHub Releases du projet pour être alerté sans avoir à surveiller manuellement.
  • Versions mineures : mensuel ou dès que la version est stable. Lisez le changelog avant d’appliquer.
  • Versions majeures : planifiées, après test sur l’environnement de recette. Les versions majeures peuvent inclure des changements de schéma de base de données ou de configuration qui nécessitent des actions manuelles.

Pour Fider, CMD ./fider migrate && ./fider exécute les migrations automatiquement au démarrage. Vérifiez le changelog avant toute montée de version majeure : certaines migrations de schéma sont irréversibles sans sauvegarde préalable de la base de données.

11. Bonne pratique SmartBooster : documentez votre dépôt

Chaque dépôt Git hébergeant un outil Docker doit contenir un README.md qui centralise les informations utiles pour l’équipe. C’est la première chose que l’on consulte quand on revient sur un projet six mois plus tard ou quand un nouveau développeur doit intervenir.

Structure recommandée

# Maildev — Projet X

Service de capture d'emails pour les environnements de test.

## Liens utiles
- Interface Maildev (recette) : https://maildev.recette.votreprojet.fr
- Console Clever Cloud : https://console.clever-cloud.com/organisations/org_xxx/applications/app_xxx
- Documentation Maildev : https://maildev.github.io/maildev/

## Variables d'environnement
| Variable | Description |
|---|---|
| PORT | Port HTTP (toujours 8080 sur Clever Cloud) |
| CC_DOCKER_EXPOSED_TCP_PORT | Port SMTP attribué par la redirection TCP Clever Cloud |
| WEB_USER | Login pour l'interface web Maildev |
| WEB_PASS | Mot de passe pour l'interface web Maildev |

## Déploiement
Le déploiement se fait via le job GitLab `deploy` (manuel).
1. Vérifier que le Dockerfile pointe vers la bonne version de l'image
2. Déclencher le job depuis l'interface GitLab CI/CD > Pipelines

## How-to

**Changer le mot de passe d'accès**
Modifier les variables `WEB_USER` et `WEB_PASS` dans la console Clever Cloud,
puis redémarrer l'application depuis la console.

**Retrouver le port SMTP à configurer dans l'application cliente**
La valeur de `CC_DOCKER_EXPOSED_TCP_PORT` est visible dans la section
"TCP Redirections" de la console Clever Cloud. C'est ce port qui doit être
renseigné comme serveur SMTP dans votre application.

## FAQ

**Q : Les emails envoyés depuis la recette arrivent chez de vrais destinataires ?**
R : Non, Maildev intercepte tous les envois SMTP locaux. Seuls les emails relayés
via la configuration outgoing-host quittent le serveur.

**Q : L'interface est-elle sécurisée ?**
R : Oui, via HTTP Basic Auth (variables WEB_USER / WEB_PASS) et HTTPS forcé.

Ce README évolue au fil des incidents et des questions de l’équipe. Chaque fois qu’un membre pose une question sur l’outil, la réponse s’ajoute dans la section FAQ ou How-to. C’est le meilleur moyen de capitaliser sur l’expérience sans dépendre de la mémoire de chacun.

Conclusion

Un dépôt Git avec un Dockerfile de quelques lignes, un .dockerignore, quelques variables d’environnement et un add-on PostgreSQL : c’est tout ce qu’il faut pour héberger un outil complet sur Clever Cloud. Cette approche s’applique à des dizaines d’outils open-source et évite de réinventer des solutions pour des besoins transverses bien couverts par l’écosystème Docker.

Si cette logique vous intéresse au-delà de l’infrastructure, nous avons développé une réflexion plus large sur les alternatives aux logiciels SaaS : quand le sur-mesure ou l’open-source remplace avantageusement un abonnement mensuel sur le long terme.

Si vous utilisez déjà Clever Cloud pour vos applications Symfony ou Node.js, vous pouvez centraliser l’ensemble de votre infrastructure sur la même plateforme.

Clever Cloud propose un component catalog GitLab pour intégrer les déploiements dans vos pipelines. Nous préférons utiliser directement les commandes CLI (clever deploy, clever restart) : cela garantit le même fonctionnement que lors d’une intervention manuelle depuis un poste développeur. En cas d’incident nécessitant un déploiement hors CI, les mêmes commandes s’appliquent sans avoir à adapter le workflow.

Mathieu Ducrot
Mathieu Ducrot CTO
Mots clés :
#DevOps #Vélocité

Articles similaires

Vous avez un projet ?

Contactez-nous pour savoir comment nous pouvons vous aider.