#!/bin/sh # 游铛铛客户端后端 — 生产环境启动脚本 # 虚拟环境选择顺序(与当前 shell 里 echo $VIRTUAL_ENV 无关,以实际 python 路径为准): # 1) 环境变量 VENV_DIR(显式指定,如 /root/sync_goods/venv) # 2) 与 backend-client 同级的 sync_goods/venv(常见生产布局:~/backend-client + ~/sync_goods/venv) # 3) 本目录 venv 或 .venv # 兼容 /bin/sh(dash) set -e RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' SCRIPT_DIR=$(CDPATH= cd -- "$(dirname "$0")" && pwd) cd "$SCRIPT_DIR" printf '%b\n' "${GREEN}游铛铛客户端后端(生产)${NC}" if [ ! -f "app/main.py" ]; then printf '%b\n' "${RED}错误:未找到 app/main.py,脚本应位于 backend-client 目录${NC}" exit 1 fi SYNC_GOODS_VENV="$SCRIPT_DIR/../sync_goods/venv" if [ -n "${VENV_DIR:-}" ]; then if [ ! -f "$VENV_DIR/bin/python" ]; then printf '%b\n' "${RED}错误:VENV_DIR=$VENV_DIR 下未找到 bin/python${NC}" exit 1 fi VENV_ROOT=$(CDPATH= cd -- "$VENV_DIR" && pwd) elif [ -f "$SYNC_GOODS_VENV/bin/python" ]; then VENV_ROOT=$(CDPATH= cd -- "$SYNC_GOODS_VENV" && pwd) elif [ -f "venv/bin/python" ]; then VENV_ROOT="$SCRIPT_DIR/venv" elif [ -f ".venv/bin/python" ]; then VENV_ROOT="$SCRIPT_DIR/.venv" else printf '%b\n' "${RED}错误:未找到可用的虚拟环境${NC}" printf '%b\n' "${YELLOW}已按顺序查找: \$VENV_DIR、$SYNC_GOODS_VENV、$SCRIPT_DIR/venv、$SCRIPT_DIR/.venv${NC}" printf '%b\n' "${YELLOW}请指定:export VENV_DIR=/你的/venv路径 再执行本脚本${NC}" exit 1 fi PYTHON_BIN="$VENV_ROOT/bin/python" printf '%b\n' "${GREEN}使用虚拟环境: $VENV_ROOT${NC}" if ! "$PYTHON_BIN" -c "import uvicorn" > /dev/null 2>&1; then if [ ! -f requirements.txt ]; then printf '%b\n' "${RED}错误:缺少 requirements.txt,无法安装依赖${NC}" exit 1 fi if [ "${START_PROD_NO_AUTO_PIP:-}" = "1" ]; then printf '%b\n' "${RED}错误:venv 中未安装 uvicorn,且已设置 START_PROD_NO_AUTO_PIP=1 跳过自动安装${NC}" printf '%b\n' "${YELLOW}请执行: $PYTHON_BIN -m pip install -r $SCRIPT_DIR/requirements.txt${NC}" exit 1 fi printf '%b\n' "${YELLOW}未检测到 uvicorn,正在执行: $PYTHON_BIN -m pip install -r requirements.txt${NC}" "$PYTHON_BIN" -m pip install -r requirements.txt fi if ! "$PYTHON_BIN" -c "import uvicorn" > /dev/null 2>&1; then printf '%b\n' "${RED}错误:安装依赖后仍无法 import uvicorn${NC}" exit 1 fi printf '%b\n' "${GREEN}启动客户端生产服务器...${NC}" printf '%b\n' "${YELLOW}API 文档:http://125.122.32.114:9000/docs${NC}" exec "$PYTHON_BIN" -m uvicorn app.main:app --host 0.0.0.0 --port 9000 --workers 4