[{"data":1,"prerenderedAt":193},["ShallowReactive",2],{"seo-verification":3,"blog-deployer-avec-kamal-ma-fr":6,"promo-bar-likely":192},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-deployer-avec-kamal-ma-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":136,"ctaBody":137,"ctaButton":138,"ctaUrl":139,"relatedPosts":140},40,"deployer-avec-kamal",{"fr":10,"en":12,"ar":13,"es":14},"deploy-your-applications-with-kamal-on-a-vps","انشر-تطبيقاتك-باستخدام-kamal-على-خادم-vps","desplegar-con-kamal","Déployer des applications web avec Kamal sur un VPS","Guide complet Kamal v2 : installation, configuration deploy.yml, kamal-proxy, secrets, multi-serveurs, CI\u002FCD GitHub Actions et dépannage sur VPS.",12,1,false,"2026-05-11T00:00:00+00:00","2026-11-08T01:13:14+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},3,"Déploiement","deploiement","bg-success\u002F10 text-success",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fdeployer-avec-kamal-poster.svg","Kamal (anciennement MRSK), développé par 37signals, déploie des applications conteneurisées sur un ou plusieurs VPS depuis votre machine locale, sans orchestrateur lourd. En version 2 depuis septembre 2024, il remplace Traefik par son propre proxy (kamal-proxy) et centralise la gestion des secrets dans `.kamal\u002Fsecrets`. La commande `kamal deploy` coordonne build Docker, push vers un registre et bascule zero-downtime en une passe — sur un VPS unique comme sur un cluster de cinquante serveurs.",[34,38,50,53,56,84,87,90,93,96,99,102,133],{"type":35,"title":36,"body":37},"h2","Pourquoi Kamal plutôt que Kubernetes pour déployer des applications web sur un VPS ?","Kubernetes résout des problèmes de coordination à grande échelle — découverte de service, autoscaling horizontal, namespaces multi-équipes — qui n'existent pas sur un VPS unique ou un petit cluster. Rien que pour l'installer avec kubeadm, la documentation officielle demande 2 Go de RAM par machine et 2 CPU pour le plan de contrôle, avant la moindre application. Kamal occupe un terrain différent : il prend votre Dockerfile, construit l'image localement ou sur le serveur, la pousse vers un registre, l'exécute sur vos serveurs via SSH et bascule le trafic sans interruption grâce à kamal-proxy. Toute la configuration tient dans un fichier `config\u002Fdeploy.yml` versionné avec votre code. Pas de control plane à maintenir, pas de certificats d'API à renouveler, pas de YAML interminable réparti sur dix ressources. Vous conservez la simplicité opérationnelle d'un VPS — accès SSH direct, `docker ps` lisible, logs dans un fichier — tout en disposant d'un workflow de déploiement professionnel avec rollback instantané, health checks et HTTPS automatique.",{"type":39,"title":40,"items":41},"ul","Ce que Kamal v2 vous apporte",[42,43,44,45,46,47,48,49],"**Déploiements zero-downtime** — kamal-proxy attend que les health checks passent sur le nouveau conteneur avant de basculer le trafic, et draine les requêtes en vol sur l'ancien","**Une seule commande** — `kamal deploy` enchaîne build, push vers le registre, déploiement SSH et vérification sans intervention manuelle","**HTTPS automatique Let's Encrypt** — kamal-proxy gère le renouvellement des certificats TLS ; aucune configuration Certbot séparée","**Rollback instantané** — `kamal rollback [VERSION]` repointe le proxy sur une image déjà présente sur le serveur en quelques secondes","**Gestion des secrets structurée** — `.kamal\u002Fsecrets` supporte la lecture depuis 1Password, Bitwarden ou des variables d'environnement, sans stocker de valeurs en clair dans le dépôt","**Multi-serveurs et multi-rôles natifs** — web, workers Sidekiq, accessoires Postgres ou Redis décrits dans un seul fichier, déployés en parallèle","**Multi-applications sur un seul VPS** — depuis Kamal 2, plusieurs applications partagent un même kamal-proxy sans conflit de configuration","**Compatible toute stack** — Rails, Django, Node.js, Go, PHP : Kamal ne présuppose qu'un Dockerfile et un registre d'images",{"type":35,"title":51,"body":52},"Prérequis chiffrés avant de déployer avec Kamal","Côté VPS, Kamal a besoin d'un serveur Linux joignable en SSH par clé (pas de mot de passe) ; sa documentation n'impose ni distribution ni gabarit, mais comptez au moins 2 vCPU et 2 Go de RAM pour une application web standard avec sa base de données. Kamal peut installer Docker lui-même lors du premier `kamal setup` (script get.docker.com), mais il lui faut pour cela un accès root en SSH — Kamal se connecte en root par défaut. Un port 80 et 443 ouverts en entrée et un enregistrement DNS A pointant vers l'IP du VPS sont indispensables avant d'activer le SSL. Côté machine locale, deux options existent : installer la gem Ruby (`gem install kamal`, avec un environnement Ruby) ou utiliser l'image Docker officielle. La version courante est la 2.12.0 (juin 2026). Préparez enfin un registre de conteneurs — Docker Hub, GitHub Container Registry ou un registre privé — ainsi que ses identifiants.",{"type":35,"title":54,"body":55},"Kamal v1 vs Kamal v2 : ce qui a changé","Kamal 2, sorti en septembre 2024 (bundlé par défaut dans Rails 8, sorti en novembre 2024), remplace Traefik par kamal-proxy, un reverse proxy développé en interne par 37signals. Le changement est structurel : Traefik est déclaratif (on lui soumet une configuration et il converge), alors que Kamal est impératif. La version 1 devait interroger l'API de Traefik en boucle pour savoir si le déploiement avait abouti — une source de raceconditions. Avec kamal-proxy, les commandes sont directes et synchrones. Côté configuration, le bloc `traefik:` disparaît de `deploy.yml` ; il est remplacé par `proxy:` avec les clés `host`, `ssl` et `app_port`. Les secrets migrent de `.env` vers `.kamal\u002Fsecrets`, un fichier shell évalué qui peut appeler des CLI externes (`op read`, `bw get`). La configuration se convertit à la main ; `kamal upgrade` migre ensuite les serveurs : il retire Traefik, démarre kamal-proxy, puis redémarre l'application et les accessoires sur le nouveau réseau. Enfin, Kamal 2 introduit le déploiement de plusieurs applications sur un même proxy et le mode maintenance (`kamal app maintenance`, puis `kamal app live` pour revenir en ligne).",{"type":57,"title":58,"steps":59},"steps","Installation et premier déploiement avec Kamal v2",[60,63,66,69,72,75,78,81],{"title":61,"body":62},"Installer Kamal sur votre machine locale","Exécutez `gem install kamal` (environnement Ruby requis) ou, si vous préférez éviter Ruby, utilisez l'alias Docker : `alias kamal='docker run -it --rm -v \"${PWD}:\u002Fworkdir\" -v \"${SSH_AUTH_SOCK}:\u002Fssh-agent\" -e SSH_AUTH_SOCK=\u002Fssh-agent -v \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock ghcr.io\u002Fbasecamp\u002Fkamal:latest'`. Vérifiez l'installation avec `kamal version` — la version courante est 2.12.0.",{"title":64,"body":65},"Initialiser la configuration dans votre projet","Dans le dossier racine du projet, lancez `kamal init`. Kamal génère `config\u002Fdeploy.yml` et `.kamal\u002Fsecrets`. Renseignez dans `deploy.yml` : le nom du service (`service: monapp`), l'image (`image: votreuser\u002Fmonapp`), la liste des serveurs (`servers: web: - 203.0.113.10`), et le registre (`registry: server: ghcr.io` ou omis pour Docker Hub).",{"title":67,"body":68},"Configurer les secrets et variables d'environnement","Ajoutez `.kamal\u002Fsecrets` à votre `.gitignore`. Dans ce fichier, déclarez vos secrets sous forme de variables shell : `KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD` (lues depuis l'environnement local) ou `DB_PASSWORD=$(op read op:\u002F\u002Fvault\u002Fmonapp\u002Fdb-password)` (depuis 1Password). Dans `config\u002Fdeploy.yml`, référencez-les sous `env.secret:` pour les valeurs secrètes et `env.clear:` pour les variables non sensibles comme `RAILS_ENV=production`.",{"title":70,"body":71},"Configurer le proxy et le SSL","Dans `config\u002Fdeploy.yml`, ajoutez la section proxy : `proxy: host: app.votre-domaine.com ssl: true app_port: 3000`. Kamal-proxy obtiendra automatiquement un certificat Let's Encrypt via ACME (ports 80 et 443 ouverts). Assurez-vous que l'enregistrement DNS A pointe déjà vers l'IP du VPS avant cette étape — le défi ACME échoue sinon.",{"title":73,"body":74},"Provisionner le serveur (une seule fois)","Lancez `kamal setup`. Kamal se connecte en SSH, installe Docker si absent, authentifie le registre, démarre kamal-proxy et déploie la première version de l'application. Cette commande est l'unique étape d'amorçage : elle configure le serveur de A à Z. En cas de serveur déjà équipé, `kamal setup` détecte Docker existant et ne réinstalle pas.",{"title":76,"body":77},"Déployer les mises à jour suivantes","À chaque itération, exécutez `kamal deploy`. Kamal construit l'image (ou la récupère si elle existe déjà dans le cache), la pousse vers le registre, démarre un nouveau conteneur en parallèle de l'ancien, attend que le health check passe (par défaut `GET \u002Fup`), bascule kamal-proxy vers le nouveau conteneur, draine les connexions en cours et stoppe l'ancien. L'opération est visible en temps réel dans le terminal.",{"title":79,"body":80},"Vérifier l'état et consulter les logs","Après déploiement : `kamal app details` affiche la version en cours sur chaque serveur, `kamal app logs -f` suit les logs en temps réel, `kamal app exec -i 'bin\u002Frails console'` ouvre une console dans le conteneur en production. Pour voir l'état du proxy : `kamal proxy details`.",{"title":82,"body":83},"Gérer les accessoires (base de données, cache)","Déclarez Postgres sous la clé `accessories:` dans `deploy.yml` : image, port (lié à l'hôte local, `port: \"127.0.0.1:5432:5432\"`, jamais publié sur toutes les interfaces), volumes, variables. `kamal accessory boot db` démarre le service sur le bon serveur. Les accessoires ne passent pas par kamal-proxy — ils sont joints directement par l'application via les variables d'environnement. Cette approche garde la stack entière décrite dans un seul fichier versionné.",{"type":35,"title":85,"body":86},"Configuration multi-serveurs et déploiements parallèles","Kamal déploie vers tous les serveurs d'un rôle en parallèle par défaut. Pour un cluster de serveurs web, listez leurs IPs sous `servers: web:`. Pour un déploiement progressif (rolling), ajoutez `boot: limit: 2 wait: 10` — Kamal déploiera sur 2 serveurs à la fois avec 10 secondes entre chaque vague. Les rôles permettent de différencier les serveurs : sous `servers:` déclarez `web:` (serveurs HTTP) et `workers:` avec une commande spécifique comme `bundle exec sidekiq`. Chaque rôle peut avoir ses propres serveurs, secrets et variables. kamal-proxy tourne sur chaque serveur du rôle principal (`web` par défaut) ; les autres rôles, comme `workers`, n'en ont pas. Avec plusieurs serveurs web, placez un répartiteur de charge devant eux : le HTTPS automatique de kamal-proxy suppose un déploiement sur un seul serveur. Pour plusieurs applications sur un même VPS, chacune déclare son propre `service:` et `host:` dans son `deploy.yml` ; kamal-proxy les distingue par hostname et route les requêtes sans configuration additionnelle.",{"type":35,"title":88,"body":89},"Variables d'environnement et secrets — bonnes pratiques","La séparation entre variables claires et secrets est explicite dans Kamal 2. Dans `deploy.yml`, les variables non sensibles vont sous `env: clear:` (elles apparaissent dans les logs et l'inspection de conteneur), et les secrets sous `env: secret:` — leur valeur est lue depuis `.kamal\u002Fsecrets` au moment du déploiement et écrite dans un fichier d'environnement sur le serveur, au lieu d'être passée en clair dans la commande `docker run`. Un secret présent dans `.kamal\u002Fsecrets` n'est injecté que s'il est listé sous `env: secret:` — à la racine pour tous les rôles, ou dans le rôle ou l'accessoire qui l'utilise. La commande `kamal secrets print` affiche les valeurs résolues pour vérifier que la lecture depuis un gestionnaire de mots de passe fonctionne correctement avant un déploiement. Pour les environnements multiples (staging, production), `.kamal\u002Fsecrets.staging` et `.kamal\u002Fsecrets.production` coexistent ; le fichier `.kamal\u002Fsecrets-common` porte les valeurs partagées.",{"type":91,"body":92},"tip","Si un déploiement introduit une régression, n'attendez pas le prochain cycle de build : exécutez `kamal rollback [VERSION]` pour repointer kamal-proxy instantanément vers une image précédente déjà présente sur le VPS. Listez les versions disponibles avec `kamal app images`. Le rollback ne reconstruit rien — il repointe le proxy en quelques secondes. En complément, `kamal app exec 'commande'` lance des migrations dans un conteneur de la version en cours (`--reuse` pour le conteneur actif, `-i` pour une console) sans ouvrir de session SSH manuelle.",{"type":35,"title":94,"body":95},"HTTPS automatique avec kamal-proxy et Let's Encrypt","Kamal-proxy gère le cycle de vie TLS complet : il écoute sur les ports 80 et 443, répond aux défis ACME de Let's Encrypt, obtient le certificat, le stocke sur le serveur et le renouvelle automatiquement avant expiration. La seule précondition est que le nom d'hôte déclaré dans `proxy: host:` resolve bien vers l'IP du VPS et que les ports 80 et 443 soient ouverts — le certificat est demandé à la première connexion HTTPS, et le défi ACME échoue tant que le DNS n'est pas propagé. Sur un serveur hébergeant plusieurs applications, chaque application a son propre `host:` ; kamal-proxy route par nom d'hôte et gère un certificat distinct par domaine. Ce HTTPS automatique suppose un déploiement sur un seul serveur : au-delà, terminez le TLS sur un répartiteur de charge. Pour les domaines qui ne nécessitent pas de TLS (environnements internes, staging sans domaine public), il suffit de ne pas inclure `ssl: true` dans la section `proxy:` — le proxy répond alors en HTTP sur le port 80.",{"type":35,"title":97,"body":98},"Dépannage — erreurs fréquentes lors du déploiement avec Kamal","**SSH connection timeout** : vérifiez que l'IP du serveur est joignable (`ssh -i votre_cle root@203.0.113.10`) et que le pare-feu autorise le port 22. L'agent SSH doit être actif (`eval $(ssh-agent) && ssh-add`). **Target failed to become healthy** : le health check par défaut frappe `GET \u002Fup` — si votre application ne répond pas sur ce chemin, déclarez `proxy: healthcheck: path: \u002Fhealth` dans `deploy.yml`. Vérifiez aussi que `app_port:` correspond au port que le conteneur écoute réellement. **Registry authentication error** : `kamal registry login` puis relancez ; en CI, vérifiez que la variable `KAMAL_REGISTRY_PASSWORD` est bien exportée avant `kamal deploy`. **Port conflict sur le serveur** : si un processus externe occupe le port 80 ou 443, kamal-proxy ne peut pas démarrer. Identifiez-le avec `ss -tlnp | grep -E '80|443'` et arrêtez-le. **Kamal setup échoue sur l'installation de Docker** : l'installation automatique demande un accès root en SSH. Si l'installation automatique est refusée par la politique système, installez Docker manuellement et relancez `kamal setup` — il détecte Docker déjà présent et passe à l'étape suivante.",{"type":35,"title":100,"body":101},"Intégrer Kamal dans un pipeline CI\u002FCD GitHub Actions","Le fichier de workflow GitHub Actions typique pour Kamal 2 s'articule en deux jobs : un job de test (exécuté sur chaque push) et un job de déploiement conditionnel (déclenché sur push vers `main` ou publication d'une release). Dans le job de déploiement, installez Ruby et la gem Kamal, puis lancez `kamal deploy` avec les secrets injectés depuis GitHub Secrets. L'essentiel du fichier `.github\u002Fworkflows\u002Fdeploy.yml` : le job déploiement dépend du job test (`needs: test`), configure les variables d'environnement (`KAMAL_REGISTRY_PASSWORD: ${{ secrets.KAMAL_REGISTRY_PASSWORD }}`), installe Kamal avec `gem install kamal -v 2.12.0` pour une version épinglée, puis exécute `kamal deploy`. L'agent SSH est configuré via `webfactory\u002Fssh-agent@v0.10.0` avec la clé privée stockée dans les secrets GitHub. Chaque déploiement est ainsi traçable dans l'onglet Actions, avec les logs complets et la possibilité de le déclencher manuellement via `workflow_dispatch`.",{"type":103,"title":104,"rows":105,"headers":130},"comparison","Kamal v1 vs Kamal v2 — récapitulatif des différences",[106,110,114,118,122,126],[107,108,109],"Proxy","Traefik (déclaratif, polling API)","kamal-proxy (impératif, commandes directes)",[111,112,113],"Secrets",".env à la racine du projet",".kamal\u002Fsecrets (shell évalué, gestionnaires de mots de passe)",[115,116,117],"SSL","Géré par Traefik via ACME","Géré par kamal-proxy (Let's Encrypt intégré)",[119,120,121],"Multi-apps","Non supporté nativement","Natif : plusieurs apps par serveur, un seul proxy",[123,124,125],"Upgrade","—","`kamal upgrade` migre les serveurs (config à convertir à la main)",[127,128,129],"Config proxy dans deploy.yml","Bloc `traefik:`","Bloc `proxy:` avec `host`, `ssl`, `app_port`",[5,131,132],"Kamal v1","Kamal v2",{"type":35,"title":134,"body":135},"Kamal sur un VPS ServOrbit — de la commande au domaine en orbite","Un VPS Cloud ServOrbit sous Ubuntu 24.04 répond à tous les prérequis de Kamal dès la livraison : accès SSH par clé, réseau 1 Gbit\u002Fs et IP dédiée. Le workflow type : créez un enregistrement DNS A pointant `app.votre-domaine.com` vers l'IP du VPS, lancez `kamal setup` depuis votre machine locale — Kamal installe Docker, démarre kamal-proxy, obtient le certificat Let's Encrypt et déploie votre application en une passe. Dès lors, chaque `kamal deploy` depuis votre terminal ou votre pipeline CI applique la mise à jour en zero-downtime. Pour héberger plusieurs projets sur un même VPS, chacun avec son propre domaine et son propre certificat, ajoutez une application dans un second `deploy.yml` pointant vers le même serveur — kamal-proxy route par hostname sans reconfiguration. La facturation reste celle du VPS, sans surcoût lié au déploiement.","Pilotez vos déploiements Kamal sur un VPS Cloud ServOrbit","Provisionnez un VPS Cloud avec le template Déploiement et accès SSH par clé : Kamal y installe Docker et déploie votre application en zero-downtime dès la première commande.","Voir les VPS Cloud","\u002Fvps-cloud",[141,160,176],{"id":142,"slug":143,"slugs":144,"title":148,"excerpt":149,"readTime":150,"views":151,"isPinned":19,"noindex":19,"publishedAt":152,"updatedAt":153,"category":154,"categories":155,"featuredImage":29,"bgImage":30,"posterImage":157,"relatedSolution":158},33,"deployer-avec-caprover",{"fr":143,"en":145,"ar":146,"es":147},"deploy-your-applications-with-caprover-on-a-vps","انشر-تطبيقاتك-باستخدام-caprover-على-خادم-vps","desplegar-aplicaciones-con-caprover-en-un-vps","Déployer vos applications avec CapRover sur un VPS","Guide complet CapRover : installation, captain-definition, CI\u002FCD GitHub Actions, cluster multi-nœuds, sauvegardes et dépannage.",10,2,"2026-05-18T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[156],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-caprover-poster.svg",{"categorySlug":25,"appSlug":159},"caprover",{"id":161,"slug":162,"slugs":163,"title":167,"excerpt":168,"readTime":169,"views":18,"isPinned":19,"noindex":19,"publishedAt":170,"updatedAt":171,"category":172,"categories":173,"featuredImage":29,"bgImage":30,"posterImage":175,"relatedSolution":29},34,"deployer-avec-dokku",{"fr":162,"en":164,"ar":165,"es":166},"deploy-your-applications-with-dokku-on-a-vps","انشر-تطبيقاتك-باستخدام-dokku-على-خادم-vps","desplegar-aplicaciones-con-dokku-en-un-vps","Déployer vos applications avec Dokku sur un VPS","Guide complet Dokku v0.35 : installation, buildpacks, variables d'env, rollback, plugins postgres\u002Fredis\u002Fletsencrypt et dépannage des erreurs courantes.",11,"2026-05-17T00:00:00+00:00","2026-10-18T21:57:59+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[174],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-dokku-poster.svg",{"id":177,"slug":178,"slugs":179,"title":183,"excerpt":184,"readTime":150,"views":18,"isPinned":19,"noindex":19,"publishedAt":185,"updatedAt":153,"category":186,"categories":187,"featuredImage":29,"bgImage":30,"posterImage":189,"relatedSolution":190},35,"deployer-avec-portainer",{"fr":178,"en":180,"ar":181,"es":182},"deploy-your-applications-with-portainer-on-a-vps","انشر-تطبيقاتك-باستخدام-portainer-على-خادم-vps","desplegar-aplicaciones-con-portainer-en-un-vps","Déployer vos applications avec Portainer sur un VPS","Pilotez Docker visuellement avec Portainer sur votre VPS : conteneurs, stacks, volumes et réseaux gérés depuis une interface web claire.","2026-05-16T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[188],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-portainer-poster.svg",{"categorySlug":25,"appSlug":191},"portainer",true,1794270693166]