#!/usr/bin/env bash # agent/qa/scripts/start.sh —— QA V1.1.73 服务唯一启动接口 # 用法:bash scripts/start.sh [port] (默认 8091 终态;浸泡期影子用 7921) set -euo pipefail AGENT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" PORT="${1:-8091}" # 终态端口 ENV_FILE="${QA_ENV_FILE:-$AGENT_ROOT/env/prod.env}" LOG_FILE="${QA_LOG_FILE:-/tmp/plantai-agent-qa-$PORT.log}" PID_FILE="$AGENT_ROOT/run/qa-$PORT.pid" PYTHON="${QA_PYTHON:-$AGENT_ROOT/../venv/bin/python}" [[ -x "$PYTHON" ]] || PYTHON="/home/xzq/5090/teamWorkspace/zh/plantai-rag-new-venv/bin/python" mkdir -p "$AGENT_ROOT/run" [[ -x "$PYTHON" ]] || { echo "QA Python 不可执行: $PYTHON" >&2; exit 1; } [[ -f "$ENV_FILE" ]] || { echo "缺少 env 文件: $ENV_FILE" >&2; exit 1; } if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then echo "QA 已在运行 pid=$(cat "$PID_FILE")" >&2 exit 1 fi set -a # shellcheck disable=SC1090 . "$ENV_FILE" set +a if [[ -f "$AGENT_ROOT/env/active_library.env" ]]; then set -a; . "$AGENT_ROOT/env/active_library.env"; set +a fi # ---- 开机自愈:后端校验(Qdrant/Neo4j)失败即崩且零重试,启动前必须等依赖就绪(2026-09-23) ---- QD_READYZ="${QDRANT_URL:-http://127.0.0.1:27433}/readyz" QD_DEADLINE=$(( $(date +%s) + 1800 )) until curl -sf --max-time 3 "$QD_READYZ" >/dev/null 2>&1; do [ "$(date +%s)" -ge "$QD_DEADLINE" ] && { echo "[qa] Qdrant 30 分钟未就绪,放弃启动" >&2; exit 1; } sleep 5 done N4_HP="${NEO4J_URI#bolt://}"; N4_H="${N4_HP%:*}"; N4_P="${N4_HP##*:}" N4_DEADLINE=$(( $(date +%s) + 600 )) until timeout 3 bash -c "echo > /dev/tcp/$N4_H/$N4_P" 2>/dev/null; do [ "$(date +%s)" -ge "$N4_DEADLINE" ] && { echo "[qa] Neo4j 10 分钟未就绪,放弃启动" >&2; exit 1; } sleep 5 done # ---- 就绪等待结束 ---- # reranker 模型路径回退:env 未指定时用安装包内模型(install/models/bge-reranker-base) if [[ -z "${QA_V1_BGE_RERANKER_MODEL:-}" && -d "$AGENT_ROOT/../models/bge-reranker-base" ]]; then export QA_V1_BGE_RERANKER_MODEL="$AGENT_ROOT/../models/bge-reranker-base" fi cd "$AGENT_ROOT" setsid "$PYTHON" -m uvicorn scripts.qa_v1_1_73_server:app \ --host 127.0.0.1 --port "$PORT" \ > "$LOG_FILE" 2>&1 < /dev/null & echo $! > "$PID_FILE" disown for _ in $(seq 1 30); do if curl -sf --max-time 3 "http://127.0.0.1:$PORT/health" >/dev/null 2>&1; then echo "QA UP (127.0.0.1:$PORT, pid=$(cat "$PID_FILE"))" exit 0 fi sleep 2 done echo "QA FAIL —— 日志尾部:" >&2 tail -30 "$LOG_FILE" >&2 exit 1