# Honcho Docker Compose # # Usage: # cp docker-compose.yml.example docker-compose.yml # cp .env.template .env # edit with your provider config # docker compose up -d --build # INSTALL_LANCEDB=true docker compose up -d --build # optional local vector store # # By default, ports are bound to 127.0.0.1 (localhost only). # For development, uncomment the source mounts and monitoring services below. services: api: build: context: . dockerfile: Dockerfile args: INSTALL_LANCEDB: ${INSTALL_LANCEDB:-false} entrypoint: ["sh", "docker/entrypoint.sh"] depends_on: database: condition: service_healthy redis: condition: service_healthy ports: - "127.0.0.1:8000:8000" healthcheck: test: [ "CMD", "/app/.venv/bin/python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health', timeout=2).read()", ] interval: 5s timeout: 5s retries: 5 start_period: 10s volumes: # Shared LanceDB data (used when VECTOR_STORE_TYPE=lancedb) - lancedb-data:/app/lancedb_data # -- Development: mount source for live reload -- # - .:/app # - venv:/app/.venv environment: - DB_CONNECTION_URI=postgresql+psycopg://postgres:postgres@database:5432/postgres - CACHE_URL=redis://redis:6379/0?suppress=true - CACHE_ENABLED=true env_file: - path: .env required: false restart: unless-stopped deriver: build: context: . dockerfile: Dockerfile args: INSTALL_LANCEDB: ${INSTALL_LANCEDB:-false} entrypoint: ["/app/.venv/bin/python", "-m", "src.deriver"] depends_on: api: condition: service_healthy database: condition: service_healthy redis: condition: service_healthy volumes: # Shared LanceDB data (used when VECTOR_STORE_TYPE=lancedb) - lancedb-data:/app/lancedb_data # -- Development: mount source for live reload -- # - .:/app # - venv:/app/.venv environment: - DB_CONNECTION_URI=postgresql+psycopg://postgres:postgres@database:5432/postgres - CACHE_URL=redis://redis:6379/0?suppress=true - CACHE_ENABLED=true env_file: - path: .env required: false restart: unless-stopped mcp: build: context: ./mcp dockerfile: Dockerfile depends_on: api: condition: service_healthy ports: - "127.0.0.1:3000:3000" environment: - HONCHO_API_URL=http://api:8000 env_file: - path: .env required: false healthcheck: test: [ "CMD", "bun", "-e", "fetch('http://127.0.0.1:3000/health').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))", ] interval: 5s timeout: 5s retries: 5 start_period: 10s restart: unless-stopped database: image: pgvector/pgvector:pg15 restart: unless-stopped ports: - "127.0.0.1:5432:5432" command: ["postgres", "-c", "max_connections=200"] environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres # Allow passwordless connections from the host (port is bound to 127.0.0.1). # Lets the local test suite and ad-hoc tools connect without supplying a # password. Do NOT use this in production. - POSTGRES_HOST_AUTH_METHOD=trust - PGDATA=/var/lib/postgresql/data/pgdata volumes: - ./database/init.sql:/docker-entrypoint-initdb.d/init.sql - pgdata:/var/lib/postgresql/data/ healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"] interval: 5s timeout: 5s retries: 5 redis: image: redis:8.2 restart: unless-stopped ports: - "127.0.0.1:6379:6379" volumes: - redis-data:/data healthcheck: test: ["CMD-SHELL", "redis-cli ping"] interval: 5s timeout: 5s retries: 5 # -- Development: monitoring stack (uncomment to enable) -- # prometheus: # image: prom/prometheus:v3.2.1 # ports: # - "127.0.0.1:9090:9090" # volumes: # - ./docker/prometheus.yml:/etc/prometheus/prometheus.yml:ro # - prometheus-data:/prometheus # depends_on: # api: # condition: service_started # grafana: # image: grafana/grafana:11.4.0 # ports: # - "127.0.0.1:3000:3000" # environment: # - GF_SECURITY_ADMIN_USER=admin # - GF_SECURITY_ADMIN_PASSWORD=admin # - GF_AUTH_ANONYMOUS_ENABLED=true # - GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer # volumes: # - ./docker/grafana-datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml:ro # depends_on: # prometheus: # condition: service_started volumes: pgdata: redis-data: lancedb-data: # -- Development: uncomment if using source mounts -- # venv: # prometheus-data: