services: db: image: postgres:16-alpine environment: POSTGRES_USER: gogo POSTGRES_PASSWORD: gogo POSTGRES_DB: gogo ports: - "127.0.0.1:5433:5432" # 5433 on the host to avoid clashing with a system postgres volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U gogo"] interval: 5s timeout: 3s retries: 10 app: build: . depends_on: db: condition: service_healthy environment: GOGO_DATABASE_URL: postgresql+psycopg://gogo:gogo@db:5432/gogo env_file: - path: .env required: false ports: - "127.0.0.1:8000:8000" volumes: - recordings:/data/recordings command: > sh -c "alembic upgrade head && uvicorn gogo.main:app --host 0.0.0.0 --port 8000" # Voice pipeline (M4): AudioSocket server with STT/TTS/LLM. # Heavy (faster-whisper); start with: docker compose --profile voice up voice: build: context: . dockerfile: Dockerfile.voice profiles: ["voice"] depends_on: db: condition: service_healthy environment: GOGO_DATABASE_URL: postgresql+psycopg://gogo:gogo@db:5432/gogo GOGO_RECORDINGS_DIR: /data/recordings env_file: - path: .env required: false ports: - "127.0.0.1:9092:9092" volumes: - recordings:/data/recordings # Asterisk (M4): softphones register here; agent calls bridge to `voice`. # Config is generated: python -m gogo.telephony.asterisk --out ./asterisk/conf asterisk: image: andrius/asterisk:alpine-20.5.2 profiles: ["voice"] network_mode: host # SIP/RTP is painful behind NAT; host networking for MVP volumes: - ./asterisk/conf/pjsip.conf:/etc/asterisk/pjsip.conf:ro - ./asterisk/conf/extensions.conf:/etc/asterisk/extensions.conf:ro volumes: pgdata: recordings: