#!/bin/bash # Apollo Router 启动脚本(dev-apps 模式:仅 5 个 TS 子图) # # 与 entrypoint.sh 的差异: # - SUBGRAPHS 仅包含 iam/core-edu/content/msg/config-service(排除 ai/data-ana) # - 依赖 docker compose depends_on 已确保子图健康,等待重试次数减少到 30 # # 使用:通过 docker-compose.dev-apps.yml 卷挂载覆盖 /dist/entrypoint.sh set -e SUBGRAPHS=( "iam:iam:3002" "core-edu:core-edu:3004" "content:content:3005" "msg:msg:3007" "config-service:config-service:3011" ) echo "[apollo-router:dev-apps] Waiting for subgraphs to be ready..." wait_for_subgraph() { local name="$1" local host="$2" local port="$3" local max_retries=30 local retry=0 while [ $retry -lt $max_retries ]; do if curl -sf -o /dev/null "http://${host}:${port}/healthz" 2>/dev/null; then echo "[apollo-router:dev-apps] ${name} is ready (http://${host}:${port})" return 0 fi retry=$((retry + 1)) echo "[apollo-router:dev-apps] Waiting for ${name} at ${host}:${port} (attempt ${retry}/${max_retries})" sleep 3 done echo "[apollo-router:dev-apps] WARNING: ${name} not ready after ${max_retries} attempts, continuing anyway..." return 0 } for entry in "${SUBGRAPHS[@]}"; do name="${entry%%:*}" hostport="${entry#*:}" host="${hostport%%:*}" port="${hostport##*:}" wait_for_subgraph "$name" "$host" "$port" done # 组合 supergraph SDL echo "[apollo-router:dev-apps] Composing supergraph SDL..." export APOLLO_ELV2_LICENSE=accept max_compose_retries=5 compose_retry=0 while [ $compose_retry -lt $max_compose_retries ]; do compose_retry=$((compose_retry + 1)) if rover supergraph compose --config /dist/supergraph.yaml --output /tmp/supergraph.graphql 2>&1; then echo "[apollo-router:dev-apps] Supergraph composed successfully" break fi echo "[apollo-router:dev-apps] Compose attempt ${compose_retry}/${max_compose_retries} failed, retrying in 5s..." sleep 5 done if [ ! -f /tmp/supergraph.graphql ]; then echo "[apollo-router:dev-apps] ERROR: Failed to compose supergraph after ${max_compose_retries} attempts" exit 1 fi # PQ manifest 检查(dev 模式 require_manifest=false,仅警告) MANIFEST_PATH="/etc/apollo-router/pq-manifest.json" REQUIRE_MANIFEST="${APOLLO_REQUIRE_PQ_MANIFEST:-false}" if [ "${REQUIRE_MANIFEST}" = "true" ]; then if [ ! -f "${MANIFEST_PATH}" ]; then echo "[apollo-router:dev-apps] ERROR: APOLLO_REQUIRE_PQ_MANIFEST=true but manifest not found at ${MANIFEST_PATH}" exit 1 fi echo "[apollo-router:dev-apps] PQ manifest loaded (require_manifest=true): ${MANIFEST_PATH}" else if [ ! -f "${MANIFEST_PATH}" ]; then echo "[apollo-router:dev-apps] WARNING: PQ manifest not found at ${MANIFEST_PATH} (require_manifest=false, continuing)" else echo "[apollo-router:dev-apps] PQ manifest loaded (require_manifest=false): ${MANIFEST_PATH}" fi fi # 启动 router echo "[apollo-router:dev-apps] Starting Apollo Router on port 3000..." exec /dist/router --config /dist/configuration.yaml --supergraph /tmp/supergraph.graphql --hot-reload