services: agent: build: context: . dockerfile: Dockerfile command: python agent.py start env_file: .env restart: unless-stopped network_mode: host bot: build: context: . dockerfile: Dockerfile command: python bot.py env_file: .env restart: unless-stopped environment: - LITELLM_BASE_URL - LITELLM_API_KEY - DEFAULT_MODEL - BASE_MODEL=${BASE_MODEL:-claude-haiku} - ESCALATION_MODEL=${ESCALATION_MODEL:-claude-sonnet} - MEMORY_SERVICE_URL=http://memory-service:8090 - MEMORY_SERVICE_TOKEN - PORTAL_URL - BOT_API_KEY - SKYVERN_BASE_URL=http://skyvern:8000 - SKYVERN_API_KEY volumes: - bot-data:/data # Mount source files so git pull + restart works without rebuild - ./bot.py:/app/bot.py:ro - ./voice.py:/app/voice.py:ro - ./agent.py:/app/agent.py:ro - ./e2ee_patch.py:/app/e2ee_patch.py:ro - ./cross_signing.py:/app/cross_signing.py:ro - ./device_trust.py:/app/device_trust.py:ro depends_on: memory-service: condition: service_healthy memory-db: image: pgvector/pgvector:pg17 restart: unless-stopped environment: POSTGRES_USER: memory POSTGRES_PASSWORD: ${MEMORY_DB_PASSWORD:-memory} POSTGRES_DB: memories volumes: - memory-pgdata:/var/lib/postgresql/data - ./memory-db-ssl/server.crt:/var/lib/postgresql/server.crt:ro - ./memory-db-ssl/server.key:/var/lib/postgresql/server.key:ro command: > postgres -c ssl=on -c ssl_cert_file=/var/lib/postgresql/server.crt -c ssl_key_file=/var/lib/postgresql/server.key healthcheck: test: ["CMD-SHELL", "pg_isready -U memory -d memories"] interval: 5s timeout: 3s retries: 5 memory-service: build: ./memory-service restart: unless-stopped environment: DATABASE_URL: postgresql://memory_app:${MEMORY_APP_PASSWORD}@memory-db:5432/memories?sslmode=require MEMORY_ENCRYPTION_KEY: ${MEMORY_ENCRYPTION_KEY} MEMORY_DB_OWNER_PASSWORD: ${MEMORY_DB_PASSWORD:-memory} LITELLM_BASE_URL: ${LITELLM_BASE_URL} LITELLM_API_KEY: ${LITELLM_MASTER_KEY} EMBED_MODEL: ${EMBED_MODEL:-text-embedding-3-small} MEMORY_SERVICE_TOKEN: ${MEMORY_SERVICE_TOKEN:-} depends_on: memory-db: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8090/health')"] interval: 10s timeout: 5s retries: 3 skyvern: image: public.ecr.aws/skyvern/skyvern:latest restart: unless-stopped environment: DATABASE_STRING: postgresql+psycopg://skyvern:${SKYVERN_DB_PASSWORD:-skyvern}@skyvern-db:5432/skyvern ENABLE_OPENAI_COMPATIBLE: "true" OPENAI_COMPATIBLE_API_KEY: ${LITELLM_API_KEY} OPENAI_COMPATIBLE_API_BASE: ${LITELLM_BASE_URL} OPENAI_COMPATIBLE_MODEL_NAME: gpt-4o OPENAI_COMPATIBLE_SUPPORTS_VISION: "true" LLM_KEY: OPENAI_COMPATIBLE SECONDARY_LLM_KEY: OPENAI_COMPATIBLE BROWSER_TYPE: chromium-headful ENABLE_CODE_BLOCK: "true" ENV: local PORT: "8000" ALLOWED_ORIGINS: '["http://localhost:8000"]' volumes: - skyvern-artifacts:/data/artifacts - skyvern-videos:/data/videos depends_on: skyvern-db: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/api/v1/heartbeat')"] interval: 30s timeout: 10s retries: 3 start_period: 60s skyvern-db: image: postgres:14-alpine restart: unless-stopped environment: POSTGRES_USER: skyvern POSTGRES_PASSWORD: ${SKYVERN_DB_PASSWORD:-skyvern} POSTGRES_DB: skyvern volumes: - skyvern-pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U skyvern -d skyvern"] interval: 5s timeout: 3s retries: 5 volumes: bot-data: memory-pgdata: skyvern-pgdata: skyvern-artifacts: skyvern-videos: