# Praxis v0.2 — Docker Compose service definition # Runs the praxis server inside a Docker container (inside an LXC CT). # Per RESEARCH.md Q4/Q8 / ARCHITECTURE.md §v0.2 Deployment Architecture. services: praxis: build: . image: praxis:latest restart: unless-stopped ports: - "8789:8789" volumes: # SQLite DB persistence — survives container recreation (G-102). - praxis-data:/app/data environment: PRAXIS_HOST: "0.0.0.0" PRAXIS_PORT: "8789" PRAXIS_DB_PATH: "/app/data/praxis.db" PRAXIS_SCENARIOS_DIR: "/app/scenarios" PRAXIS_TTS: "${PRAXIS_TTS:-cartesia}" PRAXIS_SCENARIO: "${PRAXIS_SCENARIO:-customer_service_refund_ca_v01}" # Voice-service keys (empty if unprovisioned — server degrades gracefully) DEEPGRAM_API_KEY: "${DEEPGRAM_API_KEY:-}" CARTESIA_API_KEY: "${CARTESIA_API_KEY:-}" OLLAMA_API_KEY: "${OLLAMA_API_KEY:-}" # Ollama Cloud endpoints (D-020) OLLAMA_BASE_URL: "${OLLAMA_BASE_URL:-https://ollama.com/v1}" OLLAMA_CHAT_URL: "${OLLAMA_CHAT_URL:-https://ollama.com/api/chat}" OLLAMA_ROLEPLAY_MODEL: "${OLLAMA_ROLEPLAY_MODEL:-gemma4:cloud}" OLLAMA_DEBRIEF_MODEL: "${OLLAMA_DEBRIEF_MODEL:-deepseek-v4-flash:cloud}" # Deepgram (D-013) DEEPGRAM_MODEL: "${DEEPGRAM_MODEL:-nova-3}" DEEPGRAM_LANGUAGE: "${DEEPGRAM_LANGUAGE:-en}" DEEPGRAM_REGION: "${DEEPGRAM_REGION:-na}" # Cartesia (D-014) CARTESIA_VOICE_ID: "${CARTESIA_VOICE_ID:-a3536a36-1d18-4efb-a95a-7c44b7b5e384}" env_file: # /etc/praxis/server.env is written by install-service.sh with # secrets injected via lxc.environment (G-101 fix: GITEA_TOKEN baked # into the snippet; voice keys from lxc.environment). # required: false so `docker compose config` validates in dev without # the file; install-service.sh ALWAYS creates it before # `docker compose up` in production (so secrets are present at runtime). - path: /etc/praxis/server.env required: false volumes: praxis-data: driver: local