name: teamdocs x-logging: &default-logging driver: json-file options: max-size: "10m" max-file: "3" services: mysql: image: mysql:8.4 command: - --ngram-token-size=2 - --innodb-ft-enable-stopword=OFF - --character-set-server=utf8mb4 - --collation-server=utf8mb4_0900_ai_ci environment: TZ: Asia/Shanghai MYSQL_DATABASE: ${DB_NAME:-teamdocs} MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required} volumes: - mysql_data:/var/lib/mysql - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p\"$${MYSQL_ROOT_PASSWORD}\" --silent"] interval: 10s timeout: 5s retries: 12 start_period: 30s logging: *default-logging restart: unless-stopped redis: image: redis:7.0-alpine command: ["redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD:?REDIS_PASSWORD is required}"] environment: REDIS_PASSWORD: ${REDIS_PASSWORD:?REDIS_PASSWORD is required} volumes: - redis_data:/data healthcheck: test: ["CMD-SHELL", "redis-cli --no-auth-warning -a \"$${REDIS_PASSWORD}\" ping | grep PONG"] interval: 10s timeout: 5s retries: 12 logging: *default-logging restart: unless-stopped minio: image: ghcr.io/git-creat7/teamdocs/minio@sha256:648817f3b321ec7a2f86c594ba468fa19eff8ee3ac17a07c03acf7a8a35fda33 command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-teamdocsadmin} MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:?MINIO_SECRET_KEY is required} MINIO_REGION_NAME: ${MINIO_REGION:-us-east-1} MINIO_API_CORS_ALLOW_ORIGIN: ${MINIO_CORS_ALLOWED_ORIGIN:?MINIO_CORS_ALLOWED_ORIGIN is required} ports: - "127.0.0.1:${MINIO_API_PORT:-29000}:9000" - "127.0.0.1:${MINIO_CONSOLE_PORT:-29001}:9001" volumes: - minio_data:/data logging: *default-logging restart: unless-stopped minio-init: image: ${MINIO_MC_IMAGE:-ghcr.io/git-creat7/teamdocs/mc@sha256:eb4ea9884b77704230e2423e9004d2fa738dc272876b9cc41a297d29443b8780} depends_on: minio: condition: service_started environment: MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-teamdocsadmin} MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:?MINIO_SECRET_KEY is required} MINIO_BUCKET_PUBLIC: ${MINIO_BUCKET_PUBLIC:-teamdocs-public} MINIO_BUCKET_PRIVATE: ${MINIO_BUCKET_PRIVATE:-teamdocs-private} entrypoint: - /bin/sh - -c - | set -eu attempt=1 max_attempts=60 until mc alias set local http://minio:9000 "$${MINIO_ROOT_USER}" "$${MINIO_ROOT_PASSWORD}"; do if [ "$${attempt}" -ge "$${max_attempts}" ]; then echo "MinIO 在 $${max_attempts} 次重试后仍未就绪" >&2 exit 1 fi attempt=$$((attempt + 1)) sleep 2 done mc mb --ignore-existing "local/$${MINIO_BUCKET_PUBLIC}" mc mb --ignore-existing "local/$${MINIO_BUCKET_PRIVATE}" mc anonymous set download "local/$${MINIO_BUCKET_PUBLIC}" logging: *default-logging restart: "no" elasticsearch: image: ${IMAGE_REPOSITORY:-ghcr.io/git-creat7/teamdocs}/elasticsearch:${IMAGE_TAG:?IMAGE_TAG must be a published commit SHA} environment: discovery.type: single-node xpack.security.enabled: "false" ES_JAVA_OPTS: "-Xms512m -Xmx512m" mem_limit: 1536m volumes: - elasticsearch_data:/usr/share/elasticsearch/data healthcheck: test: ["CMD", "curl", "--fail", "--silent", "http://localhost:9200/_cluster/health?wait_for_status=yellow&timeout=5s"] interval: 15s timeout: 10s retries: 12 start_period: 60s logging: *default-logging restart: unless-stopped backend: image: ${IMAGE_REPOSITORY:-ghcr.io/git-creat7/teamdocs}/backend:${IMAGE_TAG:?IMAGE_TAG must be a published commit SHA} depends_on: mysql: condition: service_healthy redis: condition: service_healthy minio-init: condition: service_completed_successfully environment: TZ: Asia/Shanghai DB_HOST: mysql DB_PORT: 3306 DB_NAME: ${DB_NAME:-teamdocs} DB_USERNAME: root DB_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required} REDIS_HOST: redis REDIS_PORT: 6379 REDIS_PASSWORD: ${REDIS_PASSWORD:?REDIS_PASSWORD is required} JWT_SECRET: ${JWT_SECRET:?JWT_SECRET is required} MINIO_ENDPOINT: http://minio:9000 MINIO_PUBLIC_ENDPOINT: ${MINIO_PUBLIC_ENDPOINT:?MINIO_PUBLIC_ENDPOINT is required} MINIO_REGION: ${MINIO_REGION:-us-east-1} MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-teamdocsadmin} MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:?MINIO_SECRET_KEY is required} MINIO_BUCKET_PUBLIC: ${MINIO_BUCKET_PUBLIC:-teamdocs-public} MINIO_BUCKET_PRIVATE: ${MINIO_BUCKET_PRIVATE:-teamdocs-private} MODEL_CONFIG_ENCRYPTION_KEY: ${MODEL_CONFIG_ENCRYPTION_KEY:-} AGENT_PROXY_URL: ${AGENT_PROXY_URL:-} AGENT_BASE_URL: ${AGENT_BASE_URL:-} AGENT_API_KEY: ${AGENT_API_KEY:-} AGENT_MODEL_NAME: ${AGENT_MODEL_NAME:-} AGENT_MAX_INPUT_TOKENS: ${AGENT_MAX_INPUT_TOKENS:-0} MCP_STEP_URL: ${MCP_STEP_URL:-} MCP_STEP_API_KEY: ${MCP_STEP_API_KEY:-} EMBEDDING_BASE_URL: ${EMBEDDING_BASE_URL:-} EMBEDDING_API_KEY: ${EMBEDDING_API_KEY:-} EMBEDDING_MODEL: ${EMBEDDING_MODEL:-} EMBEDDING_DIMENSIONS: ${EMBEDDING_DIMENSIONS:-1024} RERANK_BASE_URL: ${RERANK_BASE_URL:-} RERANK_API_KEY: ${RERANK_API_KEY:-} RERANK_MODEL: ${RERANK_MODEL:-} VISION_BASE_URL: ${VISION_BASE_URL:-} VISION_API_KEY: ${VISION_API_KEY:-} VISION_MODEL: ${VISION_MODEL:-} VISION_TIMEOUT_SECONDS: ${VISION_TIMEOUT_SECONDS:-20} VISION_MAX_IMAGES: ${VISION_MAX_IMAGES:-8} VISION_MAX_IMAGE_BYTES: ${VISION_MAX_IMAGE_BYTES:-2097152} VISION_MAX_PIXELS: ${VISION_MAX_PIXELS:-16000000} VISION_MAX_DIMENSION: ${VISION_MAX_DIMENSION:-1600} VISION_MAX_OUTPUT_TOKENS: ${VISION_MAX_OUTPUT_TOKENS:-4096} MILVUS_URL: http://milvus:19530 MILVUS_TOKEN: ${MILVUS_TOKEN:-} MILVUS_COLLECTION: ${MILVUS_COLLECTION:-teamdocs_qwen3_8b_d1024_v1} ES_ENABLED: ${ES_ENABLED:-true} ES_URL: http://elasticsearch:9200 ES_INDEX: ${ES_INDEX:-teamdocs-chunks} PARSE_ENABLED: ${PARSE_ENABLED:-true} ports: - "127.0.0.1:${BACKEND_PORT:-8080}:8080" healthcheck: test: ["CMD", "curl", "--fail", "--silent", "--show-error", "http://127.0.0.1:8080/actuator/health"] interval: 10s timeout: 5s retries: 12 start_period: 30s logging: *default-logging restart: unless-stopped frontend: image: ${IMAGE_REPOSITORY:-ghcr.io/git-creat7/teamdocs}/frontend:${IMAGE_TAG:?IMAGE_TAG must be a published commit SHA} depends_on: backend: condition: service_healthy ports: - "${WEB_PORT:-15173}:80" healthcheck: test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1/healthz"] interval: 10s timeout: 5s retries: 12 start_period: 10s logging: *default-logging restart: unless-stopped volumes: elasticsearch_data: mysql_data: redis_data: minio_data: