# ───────────────────────────────────────────────────────────────────────────── # Stack base del boilerplate. Coolify-ready. # # REGLAS DE ORO: # - Healthchecks usan `wget -qO-` o `curl -sf`, NUNCA `wget --spider` (issue I-008) # - SIN labels Traefik manuales — Coolify v4 los autogenera del panel FQDN (issue I-009) # - Servicios sin internet → `internal: true` en su network (regla D3) # - `image:` tag explícito para que Coolify haga el proxy-network attach # ───────────────────────────────────────────────────────────────────────────── services: web: build: context: . dockerfile: web/_default_fastapi_htmx/Dockerfile image: 'wox-web:latest' environment: PUBLIC_HOST: ${PUBLIC_HOST:-localhost} WXO_INSTANCE_URL: ${WXO_INSTANCE_URL:-} WXO_API_KEY: ${WXO_API_KEY:-} WXO_AGENT_ID: ${WXO_AGENT_ID:-} IBM_CLOUD_IAM_URL: ${IBM_CLOUD_IAM_URL:-https://iam.cloud.ibm.com/identity/token} TRACE_SINK: ${TRACE_SINK:-sqlite} TRACES_DB_PATH: /data/traces.db volumes: - web_data:/data restart: unless-stopped expose: ["8000"] labels: # Coolify Traefik — solo el toggle + network. NUNCA routers manuales. - "traefik.enable=true" - "traefik.docker.network=coolify" networks: - coolify - internal healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:8000/health"] interval: 30s timeout: 5s retries: 3 # ─── (Ejemplo) mock externo — descomentá y duplicá según necesites ───────── # example_mock: # build: # context: . # dockerfile: mocks/_example_mock/Dockerfile # image: 'wox-example-mock:latest' # environment: # BASE_URL: http://example_mock:8000 # expose: ["8000"] # restart: unless-stopped # networks: # - internal # healthcheck: # test: ["CMD", "wget", "-qO-", "http://localhost:8000/health"] # interval: 30s # timeout: 5s # retries: 3 # ─── (Ejemplo) backend propio FastAPI ────────────────────────────────────── # backend: # build: # context: . # dockerfile: backend/Dockerfile # image: 'wox-backend:latest' # environment: # DATABASE_URL: ${DATABASE_URL:-sqlite:///data/app.db} # WXO_BACKEND_TOKEN: ${WXO_BACKEND_TOKEN} # WEBHOOK_SECRET: ${WEBHOOK_SECRET} # volumes: # - backend_data:/data # expose: ["8000"] # restart: unless-stopped # networks: # - coolify # si necesita ser accesible para WxO # - internal # healthcheck: # test: ["CMD", "curl", "-sf", "http://localhost:8000/health"] # interval: 30s # timeout: 5s # retries: 3 volumes: web_data: # backend_data: networks: coolify: external: true internal: driver: bridge internal: false # cambiar a true en producción si no necesitan acceso a internet