1. 项目概述
最近OpenClaw这个开源大模型项目在技术圈里特别火,各种一键安装脚本满天飞。作为一个有强迫症的技术人,我总觉得用现成的脚本少了点什么味道。就像吃火锅直接买底料,虽然方便但总不如自己炒料来得踏实。于是决定在Ubuntu 22.04虚拟机上从头开始手动搭建OpenClaw,把每个环节都摸清楚。
选择虚拟机环境是考虑到安全性,毕竟大模型项目涉及各种依赖和网络配置,万一搞砸了也不怕影响主力机。我用的是VMware Workstation 17,分配了8核CPU、16GB内存和100GB存储空间,这个配置跑基础的大模型应用足够了。
2. 环境准备
2.1 系统基础配置
首先确保系统是最新状态,这步看似简单但很重要。我遇到过不少问题都是因为系统包没更新导致的依赖冲突:
bash复制sudo apt update && sudo apt upgrade -y
接着安装基础编译工具链,OpenClaw有些组件需要本地编译(比如node-llama-cpp)。这里有个细节要注意:Ubuntu默认的build-essential可能不包含所有需要的头文件,所以我把常用的开发库都装上了:
bash复制sudo apt install -y git curl wget build-essential \
pkg-config libssl-dev cmake python3 python3-pip \
libatlas-base-dev libblas-dev liblapack-dev
经验之谈:在虚拟机环境里,建议先做个快照再继续操作。我就在装依赖时不小心把Python环境搞乱过,有个快照能省不少时间。
2.2 Node.js环境配置
OpenClaw要求Node.js v22+,但Ubuntu 22.04官方源里的版本太旧。我试过直接用NodeSource的deb包安装,但发现和系统其他组件有兼容性问题。最终选择用NVM(Node Version Manager)管理Node环境,这样能灵活切换版本。
安装NVM时有个坑要注意:官方安装脚本需要从GitHub拉取,有时候会因为网络问题失败。如果遇到这种情况,可以尝试以下两种方案:
- 通过Gitee镜像安装(适合国内环境):
bash复制curl -o- https://gitee.com/mirrors/nvm/raw/v0.39.7/install.sh | bash
- 或者手动下载安装脚本:
bash复制wget https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh
chmod +x install.sh
./install.sh
安装完成后需要重新加载shell配置,或者直接执行:
bash复制export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
然后安装Node.js v22:
bash复制nvm install 22
nvm use 22
nvm alias default 22 # 设为默认版本
验证安装时我习惯多检查几个关键点:
bash复制node -v # 应该显示v22.x.x
npm -v # 应该显示10.x.x
which node # 应该显示在~/.nvm目录下
2.3 包管理器选择
OpenClaw官方推荐使用pnpm,这确实是个明智的选择。相比npm/yarn,pnpm在monorepo项目上的优势很明显:
- 磁盘空间节省:通过硬链接共享依赖,我的虚拟机节省了将近1GB空间
- 安装速度:首次安装比npm快约40%
- 严格性:能避免幽灵依赖问题
安装pnpm时建议用npm全局安装(虽然有点ironic):
bash复制npm install -g pnpm
安装后可以做个速度测试:
bash复制time pnpm install -g @openclaw/cli
如果发现下载速度慢,可以切换国内镜像源:
bash复制pnpm config set registry https://registry.npmmirror.com
3. 源码编译与安装
3.1 获取源代码
我习惯把这类项目放在~/opt目录下,保持主目录整洁:
bash复制mkdir -p ~/opt/openclaw && cd ~/opt/openclaw
克隆仓库时建议使用--depth=1参数,能加快下载速度:
bash复制git clone --depth=1 https://github.com/openclaw/openclaw.git .
踩坑记录:有次我忘了加depth参数,结果.git目录占了800MB+。在虚拟机环境里这种空间浪费很要命。
3.2 依赖安装
进入项目目录后,先别急着安装依赖。我建议先检查下pnpm的版本兼容性:
bash复制pnpm --version # 需要≥8.6.0
安装依赖时可能会遇到C++编译错误,这通常是因为缺少系统库。我整理了几个常见错误的解决方案:
- node-gyp报错:
bash复制sudo apt install -y g++ make python3-distutils
- OpenSSL相关错误:
bash复制export OPENSSL_ROOT_DIR=/usr/lib/ssl
- 权限问题(特别是在虚拟机里):
bash复制pnpm config set store-dir ~/.pnpm-store
正式安装依赖:
bash复制pnpm install
这个过程可能会花10-30分钟,取决于你的网络和虚拟机性能。我建议在这期间监控系统资源:
bash复制watch -n 1 'free -h && df -h && nproc'
3.3 项目构建
构建过程相对简单,但有些优化技巧值得分享:
bash复制pnpm build -- --max-old-space-size=8192
这里的--max-old-space-size参数很重要,特别是在虚拟机内存有限的情况下。我分配了16GB内存给虚拟机,所以设为8192(8GB)。如果遇到内存不足错误,可以适当调低这个值。
构建完成后检查dist目录:
bash复制ls -lh dist/
应该能看到编译后的JS文件,总大小一般在200MB左右。
4. 初始化配置
4.1 交互式向导
OpenClaw的初始化向导设计得很友好,但有些选项需要特别注意:
bash复制pnpm openclaw onboard
关键选择点记录:
-
Admin Token生成:
- 一定要记下来!我建议存到密码管理器里
- 如果丢失了,需要手动删除~/.openclaw目录重新初始化
-
数据存储路径:
- 默认~/.openclaw对大多数情况够用
- 如果计划存储大量模型数据,建议挂载单独的数据盘
-
模型提供商选择:
- 初次体验建议选Qwen或DeepSeek
- 生产环境需要考虑API调用成本
-
技能包安装:
- 首次安装建议全选
- 后期可以根据实际需求通过
pnpm openclaw skills管理
4.2 配置文件调整
虽然向导已经配置了大部分参数,但有些高级设置需要手动调整。我常用的几个配置项:
json复制{
"gateway": {
"host": "localhost",
"port": 18789,
"cors": {
"origin": ["http://localhost:3000"]
}
},
"logging": {
"level": "debug",
"file": "/var/log/openclaw.log"
}
}
安全提示:千万不要图方便把host设为0.0.0.0!我见过有人这么干结果被内网扫描攻击。正确的做法是用SSH隧道:
bash复制ssh -L 18789:localhost:18789 your_vm_ip
5. 服务部署
5.1 开发模式运行
首次启动建议在前台运行,方便查看日志:
bash复制pnpm openclaw start
看到类似下面的输出就说明成功了:
code复制[2024-03-15T10:00:00] INFO: Gateway started on http://localhost:18789
[2024-03-15T10:00:01] INFO: Model worker started with PID 1234
5.2 生产环境部署
对于长期运行,我推荐使用PM2管理进程。首先全局安装:
bash复制npm install -g pm2
然后创建启动脚本openclaw.sh:
bash复制#!/bin/bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
cd ~/opt/openclaw
pnpm openclaw start
给脚本执行权限:
bash复制chmod +x openclaw.sh
用PM2启动服务:
bash复制pm2 start ./openclaw.sh --name openclaw
pm2 save
pm2 startup # 生成自启动脚本
检查服务状态:
bash复制pm2 logs openclaw --lines 100
5.3 系统服务化(可选)
如果追求更专业的部署方式,可以创建systemd服务。创建/etc/systemd/system/openclaw.service:
ini复制[Unit]
Description=OpenClaw Service
After=network.target
[Service]
User=your_username
WorkingDirectory=/home/your_username/opt/openclaw
Environment="NVM_DIR=/home/your_username/.nvm"
ExecStart=/bin/bash -c 'source $NVM_DIR/nvm.sh && pnpm openclaw start'
Restart=always
[Install]
WantedBy=multi-user.target
然后启用服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable openclaw
sudo systemctl start openclaw
6. 使用与调优
6.1 Web界面访问
通过SSH端口转发访问Web UI:
bash复制ssh -L 18789:localhost:18789 your_vm_ip
然后在本地浏览器打开:
code复制http://localhost:18789
登录后建议立即:
- 修改默认admin密码
- 设置API访问限制
- 配置自动备份
6.2 基础功能测试
我设计了一套测试用例来验证核心功能:
-
文件操作测试:
text复制
在桌面创建test.txt,内容写入"Hello OpenClaw" -
数学计算测试:
text复制
计算987乘以654再减去321 -
知识问答测试:
text复制
用中文解释什么是Transformer架构
6.3 性能调优
根据虚拟机配置,有几个关键参数可以调整:
-
Node.js内存限制:
在启动脚本中添加:bash复制export NODE_OPTIONS="--max-old-space-size=12288" # 12GB -
模型并发数:
修改~/.openclaw/config.json:json复制{ "model": { "concurrency": 2 } } -
日志轮转:
安装logrotate配置:bash复制sudo tee /etc/logrotate.d/openclaw <<EOF /var/log/openclaw.log { daily rotate 7 compress delaycompress missingok notifempty } EOF
7. 常见问题排查
7.1 依赖问题
问题现象:Error: Cannot find module 'xxx'
解决方案:
bash复制pnpm install -g @openclaw/cli # 重装CLI工具
rm -rf node_modules .pnpm-store
pnpm install
7.2 内存不足
问题现象:JavaScript heap out of memory
解决方案:
- 增加Node内存限制
- 减少模型并发数
- 添加swap空间:
bash复制sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
7.3 端口冲突
问题现象:EADDRINUSE :::18789
解决方案:
- 找出占用进程:
bash复制sudo lsof -i :18789
- 修改OpenClaw配置中的端口号
- 或者终止占用进程(谨慎操作)
7.4 模型加载失败
问题现象:Model download failed
解决方案:
- 检查网络连接
- 尝试手动下载模型:
bash复制wget -P ~/.openclaw/models https://example.com/model.bin
- 在配置中指定本地模型路径
8. 进阶配置
8.1 多模型管理
OpenClaw支持同时加载多个模型。编辑config.json:
json复制{
"models": {
"default": "qwen-7b",
"available": {
"qwen-7b": {
"path": "~/.openclaw/models/qwen-7b",
"type": "qwen"
},
"deepseek-6b": {
"path": "~/.openclaw/models/deepseek-6b",
"type": "deepseek"
}
}
}
}
切换模型:
bash复制pnpm openclaw use-model deepseek-6b
8.2 自定义技能开发
创建一个简单的天气查询技能:
- 创建技能目录:
bash复制mkdir -p ~/openclaw-skills/weather
cd ~/openclaw-skills/weather
- 初始化package.json:
json复制{
"name": "weather-skill",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"axios": "^1.6.0"
}
}
- 编写技能逻辑index.js:
javascript复制module.exports = {
name: "weather",
description: "查询城市天气",
async execute(args, context) {
const { city } = args;
const response = await axios.get(`https://api.weather.com/v1/${city}`);
return `当前${city}天气:${response.data.weather}`;
}
};
- 注册技能:
bash复制pnpm openclaw add-skill ~/openclaw-skills/weather
8.3 备份与恢复
创建自动备份脚本backup.sh:
bash复制#!/bin/bash
BACKUP_DIR=~/openclaw_backups
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/openclaw_$(date +%Y%m%d).tar.gz \
~/.openclaw \
~/opt/openclaw
添加到crontab每天自动运行:
bash复制0 3 * * * /path/to/backup.sh
恢复备份:
bash复制tar -xzf openclaw_20240315.tar.gz -C ~/