Skip to content

Self-host Teable

updated Sep 2026prices checked · Jul 2026Install verified on Ubuntu 26.04 · Sep 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →

A no-code database built on PostgreSQL: a spreadsheet-style grid with kanban, gallery, form and calendar views, real-time collaboration, automations and a REST API.

Airtable / yr$288
Self-hosted / yr~$283
You keep$5/yr
Pocket the difference — spin it up on a cheap VPS in minutes.Start free on Kamatera → (opens in new tab)

Key facts

LicenseAGPL-3.0
StackTypeScript, NestJS, Next.js
Min RAM4096 MB
Official imageyes
Measured idle RAM1885 MB
Difficulty

What you need

  • Any VPS with at least 4096 MB of RAM
  • A domain you control — most self-hosted setups need HTTPS in front of them
  • Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + US
Get Hetzner Cloud (opens in new tab)
Kamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + Asia
Start free on Kamatera → (opens in new tab)
DigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + Asia
Deploy on DigitalOcean → (opens in new tab)

Paid link — we earn a commission if you shop through it.

Install

Run these commands on your server:

# Teable — upstream's minimal Docker Compose (help.teable.ai/en/deploy/docker): app + PostgreSQL + Redis
mkdir -p teable && cd teable
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 16)
REDIS_PASSWORD=$(openssl rand -hex 16)
SECRET_KEY=$(openssl rand -hex 32)
PUBLIC_ORIGIN=http://SERVER_IP:3000
POSTGRES_HOST=teable-db
POSTGRES_PORT=5432
POSTGRES_DB=teable
POSTGRES_USER=teable
REDIS_HOST=teable-cache
REDIS_PORT=6379
REDIS_DB=0
PRISMA_DATABASE_URL=postgresql://\${POSTGRES_USER}:\${POSTGRES_PASSWORD}@\${POSTGRES_HOST}:\${POSTGRES_PORT}/\${POSTGRES_DB}
BACKEND_CACHE_PROVIDER=redis
BACKEND_CACHE_REDIS_URI=redis://default:\${REDIS_PASSWORD}@\${REDIS_HOST}:\${REDIS_PORT}/\${REDIS_DB}
EOF
cat > docker-compose.yaml <<'EOF'
services:
  teable:
    image: ghcr.io/teableio/teable:latest
    restart: always
    ports: ['3000:3000']
    volumes: ['teable-data:/app/.assets:rw']
    env_file: [.env]
    depends_on:
      teable-db: { condition: service_healthy }
      teable-cache: { condition: service_healthy }
  teable-db:
    image: postgres:15.4
    restart: always
    volumes: ['teable-db:/var/lib/postgresql/data:rw']
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    healthcheck: { test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'], interval: 10s, timeout: 3s, retries: 3 }
  teable-cache:
    image: redis:7.2.4
    restart: always
    volumes: ['teable-cache:/data:rw']
    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
    healthcheck: { test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping'], interval: 10s, timeout: 3s, retries: 3 }
volumes: { teable-data: {}, teable-db: {}, teable-cache: {} }
EOF
docker compose up -d  # → http://SERVER_IP:3000
# the first account you sign up becomes the instance admin

An alternative to

More in No-code database

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.