Docs

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

ServiceDescription
proxyCaddy reverse proxy + automatic TLS (Let's Encrypt)
postgresPostgreSQL 16 — system of record
redisRedis 7 — caches, queues, dedup
minioS3-compatible object storage (uploaded icons, previews, exports)
backend-web-1, backend-web-2Rails API (Puma) — API, link redirects, SDK endpoints
backend-worker-1, backend-worker-2Sidekiq — event processing, metrics, maintenance
dashboardNext.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:

HostPurpose
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/443 open.
  • 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 →