Windows
在控制台里运行
Section titled “在控制台里运行”-
装 Node 26(官方安装包)。
-
解压
nextskin-<版本>.zip,用资源管理器解压也行(包里没有符号链接,路径也不长)。 -
在
nextskin目录里打开 PowerShell:终端窗口 node nextskin.mjs start第一次启动生成
.env,备份它。安装码在data\setup-code,打开http://localhost:3000/setup建站。 -
停止:按 Ctrl+C,核心先收尾,最多 30 秒,到时强制结束;再按一次 Ctrl+C 立即强制结束。强制结束时日志里记一条“强制结束”。不要直接关窗口:Windows 大约 5 秒后就强制结束进程,核心来不及收尾(进程不会残留)。
前面有同机的反向代理(IIS、nginx、Caddy)时,在 .env 里加一行 NEXTSKIN_HOST=127.0.0.1,Windows 防火墙也不用放行 3000。反向代理要带的请求头见反向代理与 HTTPS。
做成服务:NSSM
Section titled “做成服务:NSSM”服务停止时必须发 Ctrl+C 并等够 40 秒,直接结束进程会让核心来不及收尾。NSSM 能做到:
nssm install NextSkin "C:\Program Files\nodejs\node.exe" "C:\nextskin\nextskin.mjs start"nssm set NextSkin AppDirectory C:\nextskinnssm set NextSkin AppStopMethodSkip 6 # 先发 Ctrl+C,跳过 WM_CLOSE 和 WM_QUITnssm set NextSkin AppStopMethodConsole 40000 # Ctrl+C 之后等 40 秒,默认 1.5 秒nssm set NextSkin AppExit 78 Exit # 配置错误不重启nssm start NextSkin-
服务账户(默认 LocalSystem)要能写
C:\nextskin:第一次启动要在这里生成.env、在data下建库。换成专用账户时给它这两处的写权限。 -
直接建在 C 盘根下的目录默认继承“Authenticated Users:修改”:本机的任何账户都能改程序、读
.env,而服务以 LocalSystem 运行。装服务之前在管理员 PowerShell 里收紧权限,只留 SYSTEM 和管理员(换成专用账户时再加上/grant 账户:(OI)(CI)M):终端窗口 icacls C:\nextskin /inheritance:r /grant:r "*S-1-5-18:(OI)(CI)F" "*S-1-5-32-544:(OI)(CI)F" -
命令行在以管理员身份打开的 PowerShell 里运行:控制通道的命名管道只让 SYSTEM、管理员和运行服务的账户连接,普通的 PowerShell 会报“没有权限连接管理进程”。换成专用账户时用那个账户运行;用别的账户时,
data里新建的文件服务可能读写不了。 -
日志在
C:\nextskin\data\logs\nextskin.log,按后台“设置 → 高级”里的上限轮换,不用设 NSSM 的AppStdout、AppStderr。服务起不来、以 78 退出(配置错误)时,原因只写终端、NSSM 不记:在管理员 PowerShell 里运行node nextskin.mjs doctor看哪一项失败。 -
核对:
nssm stop NextSkin之后日志里应该有启动器按顺序停止核心的记录(“正在停止核心”)。几秒内就被结束、没有这些记录,说明 Ctrl+C 没送到。事件日志里 NSSM 每次停服务都会记“Killing process …”,正常收尾时也一样,以nextskin.log为准。 -
核心收尾超过 3 秒时,
nssm stop会先返回并报Unexpected status SERVICE_STOP_PENDING in response to STOP control.,服务其实还在停。要动文件(比如手动升级)之前,等sc.exe query NextSkin显示STOPPED。
- 后台“更新”页能一键升级,见升级与回退。运行服务的账户要能写
releases\。 - 控制通道是命名管道:能连上的只有运行服务的账户、SYSTEM 和以管理员身份运行的进程,请求还要带上
releases\manager.token里的令牌。 - 杀毒软件会扫刚解压的发行包,扫完之前目录改不了名:准备时最多等一分钟左右(实测卡巴斯基要几秒)。
- 替换
releases\current.json时文件被占着会重试几秒。切换时还写不进去就照旧运行原来的版本;指针写不回去时结果里会写明,重启服务之前把current.json改成指向哪个版本。删不掉的旧版本目录留到下次启动再删,不影响站点。 - 手动升级:停服务(等到
STOPPED)→ 备份data和.env→ 用资源管理器或Expand-Archive -Force把新的 ZIP 覆盖解压到原目录 → 启动。