name: ${COMPOSE_PROJECT_NAME:-affiliate_dash} services: postgres: image: ${POSTGRES_IMAGE:-docker.m.daocloud.io/library/postgres:16-alpine} environment: - POSTGRES_USER=${POSTGRES_USER:-affiliate} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-affiliate_dev_password} - POSTGRES_DB=${POSTGRES_DB:-affiliate_dash} - TZ=${TZ:-Asia/Shanghai} - PGTZ=${TZ:-Asia/Shanghai} command: ["postgres", "-c", "timezone=${TZ:-Asia/Shanghai}"] ports: - "${POSTGRES_PORT:-15432}:5432" volumes: - postgres-data:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 backend: build: context: . dockerfile: Dockerfile.backend args: GO_BUILDER_IMAGE: ${GO_BUILDER_IMAGE:-docker.m.daocloud.io/library/golang:1.26-alpine} BACKEND_RUNTIME_IMAGE: ${BACKEND_RUNTIME_IMAGE:-docker.m.daocloud.io/library/alpine:3.22} GOPROXY: ${GOPROXY:-https://goproxy.cn,direct} GOSUMDB: ${GOSUMDB:-sum.golang.google.cn} ALPINE_MIRROR: ${ALPINE_MIRROR:-https://mirrors.aliyun.com/alpine} image: affiliate-backend:latest # 以宿主用户身份运行,日志文件归属正确(宿主机 logs 目录需预先 chown) user: "${HOST_UID:-1000}:${HOST_GID:-1000}" ports: - "${BACKEND_PORT:-18080}:8080" environment: - PORT=8080 - TZ=${TZ:-Asia/Shanghai} - JWT_SECRET=${JWT_SECRET} - "DATABASE_URL=${DOCKER_DATABASE_URL:-postgres://${POSTGRES_USER:-affiliate}:${POSTGRES_PASSWORD:-affiliate_dev_password}@postgres:5432/${POSTGRES_DB:-affiliate_dash}?sslmode=disable&TimeZone=${TZ:-Asia/Shanghai}}" - GIN_MODE=${GIN_MODE:-release} - CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS:-} - OPEN_API_KEY=${OPEN_API_KEY} - OPEN_API_SECRET=${OPEN_API_SECRET} - OPEN_SIGN_SKEW=${OPEN_SIGN_SKEW:-300} - OPEN_API_DEBUG=${OPEN_API_DEBUG:-false} - LOG_FILE=${LOG_FILE:-logs/app.log} - LOG_RETAIN_DAYS=${LOG_RETAIN_DAYS:-30} - DELIVERY_BASE_URL=${DELIVERY_BASE_URL:-} - DELIVERY_BFF_BASE_URL=${DELIVERY_BFF_BASE_URL:-https://www.jxya.top/bff} - DELIVERY_CHANNEL=${DELIVERY_CHANNEL:-dlc} - DELIVERY_LINK_SECRET=${DELIVERY_LINK_SECRET:-} - DELIVERY_LINK_TTL_MINUTES=${DELIVERY_LINK_TTL_MINUTES:-120} - FULFILLMENT_PROCESSING_TIMEOUT_MINUTES=${FULFILLMENT_PROCESSING_TIMEOUT_MINUTES:-30} - FULFILLMENT_TIMEOUT_SCAN_INTERVAL_SECONDS=${FULFILLMENT_TIMEOUT_SCAN_INTERVAL_SECONDS:-60} - CALLBACK_MAX_ATTEMPTS=${CALLBACK_MAX_ATTEMPTS:-16} - CALLBACK_PUSH_TIMEOUT_SECONDS=${CALLBACK_PUSH_TIMEOUT_SECONDS:-15} - CALLBACK_RETRY_SCHEDULE=${CALLBACK_RETRY_SCHEDULE:-} volumes: - ./logs:/app/logs - ./data:/app/data restart: unless-stopped healthcheck: test: ["CMD", "curl", "-fsS", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 depends_on: postgres: condition: service_healthy caddy: build: context: . dockerfile: Dockerfile.caddy args: NODE_BUILDER_IMAGE: ${NODE_BUILDER_IMAGE:-docker.m.daocloud.io/library/node:22-alpine} CADDY_BASE_IMAGE: ${CADDY_BASE_IMAGE:-docker.m.daocloud.io/library/caddy:2-alpine} NPM_REGISTRY: ${NPM_REGISTRY:-https://registry.npmmirror.com} ALPINE_MIRROR: ${ALPINE_MIRROR:-https://mirrors.aliyun.com/alpine} image: affiliate-caddy:latest ports: - "${HTTP_PORT:-80}:80" - "${HTTPS_PORT:-443}:443" environment: - TZ=${TZ:-Asia/Shanghai} volumes: - caddy-data:/data - caddy-config:/config depends_on: backend: condition: service_healthy restart: unless-stopped volumes: postgres-data: name: ${POSTGRES_DATA_VOLUME:-affiliate_dash_postgres_data} caddy-data: caddy-config: