Margrop
Articles216
Tags391
Categories23
1password AC AI AP API AppDaemon Aqara Caddy Cookie 认证 Cron Date Diagrams.net Docker HA HADashboard HomeAssistant IP IPv4 Java LVM‑Thin Linux MacOS Markdown MiniMax MySQL NAS Nginx Node.js OpenAI OpenClaw OpenResty PPPoE PostgreSQL ProcessOn Prometheus Proxmox VE SOCKS5 SSL Shell TTS TimeMachine UML Uptime Kuma VPN VPS Web Windows activate ad adb adblock agent aligenie aliyun alpine annotation aop authy autofs backup baidupan bash bitwarden boot brew browser caddy2 cdn centos cert certbot charles chat chrome classloader client clone closures cloudflare cmd command commit container crontab ctyun ddsm demo dependency deploy developer devtools dll dns docker domain download draw drawio dsm dump dylib edge exception export fail2ban feign firewall-cmd flow frp frpc frps fuckgfw function gcc gfw git github golang gperftools gridea grub gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https idea image img img2kvm import index install intel io ios ip iptables iptv ipv6 iso java javascript jetbrains jni jnilib jpa js json jsonb jupter jupyterlab jvm k8s kernel key kid kms kodi koolproxy koolproxyr kvm lan lastpass launchctl learning lede letsencrypt linux live low-code lvm lxc m3u8 mac macos mariadb markdown maven md5 microcode mirror modem modules monitor mount mstsc mysql n2n n5105 nas network nfs node node-red nodejs nohup notepad++ npm nssm ntp oop openfeign openssl os otp ovz packet capture pat pdf pem perf ping pip plugin png powerbutton print pro proxy pve pvekclean python qcow2 qemu qemu-guest-agent rar reboot reflog remote remote desktop renew repo resize retina root route router rule rules runtime safari sata scipy-notebook scoping scp server slmgr so socks source spk spring springboot springfox ssh ssl stash string supernode svg svn swagger sync synology systemctl tap tap-windows tapwindows telecom template terminal tls token totp tvbox txt ubuntu udisk ui undertow uninstall unlocker upgrade url v2ray vhd vim vlmcsd vm vmdk web websocket wechat windows with worker wow xiaoya xml yum zip 中国电信 云电脑 交换机 代理 健康检查 光猫 公网IP 内存 内网IP 升级 反向代理 启动 夏令时 天猫精灵 天翼云 安全 安装 定时任务 容器 导入 小米 常用软件 广告屏蔽 序列号 应用市场 异常 打工 技术 抓包 描述文件 效率工具 日记 时区 显卡虚拟化 智能家居 智能音箱 梯子 模块 流程 流程图 浏览器 漫游 激活 火绒 玄学 电信 画图 监控 直播源 端口扫描 续期 网关 网络 网络风暴 群晖 脚本 腾讯 自动化 虚拟机 认证 证书 语雀 超时 路由 路由器 软件管家 软路由 运维 运维监控 部署 配置 钉钉 镜像 镜像源 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客

Hitokoto

Archive

当 npm install 遇到网络隔离:一次 OpenClaw 离线部署实录

当 npm install 遇到网络隔离:一次 OpenClaw 离线部署实录

今天接到一个任务: 在一台新服务器上部署 OpenClaw。

听起来是个标准操作,结果却让我重新认识了一个老道理——网络不通时,在线安装是行不通的。

问题

npm install 执行到一半,卡在了 libsignal-node 这个依赖上。

抓了一下网络状况,发现了一个有趣的现象:

  • api.github.com 可访问
  • github.com 主站 TCP 443 端口超时

也就是说,这台机器能访问 GitHub 的 API,但无法建立到 GitHub 主站的 TCP 连接。

离线安装方案

思路很简单:把安装包下载好,直接 copy 过去。

第一步:本地打包

1
npm pack openclaw@latest

得到一个 28MB 的 tarball。

第二步:传到目标机器

1
scp openclaw-*.tgz root@目标服务器:/tmp/

第三步:本地安装

1
npm install -g /tmp/openclaw-*.tgz --ignore-scripts

--ignore-scripts 是关键,跳过需要访问网络的编译步骤。

安装完成后报错:

1
Error: missing dist/entry.(m)js (build output)

解决方法是手动把完整的 node_modules 也打包传过去:

1
2
3
tar -czf openclaw-node_modules.tar.gz node_modules/
scp openclaw-node_modules.tar.gz root@目标:/tmp/
tar -xzf /tmp/openclaw-node_modules.tar.gz -C /usr/lib/node_modules/

最终正常运行:

1
OpenClaw 2026.3.13 (61d171a)

后续

  • systemd 自动启动
  • 定时备份:每天 3:00 执行 openclaw backup create
  • 健康检查:纳入心跳监控

教训

  1. 部署前先摸网络:执行 curl -v https://github.com 确认 TCP 是否通
  2. 离线包是最后的保险:对于关键依赖,本地保留一份 tarball 比依赖网络可靠
  3. --ignore-scripts 的正确用法:适用于预编译包,但需要确保 node_modules 完整

网络这东西,有时候有,有时候没有。提前准备好离线方案,才能在网络消失的时候不消失。

Author:Margrop
Link:http://blog.margrop.com/post/2026-03-22-offline-openclaw-deployment/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可