<!-- Generated from the canonical OpenPost public page. Do not edit this build artifact. -->

Title: Install on umbrelOS
Description: Run OpenPost on umbrelOS through Portainer, check the local installation, and set up public access before connecting social accounts.
Canonical: https://openpo.st/docs/self-hosting/umbrelos
Source: [https://openpo.st/docs/self-hosting/umbrelos](https://openpo.st/docs/self-hosting/umbrelos)

# Install on umbrelOS

Run OpenPost as a Portainer stack on umbrelOS. Umbrel recommends [Portainer for custom Docker containers](https://umbrel.com/support/apps/running-custom-docker-containers), and OpenPost supplies a [Compose file](https://github.com/getopenpost/openpost/blob/main/deploy/portainer/docker-compose.yml) with SQLite and local media storage. The image supports x86_64 and ARM64 devices.

This installation is managed in Portainer and does not appear on the Umbrel home screen.

## What you need

- An umbrelOS device with access to its App Store.
- An available port. The supplied Compose file uses `8080`.
- Two independent [deployment secrets](https://openpo.st/docs/self-hosting/configuration#deployment-secrets). Keep them in your private environment settings and retain the same values for upgrades and restores.
- A public HTTPS address before you connect social accounts. You can check the installation locally first.

## Install Portainer

1. In Umbrel's App Store, install **Portainer**.
2. Open Portainer and sign in with the credentials shown after installation. Change the password when prompted.
3. Open its Docker environment, then select **Stacks → Add stack** and name the stack `openpost`.

## Deploy OpenPost

1. Download [`deploy/portainer/docker-compose.yml`](https://github.com/getopenpost/openpost/blob/main/deploy/portainer/docker-compose.yml) and paste its contents into Portainer's **Web editor**.
2. Keep the `openpost_data:/data` named volume and `restart: unless-stopped`. Umbrel requires named volumes for persistent custom-container data; bind-mounted data can be lost when Portainer restarts or updates.
3. If another app uses port `8080`, change the mapping to an available port, such as `"8090:8080"`. Keep the container port and `OPENPOST_PORT` at `8080`.
4. Under **Environment variables**, enter these values. Replace the two secret placeholders with the values you generated:

```dotenv
OPENPOST_APP_URL=http://umbrel.local:8080
OPENPOST_PUBLIC_URL=http://umbrel.local:8080
OPENPOST_MEDIA_URL=http://umbrel.local:8080/media
OPENPOST_JWT_SECRET=YOUR_GENERATED_JWT_SECRET
OPENPOST_ENCRYPTION_KEY=YOUR_GENERATED_ENCRYPTION_KEY
```

Use your chosen host port in all three URLs. If `umbrel.local` does not resolve on your computer, use the device's local IP address instead, both in the URLs and when opening the app. Leave `OPENPOST_DISABLE_REGISTRATIONS` unset or `false` until you create the first account.

5. Replace the image's `latest` tag with a release tag from [GitHub Releases](https://github.com/getopenpost/openpost/releases) for a permanent installation.
6. Select **Deploy the stack**.

## Check the local installation

Open `http://umbrel.local:8080`, using your chosen host and port. Create the first account, which becomes the instance administrator, then create a workspace.

Check readiness from your computer:

```sh
curl -fsS http://umbrel.local:8080/api/v1/ready
```

Expect `"status":"ready"` and `"database":"ok"`. If the check fails, inspect the OpenPost container's logs in Portainer and confirm that the port is available. SQLite and media are stored in the stack's `openpost_data` named volume.

## Before connecting social accounts

Set up a [public HTTPS reverse proxy or tunnel](https://openpo.st/docs/self-hosting/reverse-proxy) that forwards requests to OpenPost's published port on your Umbrel. Forward the whole app, including `/api/v1/` and `/media/`. Provider callbacks and media URLs must be reachable from outside your network.

In the existing Portainer stack, replace the three local URL values with your public address:

```dotenv
OPENPOST_APP_URL=https://post.example.com
OPENPOST_PUBLIC_URL=https://post.example.com
OPENPOST_MEDIA_URL=https://post.example.com/media
```

Replace `post.example.com` with your domain. Update the stack while keeping the same named volume and both secrets, then check readiness through HTTPS:

```sh
curl -fsS https://post.example.com/api/v1/ready
```

After it reports ready, [configure social integrations](https://openpo.st/docs/self-hosting/integrations), connect an account, and [publish a test post](https://openpo.st/docs/guides/quickstart). Set `OPENPOST_DISABLE_REGISTRATIONS=true` and update the stack if public signup should close. Existing accounts can still sign in.

## Upgrade and back up

Stop OpenPost before backing up its named volume so the SQLite copy is consistent. Back up the volume, Compose definition, environment values, and image tag together, then start it again. Keep the backup private and off the device. Follow the [maintenance guide](https://openpo.st/docs/self-hosting/maintenance) for restore checks.

Before upgrading, make a backup, change the image tag in the existing stack, and redeploy without removing its volume. Check readiness, sign in, and open a saved post with media. Database migrations can require restoring a matching backup when rolling back.

Umbrel warns that [uninstalling Portainer removes its custom containers and their data](https://umbrel.com/support/apps/running-custom-docker-containers). Keep a tested backup before removing Portainer.
