提交
This commit is contained in:
1 parent
f1ef768c17
commit
3f56586b02
14 files changed
+172
-105
No files matched your search
+78
-15
@@ -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
|
||||
|
||||
|
||||
Reference in new issue
Block a user