services: config-render: image: alpine:3.20 environment: DOMAIN: ${DOMAIN} ACME_EMAIL: ${ACME_EMAIL} LISTEN_PORT: ${LISTEN_PORT} USER1_PASSWORD: ${USER1_PASSWORD} CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN} ANYTLS_DOMAIN: ${ANYTLS_DOMAIN} ANYTLS_HY2_PORT: ${ANYTLS_HY2_PORT} ANYTLS_PASSWORD: ${ANYTLS_PASSWORD} HY2_PASSWORD: ${HY2_PASSWORD} HY2_OBFS_PASSWORD: ${HY2_OBFS_PASSWORD} VLESS_PORT: ${VLESS_PORT} VLESS_UUID: ${VLESS_UUID} REALITY_SERVER_NAME: ${REALITY_SERVER_NAME} REALITY_PRIVATE_KEY: ${REALITY_PRIVATE_KEY} REALITY_SHORT_ID: ${REALITY_SHORT_ID} volumes: - ./etc/sing-box/config.json.template:/template/config.json.template:ro - sing-box-config:/output command: - /bin/sh - -ec - | apk add --no-cache gettext envsubst < /template/config.json.template > /output/config.json chmod 600 /output/config.json restart: "no" sing-box: image: ghcr.io/sagernet/sing-box:v1.14.0 restart: unless-stopped depends_on: config-render: condition: service_completed_successfully volumes: - sing-box-config:/etc/sing-box:ro - sing-box-data:/var/lib/sing-box command: -D /var/lib/sing-box -C /etc/sing-box/ run network_mode: host logging: driver: json-file options: max-size: 200k max-file: "2" volumes: sing-box-config: sing-box-data: