Install

Install with Docker

Deploy Cuitty on a single VM using Docker Compose. Recommended for solo developers and small teams.

Install with Docker Compose

Docker Compose is the fastest way to run Cuitty in production-like conditions on a single VM. The reference compose file lives at the root of the cuitty repo.

Reference compose file

version: "3.9"

services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_USER: cuitty
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: cuitty
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U cuitty"]
      interval: 5s
      timeout: 3s
      retries: 12

  spicedb:
    image: authzed/spicedb:latest
    command: serve --grpc-preshared-key ${SPICEDB_PRESHARED_KEY}
    ports:
      - "50051:50051"

  portal:
    image: ghcr.io/cuitty/portal:latest
    depends_on:
      postgres: { condition: service_healthy }
      spicedb: { condition: service_started }
    ports:
      - "7700:7700"
    environment:
      DATABASE_URL: postgres://cuitty:${POSTGRES_PASSWORD}@postgres:5432/cuitty
      SPICEDB_URL: spicedb:50051
      SPICEDB_TOKEN: ${SPICEDB_PRESHARED_KEY}
      BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}

volumes:
  pgdata:

Create a .env file with POSTGRES_PASSWORD, SPICEDB_PRESHARED_KEY, and a 32-byte random BETTER_AUTH_SECRET. Then:

docker compose up -d

Backups

The portal stores nothing important on its own filesystem โ€” every byte that matters lives in the postgres and libsql volumes. Snapshot the named volumes nightly with pg_dump and a tar of the libSQL data directory.

Upgrades

docker compose pull portal
docker compose up -d portal

The portal runs migrations on startup. Always snapshot first.

See also

Read the same page as Markdown ยท JSON Updated 2026-04-27