start_prod.sh 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/bin/sh
  2. # 游铛铛客户端后端 — 生产环境启动脚本
  3. # 虚拟环境选择顺序(与当前 shell 里 echo $VIRTUAL_ENV 无关,以实际 python 路径为准):
  4. # 1) 环境变量 VENV_DIR(显式指定,如 /root/sync_goods/venv)
  5. # 2) 与 backend-client 同级的 sync_goods/venv(常见生产布局:~/backend-client + ~/sync_goods/venv)
  6. # 3) 本目录 venv 或 .venv
  7. # 兼容 /bin/sh(dash)
  8. set -e
  9. RED='\033[0;31m'
  10. GREEN='\033[0;32m'
  11. YELLOW='\033[1;33m'
  12. NC='\033[0m'
  13. SCRIPT_DIR=$(CDPATH= cd -- "$(dirname "$0")" && pwd)
  14. cd "$SCRIPT_DIR"
  15. printf '%b\n' "${GREEN}游铛铛客户端后端(生产)${NC}"
  16. if [ ! -f "app/main.py" ]; then
  17. printf '%b\n' "${RED}错误:未找到 app/main.py,脚本应位于 backend-client 目录${NC}"
  18. exit 1
  19. fi
  20. SYNC_GOODS_VENV="$SCRIPT_DIR/../sync_goods/venv"
  21. if [ -n "${VENV_DIR:-}" ]; then
  22. if [ ! -f "$VENV_DIR/bin/python" ]; then
  23. printf '%b\n' "${RED}错误:VENV_DIR=$VENV_DIR 下未找到 bin/python${NC}"
  24. exit 1
  25. fi
  26. VENV_ROOT=$(CDPATH= cd -- "$VENV_DIR" && pwd)
  27. elif [ -f "$SYNC_GOODS_VENV/bin/python" ]; then
  28. VENV_ROOT=$(CDPATH= cd -- "$SYNC_GOODS_VENV" && pwd)
  29. elif [ -f "venv/bin/python" ]; then
  30. VENV_ROOT="$SCRIPT_DIR/venv"
  31. elif [ -f ".venv/bin/python" ]; then
  32. VENV_ROOT="$SCRIPT_DIR/.venv"
  33. else
  34. printf '%b\n' "${RED}错误:未找到可用的虚拟环境${NC}"
  35. printf '%b\n' "${YELLOW}已按顺序查找: \$VENV_DIR、$SYNC_GOODS_VENV、$SCRIPT_DIR/venv、$SCRIPT_DIR/.venv${NC}"
  36. printf '%b\n' "${YELLOW}请指定:export VENV_DIR=/你的/venv路径 再执行本脚本${NC}"
  37. exit 1
  38. fi
  39. PYTHON_BIN="$VENV_ROOT/bin/python"
  40. printf '%b\n' "${GREEN}使用虚拟环境: $VENV_ROOT${NC}"
  41. if ! "$PYTHON_BIN" -c "import uvicorn" > /dev/null 2>&1; then
  42. if [ ! -f requirements.txt ]; then
  43. printf '%b\n' "${RED}错误:缺少 requirements.txt,无法安装依赖${NC}"
  44. exit 1
  45. fi
  46. if [ "${START_PROD_NO_AUTO_PIP:-}" = "1" ]; then
  47. printf '%b\n' "${RED}错误:venv 中未安装 uvicorn,且已设置 START_PROD_NO_AUTO_PIP=1 跳过自动安装${NC}"
  48. printf '%b\n' "${YELLOW}请执行: $PYTHON_BIN -m pip install -r $SCRIPT_DIR/requirements.txt${NC}"
  49. exit 1
  50. fi
  51. printf '%b\n' "${YELLOW}未检测到 uvicorn,正在执行: $PYTHON_BIN -m pip install -r requirements.txt${NC}"
  52. "$PYTHON_BIN" -m pip install -r requirements.txt
  53. fi
  54. if ! "$PYTHON_BIN" -c "import uvicorn" > /dev/null 2>&1; then
  55. printf '%b\n' "${RED}错误:安装依赖后仍无法 import uvicorn${NC}"
  56. exit 1
  57. fi
  58. printf '%b\n' "${GREEN}启动客户端生产服务器...${NC}"
  59. printf '%b\n' "${YELLOW}API 文档:http://125.122.32.114:9000/docs${NC}"
  60. exec "$PYTHON_BIN" -m uvicorn app.main:app --host 0.0.0.0 --port 9000 --workers 4