Olympus Docs
CookbookDeployment

Single $5 VPS deployment

Run Olympus on the cheapest legitimate VPS

For a personal or small-org deployment, a single $5/month VPS is enough. This recipe shows the cheapest viable setup.

Provider choice

Hostinger KVM 1 at ~€5/month gives 4GB RAM, 1 vCPU, 50GB NVMe storage. Sufficient for:

  • Olympus stack with all 14 containers.
  • Self-hosted Postgres on the same VPS.
  • Up to ~500 MAU comfortably.

Alternative: DigitalOcean's $6 Basic Droplet, slightly more expensive but better tooling.

Setup

Use Daedalus's Hostinger or DigitalOcean Provider step. Choose:

  • Database: Self-hosted (uses the same VPS).
  • Email: Resend free tier (3000/month).
  • DNS: anywhere with API access (Cloudflare free tier works).

Total monthly: ~€5 + DNS (typically free).

Trade-offs vs managed Postgres

Single VPS w/ self-hosted PostgresSingle VPS w/ managed Postgres (Neon)
Monthly cost~€5~€5 + $0-5 (Neon)
Backup responsibilityYouNeon retains 7 days
Postgres maintenanceYouNeon
Scale headroomLimited by VPS RAMIndependent
RPO on disasterLast backupLast commit

For fewer than 100 MAU, single-VPS is fine. Above that, move Postgres to Neon as the first scaling step.

Backups even on a tiny VPS

# /etc/cron.daily/olympus-backup
#!/bin/bash
podman exec olympus-postgres pg_dumpall -U postgres | gzip > /backups/$(date +%Y%m%d).sql.gz
find /backups -name '*.sql.gz' -mtime +14 -delete
rclone copy /backups/$(date +%Y%m%d).sql.gz remote:olympus-backups/

See Operate, Backups (Postgres).

Monitoring

Free-tier monitoring:

  • UptimeRobot, 50 monitors free. Set up:
    • GET https://ciam.<domain>/.well-known/openid-configuration
    • GET https://iam.<domain>/.well-known/openid-configuration
    • GET https://<domain>/ (Site)
  • Hostinger / DigitalOcean dashboard, VPS-level metrics.

When to outgrow

Symptoms:

  • VPS RAM consistently >80% used.
  • Postgres slow queries (Hera flow latency spikes).
  • Container restarts due to memory pressure.

Then: bump to a larger VPS (~€10/month for double the RAM), or move Postgres to managed.

On this page