|
@@ -186,6 +186,10 @@ def create_deployment():
|
|
|
# 创建启动脚本
|
|
# 创建启动脚本
|
|
|
create_start_scripts(deploy_dir)
|
|
create_start_scripts(deploy_dir)
|
|
|
|
|
|
|
|
|
|
+ # 创建 Windows 服务脚本(新增)
|
|
|
|
|
+ if sys.platform == "win32":
|
|
|
|
|
+ create_windows_service_scripts(deploy_dir)
|
|
|
|
|
+
|
|
|
print(f"✅ 部署包: {deploy_dir}")
|
|
print(f"✅ 部署包: {deploy_dir}")
|
|
|
|
|
|
|
|
|
|
|
|
@@ -240,6 +244,208 @@ python3 app.py
|
|
|
print(" 创建启动脚本: start.bat, start.sh")
|
|
print(" 创建启动脚本: start.bat, start.sh")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+def create_windows_service_scripts(deploy_dir):
|
|
|
|
|
+ """创建 Windows 服务管理脚本"""
|
|
|
|
|
+ print(" 创建 Windows 服务脚本...")
|
|
|
|
|
+
|
|
|
|
|
+ # 检查本地 nssm.exe
|
|
|
|
|
+ nssm_exe = Path("nssm.exe")
|
|
|
|
|
+ if not nssm_exe.exists():
|
|
|
|
|
+ print(" ⚠️ 未找到 nssm.exe,跳过服务脚本创建")
|
|
|
|
|
+ return
|
|
|
|
|
+
|
|
|
|
|
+ # 复制 nssm.exe 到部署目录
|
|
|
|
|
+ nssm_dst = deploy_dir / "nssm.exe"
|
|
|
|
|
+ shutil.copy2(nssm_exe, nssm_dst)
|
|
|
|
|
+ print(" ✅ 复制 nssm.exe")
|
|
|
|
|
+
|
|
|
|
|
+ # 服务安装脚本
|
|
|
|
|
+ install_bat = """@echo off
|
|
|
|
|
+chcp 65001 >nul
|
|
|
|
|
+echo ========================================
|
|
|
|
|
+echo LongjoeAgent Windows Service Install
|
|
|
|
|
+echo ========================================
|
|
|
|
|
+echo.
|
|
|
|
|
+
|
|
|
|
|
+REM 检查是否以管理员权限运行
|
|
|
|
|
+net session >nul 2>&1
|
|
|
|
|
+if %errorlevel% neq 0 (
|
|
|
|
|
+ echo Error: 请以管理员权限运行此脚本!
|
|
|
|
|
+ echo 请右键点击此脚本 -> "以管理员身份运行"
|
|
|
|
|
+ pause
|
|
|
|
|
+ exit /b 1
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+REM 动态获取脚本所在目录
|
|
|
|
|
+set "PROJECT_DIR=%~dp0"
|
|
|
|
|
+set "PROJECT_DIR=%PROJECT_DIR:~0,-1%"
|
|
|
|
|
+
|
|
|
|
|
+echo 项目目录: %PROJECT_DIR%
|
|
|
|
|
+
|
|
|
|
|
+REM 检查必要文件是否存在
|
|
|
|
|
+if not exist "%PROJECT_DIR%\\nssm.exe" (
|
|
|
|
|
+ echo 错误: nssm.exe 未在项目目录中找到!
|
|
|
|
|
+ pause
|
|
|
|
|
+ exit /b 1
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+if not exist "%PROJECT_DIR%\\app.py" (
|
|
|
|
|
+ echo 错误: app.py 未在项目目录中找到!
|
|
|
|
|
+ pause
|
|
|
|
|
+ exit /b 1
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+REM 动态查找Python安装路径
|
|
|
|
|
+echo 搜索Python安装...
|
|
|
|
|
+for /f "delims=" %%i in ('where python') do (
|
|
|
|
|
+ set "PYTHON_PATH=%%i"
|
|
|
|
|
+ goto :found_python
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+:found_python
|
|
|
|
|
+if not defined PYTHON_PATH (
|
|
|
|
|
+ echo 错误: 未找到Python!
|
|
|
|
|
+ echo 请安装 Python 3.7+ 并确保其在 PATH 中
|
|
|
|
|
+ pause
|
|
|
|
|
+ exit /b 1
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+echo 找到Python: %PYTHON_PATH%
|
|
|
|
|
+
|
|
|
|
|
+REM 停止并移除现有服务
|
|
|
|
|
+echo Unstall Service
|
|
|
|
|
+net stop LongjoeAI >nul 2>&1
|
|
|
|
|
+timeout /t 2 /nobreak >nul
|
|
|
|
|
+"%PROJECT_DIR%\\nssm.exe" remove LongjoeAI confirm >nul 2>&1
|
|
|
|
|
+
|
|
|
|
|
+REM 关键修正:使用正确的引号格式(模仿您的成功命令)
|
|
|
|
|
+echo 安装 LongjoeAI 服务...
|
|
|
|
|
+"%PROJECT_DIR%\\nssm.exe" install LongjoeAI "cmd" "/c cd /d "%PROJECT_DIR%" && "%PYTHON_PATH%" app.py"
|
|
|
|
|
+
|
|
|
|
|
+if errorlevel 1 (
|
|
|
|
|
+ echo 错误: 服务安装失败!
|
|
|
|
|
+ echo.
|
|
|
|
|
+ echo 调试信息:
|
|
|
|
|
+ echo 项目目录: %PROJECT_DIR%
|
|
|
|
|
+ echo Python 路径: %PYTHON_PATH%
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+REM 配置服务参数
|
|
|
|
|
+echo 配置服务参数...
|
|
|
|
|
+"%PROJECT_DIR%\\nssm.exe" set LongjoeAI DisplayName "Longjoe AI Agent Service"
|
|
|
|
|
+"%PROJECT_DIR%\\nssm.exe" set LongjoeAI Description "龙嘉软件AI助手服务"
|
|
|
|
|
+
|
|
|
|
|
+echo.
|
|
|
|
|
+echo LongjoeAI 服务安装完成!
|
|
|
|
|
+goto :start_service
|
|
|
|
|
+
|
|
|
|
|
+:start_service
|
|
|
|
|
+echo.
|
|
|
|
|
+echo Starting service...
|
|
|
|
|
+net start LongjoeAI
|
|
|
|
|
+
|
|
|
|
|
+if %errorlevel% equ 0 (
|
|
|
|
|
+ echo SUCCESS: Service started successfully!
|
|
|
|
|
+ echo.
|
|
|
|
|
+
|
|
|
|
|
+) else (
|
|
|
|
|
+ echo ERROR: Service failed to start
|
|
|
|
|
+ echo.
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+echo.
|
|
|
|
|
+pause
|
|
|
|
|
+"""
|
|
|
|
|
+
|
|
|
|
|
+ # 服务卸载脚本
|
|
|
|
|
+ uninstall_bat = """@echo off
|
|
|
|
|
+chcp 65001 >nul
|
|
|
|
|
+echo ========================================
|
|
|
|
|
+echo LongjoeAI Service Uninstall
|
|
|
|
|
+echo ========================================
|
|
|
|
|
+echo.
|
|
|
|
|
+
|
|
|
|
|
+REM 检查是否以管理员权限运行
|
|
|
|
|
+net session >nul 2>&1
|
|
|
|
|
+if %errorlevel% neq 0 (
|
|
|
|
|
+ echo 错误: 请以管理员权限运行此脚本!
|
|
|
|
|
+ echo 请右键点击此脚本 -> "以管理员身份运行"
|
|
|
|
|
+ pause
|
|
|
|
|
+ exit /b 1
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+REM 动态获取项目目录
|
|
|
|
|
+set "PROJECT_DIR=%~dp0"
|
|
|
|
|
+set "PROJECT_DIR=%PROJECT_DIR:~0,-1%"
|
|
|
|
|
+
|
|
|
|
|
+echo 停止服务...
|
|
|
|
|
+net stop LongjoeAI >nul 2>&1
|
|
|
|
|
+timeout /t 3 /nobreak >nul
|
|
|
|
|
+
|
|
|
|
|
+echo 卸载服务...
|
|
|
|
|
+"%PROJECT_DIR%\\nssm.exe" remove LongjoeAI confirm >nul 2>&1
|
|
|
|
|
+
|
|
|
|
|
+if errorlevel 1 (
|
|
|
|
|
+ echo 尝试强制删除...
|
|
|
|
|
+ sc delete LongjoeAI >nul 2>&1
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+echo LongjoeAI 服务卸载成功!
|
|
|
|
|
+echo.
|
|
|
|
|
+pause
|
|
|
|
|
+"""
|
|
|
|
|
+
|
|
|
|
|
+ # 服务管理脚本
|
|
|
|
|
+ manage_bat = """@echo off
|
|
|
|
|
+chcp 65001 >nul
|
|
|
|
|
+echo ========================================
|
|
|
|
|
+echo LongjoeAI Service Management
|
|
|
|
|
+echo ========================================
|
|
|
|
|
+echo.
|
|
|
|
|
+
|
|
|
|
|
+set "PROJECT_DIR=%~dp0"
|
|
|
|
|
+set "PROJECT_DIR=%PROJECT_DIR:~0,-1%"
|
|
|
|
|
+
|
|
|
|
|
+echo 1. 启动服务
|
|
|
|
|
+echo 2. 停止服务
|
|
|
|
|
+echo 3. 重启服务
|
|
|
|
|
+echo 4. 服务状态
|
|
|
|
|
+echo 5. Exit
|
|
|
|
|
+echo.
|
|
|
|
|
+set /p choice=请选择操作 (1-5):
|
|
|
|
|
+
|
|
|
|
|
+if "%choice%"=="1" (
|
|
|
|
|
+ net start LongjoeAI
|
|
|
|
|
+ if %errorlevel% equ 0 echo Service started successfully.
|
|
|
|
|
+) else if "%choice%"=="2" (
|
|
|
|
|
+ net stop LongjoeAI
|
|
|
|
|
+ if %errorlevel% equ 0 echo Service stopped successfully.
|
|
|
|
|
+) else if "%choice%"=="3" (
|
|
|
|
|
+ net stop LongjoeAI
|
|
|
|
|
+ timeout /t 2 /nobreak >nul
|
|
|
|
|
+ net start LongjoeAI
|
|
|
|
|
+ if %errorlevel% equ 0 echo Service restarted successfully.
|
|
|
|
|
+) else if "%choice%"=="4" (
|
|
|
|
|
+ sc query LongjoeAI
|
|
|
|
|
+) else if "%choice%"=="5" (
|
|
|
|
|
+ exit
|
|
|
|
|
+) else (
|
|
|
|
|
+ echo 错误: 无效选择!
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+echo.
|
|
|
|
|
+pause
|
|
|
|
|
+"""
|
|
|
|
|
+
|
|
|
|
|
+ # 写入脚本文件
|
|
|
|
|
+ (deploy_dir / "service_install.bat").write_text(install_bat, encoding="utf-8")
|
|
|
|
|
+ (deploy_dir / "service_uninstall.bat").write_text(uninstall_bat, encoding="utf-8")
|
|
|
|
|
+ (deploy_dir / "service_manage.bat").write_text(manage_bat, encoding="utf-8")
|
|
|
|
|
+ print(
|
|
|
|
|
+ " ✅ 创建服务脚本: service_install.bat, service_uninstall.bat, service_manage.bat"
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
def main():
|
|
def main():
|
|
|
"""主函数"""
|
|
"""主函数"""
|
|
|
print_banner()
|
|
print_banner()
|
|
@@ -271,7 +477,7 @@ def main():
|
|
|
print("\n🚀 使用方法:")
|
|
print("\n🚀 使用方法:")
|
|
|
print(" 开发: python app.py")
|
|
print(" 开发: python app.py")
|
|
|
print(" 部署: 复制 build/deploy/ 到服务器")
|
|
print(" 部署: 复制 build/deploy/ 到服务器")
|
|
|
- print(" 运行: 执行 start.sh 或 start.bat")
|
|
|
|
|
|
|
+ print(" 运行: 执行 service_install.bat")
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if __name__ == "__main__":
|