services: code-server: build: context: ../.. dockerfile: docker/server.Dockerfile image: code-server:local restart: unless-stopped environment: FRONTAL_CODE_SERVER_HOST: ${FRONTAL_CODE_SERVER_HOST:-0.0.0.0} FRONTAL_CODE_SERVER_PORT: ${FRONTAL_CODE_SERVER_PORT:-8788} FRONTAL_CODE_SERVER_LANE_TRANSPORT: ${FRONTAL_CODE_SERVER_LANE_TRANSPORT:-tools-agent} FRONTAL_CODE_SERVER_API_KEY: ${FRONTAL_CODE_SERVER_API_KEY:-} FRONTAL_CODE_SERVER_WORKSPACE_ROOT: ${FRONTAL_CODE_SERVER_WORKSPACE_ROOT:-/workspace/workspaces} FRONTAL_CODE_SERVER_DOCKER_IMAGE: ${FRONTAL_CODE_SERVER_DOCKER_IMAGE:-frontal-code-worker:local} FRONTAL_CODE_SERVER_CALLBACK_URL: ${FRONTAL_CODE_SERVER_CALLBACK_URL:-http://host.docker.internal:8788} FRONTAL_CODE_SERVER_RECONCILE_INTERVAL_SECS: ${FRONTAL_CODE_SERVER_RECONCILE_INTERVAL_SECS:-15} FRONTAL_CODE_SERVER_ORPHAN_APPROVAL_DELAY_SECS: ${FRONTAL_CODE_SERVER_ORPHAN_APPROVAL_DELAY_SECS:-0} FRONTAL_CODE_SERVER_ORPHAN_AUTO_RETRY_SECS: ${FRONTAL_CODE_SERVER_ORPHAN_AUTO_RETRY_SECS:-0} FRONTAL_CODE_SERVER_ORPHAN_AUTO_CANCEL_SECS: ${FRONTAL_CODE_SERVER_ORPHAN_AUTO_CANCEL_SECS:-0} FRONTAL_CODE_SERVER_ORPHAN_POLICY_RULES: ${FRONTAL_CODE_SERVER_ORPHAN_POLICY_RULES:-[]} FRONTAL_CODE_SERVER_STATE_FILE: ${FRONTAL_CODE_SERVER_STATE_FILE:-/var/lib/frontal-code/server/state.json} FRONTAL_CODE_AGENT_STORE: ${FRONTAL_CODE_AGENT_STORE:-/var/lib/frontal-code/agents} RUST_LOG: ${RUST_LOG:-info} FRONTAL_CODE_GITHUB_WEBHOOK_SECRET: ${FRONTAL_CODE_GITHUB_WEBHOOK_SECRET:-} FRONTAL_API_KEY: ${FRONTAL_API_KEY:-} FRONTAL_AUTH_TOKEN: ${FRONTAL_AUTH_TOKEN:-} FRONTAL_BASE_URL: ${FRONTAL_BASE_URL:-} OPENAI_API_KEY: ${OPENAI_API_KEY:-} OPENAI_BASE_URL: ${OPENAI_BASE_URL:-} XAI_API_KEY: ${XAI_API_KEY:-} XAI_BASE_URL: ${XAI_BASE_URL:-} AZURE_OPENAI_API_KEY: ${AZURE_OPENAI_API_KEY:-} AZURE_OPENAI_BASE_URL: ${AZURE_OPENAI_BASE_URL:-} BEDROCK_API_KEY: ${BEDROCK_API_KEY:-} BEDROCK_BASE_URL: ${BEDROCK_BASE_URL:-} OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-} OLLAMA_MODEL: ${OLLAMA_MODEL:-} working_dir: /workspace volumes: - frontal-code_workspace:/workspace - frontal-code_server_state:/var/lib/frontal-code/server - frontal-code_agent_store:/var/lib/frontal-code/agents tmpfs: - /tmp security_opt: - no-new-privileges:true cap_drop: - ALL ports: - "${FRONTAL_CODE_SERVER_PUBLISH_ADDR:-127.0.0.1}:${FRONTAL_CODE_SERVER_PORT:-8788}:8788" healthcheck: test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8788/health"] interval: 30s timeout: 10s retries: 5 start_period: 20s frontal-code-worker-image: build: context: ../.. dockerfile: docker/worker.Dockerfile image: frontal-code-worker:local command: ["frontal-code", "--version"] restart: "no" profiles: ["worker-image"] # Event store for the Slack bot's OpenChannel Protocol host (@openchannelprotocol/sdk). ocp-postgres: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_USER: ${OCP_POSTGRES_USER:-frontal_code_slack} POSTGRES_PASSWORD: ${OCP_POSTGRES_PASSWORD:-frontal_code_slack} POSTGRES_DB: ${OCP_POSTGRES_DB:-frontal_code_slack} volumes: - frontal-code_ocp_postgres:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 10 frontal-code-slack: build: context: ../.. dockerfile: docker/slack.Dockerfile image: frontal-code-slack:local restart: unless-stopped environment: FRONTAL_CODE_API_URL: ${FRONTAL_CODE_API_URL:-http://code-server:8788} FRONTAL_CODE_API_TIMEOUT: ${FRONTAL_CODE_API_TIMEOUT:-30000} FRONTAL_SERVER_API_KEY: ${FRONTAL_SERVER_API_KEY:-} SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN} SLACK_APP_TOKEN: ${SLACK_APP_TOKEN} SLACK_SIGNING_SECRET: ${SLACK_SIGNING_SECRET} NODE_ENV: ${NODE_ENV:-production} LOG_LEVEL: ${LOG_LEVEL:-info} PORT: ${PORT:-3000} MAX_CONCURRENT_TASKS: ${MAX_CONCURRENT_TASKS:-10} TASK_TIMEOUT: ${TASK_TIMEOUT:-3600000} HEALTH_CHECK_INTERVAL: ${HEALTH_CHECK_INTERVAL:-30000} GITHUB_TOKEN: ${GITHUB_TOKEN:-} SENTRY_DSN: ${SENTRY_DSN:-} OCP_DATABASE_URL: ${OCP_DATABASE_URL:-postgres://frontal_code_slack:frontal_code_slack@ocp-postgres:5432/frontal_code_slack} OCP_RUN_MIGRATIONS: ${OCP_RUN_MIGRATIONS:-true} depends_on: code-server: condition: service_healthy ocp-postgres: condition: service_healthy read_only: true tmpfs: - /tmp security_opt: - no-new-privileges:true cap_drop: - ALL healthcheck: test: [ "CMD", "node", "-e", "require('http').get('http://127.0.0.1:3000/ready', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))", ] interval: 30s timeout: 10s retries: 5 start_period: 20s volumes: frontal-code_ocp_postgres: frontal-code_workspace: frontal-code_server_state: frontal-code_agent_store: