Easypanel
Deploy Grovs on an Easypanel server from the preview service template, with shared object storage.
When to use
You already run Easypanel and want Grovs as native services. The template creates the backend, dashboard, two workers and three databases with persistent volumes.
Preview: the template passes local checks. Live Easypanel validation and an official catalog listing are pending, so you import it manually.
Prerequisites
| Requirement | Notes |
|---|---|
| Easypanel server | 4 vCPU, 8 GB RAM, 80 GB SSD. To install the panel, see Easypanel's setup guide. |
| Domains you control | App, production links and test links |
| Private S3-compatible bucket | For uploads. Keep the credentials ready for the template form. |
| Workstation with Node.js 22, npm and Git | Only to generate the template. Grovs itself runs from published images. |
1. Prepare DNS and proxy
Choose three domains, without a scheme or path:
| Setting | Example |
|---|---|
| App base domain | grovs.example.com |
| Production links domain | links.example.com |
| Test links domain | test.links.example.com |
Point the DNS records at the Easypanel server. Plan wildcard certificates for both link domains: they need DNS validation or certificates you supply. A wildcard DNS record alone does not enable HTTPS.
2. Create the app
Until Grovs is in Easypanel's catalog, generate its configuration with the upstream template playground. In a fresh directory:
git clone https://github.com/grovs-io/self-host.git grovs-self-host
git clone https://github.com/easypanel-io/templates.git grovs-easypanel
cp -R grovs-self-host/deploy/catalogs/easypanel/grovs grovs-easypanel/templates/grovs
cd grovs-easypanel
npm ci
npm run build-templates
npm run dev:next -- --port 30103. Configure environment
Open http://localhost:3010/?slug=grovs. Enter your domains, administrator email and bucket details. Leave the storage endpoint empty for AWS S3. For another provider, enter its S3-compatible HTTPS endpoint.
Select Generate, then Copy. The JSON includes generated passwords, encryption keys and the credentials you entered. Keep it private and save a secure copy. Generate it once per installation: generating again creates new secrets.
Press Ctrl+C.
4. Deploy and verify
In your Easypanel project, create a template from JSON, paste the configuration and create the services. Keep the default single replica per service and leave zero-downtime replacement disabled.
Web waits for PostgreSQL and ClickHouse, runs migrations and initial setup, then starts the API. The workers wait for the API's health endpoint. Database services have persistent volumes and no public ports.
The template attaches these fixed hosts on container port 3000:
| Service | Hosts |
|---|---|
| Dashboard | dashboard.<app domain> |
| Web | api, sdk, mcp, go and preview under the app domain |
Add these to web, also on port 3000:
links.<production links domain>andlinks.<test links domain>*.<production links domain>and*.<test links domain>for project links
Configure wildcard routing and certificates in Easypanel's proxy settings.
Read BOOTSTRAP_ADMIN_EMAIL and BOOTSTRAP_ADMIN_PASSWORD from the web service's environment. Open https://dashboard.<app domain> and sign in.
Check https://api.<app domain>/up, create a project and open a link. Confirm analytics, an uploaded image, and HTTPS on both production and test link hosts. If migrations fail or the API does not become ready, check web's logs.
Upgrades
- Back up the environment secrets, database volumes and bucket contents. See Backups.
- Stop the workers.
- Update both Grovs images to the same release.
- Let web complete migrations.
- Restart the workers and dashboard.
Platform-specific gotchas
- Keep
worker-1at one instance. - Never generate a replacement template over an existing install. It creates new secrets.
- See Troubleshooting and the template package.