diff --git a/install_service.sh b/install_service.sh index c1dffb8..151e32a 100644 --- a/install_service.sh +++ b/install_service.sh @@ -8,7 +8,6 @@ set -e SERVICE_NAME="oai-team-bot" SERVICE_DESC="OpenAI Team Provisioner Bot" WORK_DIR="$(cd "$(dirname "$0")" && pwd)" -PYTHON_BIN="${WORK_DIR}/.venv/bin/python" SCRIPT_NAME="telegram_bot.py" USER="${SUDO_USER:-root}" @@ -38,18 +37,36 @@ check_env() { exit 1 fi - # 检查 Python 环境 - if [ ! -f "$PYTHON_BIN" ]; then - log_warn "未找到 .venv,尝试使用系统 Python" + # 检测 uv + if command -v uv &> /dev/null && [ -f "${WORK_DIR}/pyproject.toml" ]; then + UV_BIN=$(which uv) + + # 先执行 uv sync 安装依赖 + log_info "执行 uv sync 安装依赖..." + cd "${WORK_DIR}" + sudo -u ${USER} ${UV_BIN} sync + log_success "依赖安装完成" + + # 使用 uv run 运行 + EXEC_CMD="${UV_BIN} run python ${SCRIPT_NAME}" + log_info "使用 uv run 运行" + elif [ -f "${WORK_DIR}/.venv/bin/python" ]; then + # 使用 .venv + EXEC_CMD="${WORK_DIR}/.venv/bin/python ${WORK_DIR}/${SCRIPT_NAME}" + log_info "使用 .venv 虚拟环境" + else + # 使用系统 python PYTHON_BIN=$(which python3 || which python) if [ -z "$PYTHON_BIN" ]; then - log_error "找不到 Python" + log_error "找不到 Python 或 uv" exit 1 fi + EXEC_CMD="${PYTHON_BIN} ${WORK_DIR}/${SCRIPT_NAME}" + log_warn "使用系统 Python,可能缺少依赖" fi log_info "工作目录: ${WORK_DIR}" - log_info "Python: ${PYTHON_BIN}" + log_info "启动命令: ${EXEC_CMD}" log_info "运行用户: ${USER}" } @@ -57,6 +74,12 @@ check_env() { install_service() { log_info "正在安装 ${SERVICE_NAME} 服务..." + # 获取 uv 路径用于 PATH + UV_PATH="" + if command -v uv &> /dev/null; then + UV_PATH="$(dirname $(which uv)):" + fi + # 创建 systemd service 文件 cat > /etc/systemd/system/${SERVICE_NAME}.service << EOF [Unit] @@ -69,7 +92,7 @@ Type=simple User=${USER} Group=${USER} WorkingDirectory=${WORK_DIR} -ExecStart=${PYTHON_BIN} ${WORK_DIR}/${SCRIPT_NAME} +ExecStart=${EXEC_CMD} Restart=always RestartSec=10 StandardOutput=journal @@ -78,11 +101,11 @@ StandardError=journal # 环境变量 Environment="PYTHONUNBUFFERED=1" Environment="LOG_LEVEL=INFO" +Environment="PATH=${UV_PATH}/usr/local/bin:/usr/bin:/bin" +Environment="HOME=/root" -# 安全限制 +# 安全限制 (root 用户不使用 ProtectSystem) NoNewPrivileges=true -ProtectSystem=strict -ReadWritePaths=${WORK_DIR} [Install] WantedBy=multi-user.target