Ctrl K
ComunidadGuías…

docker-compose.dev.example.yml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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