Grist
Spreadsheet that works like a database, with typed columns, Python formulas, linked tables, charts and forms.
Database / Productivity
Spreadsheet-style database in the vein of Airtable, built on Postgres: grid, kanban, calendar, gallery and form views, file attachments, formulas, real-time collaboration and an API.
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>:3500 in a browser.The same file Portainer deploys. It reads its settings from a .env next to it.
services:
teable:
image: ghcr.io/teableio/teable:latest
restart: unless-stopped
ports:
- "${TEABLE_PORT:-3500}:3000"
environment:
PUBLIC_ORIGIN: ${TEABLE_URL:-http://localhost:3500}
SECRET_KEY: ${TEABLE_SECRET:?Set a secret key}
PRISMA_DATABASE_URL: postgresql://teable:${TEABLE_DB_PASSWORD:?Set a database password}@postgres:5432/teable
TELEMETRY_REPORT_DISABLED: ${TEABLE_TELEMETRY_OFF:-false}
volumes:
- teable-data:/app/.assets
- teable-cache:/data
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_DB: teable
POSTGRES_USER: teable
POSTGRES_PASSWORD: ${TEABLE_DB_PASSWORD:?Set a database password}
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U teable -d teable"]
interval: 10s
timeout: 5s
retries: 5
volumes:
teable-data:
teable-cache:
postgres-data:
Fill in the blanks, as Teable won't start without them.
# Secret key (required) - Signs logins and encrypts stored tokens. Generate one with: openssl rand -hex 32
TEABLE_SECRET=
# Database password (required) - Letters and numbers only, since it goes into a database URL. Generate one with: openssl rand -hex 32
TEABLE_DB_PASSWORD=
# Address you'll open it on - Like http://192.168.1.10:3500. Invite links and profile pictures point here, so they break on any other address.
TEABLE_URL=http://localhost:3500
# Host port for the web UI
TEABLE_PORT=3500 Grab the file and start it.
mkdir teable && cd teable
curl -fsSL -o compose.yml https://raw.githubusercontent.com/NotAFlightRisk/portainer-templates-extras/main/apps/teable/compose.yml
# save the .env tab here as .env first
docker compose up -d Set the secret key and database password before you deploy, since the stack won't start without them. The first start sets up the database and takes a couple of minutes, then open http://<your-host>:3500 (or whichever port you picked). The first account you sign up becomes the admin. Anyone who can reach it can sign up after that, so once you're in, switch off Allow creating new accounts under System Admin --> Instance settings. Set the address field to wherever you'll open it, or invite links will point at localhost. Teable's image sends a small daily usage report to Teable (your instance ID, how many people are active, and a rough count of spaces and bases). To stop it, add TEABLE_TELEMETRY_OFF set to true to the stack's environment variables and redeploy. AI features and enterprise extras need a paid licence, everything else is free. Attachments live in the teable-data volume, logins in teable-cache, and your tables in postgres-data. Docs: help.teable.ai
What the Portainer form asks for. With compose they go in the .env file instead.
| Variable | What it's for | Default |
|---|---|---|
TEABLE_SECRET | Secret key (required) Signs logins and encrypts stored tokens. Generate one with: openssl rand -hex 32 | Needs filling in |
TEABLE_DB_PASSWORD | Database password (required) Letters and numbers only, since it goes into a database URL. Generate one with: openssl rand -hex 32 | Needs filling in |
TEABLE_URL | Address you'll open it on Like http://192.168.1.10:3500. Invite links and profile pictures point here, so they break on any other address. | http://localhost:3500 |
TEABLE_PORT | Host port for the web UI | 3500 |
The containers this stack runs, with ports as they come out of the box.
| Service | Image | Ports |
|---|---|---|
teable | ghcr.io/teableio/teable:latest | 3500:3000 |
postgres | postgres:17-alpine | Internal only |