Deploy Cabot on a VPS
Self-hosted infrastructure monitoring with HTTP checks, Graphite metrics, Jenkins integration, and multi-channel alerting — the open-source alternative to PagerDuty and Pingdom.
At a Glance
| Project | Cabot by Arachnys |
| License | MIT |
| Recommended Plan | RamNode Premium KVM 2GB or higher |
| OS | Ubuntu 22.04 / 24.04 LTS |
| Default Port | 5000 (proxied via Nginx) |
| Stack | Docker Compose (Web, Worker, Beat, PostgreSQL, RabbitMQ) |
| Estimated Setup Time | 20–30 minutes |
Prerequisites
- A RamNode VPS with at least 2 GB RAM and 1 vCPU (Premium KVM 2GB or higher)
- Ubuntu 22.04 or 24.04 LTS (fresh install recommended)
- A domain name pointed to your VPS IP via an A record
- SSH access with a non-root sudo user
- Basic familiarity with the Linux command line
Initial Server Setup
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git ufwConfigure the Firewall
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enablesudo ufw statusInstall Docker and Docker Compose
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USERLog out and back in (or run newgrp docker) for the group change to take effect.
docker --version
docker compose versionClone the Cabot Docker Repository
cd ~
git clone https://github.com/cabotapp/docker-cabot.git
cd docker-cabotThis repository contains docker-compose files, a base configuration, and example environment files for production deployment.
Configure the Environment
cp conf/production.env.example conf/production.env
nano conf/production.env# Required: Plugin configuration
CABOT_PLUGINS_ENABLED=cabot_alert_email
# Django settings
DJANGO_SETTINGS_MODULE=cabot.settings
DATABASE_URL=postgres://postgres:postgres_password@postgres:5432/postgres
CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672
# Cabot web URL (used in alert messages)
WWW_HTTP_HOST=monitor.yourdomain.com
WWW_SCHEME=https
# SMTP configuration for email alerts
SES_HOST=smtp.yourdomain.com
SES_PORT=587
SES_USER=your_smtp_username
SES_PASS=your_smtp_password
CABOT_FROM_EMAIL=cabot@yourdomain.com
# Django secret key (generate a unique random string)
DJANGO_SECRET_KEY=your-unique-secret-key-here
# Time zone
TIME_ZONE=America/ChicagoGenerate a strong secret key: python3 -c "import secrets; print(secrets.token_urlsafe(50))"
Note: If you change the Postgres password in DATABASE_URL, make sure it matches the POSTGRES_PASSWORD in docker-compose.yml.
Launch Cabot with Docker Compose
docker compose up -dMonitor the startup process:
docker compose logs -f webWait for Gunicorn workers to boot, then verify all containers:
docker compose psYou should see containers for web, worker, beat, postgres, and rabbitmq, all running. Cabot is now listening on 127.0.0.1:5000.
Install and Configure Nginx
sudo apt install -y nginxserver {
listen 80;
server_name monitor.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 90;
}
}sudo ln -s /etc/nginx/sites-available/cabot /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxSecure with Let's Encrypt SSL
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d monitor.yourdomain.comVerify automatic renewal:
sudo systemctl status certbot.timerCreate Your Admin Account
Navigate to https://monitor.yourdomain.com for the first-time setup screen, or create the admin from the command line:
cd ~/docker-cabot
docker compose exec web python manage.py createsuperuserConfigure Your First Service Check
HTTP Check
Navigate to Checks → HTTP Checks → Create new HTTP check. Enter a name, endpoint URL, expected status code (typically 200), frequency, and importance level.
ICMP (Ping) Check
Similar to HTTP checks but only requires a hostname or IP address to verify host reachability.
Graphite Check
If running a Graphite/StatsD stack, create checks that alert based on metric thresholds — provide the metric path, threshold value, and alert direction.
Group Checks into a Service
Navigate to Services → Create new service. Add your checks, assign alert recipients, and save. Cabot will begin running checks at the configured intervals.
Set Up Alert Integrations
Slack Alerts
CABOT_PLUGINS_ENABLED=cabot_alert_email,cabot_alert_slack
SLACK_ALERT_TOKEN=xoxb-your-slack-bot-token
SLACK_ALERT_CHANNEL=#alertsTwilio (SMS/Phone) Alerts
CABOT_PLUGINS_ENABLED=cabot_alert_email,cabot_alert_twilio
TWILIO_ACCOUNT_SID=your_account_sid
TWILIO_AUTH_TOKEN=your_auth_token
TWILIO_OUTGOING_NUMBER=+1234567890Restart the stack after any environment changes:
cd ~/docker-cabot
docker compose down
docker compose up -dOngoing Maintenance
Updating Cabot
cd ~/docker-cabot
docker compose pull
docker compose down
docker compose up -dBacking Up the Database
docker compose exec postgres pg_dump -U postgres postgres > cabot_backup_$(date +%Y%m%d).sqlAutomate daily backups with a cron job at 2:00 AM:
0 2 * * * cd ~/docker-cabot && docker compose exec -T postgres pg_dump -U postgres postgres > ~/backups/cabot_backup_$(date +\%Y\%m\%d).sqlMonitoring Resource Usage
The full stack typically uses 600–800 MB RAM at idle. Monitor with:
docker stats --no-streamIf memory becomes tight, add swap:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab