Quickstart

This page walks through the install end-to-end. Estimated time: ~15 minutes on a typical broadband connection (most of that is image + model pulls).

Prerequisites

  • A Linux/macOS/WSL2 host with Docker Desktop (or Docker Engine + Compose v2 on Linux).
  • 16 GB system RAM minimum (Llama 3.1 8B needs ~6 GB warm + the data plane + app services + headroom).
  • 12 GB free disk comfortable floor (Ollama models, Supabase images, Postgres data, container layers).

Install

curl -fsSL https://get.ccdsuite.com/install.sh | sh

The installer:

  1. Preflights — Docker reachability, disk, RAM, ports 3000/8000/5432/11434.
  2. Picks an install directory (default ./ccd).
  3. Fetches the compose + init scripts + Kong routing config.
  4. Generates fresh secrets (Postgres password, JWT signing key, Supabase anon/service keys, Realtime SECRET_KEY_BASE, internal service secrets).
  5. Asks: bundled Ollama vs BYO LLM key.
  6. Runs docker compose up -d.
  7. Polls /api/health for up to 5 minutes and reports.

What you should see

First boot pulls ~5 GB of Ollama models plus ~700 MB of Supabase OSS images, then runs the CCD migrations (~30 s):

▸ CCD-Suite self-host installer
✓ OS: Linux
✓ Docker 27.x + compose v2.32 reachable.
✓ Disk: 47 GB free in /home/you
✓ RAM: 32768 MB
✓ Ports free: 3000 (web), 8000 (kong), 11434 (ollama), 5432 (postgres)
▸ Install directory: /home/you/ccd
▸ Fetching bundle files from downloads.ccdsuite.com/self-host/latest...
✓ Fetched docker-compose.yml + init scripts + kong config.
▸ Created .env from template.
▸ Generating fresh Supabase keys + service secrets...
✓ Regenerated POSTGRES_PASSWORD, JWT_SECRET, ANON/SERVICE keys, ...

Use the bundled Ollama LLM (default) or a managed API key?
  [1] Bundled Ollama — recommended. ~5 GB first-boot pull, $0/mo, fully local.
  [2] OpenAI / Anthropic (BYO key) — instant, $-per-call, leaves your machine.
Choice [1]:

▸ Starting services (docker compose up -d)…
[+] Building 4/4 ...
[+] Running 14/14
 ✔ Container ccd-supabase-db          Healthy
 ✔ Container ccd-supabase-auth        Healthy
 ✔ Container ccd-supabase-rest        Started
 ✔ Container ccd-supabase-realtime    Started
 ✔ Container ccd-supabase-storage     Healthy
 ✔ Container ccd-supabase-kong        Started
 ✔ Container ccd-db-migrate           Exited (0)
 ✔ Container ccd-ollama               Healthy
 ✔ Container ccd-ollama-preload       Exited (0)
 ✔ Container ccd-web                  Started
 ...

Verify

Open http://localhost:3000 — that's the CCD web app. Sign up with your email + password; MAILER_AUTOCONFIRM=true is on by default, so the first sign-up creates the install owner without needing SMTP.

You can also poke the data plane directly:

# Supabase API gateway (Kong)
curl http://localhost:8000/auth/v1/health

# Ollama (local LLM runtime)
curl http://localhost:11434/api/tags

# Postgres (via the bundled container)
docker compose exec db psql -U postgres -d postgres -c '\dt public.*'

Common operations

cd ccd
docker compose ps                 # see what's running
docker compose logs -f            # tail all services
docker compose logs -f web        # tail just the Next.js app
docker compose restart ai-services
docker compose down               # stop the stack (data + models survive)
docker compose down -v            # nuke ALL data (irreversible)

./ccd backup create               # see Backup + restore docs
./ccd upgrade v1.1.0              # see Upgrades docs

What's next

Troubleshooting (quick hits)

docker compose ... command not found — you have Docker Compose v1. Install v2 (the docker compose plugin) — see Docker's docs.

Web container stays unhealthy — usually means migrations didn't finish. Check docker compose logs --tail=50 db-migrate. Migrations take ~30 s on first boot; if you see a SQL error, the migration crashed mid-replay and needs manual cleanup (file an issue with the log).

Ollama OOMs — host doesn't have enough RAM. Swap the model:

echo 'AI_OLLAMA_MODEL=phi3:mini' >> .env
docker compose up -d --force-recreate ai-services ollama-preload

Port conflict on 3000 or 8000 — override in .env:

CCD_PORT=3010
KONG_HTTP_PORT=8010

Then docker compose up -d --force-recreate web kong.