AFFiNE
Workspace that mixes docs, whiteboards and databases, so a page can flip between writing and an endless canvas. Edits sync to this server as you type.
Documents / Productivity / Wiki
Collaborative text editor where everyone types in the same document at once, with history, chat and plugins. This one runs on Postgres.
It isn't in the main Portainer Templates list yet, so use this one. Portainer takes one URL at a time, so it swaps out whatever list you had before.
In Portainer, head to Settings --> App Templates, paste this in as the URL and save.
https://raw.githubusercontent.com/NotAFlightRisk/portainer-templates-extras/main/templates.json http://<your-server>:9001 in a browser.The same file Portainer deploys. It reads its settings from a .env next to it.
services:
etherpad:
image: etherpad/etherpad:3
restart: unless-stopped
ports:
- "${ETHERPAD_PORT:-9001}:9001"
environment:
NODE_ENV: production
ADMIN_PASSWORD: ${ETHERPAD_ADMIN_PASSWORD:?Set an admin password}
DB_TYPE: postgres
DB_HOST: postgres
DB_PORT: 5432
DB_NAME: etherpad
DB_USER: etherpad
DB_PASS: ${ETHERPAD_DB_PASSWORD:?Set a database password}
TRUST_PROXY: ${ETHERPAD_TRUST_PROXY:-false}
volumes:
- etherpad-var:/opt/etherpad-lite/var
- etherpad-plugins:/opt/etherpad-lite/src/plugin_packages
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_DB: etherpad
POSTGRES_USER: etherpad
POSTGRES_PASSWORD: ${ETHERPAD_DB_PASSWORD:?Set a database password}
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U etherpad -d etherpad"]
interval: 10s
timeout: 5s
retries: 5
volumes:
etherpad-var:
etherpad-plugins:
postgres-data:
Fill in the blanks, as Etherpad won't start without them.
# Admin password (required) - For the admin panel at /admin, where you sign in as admin. Generate one with: openssl rand -hex 32
ETHERPAD_ADMIN_PASSWORD=
# Database password (required) - Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or Etherpad can't reach its database.
ETHERPAD_DB_PASSWORD=
# Host port for the web UI
ETHERPAD_PORT=9001
# Behind a reverse proxy?
ETHERPAD_TRUST_PROXY=false Grab the file and start it.
mkdir etherpad && cd etherpad
curl -fsSL -o compose.yml https://raw.githubusercontent.com/NotAFlightRisk/portainer-templates-extras/main/apps/etherpad/compose.yml
# save the .env tab here as .env first
docker compose up -d Set both passwords before you deploy (openssl rand -hex 32 makes good ones), since the stack won't start without them. Then open http://<your-host>:9001 (or whichever port you picked) and start a pad. Anyone who can reach it can create and edit pads, so keep it off the open internet or put a login in front of it. The admin panel is at /admin, user admin. Pads are stored in Postgres, in the postgres-data volume. Docs: docs.etherpad.org
What the Portainer form asks for. With compose they go in the .env file instead.
| Variable | What it's for | Default |
|---|---|---|
ETHERPAD_ADMIN_PASSWORD | Admin password (required) For the admin panel at /admin, where you sign in as admin. Generate one with: openssl rand -hex 32 | Needs filling in |
ETHERPAD_DB_PASSWORD | Database password (required) Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or Etherpad can't reach its database. | Needs filling in |
ETHERPAD_PORT | Host port for the web UI | 9001 |
ETHERPAD_TRUST_PROXY | Behind a reverse proxy? One of false, true. | false |
The containers this stack runs, with ports as they come out of the box.
| Service | Image | Ports |
|---|---|---|
etherpad | etherpad/etherpad:3 | 9001:9001 |
postgres | postgres:17-alpine | Internal only |