Files
wyndham-ARR/compose.yaml
2026-07-29 16:38:05 +08:00

143 lines
4.6 KiB
YAML

name: wyndham-arr
services:
web:
build:
context: .
image: "${ARR_IMAGE_NAME:-wyndham-arr}:${ARR_IMAGE_TAG:-latest}"
restart: unless-stopped
init: true
command:
- python
- -m
- arr_web.run
- --host
- 0.0.0.0
- --port
- "8765"
- --enable-processing
- --secure-cookies
environment:
ARR_DATABASE_URL: "${ARR_DATABASE_URL:?set ARR_DATABASE_URL in deploy/.env.production}"
ARR_OBJECT_PREFIX: "${ARR_OBJECT_PREFIX:-arr}"
ARR_OSS_REGION: "${ARR_OSS_REGION:?set ARR_OSS_REGION}"
ARR_OSS_ENDPOINT: "${ARR_OSS_ENDPOINT:-}"
ARR_OSS_BUCKET: "${ARR_OSS_BUCKET:?set ARR_OSS_BUCKET}"
OSS_ACCESS_KEY_ID: "${OSS_ACCESS_KEY_ID:?set OSS_ACCESS_KEY_ID or adapt Compose for a RAM role}"
OSS_ACCESS_KEY_SECRET: "${OSS_ACCESS_KEY_SECRET:?set OSS_ACCESS_KEY_SECRET or adapt Compose for a RAM role}"
OSS_SESSION_TOKEN: "${OSS_SESSION_TOKEN:-}"
DEERFLOW_BASE_URL: "${DEERFLOW_BASE_URL:?set DEERFLOW_BASE_URL}"
DEERFLOW_OPEN_API_KEY: "${DEERFLOW_OPEN_API_KEY:?set DEERFLOW_OPEN_API_KEY}"
DEERFLOW_AUTH_MODE: "${DEERFLOW_AUTH_MODE:-bearer}"
DEERFLOW_TIMEOUT_SECONDS: "${DEERFLOW_TIMEOUT_SECONDS:-60}"
DEERFLOW_CONNECT_TIMEOUT_SECONDS: "${DEERFLOW_CONNECT_TIMEOUT_SECONDS:-10}"
DEERFLOW_SESSION_DB: /app/runtime/agent_sessions.sqlite3
ARR_AGENT_RESULT_HMAC_KEY_ID: "${ARR_AGENT_RESULT_HMAC_KEY_ID:?set ARR_AGENT_RESULT_HMAC_KEY_ID}"
ARR_AGENT_RESULT_HMAC_KEY_B64: "${ARR_AGENT_RESULT_HMAC_KEY_B64:?set ARR_AGENT_RESULT_HMAC_KEY_B64}"
ARR_AGENT_RESULT_MAX_AGE_SECONDS: "${ARR_AGENT_RESULT_MAX_AGE_SECONDS:-600}"
expose:
- "8765"
volumes:
- arr_runtime:/app/runtime
- arr_outputs:/app/outputs
tmpfs:
- /tmp:size=64m,mode=1777
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
healthcheck:
test:
- CMD
- python
- -c
- >-
import json,sys,urllib.request;
data=json.load(urllib.request.urlopen('http://127.0.0.1:8765/api/health',timeout=5))['data'];
sys.exit(0 if data.get('database_ready') and data.get('processing_ready') else 1)
interval: 15s
timeout: 6s
retries: 12
start_period: 20s
mcp:
image: "${ARR_IMAGE_NAME:-wyndham-arr}:${ARR_IMAGE_TAG:-latest}"
restart: unless-stopped
init: true
command:
- python
- -m
- arr_mcp.run
- --host
- 0.0.0.0
- --port
- "8890"
- --max-concurrency
- "${ARR_MCP_MAX_CONCURRENCY:-2}"
- --allowed-host
- "${MCP_PUBLIC_HOST:?set MCP_PUBLIC_HOST}"
- --allowed-host
- "${MCP_PUBLIC_HOST}:*"
environment:
ARR_DATABASE_URL: "${ARR_DATABASE_URL:?set ARR_DATABASE_URL in deploy/.env.production}"
ARR_OBJECT_PREFIX: "${ARR_OBJECT_PREFIX:-arr}"
ARR_OSS_REGION: "${ARR_OSS_REGION:?set ARR_OSS_REGION}"
ARR_OSS_ENDPOINT: "${ARR_OSS_ENDPOINT:-}"
ARR_OSS_BUCKET: "${ARR_OSS_BUCKET:?set ARR_OSS_BUCKET}"
OSS_ACCESS_KEY_ID: "${OSS_ACCESS_KEY_ID:?set OSS_ACCESS_KEY_ID or adapt Compose for a RAM role}"
OSS_ACCESS_KEY_SECRET: "${OSS_ACCESS_KEY_SECRET:?set OSS_ACCESS_KEY_SECRET or adapt Compose for a RAM role}"
OSS_SESSION_TOKEN: "${OSS_SESSION_TOKEN:-}"
ARR_MCP_BEARER_TOKEN: "${ARR_MCP_BEARER_TOKEN:?set ARR_MCP_BEARER_TOKEN}"
expose:
- "8890"
tmpfs:
- /tmp:size=64m,mode=1777
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
healthcheck:
test:
- CMD
- python
- -c
- >-
import socket;
connection=socket.create_connection(('127.0.0.1',8890),5);
connection.close()
interval: 15s
timeout: 6s
retries: 12
start_period: 20s
caddy:
image: caddy:2.10-alpine
restart: unless-stopped
depends_on:
web:
condition: service_healthy
mcp:
condition: service_healthy
environment:
WEB_PUBLIC_HOST: "${WEB_PUBLIC_HOST:?set WEB_PUBLIC_HOST}"
MCP_PUBLIC_HOST: "${MCP_PUBLIC_HOST:?set MCP_PUBLIC_HOST}"
ACME_EMAIL: "${ACME_EMAIL:?set ACME_EMAIL}"
WEB_BASIC_AUTH_USER: "${WEB_BASIC_AUTH_USER:?set WEB_BASIC_AUTH_USER}"
WEB_BASIC_AUTH_PASSWORD_HASH: "${WEB_BASIC_AUTH_PASSWORD_HASH:?set WEB_BASIC_AUTH_PASSWORD_HASH}"
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
security_opt:
- no-new-privileges:true
volumes:
arr_runtime:
arr_outputs:
caddy_data:
caddy_config: