Install
Kodel is self-hosted: one Docker Compose stack, your machine or your server, no data leaving your infrastructure.
Requirements
Section titled “Requirements”- Docker Engine 25+ with the Compose v2 plugin (
docker compose version). Docker Desktop and OrbStack both work; the legacydocker-composedoes 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.iowith the token you were given.
Install
Section titled “Install”git clone https://github.com/kodelai/kodel-compose.git && cd kodel-compose./install.shThe 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:
./install.sh --port 9000./install.sh --url https://kodel.example.com --port 80Re-running the script is safe: an existing .env is never overwritten, because
regenerating the encryption key would make everything already stored
unreadable.
What is running
Section titled “What is running”| Container | Role |
|---|---|
server | API, WebSocket, git proxy, MCP endpoint |
web | UI and the nginx that proxies everything to the server |
postgres | main database (with pgvector for code search) |
clickhouse | analytics: run timings, model call logs |
redis | job queues and locks |
minio | file storage for attachments and artifacts |
Day-to-day
Section titled “Day-to-day”docker compose ps # healthdocker compose logs -f server # server logsdocker compose up -d server # apply a changed .envdocker compose down # stop, keep dataTo 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.
HTTPS with a domain
Section titled “HTTPS with a domain”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.