Single-compose, self-hosted, LAN-only. Assumes Docker + Docker Compose v2 on the target machine.
git clone <repo>
cd overtchat
cp .env.example .env
echo "BETTER_AUTH_SECRET=$(openssl rand -hex 32)" >> .env
echo "SEARXNG_SECRET=$(openssl rand -hex 32)" >> .envEdit .env:
BETTER_AUTH_URL— the URL the browser will hit (scheme + host + port). For LAN access from other devices, set it to your host's LAN IP, e.g.http://192.168.1.50:4718.
Then:
docker compose up -d --buildFirst boot takes ~30s because the Kokoro TTS container downloads its model. Subsequent boots are fast.
Open the URL. First user signs up → becomes admin. Add more users from /settings/users.
Run the app on the host and Redis in Docker:
npm install
docker compose -f compose.yml -f compose.dev.yml up -d redis
npm run devOpen http://localhost:4717. Add searxng or kokoro to the Compose command when working on search or text-to-speech.
git pull
docker compose up -d --buildCompose only recreates the container if the image changed. Migrations run automatically on boot. Data in the overtchat-data volume persists across rebuilds.
The app container makes the upstream LLM calls, so the base URL you set in Settings → API endpoint needs to be reachable from inside the container, not from your browser.
- LLM running on the host (not in docker): use
http://host.docker.internal:<port>/v1. Baked intocompose.ymlviaextra_hosts, works on Linux / macOS / Windows. - Public provider (OpenAI / Groq / etc.): use the provider's base URL + API key.
SearXNG and Kokoro are bundled by default. To point the app at existing services, set container-reachable URLs in .env:
OVERTCHAT_SEARXNG_URL=http://host.docker.internal:8088
OVERTCHAT_KOKORO_URL=http://host.docker.internal:8880
OVERTCHAT_STT_URL=http://host.docker.internal:5092This changes where the app connects. To also stop the bundled containers from starting, add this to your local compose.override.yml:
services:
searxng:
profiles: ["disabled"]
kokoro:
profiles: ["disabled"]Docker Compose loads compose.override.yml automatically; this repo ignores it. If you already use that file for local networks or other overrides, merge these service entries into it.
Then run the usual command:
docker compose up -dUse host.docker.internal for services running on the Docker host, or a LAN/container URL for services running elsewhere.
# Tail logs
docker compose logs -f app
# Stop everything
docker compose down
# Backup the DB (safe while running)
docker compose exec app sqlite3 /app/data/chat.db ".backup /app/data/backup.db"
docker compose cp app:/app/data/backup.db ./backup.dbcurl -I http://localhost:4718returns307— healthy (redirect to/login).- Login succeeds, next page redirects back to login —
BETTER_AUTH_URLmismatch with what the browser sees. Fix in.env, thendocker compose up -d. - Port already in use — change
APP_PORTin.env. - Schema errors after pull — you didn't rebuild.
docker compose up -d --build.