version: '3.8' services: db: image: mysql:8.0 container_name: my_mysql_cosmic_catalyst restart: always environment: MYSQL_ROOT_PASSWORD: "REPLACE_ME" # ← generated dynamically MYSQL_DATABASE: entities_db MYSQL_USER: api_user MYSQL_PASSWORD: "REPLACE_ME" # ← generated dynamically volumes: - mysql_data:/var/lib/mysql ports: - "3307:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 networks: - my_custom_network qdrant: image: qdrant/qdrant:latest container_name: qdrant_server restart: always ports: - "6333:6333" # API port - "6334:6334" # gRPC port volumes: - qdrant_storage:/qdrant/storage environment: QDRANT__STORAGE__STORAGE_PATH: "/qdrant/storage" QDRANT__SERVICE__GRPC_PORT: "6334" QDRANT__LOG_LEVEL: "INFO" networks: - my_custom_network redis: image: redis:7 container_name: redis restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data networks: - my_custom_network browser: image: ghcr.io/browserless/chromium:latest container_name: browserless_chromium restart: always ports: - "3000:3000" environment: - MAX_CONCURRENT_SESSIONS=10 - CONNECTION_TIMEOUT=60000 networks: - my_custom_network searxng: image: searxng/searxng:latest container_name: searxng restart: unless-stopped ports: - "8080:8080" volumes: - ./docker/searxng:/etc/searxng environment: - SEARXNG_BASE_URL=http://localhost:8080/ - SEARXNG_SECRET_KEY=REPLACE_ME # ← generated dynamically depends_on: - redis networks: - my_custom_network otel-collector: image: otel/opentelemetry-collector-contrib:latest container_name: otel_collector restart: always command: ["--config=/etc/otel-config.yaml"] volumes: - ./docker/otel/otel-config.yaml:/etc/otel-config.yaml ports: - "4317:4317" # gRPC receiver - "4318:4318" # HTTP receiver depends_on: - jaeger networks: - my_custom_network jaeger: image: jaegertracing/all-in-one:latest container_name: jaeger_ui restart: always environment: - COLLECTOR_OTLP_ENABLED=true ports: - "16686:16686" # UI - "14250:14250" # gRPC collector networks: - my_custom_network ollama: image: ollama/ollama:latest container_name: ollama restart: unless-stopped ports: - "11434:11434" volumes: - ollama_data:/root/.ollama networks: - my_custom_network api: build: context: . dockerfile: docker/api/Dockerfile container_name: fastapi_cosmic_catalyst restart: always env_file: - .env environment: - DATABASE_URL=mysql+pymysql://api_user:REPLACE_ME@db:3306/entities_db - PROJECT_DAVID_CREDENTIAL_KEY=REPLACE_WITH_FERNET_KEY - AUTO_MIGRATE=1 - SANDBOX_SERVER_URL=http://sandbox:8000 - QDRANT_URL=http://qdrant:6333 - REDIS_URL=redis://redis:6379/0 - BROWSER_WS_ENDPOINT=ws://browser:3000 - DEFAULT_SECRET_KEY=REPLACE_ME # ← generated dynamically - SEARXNG_URL=http://searxng:8080 - OTEL_SERVICE_NAME=api-api - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 - OTEL_EXPORTER_OTLP_PROTOCOL=grpc - OTEL_TRACES_EXPORTER=otlp - OTEL_METRICS_EXPORTER=none - OTEL_LOGS_EXPORTER=none - OLLAMA_BASE_URL=http://ollama:11434/v1 # Override the host-side SHARED_PATH with the container-internal mount point # so the purge daemon writes to the same directory the samba container serves - SHARED_PATH=/app/shared_data ports: - "9000:9000" volumes: - ./src:/app/src - ./alembic.ini:/app/alembic.ini - ./migrations:/app/migrations # Mount the same host directory that samba exposes — both containers # now read/write the same files on disk - ${SHARED_PATH}:/app/shared_data depends_on: db: condition: service_healthy sandbox: condition: service_started qdrant: condition: service_started redis: condition: service_started browser: condition: service_started searxng: condition: service_started otel-collector: condition: service_started ollama: condition: service_started command: ["./wait-for-it.sh", "db:3306", "--", "uvicorn", "entities_api.app:app", "--host", "0.0.0.0", "--port", "9000"] networks: - my_custom_network sandbox: build: context: . dockerfile: docker/sandbox/Dockerfile container_name: sandbox_api restart: always cap_add: - SYS_ADMIN security_opt: - seccomp:unconfined devices: - /dev/fuse ports: - "8000:8000" depends_on: db: condition: service_healthy volumes: - /tmp/sandbox_logs:/app/logs env_file: - .env networks: - my_custom_network samba: image: dperson/samba container_name: samba_server restart: unless-stopped environment: USERID: 1000 GROUPID: 1000 TZ: UTC USER: "samba_user;default" SHARE: "cosmic_share;/samba/share;yes;no;no;samba_user" GLOBAL: "server min protocol = NT1\nserver max protocol = SMB3" ports: - "139:139" - "1445:445" volumes: - ${SHARED_PATH}:/samba/share networks: - my_custom_network volumes: mysql_data: driver: local qdrant_storage: driver: local redis_data: driver: local ollama_data: driver: local networks: my_custom_network: driver: bridge