NSSM批处理脚本一键部署若依.NET8(UMP‑API)Windows服务

NSSM批处理脚本一键部署若依.NET8(UMP‑API)Windows服务

实现两个脚本:install‑ump‑service.bat(安装注册服务)、restart‑ump‑service.bat(重启服务),无需手动点NSSM图形界面,管理员双击脚本完成服务安装配置。

目录布局规划

项目根目录:D:\ump\

D:\ump\
├─ install-ump-service.bat     # 安装服务脚本
├─ restart-ump-service.bat     # 重启服务脚本
├─ nssm.exe                    # NSSM工具64位程序
├─ app\                        # .NET8若依后端发布输出目录
│  └─ RuoYi.Admin.exe          # 后端主程序
└─ logs\                       # 服务标准输出、错误日志目录(脚本自动创建)

⚠️重要:两个bat脚本必须放在D:\ump\根目录,不要放到app子文件夹;运行脚本必须右键【以管理员身份运行】。

脚本1:install‑ump‑service.bat(安装注册服务)

文件名:install‑ump‑service.bat

@echo off
rem ============================================================
rem Install UMP backend as a Windows service (NSSM, run as Administrator)
rem Layout: this script sits in D:\ump\ together with:
rem   app\          backend publish output (contains RuoYi.Admin.exe)
rem   nssm.exe      NSSM tool
rem Logs go to D:\ump\logs\
rem ============================================================
set BASE=%~dp0
set SERVICE=UMP-API

if not exist "%BASE%nssm.exe" (
    echo [ERROR] %BASE%nssm.exe not found. Put NSSM there first.
    pause & exit /b 1
)
if not exist "%BASE%app\RuoYi.Admin.exe" (
    echo [ERROR] %BASE%app\RuoYi.Admin.exe not found. Put backend publish output there.
    pause & exit /b 1
)

if not exist "%BASE%logs" mkdir "%BASE%logs"

rem remove old service if exists
nssm stop %SERVICE% >nul 2>&1
nssm remove %SERVICE% confirm >nul 2>&1

nssm install %SERVICE% "%BASE%app\RuoYi.Admin.exe"
nssm set %SERVICE% AppDirectory "%BASE%app"
nssm set %SERVICE% AppEnvironmentExtra ASPNETCORE_ENVIRONMENT=Production ASPNETCORE_URLS=[http://127.0.0.1:5008](http://127.0.0.1:5008)
nssm set %SERVICE% AppStdout "%BASE%logs\api-out.log"
nssm set %SERVICE% AppStderr "%BASE%logs\api-err.log"
nssm set %SERVICE% AppRotateFiles 1
nssm set %SERVICE% Start SERVICE_AUTO_START
nssm start %SERVICE%

echo.
echo Service %SERVICE% started, listening on [http://127.0.0.1:5008](http://127.0.0.1:5008)
echo Verify: curl [http://127.0.0.1:5008/captchaImage](http://127.0.0.1:5008/captchaImage)
pause

脚本逻辑说明

  1. set BASE=%~dp0 获取脚本所在根目录,不写死绝对路径,脚本移动位置也可以运行;
  2. 前置校验:检测nssm.exe、后端exe是否存在,缺失直接报错退出;
  3. 自动创建logs日志文件夹;
  4. 先停止+卸载旧服务,避免重复注册;
  5. NSSM命令行配置全部参数:
    • 工作目录指向app发布目录
    • 环境变量:生产模式 Production,监听地址[http://127.0.0.1:5008](http://127.0.0.1:5008)
    • 标准输出、错误输出日志分别写入api-out.log、api-err.log,开启日志轮转
    • 设置服务启动类型:自动开机启动
  6. 安装完成自动启动服务,给出验证访问命令。

如果需要外部机器访问,把环境变量里面地址改为 [http://0.0.0.0:5008](http://0.0.0.0:5008)。

脚本2:restart‑ump‑service.bat(重启服务脚本)

文件名:restart‑ump‑service.bat

@echo off
rem ============================================================
rem Restart UMP backend service and verify (run as Administrator)
rem Usage: restart-ump-service.bat   (keep this file next to nssm.exe, e.g. D:\ump\)
rem Notes:
rem   - appsettings*.json changed: run this script
rem   - nginx conf changed: run in nginx dir "nginx -t" then "nginx -s reload" (no restart)
rem   - frontend dist replaced: nothing to restart, hard-refresh browser (Ctrl+F5)
rem ============================================================
set SERVICE=UMP-API
set BASE=%~dp0

"%BASE%nssm.exe" status %SERVICE% >nul 2>&1
if errorlevel 1 (
    echo [ERROR] service %SERVICE% not found. Run install-ump-service.bat first.
    pause & exit /b 1
)

echo Restarting %SERVICE% ...
"%BASE%nssm.exe" restart %SERVICE%
if errorlevel 1 (
    echo [ERROR] restart failed. Check logs: %BASE%logs\api-err.log
    pause & exit /b 1
)

rem give kestrel a few seconds to bind the port
timeout /t 5 /nobreak >nul

"%BASE%nssm.exe" status %SERVICE%
echo.
echo Listening check on port 5008:
netstat -ano | findstr ":5008" | findstr "LISTENING"
if errorlevel 1 (
    echo [WARN] port 5008 not listening yet, check %BASE%logs\api-err.log
) else (
    echo OK. API is up on [http://127.0.0.1:5008](http://127.0.0.1:5008)
)
pause

脚本逻辑说明

  1. 校验服务是否已经注册,未注册提示先执行安装脚本;
  2. 调用NSSM重启服务;重启失败提示查看错误日志;
  3. 等待5秒等待Kestrel完成端口绑定;
  4. 使用netstat检测5008端口是否处于监听状态,输出状态;
  5. 使用场景:修改appsettings.json配置、替换后端发布文件后执行此脚本;
  6. 备注提示:Nginx修改配置只reload,前端静态资源更新浏览器Ctrl+F5硬刷新,不需要重启后端服务。

使用操作步骤

  1. 把NSSM的64位nssm.exe放到D:\ump\根目录;
  2. 将.NET8若依后端发布全部输出拷贝到D:\ump\app\;
  3. 将上面两个bat脚本保存到D:\ump\根目录;
  4. 右键install‑ump‑service.bat → 以管理员身份运行,自动完成注册并启动服务;
  5. 修改配置/更新后端程序:先停止服务,覆盖app目录文件,执行restart‑ump‑service.bat;
  6. 查看日志:D:\ump\logs\api‑err.log 排查启动报错。

常用补充命令(管理员cmd)

# 查看服务状态
nssm status UMP-API

# 手动停止服务
nssm stop UMP-API

# 手动卸载服务
nssm remove UMP-API confirm

踩坑要点

  1. 脚本必须管理员权限运行,否则注册Windows服务会失败;
  2. 默认监听127.0.0.1仅本机访问,外网访问改为0.0.0.0:5008,放行防火墙5008端口;
  3. 服务启动失败优先看api‑err.log,常见原因:数据库连接错误、端口占用、配置文件错误;
  4. 更新程序:不要直接覆盖文件,先停止服务,替换完成后再重启。

全部直接复制粘贴博客园Markdown即可发布。

posted @ 2026-10-30 14:03  摩诘  阅读(7)  评论(0)    收藏  举报