check_services.sh 2.93 KB
#!/usr/bin/env bash
# =============================================================================
# OmniShopAgent - 服务健康检查脚本
# 检查 Milvus、CLIP、Streamlit 等依赖服务状态
# =============================================================================
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

echo "=========================================="
echo "OmniShopAgent 服务健康检查"
echo "=========================================="

# 1. Python 环境
echo -n "[Python] "
if command -v python3 &>/dev/null; then
    VER=$(python3 -c 'import sys; v=sys.version_info; print(f"{v.major}.{v.minor}.{v.micro}")' 2>/dev/null)
    if [[ "$VER" == "3.1"* ]] || [[ "$VER" == "3.12"* ]]; then
        echo -e "${GREEN}OK${NC} $VER"
    else
        echo -e "${YELLOW}WARN${NC} $VER (建议 3.12+)"
    fi
else
    echo -e "${RED}FAIL${NC} 未找到"
fi

# 2. 虚拟环境
echo -n "[Virtualenv] "
if [ -d "$PROJECT_ROOT/venv" ]; then
    echo -e "${GREEN}OK${NC} $PROJECT_ROOT/venv"
else
    echo -e "${YELLOW}WARN${NC} 未找到 venv"
fi

# 3. .env 配置
echo -n "[.env] "
if [ -f "$PROJECT_ROOT/.env" ]; then
    if grep -q "OPENAI_API_KEY=sk-" "$PROJECT_ROOT/.env" 2>/dev/null; then
        echo -e "${GREEN}OK${NC} 已配置"
    else
        echo -e "${YELLOW}WARN${NC} 请配置 OPENAI_API_KEY"
    fi
else
    echo -e "${RED}FAIL${NC} 未找到"
fi

# 4. Milvus
echo -n "[Milvus] "
if command -v docker &>/dev/null; then
    if docker ps --format '{{.Names}}' 2>/dev/null | grep -q milvus-standalone; then
        if curl -s -o /dev/null -w "%{http_code}" http://localhost:9091/healthz 2>/dev/null | grep -q 200; then
            echo -e "${GREEN}OK${NC} localhost:19530"
        else
            echo -e "${YELLOW}WARN${NC} 容器运行中,健康检查未响应"
        fi
    else
        echo -e "${YELLOW}WARN${NC} 未运行 (docker compose up -d)"
    fi
else
    echo -e "${YELLOW}SKIP${NC} Docker 未安装"
fi

# 5. CLIP 服务(可选)
echo -n "[CLIP] "
if timeout 2 bash -c 'echo >/dev/tcp/localhost/51000' 2>/dev/null; then
    echo -e "${GREEN}OK${NC} localhost:51000"
else
    echo -e "${YELLOW}WARN${NC} 未运行 (图像搜索需启动: python -m clip_server launch)"
fi

# 6. 数据目录
echo -n "[数据] "
if [ -d "$PROJECT_ROOT/data/images" ] && [ -f "$PROJECT_ROOT/data/styles.csv" ]; then
    IMG_COUNT=$(find "$PROJECT_ROOT/data/images" -name "*.jpg" 2>/dev/null | wc -l)
    echo -e "${GREEN}OK${NC} $IMG_COUNT 张图片"
else
    echo -e "${YELLOW}WARN${NC} 未找到 data/images 或 data/styles.csv (运行 download_dataset.py)"
fi

# 7. Streamlit
echo -n "[Streamlit] "
if pgrep -f "streamlit run app.py" >/dev/null 2>&1; then
    echo -e "${GREEN}OK${NC} 运行中"
else
    echo -e "${YELLOW}WARN${NC} 未运行 (./scripts/start.sh)"
fi

echo "=========================================="