This commit is contained in:
zlwu committed 2026-06-17 10:00:54 +08:00
1 parent f1ef768c17
commit 3f56586b02
14 files changed
+172 -105

No files matched your search

+78 -15
View File
@@ -10,7 +10,7 @@
# 首次部署:
# cd /root/zkxw-backend/backend
# cp .env.test.example .env.test # 或从 .env.example 复制后按测试库填写
# python3 -m venv .venv && ./.venv/bin/pip install -r requirements.txt
# python3.9 -m venv .venv && ./.venv/bin/pip install -r requirements.txt
# ./start-test.sh activate # source .venv/bin/activate
# ./start-test.sh start
# ============================================
@@ -30,7 +30,9 @@ ENV_FILE="${ENV_FILE:-$BASE_DIR/.env.test}"
VENV_DIR="${VENV_DIR:-$BASE_DIR/.venv}"
ACTIVATE_SCRIPT="$VENV_DIR/bin/activate"
PYTHON_BIN="${PYTHON_BIN:-$VENV_DIR/bin/python}"
UVICORN_BIN="${UVICORN_BIN:-$VENV_DIR/bin/uvicorn}"
MIN_PYTHON_MAJOR=3
MIN_PYTHON_MINOR=9
SYSTEM_PYTHON=""
LOG_DIR="$BASE_DIR/logs"
LOG_FILE="$LOG_DIR/backend-test.log"
@@ -73,6 +75,7 @@ show_help() {
LOG_LEVEL=debug
APP_MODULE=app.main:app
VENV_DIR=./.venv
PYTHON_FOR_VENV=python3.9
ENV_FILE=./.env.test
测试部署目录(示例):
@@ -91,23 +94,80 @@ ensure_dirs() {
mkdir -p "$LOG_DIR"
}
check_python() {
if ! command -v python3 >/dev/null 2>&1; then
log_error "未找到 python3,请安装 python3.9+"
python_version_ge() {
local ver="$1"
local major="${ver%%.*}"
local minor="${ver#*.}"
if [ "$major" -gt "$MIN_PYTHON_MAJOR" ]; then
return 0
fi
if [ "$major" -eq "$MIN_PYTHON_MAJOR" ] && [ "$minor" -ge "$MIN_PYTHON_MINOR" ]; then
return 0
fi
return 1
}
resolve_system_python() {
local candidate ver
if [ -n "${PYTHON_FOR_VENV:-}" ] && command -v "$PYTHON_FOR_VENV" >/dev/null 2>&1; then
ver="$("$PYTHON_FOR_VENV" -c 'import sys; print("{}.{}".format(sys.version_info[0], sys.version_info[1]))')"
if python_version_ge "$ver"; then
echo "$PYTHON_FOR_VENV"
return 0
fi
log_error "PYTHON_FOR_VENV=$PYTHON_FOR_VENV 版本为 $ver,需要 >= ${MIN_PYTHON_MAJOR}.${MIN_PYTHON_MINOR}"
exit 1
fi
local py_ver
py_ver="$(python3 -c 'import sys; print("{}.{}".format(sys.version_info[0], sys.version_info[1]))')"
log_info "系统 python3 版本: $py_ver"
for candidate in python3.11 python3.10 python3.9 python3; do
if command -v "$candidate" >/dev/null 2>&1; then
ver="$("$candidate" -c 'import sys; print("{}.{}".format(sys.version_info[0], sys.version_info[1]))')"
if python_version_ge "$ver"; then
echo "$candidate"
return 0
fi
fi
done
return 1
}
check_python() {
if ! SYSTEM_PYTHON="$(resolve_system_python)"; then
log_error "未找到 python${MIN_PYTHON_MAJOR}.${MIN_PYTHON_MINOR}+,请安装 python39 或设置 PYTHON_FOR_VENV=python3.9"
exit 1
fi
log_info "系统 Python: $SYSTEM_PYTHON ($("$SYSTEM_PYTHON" --version 2>&1))"
}
ensure_venv_python_version() {
local ver
ver="$("$PYTHON_BIN" -c 'import sys; print("{}.{}".format(sys.version_info[0], sys.version_info[1]))')"
if python_version_ge "$ver"; then
log_info "虚拟环境 Python: $ver ($VENV_DIR)"
return 0
fi
log_error "虚拟环境 Python 版本过低: $ver(需要 >= ${MIN_PYTHON_MAJOR}.${MIN_PYTHON_MINOR})"
log_error "当前虚拟环境目录: $VENV_DIR"
log_warn "请执行: rm -rf \"$VENV_DIR\" && $SYSTEM_PYTHON -m venv \"$VENV_DIR\" && \"$VENV_DIR/bin/pip\" install -r requirements.txt"
exit 1
}
has_uvicorn() {
"$PYTHON_BIN" -c "import uvicorn" >/dev/null 2>&1
}
ensure_venv_and_runtime() {
log_info "虚拟环境目录: $VENV_DIR"
if [ ! -d "$VENV_DIR" ]; then
log_warn "未找到虚拟环境,开始自动创建: $VENV_DIR"
if ! python3 -m venv "$VENV_DIR" >/dev/null 2>&1; then
if ! "$SYSTEM_PYTHON" -m venv "$VENV_DIR" >/dev/null 2>&1; then
log_error "自动创建 venv 失败,请先安装 python3-venv 或手动创建虚拟环境"
log_warn "可尝试: yum install -y python3-venv 或 python3 -m ensurepip --upgrade"
log_warn "可尝试: $SYSTEM_PYTHON -m venv \"$VENV_DIR\""
exit 1
fi
fi
@@ -117,20 +177,23 @@ ensure_venv_and_runtime() {
exit 1
fi
ensure_venv_python_version
if [ ! -x "$VENV_DIR/bin/pip" ]; then
log_warn "虚拟环境 pip 不存在,尝试引导安装"
"$PYTHON_BIN" -m ensurepip --upgrade >/dev/null 2>&1 || true
fi
if [ ! -x "$UVICORN_BIN" ]; then
if ! has_uvicorn; then
log_warn "未检测到 uvicorn,开始安装依赖 requirements.txt"
if [ ! -x "$VENV_DIR/bin/pip" ]; then
log_error "pip 仍不可用,请手动执行依赖初始化"
exit 1
fi
"$VENV_DIR/bin/pip" install --upgrade pip
"$VENV_DIR/bin/pip" install -r "$BASE_DIR/requirements.txt"
if [ ! -x "$UVICORN_BIN" ]; then
log_error "依赖安装后仍未找到 uvicorn: $UVICORN_BIN"
if ! has_uvicorn; then
log_error "依赖安装后仍无法 import uvicorn,请检查: $PYTHON_BIN -m pip install -r requirements.txt"
exit 1
fi
fi
@@ -183,7 +246,7 @@ start_server() {
fi
export ENV_FILE
nohup "$UVICORN_BIN" "$APP_MODULE" \
nohup "$PYTHON_BIN" -m uvicorn "$APP_MODULE" \
--host "$HOST" \
--port "$PORT" \
--workers "$WORKERS" \
@@ -252,7 +315,7 @@ show_logs() {
activate_venv() {
if [ ! -f "$ACTIVATE_SCRIPT" ]; then
log_error "虚拟环境激活脚本不存在: $ACTIVATE_SCRIPT"
log_warn "可先执行: python3 -m venv .venv && ./.venv/bin/pip install -r requirements.txt"
log_warn "可先执行: python3.9 -m venv .venv && ./.venv/bin/pip install -r requirements.txt"
exit 1
fi