← Help Centerintegrations

Self-host on a $5/mo VPS in 30 minutes

The whole stack runs on Docker. With a $5 VPS, a domain name, and Docker installed, you can have a private RESILAND deployment running in half an hour.

The platform is designed to run on cheap commodity hardware. A Hetzner CX11 (€4.59/mo) or DigitalOcean Basic ($6/mo) is enough for the full stack — Postgres, Redis, MinIO, backend, frontend, all in Docker. This guide walks the 30-minute path from a fresh Ubuntu 24.04 box to a working https://your-domain.example.

Prerequisites

  • A VPS with ≥ 2 GB RAM and ≥ 30 GB disk. Ubuntu 24.04 LTS is what we test on.
  • A domain name (any TLD; .com / .org / .dev all fine) with DNS A record pointing at the VPS IP.
  • An Anthropic API key. (Voyage AI, Mapbox, Sentinel Hub keys are optional — see BYOK setup.)

Step 1 — Server prep (5 min)

ssh root@your-vps-ip
apt update && apt install -y docker.io docker-compose-plugin git nginx certbot python3-certbot-nginx ufw
ufw allow OpenSSH && ufw allow "Nginx Full" && ufw enable
systemctl enable --now docker

Step 2 — Clone & configure (5 min)

git clone https://github.com/ilhankilic/resilland-intelligence.git /srv/resiland
cd /srv/resiland
cp .env.example .env
nano .env  # paste keys, set strong POSTGRES_PASSWORD and MINIO_ROOT_PASSWORD

The minimum required keys are APP_SECRET_KEY (Fernet — generate with python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"), POSTGRES_PASSWORD, and MINIO_ROOT_PASSWORD. You can paste your Anthropic key here too, or wait and use the setup wizard.

Step 3 — Start the stack (5 min)

docker compose -f docker-compose.yml -f docker-compose.prod.yml -p resiland-prod up -d
docker compose -f docker-compose.yml -f docker-compose.prod.yml -p resiland-prod exec -T backend alembic upgrade head

This pulls the postgres, redis, minio, backend, frontend images and runs the database migrations. Takes ~3 minutes on first run, faster on rebuilds.

Step 4 — Nginx & HTTPS (10 min)

Copy our sample nginx config, edit the server name, run certbot:

cp infra/nginx/resilland.com.conf /etc/nginx/sites-available/your-domain.example
sed -i 's/resilland.com/your-domain.example/g' /etc/nginx/sites-available/your-domain.example
ln -s /etc/nginx/sites-available/your-domain.example /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
certbot --nginx -d your-domain.example -d www.your-domain.example

Certbot's interactive prompt will ask for an email, accept the ToS, and offer to redirect HTTP → HTTPS (yes, please).

Step 5 — First-run setup wizard (5 min)

Open https://your-domain.example/admin/setup. The 5-step wizard walks you through:

  1. Sign in with Google as the first super-admin.
  2. Paste your Anthropic key (and optional Voyage / Gemini keys).
  3. Maps provider (Mapbox or Google Maps).
  4. Sentinel Hub credentials (or skip — you can add later).
  5. Seed the default layers (cadastral, nurseries, admin boundaries) — only seeds if you have local source data, otherwise skip.

The wizard locks itself once the first provider exists. Future key changes happen at /admin/providers.

Maintenance

  • Updates: cd /srv/resiland && git pull && docker compose ... build && up -d --force-recreate (~3-5 min for a frontend rebuild).
  • Backups: Postgres dump nightly via pg_dump + cron. MinIO buckets via mc mirror. The repo has a sample backup script under scripts/backup_prod.sh.
  • Monitoring: nginx access logs, docker logs, and a /ready endpoint that returns 200 only when all four services (postgres, redis, minio, backend) are healthy.

What this costs you

  • VPS: $5–6/month.
  • Domain: $12/year for .com, $30/year for .org.
  • Anthropic: pay-as-you-go, see the cost economics blog post for math.
  • Total fixed: ~$72/year, plus your AI usage.

If you hit issues, open a GitHub issue with the output of docker compose ... logs --tail 100 from the failing service. Most problems are an env var typo or an unmounted volume.

Last updated 26/04/2026