OpenClaw Gateway 部署完成之后,最烦人的一件事就是每次重启电脑都得手动打开命令行启动服务,再去浏览器敲一遍localhost地址。今天分享一套完整的 Windows 方案,用任务计划程序让 OpenClaw Gateway 开机自启,并自动打开 Dashboard 面板,而且特意保留控制台窗口,也就是所谓“非静默版”——日志实时可见,出问题一眼就能定位,不用像后台服务那样排查半天。这套方案不需要第三方工具,全部用 Windows 自带能力实现,适合刚接触 OpenClaw 的部署用户,也适合已经在跑但受够了手动启动的人。
1. 先想清楚:为什么要做开机自启,为什么必须是非静默版
很多人在 OpenClaw Gateway 刚跑通的时候,都是开一个终端窗口,输入命令启动,然后扔在那里。但一旦电脑重启、断电、系统更新自动重启,服务就没了,依赖它的其他应用也跟着 502。所以让网关常驻是一个很实际的需求。但常驻的方式有讲究,这里我刻意放弃“静默版”,选择控制台可见的非静默模式,原因后面慢慢说。
1.1 OpenClaw Gateway 的作用与常驻需求
OpenClaw Gateway 本质上是一个本地网关服务,负责把不同来源的模型请求统一路由到对应的上游接口,并对外提供统一的 API 入口。它的 Dashboard 则是一个 Web 管理界面,用来查看网关状态、配置路由、观察请求日志。既然是网关,那就必须一直活着的。活着意味着进程不能因为终端关闭而退出,也不能在系统重启后消失。你要么把它注册成 Windows 服务,要么用任务计划程序在用户登录后拉起来。注册成服务会牵扯到进程权限、日志归集,而且调试期出了问题还得去事件查看器翻,麻烦。任务计划程序的“登录时触发”则简单直接,尤其是你还要看到一个活的窗口时,它是最合适的。
1.2 非静默版和静默版的真实差异
静默版一般是指把进程隐藏到后台运行,不显示窗口,或者用--silent之类参数让它去后台驻留。好处是桌面干净,不容易误关;坏处是你看不到实时请求日志,一旦某个路由报错,只能翻日志文件,延迟很大。
我选择非静默版的核心原因有三个:第一,调试阶段你能看到服务启动过程中的所有输出,比如端口绑定失败、配置文件语法错误、上游连接超时,都会直接打在屏幕上;第二,看板自动弹出后,你还能回头对照终端里的日志,快速判断是网关问题还是模型路由问题;第三,非静默版不会因为隐藏窗口而触发一些权限或环境变量加载差异。比如某些进程在隐藏启动时,用户环境变量加载不完整,导致找不到 Node.js 模块,这种坑我已经踩过不止一次。所以,日常开发、个人部署、学习阶段,非静默版是更稳的选择。
1.3 方案选型:为什么用任务计划程序,而不是启动文件夹
实现开机自启,方案无非几类:
- 启动文件夹:往
shell:startup里丢一个快捷方式或脚本。优点是简单,缺点是没办法设置触发延迟、没办法指定“只在用户登录后运行”、也不好配置管理员权限,而且用户可能会不小心把快捷方式删了。 - 组策略开机脚本:能跑,但配置繁琐,适用范围窄,而且同样是隐藏执行,不符合非静默需求。
- 第三方服务工具,比如 NSSM:功能强大,但需要额外下载 exe,还要处理服务注册和日志配置,对轻量场景来说属于过度设计。
- 任务计划程序:系统自带,支持延迟触发、指定用户环境、支持显示窗口,还可以通过
schtasks命令行脚本化注册。最关键是稳定,不依赖不必要的网络和驱动。
所以我最终选了任务计划程序 + PowerShell 启动脚本的组合。任务计划程序负责触发,PowerShell 脚本负责拉起 OpenClaw Gateway,并等端口就绪后自动打开 Dashboard。
2. 环境准备:先让 OpenClaw Gateway 能在当前会话跑起来
开机自启的前提是手动启动完全没问题。如果手动执行都会报错,那就别急着用自动化工具,先把基础环境收拾利索。这一节我们过一遍基础环境,然后验证手动启动。
2.1 运行环境与 OpenClaw 安装
OpenClaw Gateway 通常依赖 Node.js 运行,安装时注意两个点:版本选 LTS(长期支持版),不要图新选 Current;安装向导里一定要勾选 “Add to PATH”,否则后面任务计划程序执行命令会找不到node。
安装完 Node.js 后,打开 PowerShell,输入:
node -v npm -v能正常输出版本号,说明环境 OK。接下来全局安装 OpenClaw Gateway。假设发布包名是openclaw-gateway,则执行:
npm install -g openclaw-gateway安装完成后,运行:
openclaw gateway --version这里如果报“无法识别命令”,多半是 npm 全局目录没进 PATH。可以执行npm config get prefix,然后把输出的路径(通常是%APPDATA%\npm)手动加到系统环境变量 PATH 里。
2.2 配置网关与 Dashboard 端口
OpenClaw Gateway 的配置文件一般是一个 JSON 或 YAML 文件,里面包含两个关键端口:网关服务和 Dashboard。我习惯把它们固定下来,不随机分配。比如:
- 网关 API 监听
127.0.0.1:8080 - Dashboard 监听
127.0.0.1:3000
固定端口的好处是后面的自启脚本可以精确判断服务是否就绪,浏览器也能稳定打开同一个地址。配置文件中还要包含上游模型路由,比如 OpenAI 或本地 Ollama。这些配置项在不同版本里略有差异,但核心逻辑是一样的:每个路由有个名称,对应一个上游 base URL 和 API Key。我这里不展开具体路由参数,因为不同部署版本差异较大,你需要根据自己的实际配置来。只要记住一点:Dashboard 的端口和网关端口必须手动指定,不要在配置里留空。
2.3 手动启动并验证 Dashboard
配置文件准备好之后,打开终端,在 OpenClaw 的安装目录或项目根目录执行:
openclaw gateway start观察首次启动日志。如果出现类似Dashboard available at http://127.0.0.1:3000的输出,说明服务已经起来了。此时用浏览器访问http://127.0.0.1:3000,确认 Dashboard 能正常渲染。这一步成功,环境准备就结束了。
3. 编写启动脚本:非静默拉起进程并自动打开 Dashboard
手动启动没问题后,就要把“启动 + 打开看板”这两个动作封装成一个脚本。脚本要解决几个细节:启动时不隐藏窗口、等待服务真正就绪再开浏览器、如果端口被占或服务报错能给出可读提示。
3.1 脚本的整体逻辑
很多人直接写一个.bat文件,里面放两行:第一行启动网关,第二行start http://localhost:3000。问题在于:网关进程还没完全监听端口的时候,浏览器可能已经打开,结果页面白屏或者显示“无法连接”。要解决这个问题,启动脚本里必须有一个“等待端口就绪”的逻辑。
完整逻辑拆成三步:
- 拉起 OpenClaw Gateway 进程,不关闭当前控制台窗口;
- 循环检测网关端口(或 Dashboard 端口)是否能连上,最多等待若干秒;
- 端口通了之后,用系统默认浏览器打开 Dashboard。
3.2 PowerShell 启动脚本(推荐)
下面这个脚本我不加任何混淆,直接可用。假设网关端口为 8080,Dashboard 端口为 3000,OpenClaw 命令已存在于PATH。把下面内容保存为Start-OpenClawGateway.ps1:
# Start-OpenClawGateway.ps1 # 非静默版启动 OpenClaw Gateway,并自动打开 Dashboard $GatewayPort = 8080 $DashboardPort = 3000 $DashboardUrl = "http://127.0.0.1:$DashboardPort" $MaxWaitSeconds = 30 Write-Host "[OpenClaw] 正在启动 OpenClaw Gateway..." -ForegroundColor Cyan # 启动网关进程。这里不用 Start-Process -WindowStyle Hidden,保留窗口显示日志 Start-Process -FilePath "openclaw" -ArgumentList "gateway","start" -NoNewWindow -PassThru | Out-Null # 等待 Dashboard 端口就绪 $waited = 0 $ready = $false while ($waited -lt $MaxWaitSeconds) { try { $tcpClient = New-Object System.Net.Sockets.TcpClient $tcpClient.Connect("127.0.0.1", $DashboardPort) $tcpClient.Close() $ready = $true break } catch { Start-Sleep -Seconds 1 $waited++ } } if ($ready) { Write-Host "[OpenClaw] Dashboard 已就绪,正在打开浏览器..." -ForegroundColor Green Start-Process $DashboardUrl } else { Write-Host "[OpenClaw] 等待超时,请检查上方日志是否有报错。" -ForegroundColor Red }注意一个细节:Start-Process -NoNewWindow会让新进程在当前控制台窗口里运行,这正好符合“非静默版”的需求。如果你直接执行openclaw gateway start而不是用Start-Process,也可以用,但那样 PowerShell 会一直阻塞等待网关退出,后面的浏览器打开代码就永远执行不到了。所以Start-Process是必须的。
另外,这个脚本默认把网关命令当成了全局命令。如果你的 OpenClaw 是通过node直接运行时,可以把FilePath改成node.exe的完整路径,并在ArgumentList里填上你的启动脚本路径。比如:
Start-Process -FilePath "C:\Program Files\nodejs\node.exe" -ArgumentList "D:\apps\openclaw\server.js","gateway","start" -NoNewWindow脚本里我用的是TcpClient.Connect来做端口探测,这种方法比Test-NetConnection更快,也不依赖 PowerShell 版本。如果探测的端口是 Dashboard 端口,一定要确保 Dashboard 监听的就是127.0.0.1:3000,别写错成网关端口。
3.3 批处理版本(可选)
如果你实在不喜欢 PowerShell,也可以用.bat做一个简化版本。举例Start-OpenClawGateway.bat:
@echo off title OpenClaw Gateway - Non Silent echo Starting OpenClaw Gateway... start "OpenClaw Gateway" /max cmd /c "openclaw gateway start" timeout /t 5 /nobreak >nul start http://127.0.0.1:3000这里start "OpenClaw Gateway" /max cmd /c "..."会新开一个最大化窗口跑网关,日志保留在那边。timeout 5是等待 5 秒,但这种写法比较机械——网关如果启动慢,页面照样白屏。我还是建议用 PowerShell 版本做端口探测,体验完全不同。批处理适合应急,真正常用还是 PowerShell 脚本靠谱。
4. 注册任务计划程序:让脚本随登录自动运行
脚本写好后,接下来把它挂到任务计划程序里。注意:不能用“系统启动时”触发器,因为系统启动时用户还没登录,桌面环境没有加载,GUI 窗口根本显示不出来,而且用户级环境变量也不会加载。我们要用“登录时”触发器,这样等用户进入桌面后,任务开始跑,窗口自然就出来了。
4.1 图形界面注册
打开“任务计划程序”(Win+R 输入taskschd.msc),创建基本任务:
- 名称:
OpenClaw Gateway AutoStart - 触发器:
当用户登录时 - 操作:
启动程序 - 程序或脚本:填
powershell.exe - 添加参数:填脚本的完整路径,比如:
-ExecutionPolicy Bypass -File "D:\scripts\Start-OpenClawGateway.ps1"注意:-ExecutionPolicy Bypass很关键,否则任务计划程序运行 PowerShell 脚本时,会因为系统默认执行策略被拦截,导致任务日志里报“禁止运行脚本”。
创建完基本任务后,右键任务选择“属性”,做三件事:
- 常规:勾选“使用最高权限运行”。如果网关需要读取某些受限配置或端口占用特殊权限,这个选项能避免权限不足。如果你的 OpenClaw 不需要管理员权限,可以不勾,但勾上更省心。
- 条件:取消勾选“只有在计算机使用交流电源时才启动此任务”。笔记本如果没勾这项,插着电才会启动,拔电重启后任务直接不跑。
- 设置:勾选“如果任务失败,按以下间隔重新启动”,间隔设 1 分钟。这样万一网关启动瞬间有偶发问题,任务能自动重试一次。
4.2 命令行注册(适合批量部署)
如果你有多台机器,或者想把这个配置存成脚本,用schtasks更合适。以管理员身份打开 PowerShell,执行:
schtasks /Create /TN "OpenClaw Gateway AutoStart" /TR "powershell.exe -ExecutionPolicy Bypass -File D:\scripts\Start-OpenClawGateway.ps1" /SC ONLOGON /RL LIMITED /F这里面/SC ONLOGON表示登录时触发,/RL LIMITED表示普通权限。如果需要管理员权限,改成/RL HIGHEST。创建后可以用:
schtasks /Run /TN "OpenClaw Gateway AutoStart"手动触发一次,立刻看效果。
4.3 验证开机自启
注册完成后,建议做一次完整的验证,而不是只手动触发一次。先正常重启电脑,输入密码进入桌面,观察是否有 PowerShell 窗口弹出来,并且是否自动打开浏览器进入 Dashboard。如果窗口出现了,但浏览器没打开,多半是端口等待时间不够或 Dashboard URL 写错。如果窗口没有出现,检查任务计划程序的任务状态,看上次运行结果是否是0x1或0x41303(这两个常见错误后面会专门说)。
这里我特别提醒:任务计划程序默认有一个“历史记录”选项卡,你可以在任务属性里开启历史记录,然后查看每次启动的详细信息。这个功能对排查自启不生效很有用。
5. 常见问题与排查技巧实录
这组方案我跑过很多次,也踩过不少坑。下面把高频问题集中列出来,方便你对照排查。
5.1 开机自启不生效,任务状态异常
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 任务显示“已就绪”,但从未运行 | 触发了,但条件里“交流电源”未满足 | 取消“只有交流电源”选项 |
| 上次运行结果 0x1 | 脚本或程序执行失败 | 手动运行任务,观察报错;检查脚本路径是否正确 |
| 上次运行结果 0x41303 | 任务已超过结束时间或策略限制 | 检查任务的“设置”里是否限制了持续时间 |
| 任务没出现在列表中 | 创建任务时选了错误用户 | 用管理员身份重新注册,/SC ONLOGON |
这里最有迷惑性的是 0x1。它不表示某个具体错误,而是“程序返回的非零退出码”。如果你用图形界面创建任务,程序直接填powershell.exe,参数写错了,也会返回 0x1。最直接的办法是:在任务计划程序找到任务,右键运行一次,然后看弹窗输出。注意,如果任务计划程序窗口无输出,可以把脚本里的-NoNewWindow去掉,改成单独弹窗运行,先定位问题再恢复设置。
5.2 窗口出现了,但 Gateway 显示 502 Bad Gateway
这个问题很容易在开机自启场景中出现。原因往往是网关进程启动成功了,但某个上游模型路由没连上,Dashboard 上能看到网关状态,但请求转发时返回 502。排查步骤:
- 看 Gateway 窗口日志里有没有
upstream connect error或connection refused。 - 确认配置文件里的上游地址是否为本机可达地址。如果上游是本地 Ollama,确认 Ollama 也开机自启了。
- 如果上游地址是
localhost:11434,而 Ollama 延迟启动,就会出现网关先起、Ollama 没起的现象。解决方案:在网关启动脚本里加一个上游端口检测,比如也等待 11434 端口就绪,再启动网关。
我个人的建议是:把上游服务也做成开机自启,并且把上游服务的启动脚本放在网关之前。任务计划程序里可以设置多个任务,并用“触发器”间隔控制先后。比如 Ollama 的触发器设置为“登录时”,并延迟 5 秒;网关的任务延迟 10 秒。这样基本能避坑。
5.3 Dashboard 能手动打开,但自启时浏览器没弹出来
这种情况通常是端口探测逻辑有 bug。比如你探测的端口是 8080,但 Dashboard 实际端口是 3000,脚本还在傻等 8080。或者 Dashboard 绑定的地址是0.0.0.0,连接探测没问题,但浏览器打开的地址写成了localhost而不是127.0.0.1,导致 DNS 解析出错。我的经验是统一使用127.0.0.1,并且 Dashboard 配置也显式绑定127.0.0.1,避免 IPv6 的::1干扰。
如果在脚本中探测 Dashboard 端口时,TcpClient 抛异常导致脚本卡住,可以把Connect包一层 try/catch 并且设置一个连接超时,防止某个端口处于半连接状态时等待过长。我上面的脚本里已经有 try/catch,你可以放心。
5.4 PowerShell 脚本被安全策略拦截
任务计划程序运行 PowerShell 脚本时,最常见的报错是:
无法加载文件 D:\scripts\Start-OpenClawGateway.ps1,因为在此系统上禁止运行脚本。这基本就是执行策略没设置为Bypass。你可以先手动在 PowerShell 里执行Get-ExecutionPolicy查看当前策略。我建议不要全局改Set-ExecutionPolicy RemoteSigned,因为会影响所有脚本。任务计划程序的参数里加-ExecutionPolicy Bypass只对当前这条命令生效,干净且不影响系统。
另外,如果你的脚本路径包含空格,参数一定写成这样:
-ExecutionPolicy Bypass -File "D:\my scripts\Start-OpenClawGateway.ps1"在图形界面里,程序或脚本写powershell.exe,添加参数写-ExecutionPolicy Bypass -File "D:\my scripts\Start-OpenClawGateway.ps1",注意引号不能丢。
5.5 端口被占用导致网关启动失败
开机自启场景里端口占用尤其容易出问题。有时候上次网关没关闭,再次启动时会提示端口被占用。我的启动脚本里没有做“先杀旧进程”的操作,因为我不想误杀其他进程。你可以手动检查:
netstat -ano | findstr :8080如果发现有进程占着 8080,先确认是不是上一次遗留的 OpenClaw。如果是,可以执行taskkill /PID <pid> /F。更稳妥的办法是把旧进程的 PID 记录到文件里,下次启动前读取并结束,但这里要小心别杀错进程,尤其是端口被其他应用占用的时候。我的建议是脚本里不做自动杀进程,只负责拉起服务,端口冲突就明确报错,这样更安全。
6. 个人实践中的几点补充
这套非静默版方案我已经用了大半年,最大的感受就是“可见”带来的安全感。每次开机,屏幕上弹出 OpenClaw Gateway 的终端窗口,里面滚动着服务日志,那一刻你就知道网关活着。其实一开始我也试过把网关注册成 Windows 服务,还想了一个隐藏方案,但后来发现开发和运维是两个阶段。开发阶段你需要日志、需要调试、需要频繁改配置然后重启,非静默窗口配合 Ctrl+C 退出再启动,效率比服务管理高太多。等哪天你真的要 7x24 小时稳定跑,再考虑给它套一个后端守护服务,并且把日志接入文件轮转,那样反而更合适。
如果你想把这套方案做得更顺手,还可以做一个小改进:在任务计划程序里再加一个“每天固定时间重启网关”的任务,避免长时间运行导致内存占用缓慢增长。启动命令和自启脚本共用同一个 PowerShell 脚本,只是在重启任务里先强制结束旧进程,再执行一遍启动。这个方法适合那些连接了大量上游模型的网关实例,实测能避免一些不可预测的卡顿。
最后再分享一个小技巧:启动脚本里那句Start-Process "http://127.0.0.1:3000",如果你不想让它弹出浏览器而是默认用系统浏览器,那没问题;但如果你有多套环境,可以在脚本里指定浏览器路径,比如 Chrome 的chrome.exe加一个--user-data-dir参数,让 Dashboard 独立在一个专用窗口里,不和日常网页混标签。这属于锦上添花,但用起来真的很舒服。希望这套方案能帮你省掉每天开终端敲命令的时间,把精力放在真正该调的路由和模型效果上。