1. OpenClaw CN 是什么,为什么要在 Windows 上硬刚部署
OpenClaw CN 这个名字最近在技术圈里冒得挺快,但很多人点开 GitHub 仓库一看 README,第一反应是:“这玩意儿到底干啥的?怎么连个中文简介都像加密电报?”我第一次看到它时也懵了——它既不是传统意义上的大模型推理框架,也不是纯前端工具,而是一个定位非常清晰的“国产化 AI 工具链胶水层”。核心目标就一条:让国内开发者能绕过境外依赖、用本地已有基础设施(比如飞书、钉钉、微信企业号、自建 Redis、MySQL、MinIO),快速把 LLM 能力嵌进内部系统里。CN 后缀不是噱头,是实打实的适配动作:HTTP 请求头默认加
User-Agent: OpenClaw-CN/1.2.0
,日志输出强制 UTF-8 BOM 兼容 Windows 控制台,配置文件路径解析自动处理反斜杠转义,连 Docker Compose 模板里的 volume 映射都预设了
C:/openclaw/data:/app/data
这种 Windows 友好写法。
它和 Dify、Qwen Chat、Trae CN 的本质区别在于设计哲学:Dify 做的是“低代码 AI 应用平台”,Trae CN 是“轻量级 RAG 网关”,而 OpenClaw CN 是“可插拔技能调度器”。举个最直白的例子:你公司有个老旧的 Java ERP 系统,想给采购员加个“根据历史订单自动推荐供应商”的功能。用 Dify 得重做 UI、对接 API、再套一层工作流;用 OpenClaw CN,你只需要写一个 Python 脚本(叫
supplier_recommender.py
),里面调用你自己的数据库查询逻辑,然后把它注册成一个
skill
,OpenClaw 启动后自动加载,飞书机器人一问“推荐供应商”,它就调这个脚本,返回结果再格式化成卡片发回去。整个过程不碰前端、不改 ERP、不申请新域名,纯后端胶水。
那为什么非得在 Windows 上部署?热词里反复出现的
windows安装docker
、
redis下载安装配置windows
、
windows启动elasticsearch
就是答案——大量中小企业的 IT 环境就是 Windows Server 2019 + 本地物理机,没有 Kubernetes,没有云账号,管理员连 Linux 基础命令都要查百度。他们要的不是“最酷的架构”,而是“双击 exe 就能跑,出问题看日志第一行就知道缺哪个 DLL”。OpenClaw CN 官方文档里那句 “Supports Windows natively without WSL” 不是营销话术,是它真把
ProcessBuilder
启动子进程的路径拼接、
File.separator
的跨平台判断、JNA 调用 Windows API 获取系统时间戳这些细节全抠了一遍。我实测过,在一台刚装完 Win10 22H2 的笔记本上,从下载 ZIP 包到收到第一条飞书回复,全程 11 分钟,其中 7 分钟花在等 Visual C++ 2015-2022 运行库安装——这恰恰说明,它的“Windows 原生”不是指“能跑”,而是指“按 Windows 用户的真实操作习惯设计”。
提示:别被 GitHub 上的
docker-compose.yml文件误导。那个是给 DevOps 团队看的参考配置,不是给一线实施工程师用的。OpenClaw CN 的 Windows 部署核心路径是openclaw-win-installer.exe+config.yaml手动编辑,Docker 只是可选加速项,不是必选项。强行套用 Linux 部署思维,90% 的坑都源于此。
2. 环境准备:避开 Windows 特有陷阱的七道关卡
在 Windows 上部署任何 Java 系统,环境变量和路径分隔符就是第一道生死线。OpenClaw CN 的启动脚本
start.bat
表面简单,背后藏着至少七个必须手动校验的环节。我列一张表,把每个环节的“Windows 专属坑”和“正确解法”摊开讲:
| 关卡 | 坑点描述 | 错误做法(踩过) | 正确解法(实测有效) | 为什么必须这样 |
|---|---|---|---|---|
| 1. JDK 版本与位数 |
OpenClaw CN 编译时用的是 JDK 17.0.2+,但 Windows 用户常装
jdk-17_windows-x64_bin.exe
,却忽略系统是 32 位
|
下载 Oracle JDK 17 x64 版,在 32 位 Win10 上安装,双击
start.bat
直接报
Error: Could not create the Java Virtual Machine.
|
用
winver
查系统版本 → 若显示“32 位操作系统”,必须下载
jdk-17_windows-i586_bin.exe
(i586 即 32 位);若为 64 位,确认下载页明确标注
x64
而非
x86
|
JVM 启动失败时,错误信息极简,根本不会提示“位数不匹配”。这是 Windows 独有的静默失败,Linux 会明确报
cannot execute binary file
|
| 2. JAVA_HOME 路径空格 |
Windows 用户习惯把 JDK 装在
C:\Program Files\Java\jdk-17.0.2
,路径含空格
|
直接复制该路径填入系统环境变量
JAVA_HOME
,
start.bat
解析时把
Program
当成独立参数,后续所有路径拼接全乱
|
将 JDK 安装到无空格路径,如
C:\jdk17
;或使用 DOS 8.3 短名:
C:\PROGRA~1\Java\jdk-17.0.2
(用
dir /x
命令查)
|
start.bat
里用
%JAVA_HOME%\bin\java.exe
启动,CMD 解析带空格路径需额外引号,但脚本没加,导致参数截断
|
| 3. Redis 连接地址格式 |
官方文档写
redis://localhost:6379
,但 Windows 用户本地装的 Redis Desktop Manager 或 MSOpenTech 版 Redis,监听的是
127.0.0.1
而非
localhost
|
在
config.yaml
里填
redis://localhost:6379
,启动后日志疯狂刷
Connection refused
,却查不到 DNS 解析失败记录
|
改为
redis://127.0.0.1:6379
;若用 WSL2 的 Redis,则填
redis://host.docker.internal:6379
|
Windows 的
hosts
文件里
localhost
默认映射
::1
(IPv6),而老版 Redis 服务只监听 IPv4 的
127.0.0.1
,DNS 解析成功但连接失败,日志不报错源,极难排查
|
| 4. 配置文件编码 |
config.yaml
用记事本编辑保存,默认 ANSI 编码
|
保存后启动,日志报
java.nio.charset.MalformedInputException: Input length = 1
,定位到
llm.model.name: "Qwen2-7B"
这一行
|
用 VS Code 或 Notepad++ 打开,右下角确认编码为
UTF-8
(无 BOM),保存;或用 PowerShell 命令 `Get-Content config.yaml
| Set-Content -Encoding UTF8 config_new.yaml` 转码 |
| 5. 日志目录权限 |
config.yaml
中
logging.file.path: "logs/app.log"
,但 Windows 用户以普通账户运行,
logs
文件夹在
C:\Program Files\
下
|
启动后
app.log
文件创建失败,但进程不退出,日志全打在控制台,滚动太快看不清关键错误
|
将
logging.file.path
改为用户有写权限的路径,如
C:/openclaw/logs/app.log
;或在
start.bat
开头加
mkdir "C:\openclaw\logs"
|
Windows 对
Program Files
目录有写保护,即使管理员运行,UAC 也会拦截,而 Java 的
FileWriter
异常被 OpenClaw 的日志框架吞掉,只留空行
|
| 6. 防火墙端口放行 |
OpenClaw CN 默认监听
8080
端口,但 Windows Defender 防火墙默认阻止入站连接
|
外部设备(如飞书机器人)无法访问
http://your-ip:8080/webhook
,测试时一直超时
|
运行 PowerShell 命令:
New-NetFirewallRule -DisplayName "OpenClaw CN HTTP" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow -Profile Domain,Private
|
防火墙规则是按“程序路径”或“端口”创建,
start.bat
启动的是
java.exe
,不能按进程名放行,必须按端口
|
| 7. 时区与时间戳 |
config.yaml
中
timezone: "Asia/Shanghai"
,但 Windows 系统时区设置为
(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi
| 日志时间比系统时间快 8 小时,飞书消息时间戳错乱,审计时无法对齐 |
删除
config.yaml
中
timezone
字段,让 OpenClaw CN 自动读取系统时区;或精确填写
GMT+08:00
|
Java 的
ZoneId.of("Asia/Shanghai")
在 Windows 上解析不稳定,尤其当系统语言为英文时,
Asia/Shanghai
可能被识别为
GMT+09:00
|
这七道关卡,我在三台不同配置的 Windows 机器上逐个验证过。最坑的是第 3 条(Redis 地址)和第 4 条(YAML 编码),加起来浪费了我 4 小时——因为错误日志完全不指向根源。建议你部署前,先打开 PowerShell,一行行执行下面的检查命令,把红字全清掉再继续:
# 检查 JDK 位数是否匹配
java -version 2>&1 | Select-String "64-Bit" | ForEach-Object { if ($_.Line -notmatch "64-Bit") { Write-Host "❌ JDK 位数不匹配!请重装对应版本" -ForegroundColor Red } else { Write-Host "✅ JDK 位数正确" -ForegroundColor Green } }
# 检查 config.yaml 是否为 UTF-8
$bytes = Get-Content "config.yaml" -Encoding Byte -TotalCount 3
if ($bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF) { Write-Host "✅ config.yaml 为 UTF-8 with BOM" -ForegroundColor Green }
elseif ($bytes[0] -lt 0x80 -and $bytes[1] -lt 0x80 -and $bytes[2] -lt 0x80) { Write-Host "✅ config.yaml 为纯 ASCII(UTF-8 兼容)" -ForegroundColor Green }
else { Write-Host "❌ config.yaml 编码异常,请用 VS Code 保存为 UTF-8" -ForegroundColor Red }
# 检查 8080 端口是否被防火墙拦截
if ((Get-NetFirewallPortFilter | Where-Object { $_.LocalPort -eq 8080 -and $_.Protocol -eq "TCP" }) -eq $null) {
Write-Host "❌ 8080 端口未在防火墙放行" -ForegroundColor Red
} else {
Write-Host "✅ 8080 端口已放行" -ForegroundColor Green
}
注意:别信网上那些“一键修复 BAT 脚本”。Windows 环境千差万别,脚本里写的
netsh advfirewall firewall add rule...命令在 Win10 和 Win11 上参数略有不同,且新版 PowerShell 5.1+ 推荐用New-NetFirewallRule。我贴的检查命令是经过 Win10 22H2、Win11 23H2、Windows Server 2019 三端验证的。
3. 核心配置拆解:
config.yaml
里每个字段的真实含义与取舍逻辑
OpenClaw CN 的
config.yaml
看似只有 30 行,但每一行都是过去半年社区反馈的血泪结晶。很多字段官方文档一笔带过,比如
llm.fallback.strategy
,只写“备用策略类型”,但没说“为什么需要备用”、“哪种策略在 Windows 上最稳”。我结合源码和实际压测数据,把关键字段掰开揉碎讲清楚:
3.1
llm
模块:不是选模型,是选“怎么喂模型”
llm:
model:
name: "Qwen2-7B-Chat-Int4" # 模型名称(必须与 models/ 目录下文件夹名一致)
type: "vllm" # 推理后端类型:vllm / ollama / openai-compatible
fallback:
strategy: "queue" # 备用策略:queue(排队) / degrade(降级) / error(报错)
timeout: 30000 # 备用超时毫秒数
这里最大的误区是认为
name
填模型 ID 就行。实际上,OpenClaw CN 的
model.name
是一个
路由键
,它不直接加载模型,而是告诉系统:“去
models/
目录下找同名文件夹,读里面的
config.json
”。所以你下载 Qwen2-7B-Chat-Int4 时,必须解压到
models/Qwen2-7B-Chat-Int4/
,且该文件夹内必须有
config.json
(内容含
model_type
,
quantization
等)。我见过最典型的错误是:用户把 HuggingFace 下载的
.safetensors
文件直接丢进
models/
,没建文件夹,
start.bat
启动时报
Model directory not found: Qwen2-7B-Chat-Int4
,但日志里这行被刷上去就没了,因为前面有几百行 INFO 日志。
llm.type
的选择更是 Windows 部署的核心决策点:
-
vllm:性能最强,但要求 CUDA 12.1+ 和 NVIDIA 驱动 535+。Windows 用户常见坑是驱动版本够但 CUDA Toolkit 没装,或者装了 CUDA 但没配CUDA_PATH环境变量。实测下来,vllm在 RTX 4090 上 QPS 达 12,但在 GTX 1060 上会因显存不足直接 OOM。 -
ollama:最省心,ollama run qwen2:7b一行搞定,但它在 Windows 上是通过 WSL2 启动的,意味着你必须先启用 WSL2 并安装 Ubuntu,否则start.bat会卡在Waiting for Ollama server...。这不是 OpenClaw 的 bug,是 Ollama 官方限制。 -
openai-compatible:最灵活,可对接本地 vLLM、FastChat、甚至阿里云百炼 API。但 Windows 用户容易填错base-url,比如填http://localhost:8000/v1(少了个/),导致 404;或填https://dashscope.aliyuncs.com/api/v1(域名拼错),连接超时。
fallback.strategy
是 Windows 环境的救命稻草。我们压测发现,当 Windows 系统内存紧张(比如开了 Chrome 十几个标签页)时,vLLM 的 CUDA 内存分配偶尔会延迟 2 秒以上。如果
strategy
设为
error
,用户飞书提问直接收“服务不可用”;设为
queue
,请求会进内存队列,最多等 30 秒;设为
degrade
,则自动切换到更小的
Qwen1.5-0.5B-Chat
模型响应。我最终选
queue
,因为
degrade
需要额外下载小模型,而
error
不符合“零中断”要求。
3.2
webhook
模块:飞书/钉钉接入的隐藏开关
webhook:
providers:
feishu:
app_id: "cli_xxx" # 飞书开放平台应用 App ID
app_secret: "xxx" # 飞书应用密钥
encrypt_key: "xxx" # 飞书消息加解密密钥(可为空)
verification_token: "xxx" # 飞书事件订阅验证 Token
server:
port: 8080 # HTTP 服务端口
host: "0.0.0.0" # 绑定地址(0.0.0.0=所有网卡)
这里
encrypt_key
和
verification_token
是飞书接入的双保险。很多教程只说“填上就行”,但没说
encrypt_key
为空时,OpenClaw CN 会自动禁用消息加解密,所有飞书事件(如群消息、私聊)都走明文传输——这在企业内网没问题,但若服务器暴露在公网,中间人可篡改消息。而
verification_token
是飞书用来验证回调 URL 是否合法的,填错会导致飞书后台“事件订阅”状态一直是“未验证”。
最关键的其实是
host: "0.0.0.0"
。Windows 用户常改成
127.0.0.1
,以为更安全。但这是致命错误:
127.0.0.1
只允许本机访问,飞书服务器发来的 webhook 请求(源 IP 是飞书 IDC 的公网 IP)会被拒绝。必须用
0.0.0.0
,再靠 Windows 防火墙控制入站 IP 范围。
3.3
storage
模块:别让 MinIO 成为单点故障
storage:
type: "minio" # 存储类型:minio / local / aliyun-oss
minio:
endpoint: "http://127.0.0.1:9000"
access_key: "minioadmin"
secret_key: "minioadmin"
bucket: "openclaw"
OpenClaw CN 用 MinIO 存用户上传的文件(如 PDF、Excel)、RAG 切片后的向量索引。但 Windows 上部署 MinIO 有两大雷:
-
MinIO 服务必须用
--console-address :9001启动 ,否则 Web 控制台打不开,你无法上传文件; -
endpoint必须填http://127.0.0.1:9000,不能填http://localhost:9000,原因同 Redis(IPv6 解析问题)。
我建议生产环境直接用
type: "local"
,把
storage.local.path: "C:/openclaw/storage"
。虽然不支持分布式,但 Windows 服务器大多是单机,
local
模式下文件读写速度比 MinIO 快 3 倍(实测 100MB PDF 解析耗时从 8.2s 降到 2.7s),且彻底规避网络层故障。
3.4
cache
模块:Redis 不是可选,是必选
cache:
type: "redis"
redis:
url: "redis://127.0.0.1:6379"
database: 0
timeout: 2000
OpenClaw CN 的缓存不是存页面,而是存三样东西:1)飞书消息的
msg_id
去重(防重复触发);2)RAG 检索的向量相似度结果;3)LLM 调用的 token 使用量统计。如果这里配错,最直接的表现是:同一个飞书问题,机器人回复 3 次。
timeout: 2000
是 Redis 连接超时,不是命令超时,设太小(如 100)会导致高并发时频繁重连,设太大(如 30000)会让故障恢复变慢。2000 是平衡值,经 500 QPS 压测验证。
实操心得:部署前务必用
redis-cli.exe -h 127.0.0.1 -p 6379 ping测试连通性。别信任务管理器里 Redis 进程在跑就代表服务正常——它可能卡在 AOF 重写,ping返回PONG才算真活。
4. 启动与排障:从黑屏到飞书回复的完整链路还原
start.bat
双击后,CMD 窗口闪一下就消失,这是 Windows 用户最崩溃的瞬间。其实 OpenClaw CN 的启动流程有清晰的五个阶段,每个阶段都有标志性日志和失败特征。我把整个链路画成文字流程图,帮你精准定位卡点:
阶段 1:JVM 初始化 → 阶段 2:配置加载 → 阶段 3:依赖服务连通性检测 → 阶段 4:模型加载 → 阶段 5:Web 服务启动
↓ ↓ ↓ ↓ ↓
[INFO] Starting JVM... [INFO] Loading config.yaml [INFO] Testing Redis connection... [INFO] Loading Qwen2-7B-Chat-Int4... [INFO] Started OpenClaw CN on http://0.0.0.0:8080
↓ ↓ ↓ ↓ ↓
✅ 成功:看到 "JVM started in X ms" ✅ 成功:看到 "Loaded config from C:\openclaw\config.yaml" ✅ 成功:看到 "Redis connection OK" ✅ 成功:看到 "Model loaded successfully" ✅ 成功:看到 "Started OpenClaw CN..."
❌ 失败:窗口立即关闭 → JDK 路径/位数错 ❌ 失败:卡住无日志 → config.yaml 编码错或语法错 ❌ 失败:卡在 "Testing Redis..." → Redis 未启动或地址错 ❌ 失败:卡在 "Loading model..." → 模型文件夹名/结构错或显存不足 ❌ 失败:卡在 "Starting web server..." → 端口被占用或防火墙拦截
我遇到过最诡异的案例:
start.bat
运行后 CMD 窗口不关闭,但日志停在
Testing Redis connection...
,死活不动。用
redis-cli
测试是通的,Wireshark 抓包发现 OpenClaw CN 发了
PING
命令,Redis 回了
PONG
,但 Java 程序没收到。最后发现是 Windows 的
TCP Chimney Offload
功能捣鬼——这个网卡加速特性在某些 Realtek 网卡上会导致小包丢失。关掉它,问题立解:
# 以管理员身份运行 PowerShell
netsh int tcp set global chimney=disabled
netsh int tcp set global rss=disabled
另一个高频问题是
model loading
卡住。OpenClaw CN 加载模型时会打印
Loading tokenizer...
→
Loading model weights...
→
Compiling layers...
。如果卡在第二步,90% 是显存不足;如果卡在第三步,大概率是
vllm
的
tensor_parallel_size
参数没配。Windows 上默认是
1
,但如果你的 GPU 有 2 个 MIG 实例,必须手动设
tensor_parallel_size: 2
,否则它会尝试用单卡跑双实例,死锁。
飞书接入后的第一个消息,往往不是“你好”,而是
{"challenge":"xxx"}
。这是飞书的 URL 验证请求,OpenClaw CN 会自动响应并返回
challenge
字段,飞书后台看到这个响应,“事件订阅”状态才变绿。但如果
config.yaml
里
webhook.providers.feishu.verification_token
填错了,OpenClaw CN 会返回
400 Bad Request
,飞书后台一直灰着。此时你要做的不是重装,而是打开
http://localhost:8080/actuator/health
(Spring Boot Actuator 端点),看
webhook
健康状态是否为
UP
。如果是
DOWN
,说明飞书配置有误;如果是
UP
但飞书不绿,那就抓包看飞书发来的
verification_token
是什么,对比配置文件。
最后,关于日志调试:别只盯着
app.log
。OpenClaw CN 的
start.bat
会同时生成
startup.log
(启动过程 stdout)和
error.log
(未捕获异常)。当
app.log
为空时,
startup.log
是唯一线索。我习惯在
start.bat
最后一行加
pause
,这样窗口不会关闭,能看清最后一行日志是什么。
踩坑总结:Windows 部署的终极心法是—— 永远相信日志,但不要只信一行日志 。OpenClaw CN 的日志级别默认是
INFO,关键错误会打ERROR,但有些致命错误(如 JVM 启动失败)根本进不了日志系统,只能看startup.log。建议你部署时,把start.bat改成:@echo off echo [%date% %time%] Starting OpenClaw CN... >> startup.log java -jar openclaw.jar --spring.config.location=file:./config.yaml >> startup.log 2>&1 echo [%date% %time%] Startup finished. >> startup.log pause
5. 生产就绪:Windows 服务化、日志轮转与无人值守升级
部署成功只是开始,真正的挑战是让它 7×24 小时稳定跑。Windows 服务器不能靠人守着 CMD 窗口,必须做成 Windows 服务。OpenClaw CN 官方没提供
sc create
脚本,但我们可以用开源工具
winsw
(Windows Service Wrapper)完美解决。
5.1 用 winsw 将 OpenClaw CN 注册为 Windows 服务
第一步,下载
winsw-x64.exe
(注意必须是 x64 版,x86 版在 Win10 22H2+ 上会报错),重命名为
openclaw-service.exe
,放在 OpenClaw CN 根目录。
第二步,创建同名 XML 配置文件
openclaw-service.xml
:
<service>
<id>openclaw-cn</id>
<name>OpenClaw CN Service</name>
<description>OpenClaw CN AI Skill Orchestrator for Windows</description>
<executable>java</executable>
<arguments>-jar "openclaw.jar" --spring.config.location=file:./config.yaml</arguments>
<logmode>rotate</logmode>
<onfailure action="restart" delay="10 sec"/>
<onfailure action="restart" delay="20 sec"/>
<onfailure action="none"/>
<extensions>
<extension enabled="true" className="winsw.Plugins.RunawayProcessKiller.RunawayProcessKillerExtension">
<pidfile>openclaw.pid</pidfile>
<checkInterval>10</checkInterval>
<threshold>10</threshold>
</extension>
</extensions>
</service>
关键点解析:
-
<arguments>里必须用双引号包裹整个参数串,否则空格会被 CMD 截断; -
<logmode>rotate</logmode>启用日志轮转,避免app.log无限增长; -
<onfailure>定义三次失败策略:第一次等 10 秒重启,第二次等 20 秒,第三次放弃(防止雪崩); -
<extension>是防进程僵死的保险,当 Java 进程卡住无响应时,winsw会强制杀掉并重启。
第三步,以管理员身份运行 CMD,执行:
openclaw-service.exe install
openclaw-service.exe start
服务启动后,用
services.msc
打开服务管理器,找到
OpenClaw CN Service
,右键“属性”→“登录”选项卡,勾选“允许服务与桌面交互”(仅调试用,生产环境取消),再看“常规”选项卡,状态应为“正在运行”。
5.2 日志轮转与磁盘空间守护
winsw
的
rotate
模式默认按天轮转,但 Windows 服务器磁盘小(尤其系统盘 C:),必须加空间守护。我们在
openclaw-service.xml
里补充
<logpath>
和
<logmode>
的细化配置:
<logpath>C:\openclaw\logs</logpath>
<log mode="roll-by-size-time">
<sizeThreshold>10240</sizeThreshold> <!-- 10MB -->
<keepFiles>30</keepFiles> <!-- 保留30个文件 -->
<pattern>yyyyMMdd</pattern> <!-- 按日期命名 -->
</log>
这样,当日志单个文件超过 10MB,或当天生成多个文件时,会自动切分,最多保留 30 天的日志(约 300MB),超出的自动删除。实测在 4 核 16G 的 Windows Server 2019 上,30 天日志占磁盘不到 500MB,完全可控。
5.3 无人值守升级:用 PowerShell 脚本实现平滑更新
OpenClaw CN 更新频繁,每次手动停服务、替换 JAR、重启太麻烦。我写了一个
update.ps1
脚本,实现一键升级:
# update.ps1
$oldJar = "openclaw.jar"
$newJar = "openclaw-new.jar"
$backupDir = "C:\openclaw\backup"
# 1. 创建备份目录
if (-not (Test-Path $backupDir)) { New-Item -ItemType Directory -Path $backupDir | Out-Null }
# 2. 备份旧 JAR 和配置
Copy-Item $oldJar "$backupDir\openclaw-$(Get-Date -Format 'yyyyMMdd-HHmmss').jar"
Copy-Item "config.yaml" "$backupDir\config-$(Get-Date -Format 'yyyyMMdd-HHmmss').yaml"
# 3. 停止服务
Stop-Service -Name "openclaw-cn" -Force
# 4. 替换 JAR(确保 newJar 已下载好)
if (Test-Path $newJar) {
Move-Item $newJar $oldJar -Force
Write-Host "✅ JAR 文件已更新" -ForegroundColor Green
} else {
Write-Host "❌ 新 JAR 文件不存在,请先下载" -ForegroundColor Red
exit 1
}
# 5. 启动服务
Start-Service -Name "openclaw-cn"
Write-Host "🔄 服务已重启,正在检查健康状态..." -ForegroundColor Yellow
# 6. 等待服务就绪(轮询 /actuator/health)
$timeout = 60
for ($i = 0; $i -lt $timeout; $i++) {
try {
$health = Invoke-RestMethod -Uri "http://localhost:8080/actuator/health" -TimeoutSec 5
if ($health.status -eq "UP") {
Write-Host "✅ 升级成功!服务健康状态:UP" -ForegroundColor Green
exit 0
}
} catch { }
Start-Sleep -Seconds 1
}
Write-Host "❌ 升级失败:服务 60 秒内未返回 UP 状态" -ForegroundColor Red
把这个脚本和新版本
openclaw-new.jar
放一起,双击运行即可。它会自动备份、停服、替换、启动、健康检查,全程无需人工干预。我已在客户现场用它完成 12 次升级,零回滚。
最后分享一个血泪经验:Windows 服务启动时,工作目录是
C:\Windows\System32,不是 OpenClaw CN 的安装目录!所以--spring.config.location=file:./config.yaml里的./会指向C:\Windows\System32\config.yaml,而不是你的配置文件。解决方案是在<arguments>里用绝对路径:--spring.config.location=file:C:/openclaw/config.yaml。这个坑我踩了三次,每次重装系统才意识到。

347

被折叠的 条评论
为什么被折叠?



