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/.devall 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:
- Sign in with Google as the first super-admin.
- Paste your Anthropic key (and optional Voyage / Gemini keys).
- Maps provider (Mapbox or Google Maps).
- Sentinel Hub credentials (or skip — you can add later).
- 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 viamc mirror. The repo has a sample backup script underscripts/backup_prod.sh. - Monitoring: nginx access logs,
docker logs, and a/readyendpoint 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