Files
2026-07-26 20:20:37 +08:00

251 lines
9.1 KiB
YAML

name: k1412-agent
services:
web:
build:
context: .
dockerfile: docker/web.Dockerfile
image: ${WEB_IMAGE:-k1412-agent-web:dev}
restart: unless-stopped
ports:
- "${WEB_PORT:-3000}:8080"
environment:
WEBUI_URL: ${WEBUI_URL:-http://localhost:3000}
WEBUI_NAME: K1412 Agent
K1412_REMOVE_UPSTREAM_BRANDING: ${K1412_REMOVE_UPSTREAM_BRANDING:-false}
WEBUI_FAVICON_URL: /static/favicon.png
CORS_ALLOW_ORIGIN: ${CORS_ALLOW_ORIGIN:-http://localhost:3000}
WEBUI_AUTH: "true"
WEBUI_SECRET_KEY: ${WEBUI_SECRET_KEY:?WEBUI_SECRET_KEY is required}
WEBUI_ADMIN_EMAIL: ${WEBUI_ADMIN_EMAIL:?WEBUI_ADMIN_EMAIL is required}
WEBUI_ADMIN_PASSWORD: ${WEBUI_ADMIN_PASSWORD:?WEBUI_ADMIN_PASSWORD is required}
WEBUI_ADMIN_NAME: Administrator
WEBUI_SESSION_COOKIE_SAME_SITE: lax
WEBUI_SESSION_COOKIE_SECURE: ${WEBUI_COOKIE_SECURE:-false}
WEBUI_AUTH_COOKIE_SAME_SITE: lax
WEBUI_AUTH_COOKIE_SECURE: ${WEBUI_COOKIE_SECURE:-false}
JWT_EXPIRES_IN: 7d
ENABLE_SIGNUP: "true"
DEFAULT_USER_ROLE: pending
ENABLE_SIGNUP_PASSWORD_CONFIRMATION: "true"
ENABLE_FORWARD_USER_INFO_HEADERS: "true"
FORWARD_USER_INFO_HEADER_JWT_SECRET: ${OPENWEBUI_FORWARD_JWT_SECRET:?OPENWEBUI_FORWARD_JWT_SECRET is required}
FORWARD_USER_INFO_HEADER_JWT_EXPIRES_SECONDS: "300"
K1412_GATEWAY_URL: http://gateway:8001
K1412_GATEWAY_KEY: ${INTERNAL_GATEWAY_KEY:?INTERNAL_GATEWAY_KEY is required}
OPENAI_API_BASE_URL: http://runtime:8000/v1
OPENAI_API_KEY: ${INTERNAL_PROVIDER_KEY:?INTERNAL_PROVIDER_KEY is required}
DEFAULT_MODELS: terra
TASK_MODEL: luna
ENABLE_TITLE_GENERATION: "false"
ENABLE_FOLLOW_UP_GENERATION: "false"
ENABLE_TAGS_GENERATION: "false"
ENABLE_SEARCH_QUERY_GENERATION: "false"
ENABLE_RETRIEVAL_QUERY_GENERATION: "false"
ENABLE_AUTOCOMPLETE_GENERATION: "false"
ENABLE_IMAGE_PROMPT_GENERATION: "false"
ENABLE_OLLAMA_API: "false"
ENABLE_DIRECT_CONNECTIONS: "false"
ENABLE_PERSISTENT_CONFIG: "false"
ENABLE_VERSION_UPDATE_CHECK: "false"
SAFE_MODE: "true"
ENABLE_COMMUNITY_SHARING: "false"
ENABLE_WEB_SEARCH: "false"
ENABLE_IMAGE_GENERATION: "false"
ENABLE_CODE_EXECUTION: "false"
ENABLE_CODE_INTERPRETER: "false"
ENABLE_MEMORIES: "false"
ENABLE_NOTES: "false"
ENABLE_CHANNELS: "false"
ENABLE_CALENDAR: "false"
ENABLE_AUTOMATIONS: "false"
ENABLE_EVALUATION_ARENA_MODELS: "false"
ENABLE_USER_STATUS: "false"
RAG_EMBEDDING_ENGINE: openai
RAG_EMBEDDING_MODEL: disabled
RAG_OPENAI_API_BASE_URL: http://runtime:8000/v1
RAG_OPENAI_API_KEY: ${INTERNAL_PROVIDER_KEY:?INTERNAL_PROVIDER_KEY is required}
RAG_EMBEDDING_MODEL_AUTO_UPDATE: "false"
RAG_RERANKING_MODEL_AUTO_UPDATE: "false"
ENABLE_RAG_HYBRID_SEARCH: "false"
BYPASS_EMBEDDING_AND_RETRIEVAL: "true"
VECTOR_DB: disabled
STORAGE_PROVIDER: local
USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS: "false"
USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS: "false"
USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS: "false"
USER_PERMISSIONS_WORKSPACE_TOOLS_ACCESS: "false"
USER_PERMISSIONS_WORKSPACE_SKILLS_ACCESS: "false"
USER_PERMISSIONS_CHAT_CONTROLS: "false"
USER_PERMISSIONS_CHAT_VALVES: "false"
USER_PERMISSIONS_CHAT_SYSTEM_PROMPT: "false"
USER_PERMISSIONS_CHAT_PARAMS: "false"
USER_PERMISSIONS_CHAT_MULTIPLE_MODELS: "false"
USER_PERMISSIONS_CHAT_SHARE: "false"
USER_PERMISSIONS_CHAT_ALLOW_PUBLIC_SHARING: "false"
USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS: "false"
USER_PERMISSIONS_FEATURES_WEB_SEARCH: "false"
USER_PERMISSIONS_FEATURES_IMAGE_GENERATION: "false"
USER_PERMISSIONS_FEATURES_CODE_INTERPRETER: "false"
USER_PERMISSIONS_FEATURES_API_KEYS: "false"
USER_PERMISSIONS_FEATURES_MEMORIES: "false"
USER_PERMISSIONS_FEATURES_AUTOMATIONS: "false"
USER_PERMISSIONS_FEATURES_CHANNELS: "false"
USER_PERMISSIONS_FEATURES_CALENDAR: "false"
USER_PERMISSIONS_FEATURES_NOTES: "false"
USER_PERMISSIONS_SETTINGS_INTERFACE: "false"
DATABASE_URL: postgresql+psycopg://${POSTGRES_USER:-agent}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@postgres:5432/${POSTGRES_DB:-agent}
REDIS_URL: redis://redis:6379/0
volumes:
- openwebui-data:/app/backend/data
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
runtime:
condition: service_healthy
networks:
- internal
- public
healthcheck:
test: ["CMD", "curl", "--silent", "--fail", "http://127.0.0.1:8080/health"]
interval: 15s
timeout: 5s
retries: 20
runtime:
build:
context: .
dockerfile: docker/runtime.Dockerfile
image: ${RUNTIME_IMAGE:-k1412-agent-runtime:dev}
restart: unless-stopped
environment:
MODEL_API_BASE_URL: ${MODEL_API_BASE_URL:-https://api.k1412.top}
MODEL_API_KEY: ${MODEL_API_KEY:?MODEL_API_KEY is required}
DEEPSEEK_API_BASE_URL: ${DEEPSEEK_API_BASE_URL:-https://api.deepseek.com}
DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:?DEEPSEEK_API_KEY is required}
OPENWEBUI_FORWARD_JWT_SECRET: ${OPENWEBUI_FORWARD_JWT_SECRET:?OPENWEBUI_FORWARD_JWT_SECRET is required}
INTERNAL_PROVIDER_KEY: ${INTERNAL_PROVIDER_KEY:?INTERNAL_PROVIDER_KEY is required}
INTERNAL_GATEWAY_KEY: ${INTERNAL_GATEWAY_KEY:?INTERNAL_GATEWAY_KEY is required}
DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-agent}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@postgres:5432/${POSTGRES_DB:-agent}
GATEWAY_URL: http://gateway:8001
TOOL_TIMEOUT_SECONDS: ${TOOL_TIMEOUT_SECONDS:-900}
depends_on:
postgres:
condition: service_healthy
gateway:
condition: service_healthy
networks:
- internal
- egress
read_only: true
tmpfs:
- /tmp:rw,noexec,nosuid,size=128m
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
gateway:
build:
context: .
dockerfile: docker/gateway.Dockerfile
image: ${GATEWAY_IMAGE:-k1412-agent-gateway:dev}
restart: unless-stopped
environment:
OPENWEBUI_FORWARD_JWT_SECRET: ${OPENWEBUI_FORWARD_JWT_SECRET:?OPENWEBUI_FORWARD_JWT_SECRET is required}
INTERNAL_GATEWAY_KEY: ${INTERNAL_GATEWAY_KEY:?INTERNAL_GATEWAY_KEY is required}
EXECUTION_PROVIDER: ${EXECUTION_PROVIDER:-local-docker}
WORKSPACE_IMAGE: ${WORKSPACE_IMAGE:-k1412-agent-workspace:dev}
WORKSPACE_NETWORK_ENABLED: ${WORKSPACE_NETWORK_ENABLED:-true}
WORKSPACE_MEMORY_LIMIT: ${WORKSPACE_MEMORY_LIMIT:-2g}
WORKSPACE_CPU_LIMIT: ${WORKSPACE_CPU_LIMIT:-2}
WORKSPACE_PIDS_LIMIT: ${WORKSPACE_PIDS_LIMIT:-512}
WORKSPACE_SSH_HOST: ${WORKSPACE_SSH_HOST:-}
WORKSPACE_DOWNLOAD_MAX_BYTES: ${WORKSPACE_DOWNLOAD_MAX_BYTES:-134217728}
TOOL_TIMEOUT_SECONDS: ${TOOL_TIMEOUT_SECONDS:-900}
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- internal
- egress
read_only: true
tmpfs:
- /tmp:rw,noexec,nosuid,size=128m
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
bootstrap:
build:
context: .
dockerfile: docker/runtime.Dockerfile
image: ${RUNTIME_IMAGE:-k1412-agent-runtime:dev}
restart: "no"
command: ["python", "-m", "agent_platform.bootstrap"]
environment:
OPENWEBUI_INTERNAL_URL: http://web:8080
WEBUI_ADMIN_EMAIL: ${WEBUI_ADMIN_EMAIL:?WEBUI_ADMIN_EMAIL is required}
WEBUI_ADMIN_PASSWORD: ${WEBUI_ADMIN_PASSWORD:?WEBUI_ADMIN_PASSWORD is required}
INTERNAL_GATEWAY_KEY: ${INTERNAL_GATEWAY_KEY:?INTERNAL_GATEWAY_KEY is required}
GATEWAY_URL: http://gateway:8001
depends_on:
web:
condition: service_healthy
gateway:
condition: service_healthy
networks:
- internal
postgres:
image: postgres:17-alpine@sha256:742f40ea20b9ff2ff31db5458d127452988a2164df9e17441e191f3b72252193
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-agent}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
POSTGRES_DB: ${POSTGRES_DB:-agent}
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- internal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-agent} -d ${POSTGRES_DB:-agent}"]
interval: 5s
timeout: 5s
retries: 20
redis:
image: redis:8-alpine@sha256:8096655e437712b07503796fb64d81359256cfcff0ab29d95a7da72863786efb
restart: unless-stopped
command: ["redis-server", "--save", "60", "1", "--appendonly", "yes"]
volumes:
- redis-data:/data
networks:
- internal
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 20
workspace-image:
build:
context: .
dockerfile: docker/workspace.Dockerfile
image: ${WORKSPACE_IMAGE:-k1412-agent-workspace:dev}
command: ["true"]
profiles: ["build-only"]
networks:
public:
egress:
internal:
internal: true
volumes:
openwebui-data:
postgres-data:
redis-data: