version: '3.8' services: clickhouse: image: clickhouse/clickhouse-server:latest ports: - "8123:8123" - "9000:9000" volumes: - clickhouse_data:/var/lib/clickhouse - ./clickhouse/init.sql:/docker-entrypoint-initdb.d/init.sql environment: CLICKHOUSE_DB: obsidian CLICKHOUSE_USER: obsidian CLICKHOUSE_PASSWORD: obsidian123 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8123/ping"] interval: 10s timeout: 5s retries: 5 postgres: image: postgres:16-alpine ports: - "5432:5432" environment: POSTGRES_DB: obsidian POSTGRES_USER: obsidian POSTGRES_PASSWORD: obsidian123 volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U obsidian"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 ingestor: build: context: . dockerfile: Dockerfile.api depends_on: clickhouse: condition: service_healthy postgres: condition: service_healthy redis: condition: service_healthy environment: CLICKHOUSE_HOST: clickhouse CLICKHOUSE_PORT: 9000 CLICKHOUSE_DB: obsidian CLICKHOUSE_USER: obsidian CLICKHOUSE_PASSWORD: obsidian123 DATABASE_URL: postgresql+asyncpg://obsidian:obsidian123@postgres:5432/obsidian REDIS_URL: redis://redis:6379/0 SECRET_KEY: change-me-in-production OPENAI_API_KEY: ${OPENAI_API_KEY:-} ports: - "8000:8000" volumes: - ./backend:/app command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload worker: build: context: . dockerfile: Dockerfile.api depends_on: clickhouse: condition: service_healthy postgres: condition: service_healthy redis: condition: service_healthy environment: CLICKHOUSE_HOST: clickhouse CLICKHOUSE_PORT: 9000 CLICKHOUSE_DB: obsidian CLICKHOUSE_USER: obsidian CLICKHOUSE_PASSWORD: obsidian123 DATABASE_URL: postgresql+asyncpg://obsidian:obsidian123@postgres:5432/obsidian REDIS_URL: redis://redis:6379/0 SECRET_KEY: change-me-in-production OPENAI_API_KEY: ${OPENAI_API_KEY:-} volumes: - ./backend:/app command: celery -A workers.celery_app worker --loglevel=info --concurrency=4 frontend: build: context: . dockerfile: Dockerfile.frontend depends_on: - ingestor ports: - "3000:80" volumes: - ./frontend:/app - /app/node_modules otel-collector: image: otel/opentelemetry-collector-contrib:latest ports: - "4317:4317" - "4318:4318" volumes: - ./otel-collector/config.yaml:/etc/otel/config.yaml command: ["--config", "/etc/otel/config.yaml"] depends_on: - ingestor volumes: clickhouse_data: postgres_data: