One-click deploy
Run Agent Swarm on a cloud server with HTTPS from one cloud-init paste, plus the DigitalOcean, Railway and E2B options
Pick a server option, wait for the first boot, then open the dashboard /setup link it gives you.
/setup adds your harness credentials and integrations, so no option asks for them up front.
| Option | You do | HTTPS | Cost | Status |
|---|---|---|---|---|
| Cloud-init on any VPS | Paste one file when you create the server | Caddy, on <ip>.sslip.io or your domain | About $10/month (Hetzner CX33), $48 (DigitalOcean) | Available |
| DigitalOcean 1-Click | Click "Deploy to DigitalOcean" | Same as cloud-init | $48/month | Not listed yet |
| Railway template | Click "Deploy on Railway" | Railway | About $30-60/month, Hobby plan | Available |
| A Docker host you already have | curl -fsSL https://agent-swarm.dev/install.sh | bash | localtunnel, or your proxy with --public-url | Your server | Available |
The default stack (a lead, 10 workers, agent-fs and TEI) needs at least 4 vCPU, 8 GB RAM and
40 GB of disk. Only the solo preset fits 2 vCPU / 4 GB. See
Host requirements.
Cloud-init on any VPS
deploy/cloud-init.yaml
turns a fresh Ubuntu 24.04 or Debian 12 server into a running swarm. On first boot it:
- Sets Docker's default address for published ports to 127.0.0.1, then installs Docker Engine with Compose v2, Caddy and ufw.
- Opens only ports 22, 80 and 443.
- Points Caddy at
<public-ip>.sslip.io(for example203-0-113-7.sslip.io), or at your domain. Caddy gets the certificate from Let's Encrypt. - Runs
install.sh --no-tunnel --public-url https://<host> --bind 127.0.0.1. The swarm setsPUBLIC_MCP_BASE_URLto the HTTPS address and publishes its ports on 127.0.0.1 only. - Writes the dashboard
/setuplink to/root/agent-swarm-setup-link.txtand shows it when root logs in.
To use it:
- Create a server with at least 4 vCPU and 8 GB RAM on Ubuntu 24.04.
- Paste the whole file into the user data field: Cloud config on Hetzner, User data on DigitalOcean, Vultr and Akamai, Launch script on Lightsail. Keep ports 80 and 443 open in the provider's firewall, if it has one.
- Wait about 10 minutes, then
ssh root@<server-ip>. The login message shows the/setuplink. To follow the first boot:tail -f /var/log/agent-swarm-deploy.log.
Hetzner can fetch the file instead of a paste. Put this in Cloud config:
#include
https://raw.githubusercontent.com/desplega-ai/agent-swarm/main/deploy/cloud-init.yamlYour own domain
Point an A record at the server, then set SWARM_DOMAIN near the top of the file before you
paste it:
SWARM_DOMAIN=swarm.example.comThe same block takes SWARM_PRESET (full by default) and any AGENT_SWARM_* installer
variable, such as AGENT_SWARM_CLI_VERSION.
Security
- Docker-published ports skip ufw. Before the first container starts, the installer sets
127.0.0.1as the default host address of the stack's Docker network (indocker-compose.override.yml), so every port the swarm publishes listens on loopback, whatever agent-swarm CLI release npm serves. Port 3013 is reachable only through Caddy. If a port still ends up on a public interface, the script stops the stack and fails instead of exposing it. - The API key stays in root-only files:
/root/agent-swarm/.env, the setup link file and/var/log/agent-swarm-deploy.log. The first boot never prints it to the console or to cloud-init's log, and the login message shows it to root only. - Data lives in Docker volumes on the server's disk. They survive reboots and upgrades. Back them up with your provider's snapshots.
DigitalOcean 1-Click
Not listed yet. The image is built from
deploy/digitalocean
and runs the same first boot as cloud-init. Until the listing is live, create a Droplet
(4 vCPU / 8 GB, $48/month) and paste the cloud-init file as its user data.
Railway template
The template runs the API, agent-fs, TEI, a lead and 2 coders, one volume each, and needs the
Hobby plan. Railway serves the API over HTTPS. The full service list is in
deploy/railway/README.md.
Try it for an hour on E2B
This is a trial, not a deployment. The swarm runs in E2B sandboxes, and everything in it, including
the database, is deleted when the sandboxes stop: after one hour by default (--timeout-sec), and
at most 1 hour on E2B's Hobby tier or 24 hours on Pro. You pay E2B for the sandbox time.
export E2B_API_KEY=e2b_...
bunx @desplega.ai/agent-swarm e2b start-stack --yes --swarm demo --workers 2 --api-key "$(openssl rand -hex 16)"
bunx @desplega.ai/agent-swarm e2b swarms info demo --reveal-keyswarms info --reveal-key prints the dashboard link with the API key filled in. See the
CLI reference.