Skip to content

Install

Kodel is self-hosted: one Docker Compose stack, your machine or your server, no data leaving your infrastructure.

  • Docker Engine 25+ with the Compose v2 plugin (docker compose version). Docker Desktop and OrbStack both work; the legacy docker-compose does not.
  • ~4 GB of free RAM and a few GB of disk — the stack runs six containers.
  • Free host ports 8080 (web) and 2222 (git over SSH).
  • Access to the image registry: run docker login ghcr.io with the token you were given.
Terminal window
git clone https://github.com/kodelai/kodel-compose.git && cd kodel-compose
./install.sh

The script checks your environment, writes a .env with freshly generated secrets, pulls the images and waits until the server is healthy. The first run takes a few minutes — images are large and the database migrates on first boot.

Other ports or a public address:

Terminal window
./install.sh --port 9000
./install.sh --url https://kodel.example.com --port 80

Re-running the script is safe: an existing .env is never overwritten, because regenerating the encryption key would make everything already stored unreadable.

ContainerRole
serverAPI, WebSocket, git proxy, MCP endpoint
webUI and the nginx that proxies everything to the server
postgresmain database (with pgvector for code search)
clickhouseanalytics: run timings, model call logs
redisjob queues and locks
miniofile storage for attachments and artifacts
Terminal window
docker compose ps # health
docker compose logs -f server # server logs
docker compose up -d server # apply a changed .env
docker compose down # stop, keep data

To upgrade, bump KODEL_VERSION in .env, then docker compose pull && docker compose up -d. Migrations run on start.

All state lives in Docker volumes. Back them up together with KODEL_ENCRYPTION_KEY from .env — without that key the stored tokens and credentials cannot be decrypted.

Set KODEL_HOSTNAME, ACME_EMAIL and KODEL_PUBLIC_URL=https://<domain>, leave KODEL_WEB_PORT empty, then docker compose --profile tls up -d. Caddy obtains a Let’s Encrypt certificate on its own.

Create the account that owns the instance → Create your account.