diff --git a/03-start-infra.sh b/03-start-infra.sh index fe838b2..ec503d4 100755 --- a/03-start-infra.sh +++ b/03-start-infra.sh @@ -71,6 +71,11 @@ else info "创建并启动 Kafka 容器(首次拉取镜像可能较慢)..." KAFKA_CLUSTER_ID="MkU3OEVBNTcwNTJENDM2Qk" + # bitnamilegacy/kafka 容器内以 uid=1001 运行,宿主目录需提前授权 + mkdir -p "${DATA_DIR}/kafka" + chown -R 1001:1001 "${DATA_DIR}/kafka" 2>/dev/null || \ + chmod -R 777 "${DATA_DIR}/kafka" # 无 chown 权限时退回 777 + docker run -d \ --name dev-kafka \ --restart unless-stopped \ @@ -91,37 +96,45 @@ else fi start_docker_logger "dev-kafka" -# 等待 Kafka broker 真正就绪(轮询,最长 60s) +# 等待 Kafka broker 真正就绪(轮询,最长 90s) info "等待 Kafka broker 就绪..." _kafka_ready=0 -for _i in $(seq 1 30); do - if docker exec dev-kafka kafka-topics.sh \ - --bootstrap-server localhost:9092 \ - --list &>/dev/null; then - _kafka_ready=1 - break +for _i in $(seq 1 45); do + printf " 第 %d 次探测 (%ds)...\r" "$_i" "$(( _i * 2 ))" + # 先快速检测端口是否开放(避免 kafka-topics.sh 长时间挂起) + if docker exec dev-kafka bash -c "timeout 2 bash -c 'cat < /dev/null > /dev/tcp/localhost/9092'" &>/dev/null; then + # 端口开放后再验证 broker 是否真正接受请求 + if docker exec dev-kafka timeout 5 kafka-topics.sh \ + --bootstrap-server localhost:9092 \ + --list &>/dev/null; then + _kafka_ready=1 + break + fi fi - printf " 第 %d 次探测...\r" "$_i" sleep 2 done +echo "" # 清除 \r 留下的行 if [[ $_kafka_ready -eq 1 ]]; then success "Kafka 已就绪 :${KAFKA_PORT}" else - error "Kafka 60s 内未就绪,请检查日志: ./deploy-test/logs.sh kafka" + error "Kafka 90s 内未就绪,请检查日志: ./deploy-test/logs.sh kafka" exit 1 fi # 初始化必要 Topics step "Kafka Topics 初始化" TOPICS=(toRedis toMongo toPush toOfflinePush) +# 先获取已存在的 topic 列表,避免逐个查询 +_existing_topics=$(docker exec dev-kafka kafka-topics.sh \ + --bootstrap-server localhost:9092 --list 2>/dev/null || true) + for topic in "${TOPICS[@]}"; do - if docker exec dev-kafka kafka-topics.sh \ - --bootstrap-server localhost:9092 \ - --list 2>/dev/null | grep -q "^${topic}$"; then - info " topic 已存在: $topic" + if echo "$_existing_topics" | grep -q "^${topic}$"; then + info " topic 已存在: $topic,跳过" else docker exec dev-kafka kafka-topics.sh \ --create \ + --if-not-exists \ --topic "$topic" \ --bootstrap-server localhost:9092 \ --partitions 8 \ @@ -146,6 +159,11 @@ elif docker ps -a --format '{{.Names}}' | grep -q '^dev-etcd$'; then success "Etcd 已启动 :${ETCD_PORT}" else info "创建并启动 Etcd 容器..." + # bitnamilegacy/etcd 容器内以 uid=1001 运行,宿主目录需提前授权 + mkdir -p "${DATA_DIR}/etcd" + chown -R 1001:1001 "${DATA_DIR}/etcd" 2>/dev/null || \ + chmod -R 777 "${DATA_DIR}/etcd" + docker run -d \ --name dev-etcd \ --restart unless-stopped \