Get Ottoch running in minutes

Docker Compose for both editions — Redis is bundled in the stack. Community edition is free, no license needed.

Docker Compose — free tier

Two services: the app and Redis for rate limiting. SQLite is built-in — no external database needed.

Want to try it with sample data first?

Skip writing your own compose file — ottoch-demo bundles the app, Redis, and one of every supported database (PostgreSQL, MySQL, MariaDB, SQL Server, ClickHouse, SQLite), pre-seeded with a shared sample dataset so you can try real queries across engines before connecting anything of your own.

git clone https://github.com/ottochapp/ottoch-demo
cd ottoch-demo
cp .env.example .env
docker compose up -d

1. Create your compose file

services:
  redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: redis-server --save "" --appendonly no --maxmemory 128mb --maxmemory-policy allkeys-lru

  app:
    image: registry.ottoch.com/ottoch:latest-ce
    restart: unless-stopped
    depends_on:
      - redis
    ports:
      - "80:80"
      - "443:443"
    env_file: .env
    volumes:
      - ottoch_data:/data

volumes:
  ottoch_data:

2. Create your .env file

DJANGO_SECRET_KEY=replace-with-a-long-random-string
ENCRYPTION_KEY=replace-with-a-fernet-key
REDIS_URL=redis://redis:6379/0
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1
ADMIN_URL=admin/

Generate DJANGO_SECRET_KEY:

python -c "import secrets; print(secrets.token_urlsafe(50))"

Generate ENCRYPTION_KEY:

python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"

3. Start the stack

docker compose up -d
docker compose logs app

Check the logs for your auto-generated admin credentials on first boot.

4
Open http://localhost and log in

Use the credentials from the logs. You'll be asked to change your password on first login.

5
Add your AI key

Settings → LLM Config. Supports OpenAI, Anthropic, Gemini, and any OpenAI-compatible endpoint.

6
Connect your database & start asking

Add a connection, activate the tables you want to expose, then open the dashboard and start chatting.

Environment variables

Set these in your .env file alongside the Compose file.

VariableDescriptionDefault
DJANGO_SECRET_KEY Django secret key — long random string, never reuse across instances Required
ENCRYPTION_KEY Fernet key — encrypts stored credentials and AI keys at rest Required
REDIS_URL Redis connection URL for query rate limiting redis://redis:6379/0
DATABASE_URL Database URL — CE uses SQLite by default, EE typically uses PostgreSQL SQLite
DJANGO_ALLOWED_HOSTS Comma-separated list of allowed host headers — add your domain in production localhost,127.0.0.1
ADMIN_URL Path to the Django admin — change to something non-obvious (must end with /) admin/
OTTOCH_SITE_URL Public URL of your instance https://ottoch.com
OTTOCH_OUTBOUND_IPS Comma-separated server outbound IPs, shown to users for firewall setup empty
LICENSE_KEY_SALT License validation salt — Enterprise Edition only EE only
SENTRY_DSN Sentry DSN for error tracking optional
EMAIL_HOST / EMAIL_HOST_USER / EMAIL_HOST_PASSWORD SMTP settings for system emails optional

Docker Compose with PostgreSQL

Three services: Redis, PostgreSQL, and the app. Includes LDAP/Active Directory, multi-user RBAC, follow-up detection, and license-based activation.

1. Log in to the Enterprise registry

The EE image isn't public — you need the registry username and password we sent you when you purchased your license.

docker login ee-registry.ottoch.com

2. docker-compose.yml

services:
  redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: redis-server --save "" --appendonly no --maxmemory 128mb --maxmemory-policy allkeys-lru

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ottoch
      POSTGRES_USER: ottoch
      POSTGRES_PASSWORD: changeme
    volumes:
      - pgdata:/var/lib/postgresql/data

  app:
    image: ee-registry.ottoch.com/ottoch:latest-ee
    restart: unless-stopped
    depends_on:
      - redis
      - db
    ports:
      - "80:80"
      - "443:443"
    env_file: .env
    volumes:
      - ottoch_data:/data

volumes:
  pgdata:
  ottoch_data:

3. .env

DJANGO_SECRET_KEY=replace-with-a-long-random-string
ENCRYPTION_KEY=replace-with-a-fernet-key
LICENSE_KEY_SALT=replace-with-your-license-salt
DATABASE_URL=postgres://ottoch:changeme@db:5432/ottoch
REDIS_URL=redis://redis:6379/0
DJANGO_ALLOWED_HOSTS=yourdomain.com
ADMIN_URL=your-secret-admin-path/

4. Start the stack

docker compose up -d

docker compose pull will need step 1's login again on any machine it hasn't run on before.

✓ Replace changeme with a real Postgres password in both the db service and DATABASE_URL.
✓ LICENSE_KEY_SALT must match the salt configured in your Ottoch portal. Each customer activates their own license key.
✓ An enterprise license key is required to unlock multi-user access. Request one here.

HTTPS with your own domain

Ottoch ships with Caddy, which handles HTTPS automatically via Let's Encrypt.

1
Point your domain to the server

Create an A record pointing yourdomain.com to your server's IP. TTL of 300s is fine for initial setup.

2
Update your .env and restart

Set DJANGO_ALLOWED_HOSTS=yourdomain.com and OTTOCH_SITE_URL=https://yourdomain.com, then run docker compose up -d. Caddy obtains an HTTPS certificate automatically on first request.

✓ Ports 80 and 443 must be open on your firewall for Let's Encrypt certificate issuance.
✓ Caddy renews certificates automatically before expiry — no manual certificate management.

Keeping your data safe

Community Edition (SQLite volume)

docker run --rm \
  -v ottoch_data:/data \
  -v $(pwd):/backup \
  alpine \
  tar czf /backup/ottoch-backup.tar.gz /data

Creates ottoch-backup.tar.gz in the current directory. Schedule with cron or any backup tool.

Enterprise Edition (PostgreSQL)

docker compose exec db \
  pg_dump -U ottoch ottoch \
  | gzip > ottoch-$(date +%Y%m%d).sql.gz

Standard pg_dump. Restore with gunzip | psql.

Staying up to date

Data persists in named volumes. Pull the new image and recreate the container — the volume survives.

Community Edition

docker compose pull
docker compose up -d

Enterprise Edition

docker compose pull
docker compose up -d
✓ All connections, sessions, LLM config, and user settings are stored in the volume and survive the update.
✓ Database migrations run automatically on container start. No manual steps required.

Questions? Need an enterprise license?

We're happy to help you get set up.

Request a license → Contact us