基础设施 / 自托管 AI Agent
在非推荐环境中尝试运行:在 Windows Server 2019 上安装 OpenClaw(完整指南) #
OpenClaw 官方推荐使用 WSL2,但 Windows Server 2019 并不支持 WSL2。 尽管存在这一限制,我们仍坚持走原生 Windows 路线,成功克服了 WSL 障碍、npm 已知 bug、模块缺失、GPUStack 连接问题以及会话损坏 等十余个障碍,最终实现了控制台启动与对话能力。 我们将完整的操作步骤(包括各种坑点)以及我们为面临相同环境的用户创建的运维支持工具一并公开。
Windows Server 2019 并非 OpenClaw 官方支持的环境。 本文作为验证记录发布,不保证可正常运行。 不建议应用于生产环境。
为什么要在 Server 2019 上进行测试 #
我们公司内部运行着一台 Windows Server 2019 环境,希望能用 OpenClaw 直接控制该服务器。 如果使用 WSL2,Linux 环境会被隔离,对 Windows 文件系统、进程、注册表的访问都要经过 WSL 边界中转。 如果采用原生 Windows 安装,OpenClaw 可以直接调用 Windows API,这对服务器运维场景来说更为合理。
OpenClaw 官方同时支持 WSL2 与原生 Windows 两种方式。 WSL2 更加稳定,也是官方推荐的方式,但由于 Server 2019 不支持 WSL2,因此原生路线是唯一选择。
环境配置 #
OpenClaw 主机
- Windows Server 2019 Datacenter
- OpenClaw v2026.4.5(pnpm 安装)
- Node.js v22.14.0
- 网关端口:18789
模型与搜索后端
- GPUStack + vLLM 0.17.1
- Qwen2.5-14B-Instruct(Tesla V100 ×2)
- SearXNG(本地自建)
- Custom Provider(OpenAI 兼容)
确认 WSL2 不可用的过程 #
一开始,我们按照官方文档尝试执行 wsl --install。但从一开始就遇到了问题。
错误① wsl 无法识别 #
执行 wsl --install 时出现”‘wsl’ 不是可识别的命令”的错误。
我们通过 dism.exe 启用 WSL 功能并重启计算机后解决了该问题。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
错误② --install 选项无效 #
wsl.exe 存在,但 --install 和 --set-default-version 选项均无法生效。
原因是 wsl.exe 的版本过旧。
从 GitHub 获取最新的 MSI 也未能解决该问题。
经过调查,根本原因已经明确:Windows Server 2019 与 WSL2 不兼容,微软已决定不会为其回溯适配。 WSL2 仅在 Windows Server 2022 及更高版本上可用。
WSL2 自 Windows 10 Build 19041(2020 年 5 月更新)起可用;对于服务器版本,则需要 Windows Server 2022 及以上。 Windows Server 2019(Build 17763)不支持 WSL2。
坑点清单 #
① 未安装 Node.js #
install.ps1 未能成功安装 Node.js,导致 node、npm、openclaw 均无法识别。需要手动安装 MSI。
② openclaw 命令无法识别 #
npm 的全局安装路径未加入 PATH,且每次打开新的 PowerShell 窗口时都会消失。需要将其设置为机器级持久化。
③ npm 版本大量报出 MODULE_NOT_FOUND #
@larksuiteoapi/node-sdk、@slack/web-api、@buape/carbon、grammy 等模块相继缺失。这是 npm 2026.4.x 的已知 bug(issue #61787),改用 pnpm 后得以解决。
④ 未安装 Git #
npm 依赖解析需要 Git,但系统中并未安装。重试之前必须先安装 Git for Windows。
⑤ 需要执行 pnpm approve-builds #
安装 pnpm 之后,openclaw、sharp、koffi 等的构建脚本处于待批准状态。需要执行 pnpm approve-builds -g 全部批准后重新安装。
⑥ 残留的 NODE_OPTIONS 导致命令失败 #
沿用设置了 NODE_OPTIONS=--stack-size=65536 的会话,会导致之后所有 openclaw 命令都报”is not allowed in NODE_OPTIONS”错误。需要通过 $env:NODE_OPTIONS="" 清空该变量。
⑦ GPUStack 工具调用返回 400 错误 #
启动 vLLM 时未加 --enable-auto-tool-choice,导致出现 400 "auto" tool choice requires ... 错误。需要在 GPUStack 后端设置中添加该参数。
⑧ contextWindow 被误判为 16k #
即便模型本身支持更大上下文,OpenClaw 仍将其检测为 16000,导致频繁出现上下文溢出。需要在配置文件中手动将 contextWindow: 32768 改正。
⑨ 控制台显示 Internal Server Error #
npm 版本的安装包中未包含 dist/control-ui/,导致界面无法显示。改用 pnpm 版本后解决。
⑩ 会话被锁定为 heartbeat #
反复出现上下文溢出后,主会话被识别为 heartbeat,导致无法正常对话。需要删除 sessions 目录并重置。
⑪ 插件 RangeError 拖慢启动速度 #
amazon-bedrock、google、minimax 插件在启动时抛出 Maximum call stack size exceeded,造成数分钟的延迟。清空 NODE_OPTIONS 后得以解决。
⑫ store 字段警告 #
GPUStack 日志中反复出现 fields were present in the request but ignored: {'store'}。虽不影响运行,但说明 OpenClaw 发送了不必要的字段。
完整安装步骤 #
-
安装 Git for Windows
关闭并重新打开 PowerShell。
curl.exe -L -o git.exe "https://github.com/git-for-windows/git/releases/download/v2.47.1.windows.1/Git-2.47.1-64-bit.exe" .\git.exe /VERYSILENT /NORESTART Start-Sleep -Seconds 30 -
手动安装 Node.js 22 LTS
关闭并重新打开 PowerShell,用
curl.exe -L -o nodejs.msi "https://nodejs.org/dist/v22.14.0/node-v22.14.0-x64.msi" msiexec /i nodejs.msi /quiet /norestart Start-Sleep -Seconds 30node --version进行验证。 -
启用脚本执行并设置 pnpm
关闭并重新打开 PowerShell。
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force npm install -g pnpm pnpm setup -
使用 pnpm 安装 OpenClaw
pnpm add -g openclaw@2026.4.5 -
批准构建脚本并重新安装
OpenClaw 的构建大约需要 2 分钟。
pnpm approve-builds -g # Select all (space to select all) → Enter → y pnpm add -g openclaw@2026.4.5 -
将 PATH 持久化到 Machine 级别
$paths = @( 'C:\Program Files\nodejs', "$env:APPDATA\npm", "$env:LOCALAPPDATA\pnpm" ) $current = [System.Environment]::GetEnvironmentVariable('PATH','Machine') $entries = ($current -split ';') + $paths | Select-Object -Unique [System.Environment]::SetEnvironmentVariable('PATH', ($entries -join ';'), 'Machine') $env:PATH = ($entries -join ';') -
初始化配置(Onboarding)
在模型提供方处选择 Custom Provider,Base URL 填写 GPUStack 的
$env:NODE_OPTIONS="" openclaw onboard/v1端点,兼容模式选择OpenAI-compatible。 -
手动修正 contextWindow
请根据您的环境调整 provider 名称。
$config = Get-Content "$env:USERPROFILE\.openclaw\openclaw.json" | ConvertFrom-Json $config.models.providers.'custom-10-255-253-205'.models[0].contextWindow = 32768 $config.models.providers.'custom-10-255-253-205'.models[0].maxTokens = 8192 $config | ConvertTo-Json -Depth 20 | Set-Content "$env:USERPROFILE\.openclaw\openclaw.json" -Encoding UTF8 -
启动 Gateway 并验证运行状态
出现
$env:NODE_OPTIONS="" openclaw gateway run[gateway] ready后,打开另一个窗口执行openclaw dashboard。
GPUStack 配置(vLLM 后端参数) #
为启用工具调用(function calling)功能,请在 GPUStack 管理控制台中为该模型的后端参数添加以下内容。
会话恢复步骤 #
反复出现上下文溢出可能导致主会话被识别为 heartbeat,从而无法正常对话。此时可删除 sessions 目录进行重置。
openclaw gateway stop
Remove-Item "$env:USERPROFILE\.openclaw\agents\main\sessions" -Recurse -Force
New-Item "$env:USERPROFILE\.openclaw\agents\main\sessions" -ItemType Directory
openclaw gateway run
删除 sessions 目录会永久丢失对话历史。执行前请务必备份重要对话。
创建的运维支持工具:OpenClaw PATH Manager #
为消除手动配置 PATH 的繁琐工作,我们创建了一个 PowerShell 脚本以及一个基于浏览器的诊断 UI 工具。
PATH 诊断 UI(浏览器) #
这是一个带有 3 个选项卡的交互式工具。在 PowerShell 中运行”状态检查”选项卡里的命令并粘贴输出结果,它会自动诊断 Node.js、pnpm、npm、openclaw 的 PATH 是否配置正确。若存在问题,会自动切换到”PATH 修复”选项卡并显示修正命令。
ocstart.ps1(PowerShell) #
保存到桌面后双击即可打开菜单,用于配置 PATH、启动/停止 Gateway、打开 dashboard 与 TUI。省去了每次都要手动设置 PATH 的麻烦。
ocstart.ps1 的内容 #
param([switch]$Stop)
$env:NODE_OPTIONS=""
$paths = @(
'C:\Program Files\nodejs',
"$env:APPDATA\npm",
"$env:LOCALAPPDATA\pnpm"
)
foreach ($p in $paths) {
if (($env:PATH -split ';') -notcontains $p) { $env:PATH += ";$p" }
}
if ($Stop) {
Write-Host "Stopping Gateway..."
& openclaw gateway stop
exit
}
Write-Host "OpenClaw PATH configured"
Write-Host "openclaw: $((Get-Command openclaw -EA SilentlyContinue).Source)"
$action = Read-Host "[1] Start Gateway [2] Stop Gateway [3] Dashboard [4] TUI [5] Status`n> "
switch ($action) {
'1' { openclaw gateway run }
'2' { openclaw gateway stop }
'3' { openclaw dashboard }
'4' { openclaw tui }
'5' { openclaw gateway status; openclaw doctor }
default { Write-Host "Cancelled" }
}
保存到桌面并创建快捷方式 #
# Save script to desktop
$script | Out-File "$env:USERPROFILE\Desktop\ocstart.ps1" -Encoding UTF8
# Create shortcut
$ws = New-Object -ComObject WScript.Shell
$sc = $ws.CreateShortcut("$env:USERPROFILE\Desktop\OpenClaw Launcher.lnk")
$sc.TargetPath = "powershell.exe"
$sc.Arguments = '-ExecutionPolicy Bypass -File "C:\Users\Administrator\Desktop\ocstart.ps1"'
$sc.WorkingDirectory = "$env:USERPROFILE\Desktop"
$sc.IconLocation = "powershell.exe,0"
$sc.Save()
运行验证清单 #
- 在浏览器中可以显示控制台(
http://127.0.0.1:18789) - 模型提供方连接显示
Verification successful - 在
main会话中可以获得聊天回复 - GPUStack 日志中出现
POST /v1/chat/completions HTTP/1.1" 200 OK - Gateway 已注册为计划任务,登录后自动启动
- 已配置好 SearXNG 搜索
- 会话界面的 TOKENS 显示为
xxxxx / 32768(而非 16000)
总结 #
将 OpenClaw 部署到不受支持的 Windows Server 2019 环境中充满挑战,原因在于多个已知 bug 以及该环境特有的限制。 本次工作中最重要的三点经验如下:
- 使用 pnpm 而非 npm:npm 2026.4.x 存在破坏依赖关系的严重 bug
- 每次都要检查 PATH 与 NODE_OPTIONS:打开新窗口时它们会消失,建议用
ocstart.ps1实现自动化 - 在 GPUStack 的 vLLM 参数中添加
--enable-auto-tool-choice --tool-call-parser hermes:若不添加,工具调用会返回 400 错误
在 Windows Server 2019 上安装 OpenClaw 是可行的。 但使用 pnpm、持久化 PATH以及正确配置 GPUStack 后端参数是必不可少的。 如果能够迁移到支持 WSL2 的环境(Server 2022 及以上),那条路径会容易得多。