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
Spreadsheet that works like a database, with typed columns, Python formulas, linked tables, charts and forms.
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>:8484 in a browser.The same file Portainer deploys. It reads its settings from a .env next to it.
services:
grist:
image: gristlabs/grist:1
restart: unless-stopped
ports:
- "${GRIST_PORT:-8484}:8484"
environment:
GRIST_SESSION_SECRET: ${GRIST_SESSION_SECRET:?Set a session secret}
volumes:
- grist-data:/persist
volumes:
grist-data:
Fill in the blanks, as Grist won't start without them.
# Session secret (required) - Signs everyone's login cookies. Generate one with: openssl rand -hex 32
GRIST_SESSION_SECRET=
# Host port for the web UI
GRIST_PORT=8484 Grab the file and start it.
mkdir grist && cd grist
curl -fsSL -o compose.yml https://raw.githubusercontent.com/NotAFlightRisk/portainer-templates-extras/main/apps/grist/compose.yml
# save the .env tab here as .env first
docker compose up -d Set the session secret before you deploy, since the stack won't start without one. Then open http://<your-host>:8484 (or whichever port you picked). It asks for a boot key first, which Grist prints in the container's logs every time it starts (look for BOOT KEY), then an admin email, then walks you through Quick setup. Take care on its sign-in step: No authentication means anyone who can reach the port can open and edit everything, so only pick it on a private network. Sign in with getgrist.com and forwarded headers (for Authelia and the like) are the free options, and OIDC needs an activation key. The last step has product telemetry switched on, so untick it there if you'd rather it didn't. Documents, users and settings all live in the grist-data volume. Docs: support.getgrist.com/self-managed
What the Portainer form asks for. With compose they go in the .env file instead.
| Variable | What it's for | Default |
|---|---|---|
GRIST_SESSION_SECRET | Session secret (required) Signs everyone's login cookies. Generate one with: openssl rand -hex 32 | Needs filling in |
GRIST_PORT | Host port for the web UI | 8484 |
The containers this stack runs, with ports as they come out of the box.
| Service | Image | Ports |
|---|---|---|
grist | gristlabs/grist:1 | 8484:8484 |