VPS Deployment
Deploy Action Llama on any VPS (DigitalOcean, Vultr, Hetzner, etc.) for cost-effective remote hosting. There are two approaches:- VPS cloud provider (
provider: "vps") — manage the VPS from your local machine via SSH. Images are built on the VPS, credentials pushed over SSH, scheduler deployed as a Docker container. Set up withal setup cloud. - Manual deployment — install Action Llama directly on the VPS and run
al startwith the--exposeflag. Simpler, but requires SSH’ing into the server to manage.
Approach 1: VPS Cloud Provider (Recommended)
The VPS cloud provider lets you manage your VPS deployment from your local machine, just like AWS or GCP.Quick Start
Setup Options
Theal setup cloud wizard offers two paths:
Connect to an existing server
Works with any VPS provider (DigitalOcean, Hetzner, Linode, etc.) or any server you can SSH into:- Enter the server IP, SSH user, port, and key path
- Action Llama validates SSH connectivity and checks Docker is installed
- Configuration is written to your environment file
- SSH access to the server
- Docker installed on the server (
curl -fsSL https://get.docker.com | sh)
Provision a new Vultr VPS
Automated provisioning with Vultr as a supported backend:- Configure
vultr_api_keycredential first:al creds add vultr_api_key - Run
al setup cloudand select “Provision a new Vultr VPS” - Pick region, plan (minimum 2 vCPU / 2GB RAM), and SSH key
- Instance is created with cloud-init that installs Docker automatically
- Action Llama waits for the instance to become ready
Provision a new Hetzner VPS
Automated provisioning with Hetzner Cloud:- Configure
hetzner_api_keycredential first:al creds add hetzner_api_key - Run
al setup cloudand select “Provision a new Hetzner VPS” - Pick server type, location, OS image, and SSH key
- Server is created with cloud-init that installs Docker automatically
- Action Llama waits for the server to become ready
How It Works
| Operation | Implementation |
|---|---|
| Image builds | tar -c . | ssh docker build -t <tag> - (built on VPS, no registry) |
| Credential storage | Filesystem on VPS (~/.action-llama/credentials/) via SSH |
| Credential push | Credentials copied over SSH during deployment |
| Scheduler deploy | docker run -d --restart unless-stopped on VPS |
| IAM reconciliation | No-op (SSH access = full access) |
| Log streaming | Real-time via SSH (docker logs -f) |
Configuration
In your environment file (~/.action-llama/environments/<name>.toml):
Teardown
Approach 2: Manual Deployment
Install Action Llama directly on your VPS and run it there. Simpler but requires managing the server directly.Quick Start
On your VPS:Key Features
The--expose flag enables VPS deployment by:
- Binding gateway to
0.0.0.0— makes webhooks accessible from external services - Preserving local-mode features — web UI, control routes, filesystem credentials, SQLite state
- No cloud infrastructure required — works on any Linux VPS
TLS Setup with Caddy
For production, put a reverse proxy in front with TLS termination:1. Install Caddy
2. Configure Caddy
Edit/etc/caddy/Caddyfile:
3. Start Caddy
Process Management with systemd
For the manual deployment approach, create/etc/systemd/system/action-llama.service:
Alternative: nohup
For simpler setups, usenohup:
Firewall Configuration
Ensure your VPS firewall allows:- Port 22 (SSH)
- Port 80 (HTTP, for Caddy)
- Port 443 (HTTPS, for Caddy)
- Port 8080 only if not using a reverse proxy
ufw:
Security Considerations
- Use TLS in production — Don’t expose port 8080 directly without HTTPS
- Gateway API key — Action Llama generates an API key for dashboard access (run
al doctorto view it) - Credentials isolation — Each agent runs in a Docker container with only its required credentials
- User separation — Run Action Llama as a non-root user
- SSH key security — The VPS cloud provider uses your SSH key for all operations. Protect it with a passphrase and restrict access.
Monitoring
Check service status:Cost Comparison
| Provider | vCPU | RAM | Storage | Price/month |
|---|---|---|---|---|
| DigitalOcean | 1 | 1GB | 25GB SSD | $6 |
| Vultr | 1 | 1GB | 25GB SSD | $6 |
| Hetzner | 1 | 2GB | 20GB SSD | €4.15 |
| Linode | 1 | 1GB | 25GB SSD | $5 |
Troubleshooting
Gateway not accessible externally
- Check firewall settings
- Verify
--exposeflag is used (manual deployment)
Docker issues
SSH connection issues (cloud provider)
Webhook delivery failures
- Check reverse proxy configuration
- Verify TLS certificate is valid
- Test webhook URL accessibility from external services
Out of disk space
- Clean up old Docker images:
docker system prune -a - Rotate logs: configure systemd journal limits
- Monitor disk usage:
df -h