Try locally
Run the full stack on your laptop to explore the dashboard and test link tracking, with no public server or DNS.
Prerequisites
| Requirement | Notes |
|---|---|
| Docker with Docker Compose v2 | On Windows, run the commands from WSL2 with Docker integration enabled. |
| Free port 80 | Or choose another port with GROVS_WEB_PORT. |
Install
From the directory where you want the new grovs folder:
curl -fsSL https://raw.githubusercontent.com/grovs-io/self-host/main/install.sh | GROVS_DOMAIN=local bash
cd grovsGROVS_DOMAIN=local selects the local trial without asking for a domain. The installer downloads the Compose files, generates your admin login and starts all services. It uses the release version bundled with the installer.
Open http://dashboard.lvh.me:3002 and log in with the admin email and password printed by setup. lvh.me and its subdomains resolve to 127.0.0.1, your own machine. The API uses port 80 by default.
If port 80 is in use, add GROVS_WEB_PORT=8080 before bash in the installer command and run it in a fresh directory. GROVS_DASHBOARD_PORT changes the dashboard port. Both are saved in .env.
Manual setup
To clone and inspect the repository yourself, run these in a fresh directory instead of the installer:
git clone https://github.com/grovs-io/self-host.git grovs
cd grovs
GROVS_RELEASE_URL="$(curl -fsSL -o /dev/null -w '%{url_effective}' https://github.com/grovs-io/self-host/releases/latest)"
GROVS_VERSION="${GROVS_RELEASE_URL##*/}" GROVS_DOMAIN=local ./scripts/setup.sh
docker compose -f docker-compose.yml -f docker-compose.local.yml pull
docker compose -f docker-compose.yml -f docker-compose.local.yml up -dFor an existing installation, follow Upgrades instead of rerunning the installer.
Check startup
docker compose -f docker-compose.yml -f docker-compose.local.yml ps -a
docker compose -f docker-compose.yml -f docker-compose.local.yml logs --tail=100 migrate web
curl --fail http://api.lvh.me/upUse http://api.lvh.me:8080/up if you chose port 8080. migrate should finish with exit code 0; it does not stay running. Analytics can take about a minute after startup to become available.
Limits of a local trial
Local HTTP works for a trial. Universal Links and App Links need a public HTTPS installation: follow Deploy on a server. A phone's 127.0.0.1 is the phone, not your laptop.
Stop and resume
Both commands keep your data:
docker compose -f docker-compose.yml -f docker-compose.local.yml stop
docker compose -f docker-compose.yml -f docker-compose.local.yml up -dTo remove the trial and delete all its database and upload volumes:
docker compose -f docker-compose.yml -f docker-compose.local.yml down --volumes