#!/usr/bin/env bash # ══════════════════════════════════════════════════ # 03_start_infra.sh # 分步启动基础设施(含健康等待),顺序: # PostgreSQL + Redis → etcd + MinIO → Milvus → Neo4j # 用法:bash scripts/03_start_infra.sh # ══════════════════════════════════════════════════ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" cd "$PROJECT_DIR" RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m' info() { echo -e "${BLUE}[INFO]${NC} $*"; } ok() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } error() { echo -e "${RED}[ERROR]${NC} $*"; exit 1; } # 等待服务健康的函数 wait_healthy() { local service=$1 local max_wait=${2:-120} local interval=5 local elapsed=0 info "等待 $service 健康就绪..." while [[ $elapsed -lt $max_wait ]]; do local status status=$(docker compose ps --format json "$service" 2>/dev/null | \ python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('Health','unknown'))" 2>/dev/null || echo "unknown") if [[ "$status" == "healthy" ]]; then ok "$service 已就绪" return 0 fi echo -n "." sleep $interval elapsed=$((elapsed + interval)) done echo "" error "$service 等待超时(${max_wait}s),请检查:docker compose logs $service" } info "══════════════════════════════════════════" info " 启动基础设施层" info "══════════════════════════════════════════" # ── Step 1:PostgreSQL + Redis ────────────────── info "Step 1/4:启动 PostgreSQL 和 Redis..." docker compose up -d postgres redis wait_healthy postgres 90 wait_healthy redis 30 ok "数据层就绪" # ── Step 2:etcd + MinIO(Milvus 依赖)───────── info "Step 2/4:启动 etcd 和 MinIO(Milvus 依赖)..." docker compose up -d etcd minio wait_healthy etcd 60 wait_healthy minio 60 ok "对象存储层就绪" # ── Step 3:Milvus ────────────────────────────── info "Step 3/4:启动 Milvus(向量数据库)..." docker compose up -d milvus info "Milvus 初始化需要约 60 秒,请耐心等待..." wait_healthy milvus 180 ok "Milvus 就绪" # ── Step 4:Neo4j ─────────────────────────────── info "Step 4/4:启动 Neo4j(知识图谱)..." docker compose up -d neo4j wait_healthy neo4j 120 ok "Neo4j 就绪" # ── 汇总 ──────────────────────────────────────── echo "" echo -e "${GREEN}══════════════════════════════════════════${NC}" echo -e "${GREEN} 基础设施启动完成!${NC}" echo -e "${GREEN}══════════════════════════════════════════${NC}" echo "" echo " PostgreSQL : localhost:5432" echo " Redis : localhost:6379" echo " Milvus : localhost:19530 (gRPC), localhost:9091 (HTTP)" echo " Neo4j : localhost:7474 (Browser), localhost:7687 (Bolt)" echo " MinIO 控制台: localhost:9001 (admin/minioadmin)" echo "" echo "下一步:bash scripts/04_build_services.sh"