services: postgres: build: context: ./postgres dockerfile: Dockerfile container_name: mosaic-postgres restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-mosaic} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-mosaic_dev_password} POSTGRES_DB: ${POSTGRES_DB:-mosaic} ports: - "${POSTGRES_PORT:-5432}:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-mosaic} -d ${POSTGRES_DB:-mosaic}"] interval: 10s timeout: 5s retries: 5 start_period: 30s networks: - mosaic-network valkey: image: valkey/valkey:8-alpine container_name: mosaic-valkey restart: unless-stopped ports: - "${VALKEY_PORT:-6379}:6379" volumes: - valkey_data:/data healthcheck: test: ["CMD", "valkey-cli", "ping"] interval: 10s timeout: 5s retries: 5 start_period: 10s networks: - mosaic-network coordinator: build: context: ../apps/coordinator dockerfile: Dockerfile container_name: mosaic-coordinator restart: unless-stopped environment: GITEA_WEBHOOK_SECRET: ${GITEA_WEBHOOK_SECRET} GITEA_URL: ${GITEA_URL:-https://git.mosaicstack.dev} LOG_LEVEL: ${LOG_LEVEL:-info} HOST: 0.0.0.0 PORT: 8000 # Telemetry (task completion tracking & predictions) MOSAIC_TELEMETRY_ENABLED: ${MOSAIC_TELEMETRY_ENABLED:-false} MOSAIC_TELEMETRY_SERVER_URL: ${MOSAIC_TELEMETRY_SERVER_URL:-http://telemetry-api:8000} MOSAIC_TELEMETRY_API_KEY: ${MOSAIC_TELEMETRY_API_KEY:-} MOSAIC_TELEMETRY_INSTANCE_ID: ${MOSAIC_TELEMETRY_INSTANCE_ID:-} MOSAIC_TELEMETRY_DRY_RUN: ${MOSAIC_TELEMETRY_DRY_RUN:-false} ports: - "8000:8000" healthcheck: test: [ "CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')", ] interval: 30s timeout: 10s retries: 3 start_period: 5s networks: - mosaic-network openbao: image: quay.io/openbao/openbao:2.5.0 container_name: mosaic-openbao restart: unless-stopped user: root ports: - "127.0.0.1:${OPENBAO_PORT:-8200}:8200" volumes: - openbao_data:/openbao/data - openbao_init:/openbao/init - ./openbao/config.hcl:/openbao/config/config.hcl:ro environment: VAULT_ADDR: http://0.0.0.0:8200 SKIP_SETCAP: "true" entrypoint: ["dumb-init", "--"] command: ["bao", "server", "-config=/openbao/config/config.hcl"] cap_add: - IPC_LOCK healthcheck: test: [ "CMD-SHELL", "wget --spider --quiet 'http://127.0.0.1:8200/v1/sys/health?standbyok=true&uninitcode=200&sealedcode=200'", ] interval: 10s timeout: 5s retries: 5 start_period: 10s networks: - mosaic-network labels: com.mosaic.service: "secrets" com.mosaic.description: "OpenBao secrets management" openbao-init: image: quay.io/openbao/openbao:2.5.0 container_name: mosaic-openbao-init restart: unless-stopped user: root volumes: - openbao_init:/openbao/init - ./openbao/init.sh:/init.sh:ro environment: VAULT_ADDR: http://openbao:8200 command: /init.sh depends_on: openbao: condition: service_healthy networks: - mosaic-network labels: com.mosaic.service: "secrets-init" com.mosaic.description: "OpenBao auto-initialization sidecar" # ====================== # Telemetry API (Optional - for local development) # ====================== # Uncomment to run the telemetry API locally for self-contained development. # For production, use an external telemetry API URL instead. # telemetry-api: # image: git.mosaicstack.dev/mosaic/telemetry-api:latest # container_name: mosaic-telemetry-api # restart: unless-stopped # environment: # HOST: 0.0.0.0 # PORT: 8000 # ports: # - "8001:8000" # healthcheck: # test: ["CMD", "curl", "-f", "http://localhost:8000/health"] # interval: 30s # timeout: 10s # retries: 3 # start_period: 10s # networks: # - mosaic-network volumes: postgres_data: name: mosaic-postgres-data valkey_data: name: mosaic-valkey-data openbao_data: name: mosaic-openbao-data openbao_init: name: mosaic-openbao-init networks: mosaic-network: name: mosaic-network driver: bridge