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:
- Preflights — Docker reachability, disk, RAM, ports 3000/8000/5432/11434.
- Picks an install directory (default
./ccd). - Fetches the compose + init scripts + Kong routing config.
- Generates fresh secrets (Postgres password, JWT signing key, Supabase anon/service keys, Realtime SECRET_KEY_BASE, internal service secrets).
- Asks: bundled Ollama vs BYO LLM key.
- Runs
docker compose up -d. - Polls
/api/healthfor 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
- Configuration — every
.envvariable and what it does. - Backup + restore — the
ccdCLI. - Production hardening — reverse proxy + TLS, signup lockdown, SMTP, key rotation.
- Troubleshooting — what to do when something doesn't come up.
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.