[{"data":1,"prerenderedAt":220},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-komodo-on-a-vps-multi-server-docker-and-gitops-ma-en":6,"promo-bar-likely":219},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-self-host-komodo-on-a-vps-multi-server-docker-and-gitops-ma-en",{"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":32,"intro":35,"sections":36,"ctaTitle":148,"ctaBody":149,"ctaButton":150,"ctaUrl":151,"relatedPosts":152},191,"self-host-komodo-on-a-vps-multi-server-docker-and-gitops",{"fr":12,"en":10,"ar":13,"es":14},"self-host-komodo-vps","استضافة-komodo-على-vps-تنسيق-docker-وgitops-للخوادم","alojar-komodo-en-un-vps","Self-Host Komodo on a VPS: Multi-Server Docker and GitOps","Deploy Komodo on a ServOrbit VPS to manage Docker stacks and GitOps pipelines across servers from one dashboard — Rust binary, open-source Portainer alternative.",9,2,false,"2026-07-25T00:00:00+00:00","2026-11-04T16:30:26+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},3,"Deployment","deploiement","bg-success\u002F10 text-success",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-komodo-vps-poster.svg",{"categorySlug":33,"appSlug":34},"application-deployment-devops","komodo","Managing Docker on one server is simple. On ten servers, it quickly becomes chaos: ten SSH sessions, ten compose files, no centralised history. Komodo (GPL-3.0, over 12,000 GitHub stars, v2.x) solves this with a Core\u002FPeriphery architecture: one dashboard to orchestrate all your servers, trigger deployments from Git and trace every action in an audit log. Written in Rust, the Core idles under 256 MB RAM — it runs comfortably on the smallest ServOrbit VPS.",[37,41,51,54,82,85,103,141,144],{"type":38,"title":39,"body":40},"h2","Why Komodo instead of Portainer or Dockge?","Portainer and Dockge are single-server UIs: they read the local Docker socket and show you what is running on that machine. As soon as you have two or more servers, you need two tabs, you have to remember which service runs where, and replicate every change manually. Komodo breaks this ceiling with its Core\u002FPeriphery architecture: the Core is a central server that drives lightweight Periphery agents on each machine. You deploy, restart or update any stack from one interface, with a full history of who did what and when.",{"type":42,"title":43,"items":44},"ul","What Komodo adds beyond container management",[45,46,47,48,49,50],"Native GitOps — link a Git repository, define a Deploy Procedure, and trigger it automatically on every `git push` via HMAC webhook.","Reusable Procedures — chain image pull, database migration, stack restart and Slack notification into a single versionable workflow.","Docker Swarm — manage Swarm services, replicas and rolling updates from the same interface as your Compose stacks.","Native Slack\u002FDiscord alerts — configure alert channels for deployment failures, stopped containers and critical resources.","Multi-user RBAC — grant granular access by role (viewer, builder, deployer) without sharing the admin account.","Full REST API — automate deployments from your CI\u002FCD pipeline (GitHub Actions, Woodpecker, Forgejo) without the web interface.",{"type":38,"title":52,"body":53},"Core\u002FPeriphery architecture in practice","The Core is the brain: it stores configuration in FerretDB (a MongoDB-compatible layer), exposes the web UI on port 9120 and receives webhooks. Periphery agents are the arms: each one runs on a target server, proxies the machine's Docker socket to the Core over an encrypted channel and executes the commands the Core sends. The asymmetric keypair generated at init ensures that only your Core can command your agents — no extra secrets to manage. On a ServOrbit VPS, the local Periphery agent is deployed in the same Docker Compose stack as the Core, so the hosting server itself is managed from the first boot.",{"type":55,"title":56,"steps":57},"steps","Deploy Komodo on your ServOrbit VPS",[58,61,64,67,70,73,76,79],{"title":59,"body":60},"Order the VPS","A 1 vCPU \u002F 1 GB RAM VPS on Ubuntu 24.04 LTS is sufficient for the Komodo control plane (Core + FerretDB). The Rust Core idles under 256 MB. If you plan to run other services on the same VPS, 2 GB RAM is recommended.",{"title":62,"body":63},"Deploy from the ServOrbit marketplace","In your ServOrbit client area, go to Marketplace → Application Deployment & DevOps → Komodo and click Deploy. Provide a domain name or subdomain — required for `KOMODO_HOST`. The playbook auto-generates JWT secrets, the Core\u002FPeriphery keypair and the admin password, then starts the services. The Komodo dashboard is available on port 9120 over HTTPS.",{"title":65,"body":66},"Log in and verify the local agent","Open `https:\u002F\u002Fyour-domain.com:9120` and log in with `admin` and the password shown in your ServOrbit client area. In the Servers menu you should see a server named 'Local' already registered — this is the Periphery agent on the hosting VPS that auto-connected at startup. Change your password from the account settings during this first session.",{"title":68,"body":69},"Connect a remote server via Periphery","On each additional VPS to manage, install the Periphery agent: `docker run -d --restart=unless-stopped --network host -v \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock ghcr.io\u002Fmoghtech\u002Fkomodo-periphery:latest`. Then in Komodo, go to Servers → Add Server, enter the agent IP and port 8120. The Core validates the connection using the Periphery public key generated at init. Your server fleet appears immediately in the dashboard.",{"title":71,"body":72},"Create your first stack from the marketplace","In Komodo, go to Stacks → New Stack. Choose the target server from the dropdown (Local or any added agent), paste your Docker Compose YAML or point to a Git repository path, and click Deploy. Komodo writes the file to the remote server, runs `docker compose up -d` and streams the logs in real time.",{"title":74,"body":75},"Configure Slack or e-mail alerts","In Komodo, go to Alerters → New Alerter. Choose the type (Slack, Discord, e-mail) and paste the webhook URL or destination address. Then associate the alerter with your resources (Stacks, Builds, Servers) via the Alerts section of each resource. You receive an immediate notification on deployment failure or stopped container.",{"title":77,"body":78},"Set up a GitOps pipeline","In your GitHub repository, add a webhook pointing to `https:\u002F\u002Fyour-domain.com\u002Fapi\u002Fwebhook\u002Fkomodo` with the HMAC secret defined in Komodo. Create a Procedure named 'Deploy App': pull image, restart stack, notification. Link the webhook to the Procedure. Every `git push` now triggers the pipeline — the HMAC signature is verified by Komodo before execution.",{"title":80,"body":81},"Integrate your CI\u002FCD via the REST API","Komodo exposes a full REST API at `\u002Fapi`. From GitHub Actions, trigger a deployment with a `POST \u002Fapi\u002Fexecute\u002Fprocedure\u002F\u003Cname>` call and the API token of your service account. This integration lets you chain tests, image build and deployment in a single CI workflow without direct machine access.",{"type":38,"title":83,"body":84},"GitOps with webhooks: deploy on every push","The Komodo GitOps cycle rests on three components: a Git repository, an HTTP webhook, and a Procedure. On the GitHub side, create a webhook in Settings → Webhooks, point it to `https:\u002F\u002Fyour-domain.com\u002Fapi\u002Fwebhook\u002Fkomodo`, set the content type to `application\u002Fjson` and define a secret. On the Komodo side, in the Webhooks section of a Stack or Procedure, paste that same secret — Komodo computes the HMAC SHA-256 of each incoming payload and rejects requests whose signature does not match.\n\nA typical deployment Procedure chains three actions: `PullImage` (fetches the latest image from your registry), `DeployStack` (launches or recreates the containers), then `SendAlert` (notifies your Slack channel). If any step fails, Komodo stops the Procedure and sends the full error to your alerter — you never end up with a deployment silently half-applied.\n\nOne subtlety to know: Komodo validates the push branch against the branch configured in the Stack before triggering. A push to a feature branch will not trigger a production deployment, even if the webhook points to the same URL. Configure one Stack per environment (staging on `dev`, production on `main`) and you get a fully automated promotion pipeline.",{"type":55,"title":86,"steps":87},"Creating a Komodo Procedure: pull, migrate, restart",[88,91,94,97,100],{"title":89,"body":90},"Create the Procedure","In Komodo, go to Procedures → New Procedure. Give it a name (`deploy-app`) and select the target server. A Procedure is an ordered list of steps — each step has a type (PullImage, DeployStack, RunCommand, SendAlert) and parameters.",{"title":92,"body":93},"Add the PullImage step","Click Add Step → PullImage. Enter the image name (e.g. `ghcr.io\u002Fmyorg\u002Fmyapp:latest`) and the server to pull it on. If your image is in a private registry, add the credentials in Settings → Registries before this step — Komodo injects them automatically during the pull.",{"title":95,"body":96},"Add a migration command","Click Add Step → RunCommand. In the Command field, enter the migration command to run in the container (e.g. `docker exec app php artisan migrate --force`). Enable the 'Stop on error' option: if the migration fails, the Procedure stops before restarting the service, preventing you from leaving an application with an inconsistent schema.",{"title":98,"body":99},"Add the stack restart","Click Add Step → DeployStack and select the target Stack. Komodo runs `docker compose up -d --pull never` (the image was already pulled in the previous step) and recreates modified containers. Environment variables defined in the Stack are passed automatically.",{"title":101,"body":102},"Add a completion notification","Click Add Step → SendAlert and select your Slack or Discord Alerter. You can include context variables in the message (`{{ procedure.name }}`, `{{ server.name }}`) to identify at a glance which Procedure on which server just ran.",{"type":104,"title":105,"headers":106,"rows":111},"comparison","Komodo vs Portainer vs Dockge",[107,108,109,110],"Feature","Komodo","Portainer CE","Dockge",[112,117,121,126,129,133,136],[113,114,115,116],"Native multi-server","✅ Multi-node Core\u002FPeriphery","⚠️ Edge agents (paid)","❌ Single host only",[118,119,120,120],"GitOps \u002F webhooks","✅ Native, HMAC validated","❌ Not native",[122,123,124,125],"Procedures \u002F automation","✅ Built-in engine","⚠️ Limited CE","❌ No",[127,128,128,125],"REST API","✅ Full",[130,131,132,125],"Native alerts","✅ Slack, Discord, e-mail","⚠️ Partial CE",[134,135,132,125],"Audit log","✅ All actions",[137,138,139,140],"Licence \u002F price","GPL-3.0, free","Zlib (CE free) \u002F Business paid","MIT, free",{"type":38,"title":142,"body":143},"Troubleshooting: common errors and solutions","**Periphery agent unreachable.** The most common error when adding a new server. First check that the remote server's firewall allows incoming connections on port 8120 from your Core's IP. Then verify that the `KOMODO_HOST` variable of the Periphery agent matches the IP or domain the Core uses to reach it — a wrong value lets the agent start without error but makes it unreachable.\n\n**Failed to pull image.** Komodo returns this error when the private registry is not accessible or credentials are missing. Add your credentials in Settings → Registries (Docker Hub, GHCR, private registry) before triggering a pull. If the image is public and the error persists, verify that the target server has internet access on port 443.\n\n**Webhook not triggered.** Two main causes: the HMAC secret configured in Komodo does not match the one entered in GitHub, or your Core's URL is not accessible from GitHub's servers (behind a firewall or VPN). Check the 'Recent Deliveries' tab in GitHub to see the HTTP code returned — a `401` indicates an incorrect secret, a `timeout` indicates a network issue. Also verify that the push branch matches the branch configured in your Stack or Procedure.\n\n**Slow first start (FerretDB).** FerretDB performs an internal database initialisation on first launch, which can take 30 to 60 seconds before the Komodo interface responds. If you see a connection error immediately after deployment, wait one minute and reload the page before diagnosing an installation problem.",{"type":145,"title":146,"body":147},"tip","Komodo + Dockge: the two complementary tools","Komodo and Dockge are not mutually exclusive. Dockge is great for interactive editing of Compose files on a single machine (YAML interface with syntax highlighting). Komodo handles multi-server coordination, Git deployments and workflows. Deploy Dockge via Komodo on your development machines, and use Komodo to orchestrate production deployments.","Your servers under GitOps control","Deploy Komodo on a ServOrbit VPS and manage your entire Docker fleet from a unified dashboard — GitOps, webhooks, audit log.","Deploy Komodo","\u002Fapplications\u002Fapplication-deployment-devops\u002Fkomodo",[153,177,195],{"id":154,"slug":155,"slugs":156,"title":160,"excerpt":161,"readTime":162,"views":163,"isPinned":19,"noindex":19,"publishedAt":164,"updatedAt":165,"category":166,"categories":172,"featuredImage":29,"bgImage":30,"posterImage":174,"relatedSolution":175},161,"how-to-self-host-dockge-on-a-vps-visual-docker-compose-manager",{"fr":157,"en":155,"ar":158,"es":159},"self-host-dockge-vps","استضافة-dockge-على-vps-مدير-مرئي-لـ-docker-compose","alojar-dockge-en-un-vps","How to Self-Host Dockge on a VPS: Visual Docker Compose Manager","Deploy Dockge on your VPS: a lightweight open-source visual manager to create, edit and monitor your Docker Compose stacks from a clean web UI, no command line.",4,1,"2026-07-03T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":167,"name":168,"slug":169,"color":170,"icon":171},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[173],{"id":167,"name":168,"slug":169,"color":170,"icon":171},"\u002Fblog\u002Fcovers\u002Fself-host-dockge-vps-poster.svg",{"categorySlug":33,"appSlug":176},"dockge",{"id":178,"slug":179,"slugs":180,"title":184,"excerpt":185,"readTime":186,"views":18,"isPinned":19,"noindex":19,"publishedAt":187,"updatedAt":188,"category":189,"categories":190,"featuredImage":29,"bgImage":30,"posterImage":192,"relatedSolution":193},41,"deploy-your-applications-with-coolify-on-a-vps",{"fr":181,"en":179,"ar":182,"es":183},"deployer-avec-coolify","نشر-تطبيقاتك-باستخدام-coolify-على-vps","desplegar-aplicaciones-con-coolify-en-un-vps","Deploy Your Applications with Coolify on a VPS","Deploy Coolify on a VPS: installation, HTTPS configuration, Git connection, deploying your first application, databases, backups, and troubleshooting.",12,"2026-05-10T00:00:00+00:00","2026-10-31T01:54:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[191],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-coolify-poster.svg",{"categorySlug":33,"appSlug":194},"coolify",{"id":196,"slug":197,"slugs":198,"title":202,"excerpt":203,"readTime":204,"views":18,"isPinned":19,"noindex":19,"publishedAt":205,"updatedAt":206,"category":207,"categories":213,"featuredImage":29,"bgImage":30,"posterImage":215,"relatedSolution":216},164,"self-host-headscale-on-a-vps-your-own-tailscale-control-server",{"fr":199,"en":197,"ar":200,"es":201},"self-host-headscale-tailscale-vps","استضافة-headscale-على-vps-خادم-تحكم-tailscale-خاص-بك","auto-alojar-headscale-en-un-vps-servidor-tailscale","Self-Host Headscale on a VPS: Your Own Tailscale Control Server","Replace Tailscale's cloud control server with Headscale on your own VPS — unlimited users, full WireGuard mesh networking, magic DNS and ACLs, with no SaaS dependency.",19,"2026-07-05T00:00:00+00:00","2026-11-08T01:13:12+00:00",{"id":208,"name":209,"slug":210,"color":211,"icon":212},8,"Security & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[214],{"id":208,"name":209,"slug":210,"color":211,"icon":212},"\u002Fblog\u002Fcovers\u002Fself-host-headscale-tailscale-vps-poster.svg",{"categorySlug":217,"appSlug":218},"networking-vpn","headscale",true,1794270488078]