Overview
Architecture of a self-hosted Grovs deployment — what runs, how requests are routed, and how it scales.
Grovs is fully self-hostable. The grovs-io/self-host repository bundles the whole platform into a single Docker Compose stack — backend, dashboard, PostgreSQL, Redis, object storage, background workers, and a reverse proxy with automatic TLS — that you bring up with one command on your own server.
Everything self-hosted is off by default in the application code and only activates when GROVS_SELF_HOSTED=true (backend) / NEXT_PUBLIC_SELF_HOSTED=true (dashboard) — which this stack sets for you.
What runs
| Service | Description |
|---|---|
proxy | Caddy reverse proxy + automatic TLS (Let's Encrypt) |
postgres | PostgreSQL 16 — system of record |
redis | Redis 7 — caches, queues, dedup |
minio | S3-compatible object storage (uploaded icons, previews, exports) |
backend-web-1, backend-web-2 | Rails API (Puma) — API, link redirects, SDK endpoints |
backend-worker-1, backend-worker-2 | Sidekiq — event processing, metrics, maintenance |
dashboard | Next.js web dashboard |
The application code is pulled in as two git submodules — grovs-io/backend and grovs-io/dashboard — so a self-hosted deploy always tracks the same open-source code as the managed cloud.
How requests are routed
The backend routes by subdomain under your domains:
| Host | Purpose |
|---|---|
dashboard. | Dashboard UI |
api. | Dashboard API + asset blobs |
sdk. | Mobile / server SDK endpoints |
go. | Short-link helper |
preview. | Link preview pages |
mcp. | MCP (AI tool) OAuth/API |
*. (wildcard) | Per-project deep-link subdomains |
Capacity & scaling
This single-host stack comfortably serves roughly 150,000–200,000 monthly users on a modest server (≈ 4 vCPU / 8 GB RAM / 80 GB SSD). Beyond that you'll outgrow a single box and should move to a custom deployment — managed/replicated PostgreSQL, a dedicated Redis, external object storage, and horizontally-scaled web/worker nodes behind a load balancer. The same images and environment variables still apply; you just point the connection strings at managed services.
Requirements
- A Linux server with Docker and Docker Compose v2, ports
80/443open. - Two registrable domains — one for production, one for test — each with its subdomain records plus a wildcard (see Deployment → DNS and domains).
- About 4 vCPU / 8 GB RAM / 80 GB SSD as a comfortable floor.
Next step
Deployment — DNS, the one-command stack, and your first login →