docker-compose.dev.example.yml
Rama main · réplica de lectura del repositorio original.
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