# ============================================================================= # ZhikunCode — Docker Compose (Production) # ============================================================================= # Usage: # docker compose up -d # Start in background # docker compose logs -f # Follow logs # docker compose down # Stop and remove # docker compose up --build # Rebuild and start # ============================================================================= services: zhikuncode: build: context: . dockerfile: Dockerfile target: runtime image: zhikuncode:latest container_name: zhikuncode ports: - "${ZHIKUN_PORT:-8080}:8080" environment: # ---- Required ---- - SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE:-production} - "JAVA_OPTS=${JAVA_OPTS:--Xms256m -Xmx1024m --enable-preview}" # ---- Multi-Provider LLM (Recommended) ---- - LLM_PROVIDER_OPENAI_API_KEY=${LLM_PROVIDER_OPENAI_API_KEY:-} - LLM_PROVIDER_OPENAI_MODELS=${LLM_PROVIDER_OPENAI_MODELS:-gpt-6-astra} - LLM_PROVIDER_DASHSCOPE_API_KEY=${LLM_PROVIDER_DASHSCOPE_API_KEY:-} - LLM_PROVIDER_DASHSCOPE_TOKEN_PLAN_API_KEY=${LLM_PROVIDER_DASHSCOPE_TOKEN_PLAN_API_KEY:-} - LLM_PROVIDER_DASHSCOPE_TOKEN_PLAN_MODELS=${LLM_PROVIDER_DASHSCOPE_TOKEN_PLAN_MODELS:-qwen3.8-max,qwen3.8-flash,deepseek-v4.1-flash,bailian/glm-5.3} - LLM_PROVIDER_DEEPSEEK_API_KEY=${LLM_PROVIDER_DEEPSEEK_API_KEY:-} - LLM_PROVIDER_DEEPSEEK_MODELS=${LLM_PROVIDER_DEEPSEEK_MODELS:-deepseek-flash} - LLM_PROVIDER_MOONSHOT_API_KEY=${LLM_PROVIDER_MOONSHOT_API_KEY:-} - LLM_PROVIDER_KIMI_CODE_API_KEY=${LLM_PROVIDER_KIMI_CODE_API_KEY:-} - LLM_PROVIDER_KIMI_CODE_MODELS=${LLM_PROVIDER_KIMI_CODE_MODELS:-k3.1-pro-highspeed,kimi-for-coding} - LLM_PROVIDER_ZHIPU_API_KEY=${LLM_PROVIDER_ZHIPU_API_KEY:-} - LLM_PROVIDER_ZHIPU_MODELS=${LLM_PROVIDER_ZHIPU_MODELS:-glm-5.3,glm-5.3-flash} - LLM_PROVIDER_MINIMAX_API_KEY=${LLM_PROVIDER_MINIMAX_API_KEY:-} - LLM_PROVIDER_ZENMUX_API_KEY=${LLM_PROVIDER_ZENMUX_API_KEY:-} - LLM_PROVIDER_OPENROUTER_API_KEY=${LLM_PROVIDER_OPENROUTER_API_KEY:-} - LLM_PROVIDER_OPENROUTER_MODELS=${LLM_PROVIDER_OPENROUTER_MODELS:-openrouter/anthropic/claude-fable-5.1} - LLM_FAST_MODEL=${LLM_FAST_MODEL:-deepseek-v4.1-flash} - LLM_COMPACT_MODEL=${LLM_COMPACT_MODEL:-deepseek-flash} - LLM_COMPACT_LLM_ENABLED=${LLM_COMPACT_LLM_ENABLED:-true} - LLM_COMPACT_PROVIDER=${LLM_COMPACT_PROVIDER:-deepseek} - LLM_COMPACT_THINKING_MODE=${LLM_COMPACT_THINKING_MODE:-max} - LLM_COMPACT_MAX_COMPLETION_TOKENS=${LLM_COMPACT_MAX_COMPLETION_TOKENS:-8192} - LLM_COMPACT_MAX_SUMMARY_TOKENS=${LLM_COMPACT_MAX_SUMMARY_TOKENS:-4096} - LLM_COMPACT_TIMEOUT_MS=${LLM_COMPACT_TIMEOUT_MS:-90000} - LLM_VISION_FALLBACK_MODEL=${LLM_VISION_FALLBACK_MODEL:-deepseek-v4.1-flash} - ASR_CORRECTIONS=${ASR_CORRECTIONS:-zhikuncode:zhi kun code,zkun code,智坤code,志鲲Code,智kuncode,zhi坤code} # ---- Legacy Single-Provider (Backward Compatible) ---- - LLM_API_KEY=${LLM_API_KEY:-} - LLM_BASE_URL=${LLM_BASE_URL:-https://dashscope.aliyuncs.com/compatible-mode/v1} - LLM_DEFAULT_MODEL=${LLM_DEFAULT_MODEL:-deepseek-v4.1-flash} - LLM_MODELS=${LLM_MODELS:-} # ---- Web Search ---- - WEB_SEARCH_BACKEND=${WEB_SEARCH_BACKEND:-auto} - WEB_SEARCH_DEEPSEEK_API_KEY=${WEB_SEARCH_DEEPSEEK_API_KEY:-} - WEB_SEARCH_DEEPSEEK_BASE_URL=${WEB_SEARCH_DEEPSEEK_BASE_URL:-https://api.deepseek.com} # ---- External MCP servers ---- - ZHIKUN_MCP_SERVERS=${ZHIKUN_MCP_SERVERS:-} # Delete-session confirmation code (empty = no code required) - ZHIKUN_DELETE_CONFIRM_CODE=${ZHIKUN_DELETE_CONFIRM_CODE:-} - CONTEXT7_API_KEY=${CONTEXT7_API_KEY:-} - GITHUB_TOOLS=${GITHUB_TOOLS:-get_me,get_file_contents,search_code,list_branches,list_commits,list_pull_requests,pull_request_read} - GITHUB_READ_ONLY=${GITHUB_READ_ONLY:-1} - GITHUB_LOCKDOWN_MODE=${GITHUB_LOCKDOWN_MODE:-1} - ALIBABA_CLOUD_ACCESS_KEY_ID=${ALIBABA_CLOUD_ACCESS_KEY_ID:-} - ALIBABA_CLOUD_ACCESS_KEY_SECRET=${ALIBABA_CLOUD_ACCESS_KEY_SECRET:-} - ALIBABA_CLOUD_SECURITY_TOKEN=${ALIBABA_CLOUD_SECURITY_TOKEN:-} - ALIBABA_CLOUD_OPS_VISIBLE_TOOLS=${ALIBABA_CLOUD_OPS_VISIBLE_TOOLS:-ECS_DescribeInstances,ECS_DescribeRegions,ECS_DescribeSecurityGroups,OSS_ListBuckets,OSS_ListObjects} # ---- Optional (Docker Advanced) — has Dockerfile defaults, override if needed ---- # Private network access: allows Docker bridge network IPs to bypass auth # - ALLOW_PRIVATE_NETWORK=${ALLOW_PRIVATE_NETWORK:-true} # Container log directory # - LOG_DIR=${LOG_DIR:-/app/log} # MCP capability registry path # - MCP_REGISTRY_PATH=${MCP_REGISTRY_PATH:-/app/configuration/mcp/mcp_capability_registry.json} # Persist user MCP enable/disable choices in the existing data volume. - MCP_SERVICE_STATE_PATH=/app/data/mcp-service-states.json # Persist backend-wide Skill choices in the same data volume. - SKILL_STATE_PATH=/app/data/skill-states.json # ---- Internal ---- - SPRING_WEB_RESOURCES_STATIC_LOCATIONS=classpath:/static/,file:/app/static/ - ZHIKUN_DEFAULT_WORKSPACE=/app/workspace - ZHIKUN_WORKSPACE_ALLOWED_ROOTS=/app/workspace - ZHIKUN_GLOBAL_DB_PATH=/app/data/global.db - ZHIKUNCODE_DATABASE_PROJECT_ROOT=/app/data # ---- Optional Meoo publishing (credentials file is read by the backend only) ---- - ZHIKUN_MEOO_ENABLED=${ZHIKUN_MEOO_ENABLED:-false} - ZHIKUN_MEOO_CREDENTIALS_FILE=${ZHIKUN_MEOO_CREDENTIALS_FILE:-/run/secrets/meoo-credentials.json} - ZHIKUN_MEOO_TIMEOUT_SECONDS=${ZHIKUN_MEOO_TIMEOUT_SECONDS:-1200} # ---- Optional OSS publishing + clipboard image paste (disabled by default) ---- # auto prefers local ALIBABA_CLOUD_* credentials, then a named ECS RAM Role. - ZHIKUN_OSS_ENABLED=${ZHIKUN_OSS_ENABLED:-false} - ZHIKUN_OSS_ENDPOINT=${ZHIKUN_OSS_ENDPOINT:-} - ZHIKUN_OSS_REGION=${ZHIKUN_OSS_REGION:-} - ZHIKUN_OSS_BUCKET=${ZHIKUN_OSS_BUCKET:-} - ZHIKUN_OSS_PUBLIC_BASE_URL=${ZHIKUN_OSS_PUBLIC_BASE_URL:-} - ZHIKUN_OSS_PREVIEW_ENABLED=${ZHIKUN_OSS_PREVIEW_ENABLED:-false} - ZHIKUN_OSS_PREFIX=${ZHIKUN_OSS_PREFIX:-zhikuncode-artifacts} - ZHIKUN_OSS_ECS_ROLE_NAME=${ZHIKUN_OSS_ECS_ROLE_NAME:-} - ZHIKUN_OSS_CREDENTIAL_MODE=${ZHIKUN_OSS_CREDENTIAL_MODE:-auto} - ZHIKUN_OSS_MAX_FILE_BYTES=${ZHIKUN_OSS_MAX_FILE_BYTES:-1073741824} - ZHIKUN_OSS_CONNECT_TIMEOUT_MS=${ZHIKUN_OSS_CONNECT_TIMEOUT_MS:-10000} - ZHIKUN_OSS_REQUEST_TIMEOUT_MS=${ZHIKUN_OSS_REQUEST_TIMEOUT_MS:-120000} - ALIBABA_CLOUD_ACCESS_KEY_ID=${ALIBABA_CLOUD_ACCESS_KEY_ID:-} - ALIBABA_CLOUD_ACCESS_KEY_SECRET=${ALIBABA_CLOUD_ACCESS_KEY_SECRET:-} - ALIBABA_CLOUD_SECURITY_TOKEN=${ALIBABA_CLOUD_SECURITY_TOKEN:-} volumes: # Persistent data (SQLite DB, session data, memories) - zhikun-data:/app/data # Personal memory (MEMORY.md); container HOME is /app, so it lives outside /app/data - zhikun-memory:/app/.ai-code-assistant # User workspace mount (the code project to work on) - ${WORKSPACE_PATH:-./workspace}:/app/workspace # When enabling Meoo, add a read-only secret mount in a compose override: # - /absolute/private/meoo-credentials.json:/run/secrets/meoo-credentials.json:ro # Optional: persist logs to host # - ./logs:/app/log healthcheck: test: ["CMD", "curl", "-sf", "http://localhost:8080/actuator/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s restart: unless-stopped # Resource limits (adjust based on your server) deploy: resources: limits: memory: 4g reservations: memory: 1g volumes: zhikun-data: driver: local zhikun-memory: driver: local