Tutoriel

Déploiement

Déployer vos applications avec Dokku sur un VPS

Dokku se présente comme « le plus petit PaaS au monde ». Construit autour de Docker et des buildpacks Heroku, il offre une expérience de déploiement par `git push` sur un VPS modeste, sans interface lourde ni orchestrateur embarqué. Ce guide va au-delà de l'installation de base : il couvre les variables d'environnement, le rollback zero-downtime, les plugins essentiels et le dépannage des erreurs les plus fréquentes.

11 min de lecture6 étapes
Sommaire· Pourquoi choisir Dokku pour votre VPS1/10
  1. 01Pourquoi choisir Dokku pour votre VPS
  2. 02Les atouts concrets de Dokku
  3. 03Prérequis chiffrés pour Dokku
  4. 04Installer Dokku v0.38.x et déployer une première application
  5. 05Gérer plusieurs applications et leurs variables d'environnement
  6. 06Mises à jour zero-downtime et rollback
  7. 07Plugins essentiels
  8. 08Dokku vs Caprover vs Easypanel — comparatif 2026
  9. 09Dépannage des erreurs fréquentes
  10. 10Pour aller plus loin

Pourquoi choisir Dokku pour votre VPS

Là où d'autres PaaS embarquent une interface web et un orchestrateur complet, Dokku reste volontairement minimaliste : il s'agit d'un ensemble de scripts shell qui pilotent Docker. Vous poussez votre code avec git push dokku main, Dokku détecte le langage via les buildpacks Heroku ou un Dockerfile, construit l'image et met l'application en ligne. Tout se gère en ligne de commande, ce qui le rend extrêmement léger et prévisible.

Comparés à Dokku, CapRover, Coolify et Easypanel proposent tous une interface graphique, mais au prix d'une empreinte mémoire bien plus lourde. CapRover réserve Docker Swarm et son daemon de supervision ; il recommande 2 Go de RAM en configuration minimale et impose un sous-domaine dédié pour son panneau de contrôle. Coolify 4 s'appuie sur Nixpacks et une base PostgreSQL embarquée : comptez 2 Go de RAM au repos. Easypanel intègre Traefik et un builder Nixpacks, ce qui demande lui aussi 2 Go de RAM dès qu'un build est actif. Dokku, lui, tourne confortablement à partir de 512 Mo de RAM pour une application légère, et n'ajoute aucun composant de contrôle permanent. C'est le choix naturel pour les développeurs qui veulent un workflow Heroku-like sur un petit VPS, sans surcharge mémoire et sans consommer des ressources pour un tableau de bord qu'ils n'utiliseront que quelques minutes par semaine. Son écosystème de plugins officiels (PostgreSQL, Redis, Let's Encrypt, MongoDB) couvre l'essentiel des besoins.

Les atouts concrets de Dokku

  • Empreinte mémoire minimale : tourne à partir de 512 Mo de RAM pour une app légère, 1 Go confortablement.
  • Déploiement par git push, comme sur Heroku, avec détection automatique du langage via les buildpacks.
  • Support natif des buildpacks Heroku (Node, Python, Ruby, Go, PHP…) et des Dockerfiles, au choix.
  • Plugins officiels pour PostgreSQL, MySQL, Redis et MongoDB, gérés entièrement en CLI.
  • Plugin Let's Encrypt pour HTTPS automatique, renouvellement inclus via cron.
  • Zero-downtime deploys grâce aux checks de santé configurables avant bascule du conteneur.
  • Rollback instantané via dokku tags et dokku deploy sur une image antérieure.
  • Injection automatique des variables de connexion (DATABASE_URL, REDIS_URL) lors d'un plugin:link.

Prérequis chiffrés pour Dokku

Dokku est le PaaS le plus économe en ressources de cette série.

RAM. 512 Mo suffisent pour une application légère sans build actif. Prévoyez 1 Go de RAM pour un usage courant et 2 Go dès que vos builds utilisent des buildpacks (Node, Ruby, Python compilent en mémoire pendant la construction de l'image) ou que vous hébergez une base de données sur le même VPS. Pour plusieurs applications en parallèle avec PostgreSQL, visez 4 Go.

CPU. 1 vCPU est suffisant pour des applications légères. Les phases de build buildpack sont CPU-intensives et se déroulent à la volée lors de chaque git push : un vCPU partagé peut ralentir le déploiement mais ne bloque pas.

Disque. Comptez 20 Go de SSD minimum. Les images Docker des buildpacks peuvent peser plusieurs centaines de mégaoctets ; ajoutez l'espace pour vos volumes de données (base de données, uploads).

Swap. Sur un VPS d'1 ou 2 Go de RAM, ajoutez systématiquement 2 Go de swap. Sans swap, l'OOM killer du noyau Linux peut tuer un build Node ou Ruby en cours de compilation. La commande de référence : fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile.

Système. Ubuntu 22.04 LTS ou 24.04 LTS fraîchement installé, sans Docker ni Nginx préinstallés. Dokku installe ses propres versions. Les ports 22 (SSH), 80 et 443 doivent être ouverts.

DNS. Configurez soit un domaine par application (mon-app.votre-domaine.com), soit un domaine wildcard *.votre-domaine.com pointant vers l'IP du VPS — ce dernier simplifie l'ajout de nouvelles applications sans retouche DNS à chaque fois.

Installer Dokku v0.38.x et déployer une première application

  1. Télécharger et exécuter le script d'amorçage officiel

    Sur un Ubuntu 22.04 ou 24.04 LTS fraîchement installé, récupérez le script d'installation de la branche stable et lancez-le :

    wget -NP . https://dokku.com/bootstrap.sh
    sudo DOKKU_TAG=v0.38.x bash bootstrap.sh

    Le script installe Docker (si absent), Nginx et Dokku lui-même. L'opération prend deux à cinq minutes selon la vitesse du VPS. À la fin, Dokku est fonctionnel mais non encore configuré.

  2. Configurer le domaine global et ajouter votre clé SSH

    Définissez le domaine racine que Dokku utilisera pour construire les sous-domaines applicatifs :

    dokku domains:set-global votre-domaine.com

    Ajoutez ensuite votre clé SSH publique pour autoriser les déploiements depuis votre poste local :

    cat ~/.ssh/id_ed25519.pub | ssh [email protected] "dokku ssh-keys:add admin"

    Si vous préférez finaliser depuis le navigateur, visitez http://IP-du-VPS juste après l'installation : une page de configuration s'affiche pour coller la clé publique.

  3. Créer une application et configurer le remote Git

    Sur le serveur, créez l'application cible :

    dokku apps:create mon-app

    Sur votre poste local, ajoutez Dokku comme remote Git dans votre dépôt :

    git remote add dokku [email protected]:mon-app

    Dokku créera automatiquement le sous-domaine mon-app.votre-domaine.com (ou mon-app.IP-du-VPS.sslip.io si aucun domaine global n'est défini). Vérifiez avec dokku domains:report mon-app.

  4. Provisionner une base de données PostgreSQL

    Installez le plugin officiel PostgreSQL (une seule fois, sur le serveur) :

    dokku plugin:install https://github.com/dokku/dokku-postgres.git

    Créez une base et reliez-la à l'application :

    dokku postgres:create ma-base
    dokku postgres:link ma-base mon-app

    Le link injecte automatiquement la variable d'environnement DATABASE_URL dans le conteneur de l'application. Vérifiez avec dokku config:show mon-app.

  5. Déployer l'application pour la première fois

    Depuis votre dépôt local, poussez vers Dokku :

    git push dokku main

    Dokku détecte le langage (via Procfile, package.json, requirements.txt, go.mod…), télécharge le buildpack correspondant, construit l'image Docker, puis démarre le conteneur. Le processus s'affiche en temps réel dans le terminal. À la fin, l'URL de l'application est affichée.

  6. Activer HTTPS avec Let's Encrypt

    Installez le plugin Let's Encrypt (une fois par serveur) :

    dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git

    Définissez l'adresse e-mail pour les notifications d'expiration, puis activez le certificat pour l'application :

    dokku letsencrypt:set mon-app email [email protected]
    dokku letsencrypt:enable mon-app

    Activez enfin le renouvellement automatique via une tâche cron :

    dokku letsencrypt:cron-job --add

    Sans ce cron, le certificat expirera après 90 jours sans alerte.

Gérer plusieurs applications et leurs variables d'environnement

Dokku gère chaque application dans un conteneur isolé. Vous pouvez héberger autant d'applications que votre VPS peut en porter, chacune sur son propre sous-domaine ou domaine personnalisé.

Variables d'environnement. Utilisez dokku config:set pour injecter des secrets ou des paramètres de configuration :

dokku config:set mon-app NODE_ENV=production \
  SECRET_KEY=changeme \
  MAIL_HOST=smtp.votre-domaine.com

Chaque config:set redémarre le conteneur par défaut. Pour regrouper plusieurs modifications sans redémarrage intermédiaire, ajoutez --no-restart et déclenchez manuellement dokku ps:restart mon-app à la fin.

Staging vs production. La pratique courante consiste à créer deux applications sur le même serveur :

dokku apps:create mon-app-staging
dokku apps:create mon-app-production

Chaque remote Git pointe vers sa propre application. Les variables d'environnement sont définies séparément. Les bases de données peuvent être partagées (via des services différents du même plugin) ou distinctes.

Domaines personnalisés. Pour associer un domaine existant à une application :

dokku domains:add mon-app mondomaine.com
dokku domains:add mon-app www.mondomaine.com

Assurez-vous que les enregistrements DNS A de ces domaines pointent vers l'IP du VPS avant d'activer Let's Encrypt.

Mises à jour zero-downtime et rollback

Dokku gère le zero-downtime via un mécanisme de checks de santé avant bascule. Par défaut, il attend que le nouveau conteneur réponde sur le port applicatif avant de rediriger le trafic. Vous pouvez affiner ce comportement avec un fichier CHECKS à la racine de votre projet :

WAIT=10
TIMEOUT=60
/healthz Application is up

Ce fichier indique à Dokku d'attendre 10 secondes, puis de vérifier que https://mon-app.votre-domaine.com/healthz retourne une réponse contenant « Application is up » dans les 60 secondes. Si le check échoue, Dokku conserve l'ancienne version en production.

Tags et rollback. Dokku conserve les images Docker des déploiements précédents sous forme de tags. Listez-les :

dokku tags:list mon-app

Pour revenir à une version antérieure, déployez le tag souhaité :

dokku tags:deploy mon-app v3

Cette commande rebascule le trafic vers l'image taguée v3 sans aucun rebuild — le rollback est quasi-instantané. Pour créer explicitement un tag de sauvegarde avant un déploiement risqué :

dokku tags:create mon-app stable-avant-migration

Processus. Vous pouvez également gérer l'échelle des processus (workers, schedulers) séparément de l'application web :

dokku ps:scale mon-app web=1 worker=2

Plugins essentiels

Dokku tire sa richesse de son écosystème de plugins officiels. Voici les plus couramment utilisés.

PostgreSQL. Le plus utilisé, déjà présenté. Commandes utiles supplémentaires : dokku postgres:backup ma-base pour un dump manuel, dokku postgres:connect ma-base pour un accès psql interactif.

Redis. Même logique que PostgreSQL :

dokku plugin:install https://github.com/dokku/dokku-redis.git
dokku redis:create mon-cache
dokku redis:link mon-cache mon-app

Injecte la variable REDIS_URL dans le conteneur.

Let's Encrypt. Déjà couvert à l'étape 6. Pour voir l'état des certificats et leurs dates d'expiration :

dokku letsencrypt:list

Cron (scheduler). Dokku peut exécuter des tâches planifiées via son scheduler intégré. Créez un fichier app.json à la racine de votre projet :

{
  "cron": [
    { "command": "php artisan schedule:run", "schedule": "* * * * *" }
  ]
}

Dokku 0.26+ lit ce fichier et crée automatiquement une tâche cron dans le conteneur.

MySQL. Pour les applications qui requièrent MySQL :

dokku plugin:install https://github.com/dokku/dokku-mysql.git
dokku mysql:create ma-db-mysql
dokku mysql:link ma-db-mysql mon-app

Injecte DATABASE_URL au format mysql2://user:password@host:3306/db.

Dokku vs Caprover vs Easypanel — comparatif 2026

Faites défiler le tableau

CritèreDokku 0.35CapRover 1.xEasypanel 2.x
RAM au repos~100 Mo (Nginx + daemon)~400 Mo (Swarm + superviseur)~350 Mo (Traefik + API)
Interface graphiqueNon — CLI uniquementOui (tableau de bord web)Oui (tableau de bord moderne)
BuildpacksHeroku buildpacks (CNB inclus)captain-definition / DockerNixpacks ou Dockerfile
Déploiement Gitgit push natifCLI caprover + webhookWebhook GitHub / GitLab
Plugins / marketplace~100 plugins officielsCatalogue One-Click (~150 apps)Marketplace intégrée (~200 apps)
Zero-downtimeOui (fichier CHECKS)Oui (rolling Docker Swarm)Oui (Traefik labels)
Rollbackdokku tags:deployRebuild depuis l'imageRedéploiement depuis Git
Multi-serveurNon natif (SSH multi-remote)Oui (Docker Swarm multi-nœuds)Oui (agents distants)
KubernetesNonNon (Docker Swarm seulement)Non
LicenceMITApache 2.0Propriétaire (plan gratuit)
Courbe d'apprentissageFaible (CLI simple)Modérée (interface + DNS captain)Faible (interface intuitive)

Swap recommandé dès 1 Go de RAM. Sur un VPS léger, ajoutez 2 Go de swap avant toute chose : un build Node ou Python sans swap est régulièrement tué par l'OOM killer.

Fichier CHECKS. Sans ce fichier, Dokku bascule dès que le conteneur démarre, avant même que l'application soit prête à répondre. Un CHECKS minimal évite des coupures de quelques secondes lors de chaque déploiement.

Rotation des logs. Les logs Docker grossissent sans limite par défaut. Configurez la rotation dans /etc/docker/daemon.json :

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "50m", "max-file": "3" }
}

Redémarrez ensuite Docker (systemctl restart docker) pour appliquer les paramètres. Les logs applicatifs restent accessibles via dokku logs mon-app -t.

Dépannage des erreurs fréquentes

error: failed to push some refs to '[email protected]:mon-app' — permission denied.
Vérifiez que votre clé SSH est bien enregistrée : dokku ssh-keys:list. Si elle est absente, ajoutez-la avec dokku ssh-keys:add admin < ~/.ssh/id_ed25519.pub. Assurez-vous également que le port 22 n'est pas filtré par le pare-feu du VPS.

! [remote rejected] main -> main (pre-receive hook declined).
Cette erreur indique un échec du build côté Dokku. Consultez les logs détaillés avec dokku logs mon-app ou relisez la sortie du git push ligne par ligne — le buildpack affiche l'erreur précise (dépendance manquante, npm install échoué, etc.).

L'application répond 502 Bad Gateway.
Nginx reçoit la requête mais le conteneur ne répond pas. Vérifiez l'état du processus : dokku ps:report mon-app. Si le statut est exited, consultez les logs : dokku logs mon-app. Cause fréquente : l'application n'écoute pas sur le port déclaré dans le Procfile ou la variable PORT injectée par Dokku.

letsencrypt:enable échoue — challenge HTTP-01 timeout.
Le défi ACME requiert que le domaine soit résolu vers l'IP du VPS avant l'activation. Vérifiez la propagation DNS (dig +short mon-app.votre-domaine.com). Si vous êtes derrière un proxy (Cloudflare), désactivez temporairement le proxy (DNS-only) le temps de l'émission du certificat, puis réactivez-le.

Le build est tué par le noyau (OOM) — Killed.
L'OOM killer est intervenu faute de mémoire. Ajoutez du swap (voir le bloc conseil ci-dessus) ou migrez vers un VPS avec 2 Go de RAM. Pendant un build actif, la commande free -m permet de surveiller la mémoire disponible en temps réel.

Pour aller plus loin

Dokku couvre le déploiement d'applications à conteneur unique sur un VPS. Si votre architecture évolue vers plusieurs services interdépendants, plusieurs alternatives de la même famille complètent cette approche. CapRover ajoute une interface graphique et un mode cluster Docker Swarm pour les équipes qui préfèrent un tableau de bord. Easypanel simplifie la gestion multi-services avec Nixpacks et une marketplace d'applications. Pour un reverse proxy autonome sans PaaS complet, Caddy ou Nginx Proxy Manager s'intègrent nativement avec Docker. Chacun de ces outils fonctionne sur un VPS Cloud ServOrbit sous Ubuntu LTS.

Mettez Dokku en production sur votre VPS

Un VPS Cloud ServOrbit sous Ubuntu LTS, léger et abordable, est le terrain idéal pour Dokku et son workflow de déploiement par git push.