# Easypanel

> Deploy Grovs on an Easypanel server from the preview service template, with shared object storage.

Source: https://docs.grovs.io/docs/self-hosting/platforms/easypanel

[Get Easypanel template](https://github.com/grovs-io/self-host/tree/main/deploy/catalogs/easypanel/grovs)

## 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](https://easypanel.io/docs). |
| 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](https://docs.grovs.io/docs/self-hosting/get-started/deployment#dns) 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](https://github.com/easypanel-io/templates). In a fresh directory:

```bash
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 3010
```

## 3. Configure environment

### 1. Fill in the template

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.

### 2. Generate once

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.

### 3. Stop the playground

Press Ctrl+C.

## 4. Deploy and verify

### 1. Import

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.

### 2. Attach domains

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>` and `links.<test links domain>`
- `*.<production links domain>` and `*.<test links domain>` for project links

Configure wildcard routing and certificates in Easypanel's proxy settings.

### 3. Sign in

Read `BOOTSTRAP_ADMIN_EMAIL` and `BOOTSTRAP_ADMIN_PASSWORD` from the web service's environment. Open `https://dashboard.<app domain>` and sign in.

### 4. Verify

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

1. Back up the environment secrets, database volumes and bucket contents. See [Backups](https://docs.grovs.io/docs/self-hosting/operate/backups#platforms).
2. Stop the workers.
3. Update both Grovs images to the same release.
4. Let web complete migrations.
5. Restart the workers and dashboard.

## Platform-specific gotchas

- Keep `worker-1` at one instance.
- Never generate a replacement template over an existing install. It creates new secrets.
- See [Troubleshooting](https://docs.grovs.io/docs/self-hosting/operate/troubleshooting) and the [template package](https://github.com/grovs-io/self-host/blob/main/deploy/catalogs/easypanel/README.md).
