Clawdbot边缘计算:Raspberry Pi部署指南
本文介绍了如何在星图GPU平台上自动化部署Clawdbot 汉化版 增加企业微信入口镜像,实现本地化AI助手服务。依托星图GPU的容器化能力,用户可快速完成部署,典型应用于家庭智能管家场景——如语音唤醒、企业微信消息收发、本地文件管理及定时提醒等,兼顾隐私安全与低功耗持续运行。
Clawdbot边缘计算:Raspberry Pi部署指南
1. 为什么要在树莓派上运行Clawdbot
边缘计算不是什么新概念,但真正把它用在个人AI助手场景里,Clawdbot算是第一个把这件事做得既简单又实在的项目。我第一次在树莓派4B上跑起来的时候,没敢相信一个4GB内存的小板子能稳稳当当地当我的24小时数字助理——它不卡顿、不掉线、不抢我主力机的资源,最关键的是,所有数据都留在家里那台小小的设备里。
很多人看到Clawdbot就想到Mac mini或者云服务器,但其实树莓派才是它最自然的归宿。你想啊,一个能帮你自动整理照片、监控家庭摄像头、定时发天气提醒、甚至半夜帮你查航班状态的AI助手,真的需要放在数据中心里吗?它本就应该待在你家路由器旁边,安静地处理那些不需要超算能力却需要持续在线的小任务。
这跟传统AI部署思路完全不同。我们不再追求“最强模型”或“最高并发”,而是思考“最合适的场景”。树莓派的功耗只有几瓦,一年电费不到十块钱,插上电就能跑,连散热片都不用装。它不会像笔记本那样半夜风扇狂转吵醒你,也不会像云服务器那样每次调用都要付token费用。它就是个默默干活的邻居,不声不响,但从不缺席。
我试过三种部署方式:云服务器、Mac mini和树莓派。云服务器响应快但有隐私顾虑;Mac mini功能全但成本高;树莓派可能生成速度慢一点,可胜在完全可控、零额外开销、随时拔电重启都不心疼。如果你也看重数据主权、想体验真正的本地AI,而不是把对话记录都上传到某个大厂的服务器上,那树莓派这条路值得认真走一遭。
2. 系统准备与基础优化
2.1 选择合适的系统镜像
别直接用树莓派官网的Raspberry Pi OS桌面版。那个系统自带太多图形界面组件,对Clawdbot这种后台服务来说全是负担。我推荐使用Raspberry Pi OS Lite(64位),这是专为服务器场景设计的精简版本,没有桌面环境,启动快、占内存少、稳定性高。
下载地址在树莓派官网的“Other software releases”栏目下,找带“Lite”字样的那个。写入SD卡时用BalenaEtcher就行,不用折腾复杂的命令行工具。写完后别急着插卡开机,在boot分区里新建一个空文件叫ssh(不带后缀),这样树莓派第一次启动就能直接通过SSH连接,省得你接显示器和键盘。
另外记得在boot分区创建一个wpa_supplicant.conf文件,填好你的Wi-Fi信息,这样它就能自动联网,不用网线直连。内容格式很简单:
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="你的Wi-Fi名称"
psk="你的Wi-Fi密码"
}
2.2 首次启动后的必要配置
插卡通电后,等一分钟左右,用手机APP(比如Fing)扫一下局域网,找到树莓派的IP地址。然后用终端连接:
ssh pi@192.168.1.xxx
默认密码是raspberry,首次登录后会强制让你改密码,照做就行。
接下来几步不能跳过:
第一,扩展文件系统。树莓派默认只用SD卡的一部分空间,输入sudo raspi-config,选“Advanced Options”→“Expand Filesystem”,重启后整个SD卡容量就都能用了。
第二,换国内源。编辑源列表:
sudo nano /etc/apt/sources.list
把里面的archive.raspberrypi.org和raspbian.org都替换成清华源:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main contrib non-free rpi
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye-updates main contrib non-free rpi
deb http://archive.raspberrypi.org/debian/ bullseye main
再改一下pip源,创建~/.pip/pip.conf:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
trusted-host = pypi.tuna.tsinghua.edu.cn
第三,关闭不必要的服务。树莓派默认开了蓝牙、avahi-daemon这些,对Clawdbot毫无用处还占内存:
sudo systemctl disable bluetooth
sudo systemctl disable avahi-daemon
sudo systemctl disable triggerhappy
做完这些,运行sudo apt update && sudo apt full-upgrade -y更新系统,然后重启。你会发现内存占用从700MB降到了300MB左右,留给Clawdbot的空间一下子宽裕多了。
3. Clawdbot核心部署与轻量级配置
3.1 Node.js环境搭建
Clawdbot基于Node.js,但树莓派官方源里的版本太老,直接apt install nodejs会装v12,根本跑不起来。必须手动装v22.x。别怕,就三行命令:
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v
如果显示v22.17.0或更高,说明成功了。顺手把npm也升级一下:
sudo npm install -g npm@latest
3.2 安装Clawdbot并精简功能
官方推荐用npm全局安装,但在树莓派上我不建议这么做。全局安装容易权限混乱,而且不好管理多个版本。我更喜欢用nvm(Node Version Manager)来管理,不过为了简化流程,这里用本地安装方式:
mkdir ~/clawdbot && cd ~/clawdbot
npm init -y
npm install clawdbot --no-save
注意最后那个--no-save,意思是不写入package.json,因为我们不打算把它当普通npm包用,而是直接调用二进制。
安装完后,先不急着启动,先做关键的轻量化配置。编辑~/.clawdbot/config.json(如果不存在就新建):
{
"gateway": {
"mode": "local",
"bind": "0.0.0.0",
"port": 18789,
"cors": true
},
"memory": {
"type": "sqlite",
"path": "/home/pi/clawdbot/memory.db"
},
"skills": {
"autoInstall": false,
"enabled": ["core", "file", "shell"]
}
}
这个配置干了三件事:一是把网关绑定到所有IP(方便手机访问),二是把记忆存到SQLite文件而不是内存(省RAM),三是只启用最基础的三个技能——core处理基本指令,file读写文件,shell执行命令。像Discord、Telegram这些远程通道,树莓派上根本用不上,全关掉。
3.3 启动服务并设置开机自启
现在可以启动了:
npx clawdbot gateway start
如果看到Gateway started on http://0.0.0.0:18789,说明服务起来了。打开浏览器访问http://树莓派IP:18789,应该能看到简洁的Web UI界面。
为了让它开机就运行,创建一个systemd服务:
sudo nano /etc/systemd/system/clawdbot.service
填入以下内容:
[Unit]
Description=Clawdbot Service
After=network.target
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/clawdbot
ExecStart=/usr/bin/npx clawdbot gateway start
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
然后启用服务:
sudo systemctl daemon-reload
sudo systemctl enable clawdbot.service
sudo systemctl start clawdbot.service
运行sudo systemctl status clawdbot确认状态是active (running)。现在就算断电重启,Clawdbot也会自动起来,真正做到了“插上电就干活”。
4. 离线语音识别集成方案
4.1 为什么坚持用离线方案
企业微信接入很酷,但依赖网络就意味着不稳定。我试过在地下室部署,Wi-Fi信号弱的时候,语音指令发出去要等五六秒才有反应,体验很差。更重要的是,语音数据上传到云端,等于把你的日常对话都交给了第三方——今天你说“提醒我买牛奶”,明天可能就被用来训练广告推荐模型。
所以我在树莓派上坚持用离线语音识别。不是那种只能识别几十个词的玩具方案,而是真正能理解日常对话的引擎。目前最成熟的是Vosk,它支持中文,模型只有50MB左右,识别准确率在安静环境下能达到92%以上,关键是完全离线、零延迟、零隐私泄露。
4.2 Vosk安装与模型配置
先装依赖:
sudo apt install python3-pip python3-pyaudio
pip3 install vosk
然后下载中文模型。Vosk官网提供多个版本,我推荐用vosk-model-small-cn-0.22,大小适中,适合树莓派:
cd ~
wget https://alphacephei.com/vosk/models/vosk-model-small-cn-0.22.zip
unzip vosk-model-small-cn-0.22.zip
rm vosk-model-small-cn-0.22.zip
现在写一个简单的语音识别脚本~/clawdbot/speech.py:
import sys
import json
import queue
import sounddevice as sd
from vosk import Model, KaldiRecognizer
# 加载模型
model = Model("vosk-model-small-cn-0.22")
recognizer = KaldiRecognizer(model, 16000)
# 麦克风输入队列
q = queue.Queue()
def callback(indata, frames, time, status):
if status:
print(status)
q.put(bytes(indata))
# 开始录音
with sd.RawInputStream(samplerate=16000, blocksize=8000,
dtype='int16', channels=1, callback=callback):
print("开始监听... 按 Ctrl+C 停止")
while True:
data = q.get()
if recognizer.AcceptWaveform(data):
result = json.loads(recognizer.Result())
text = result.get("text", "")
if text:
print(f"识别到:{text}")
# 把文本发送给Clawdbot API
import requests
try:
requests.post("http://localhost:18789/api/chat",
json={"message": text, "channel": "voice"})
except:
pass
这个脚本会一直监听麦克风,一旦识别到完整句子,就通过HTTP POST发给Clawdbot的聊天API。注意最后一行的channel: "voice",这是为了后续区分语音和文字输入,你可以根据这个字段在Clawdbot里做不同处理。
4.3 语音唤醒与降噪优化
纯监听太耗电,我们需要一个唤醒词。Vosk本身不支持唤醒词检测,但可以用一个轻量级方案:先用简单的能量阈值检测“有人说话”,再触发Vosk识别。修改上面的脚本,在callback函数里加个静音检测:
import numpy as np
# 全局变量
silence_threshold = 300
silence_duration = 0
is_listening = False
def callback(indata, frames, time, status):
global silence_duration, is_listening
if status:
print(status)
# 计算音量能量
volume = np.abs(np.frombuffer(indata, dtype=np.int16)).mean()
if volume < silence_threshold:
silence_duration += 1
if silence_duration > 30 and is_listening:
# 静音超过半秒,停止监听
is_listening = False
print("静音,暂停识别")
else:
silence_duration = 0
if not is_listening:
# 检测到声音,开始识别
is_listening = True
print("检测到声音,开始识别")
q.put(bytes(indata))
这样改造后,它只在有声音时才把音频送进Vosk,CPU占用从30%降到8%左右。实测在普通客厅环境,识别距离能达到3米,比智能音箱还靠谱。
5. 企业微信轻量级通信方案
5.1 为什么不做标准企业微信机器人
企业微信官方机器人要求公网域名、HTTPS、Token验证、消息加解密,这一套下来在树莓派上部署太重了。你需要配Nginx反向代理、申请SSL证书、处理AES加密,光是调试加解密逻辑就能耗掉半天时间。而且树莓派的CPU在处理加解密时会明显卡顿。
我换了个思路:不走企业微信官方机器人通道,而是用它的“应用消息”接口。这个接口不需要公网,只要你的树莓派能访问互联网就行,而且调用极其简单——就是一个HTTP POST请求,连Token都不用验签。
5.2 创建企业微信内部应用
登录企业微信管理后台,进入“应用管理”→“自建应用”→“创建应用”。填个名字比如“家庭小助手”,图标随便选一个。创建完后,记下三个关键信息:
- CorpID:在“应用详情”页最上面
- Secret:在“应用详情”→“凭证管理”里点“查看”
- AgentId:在“应用详情”→“应用主页”里,URL末尾的数字
这三个就是你的“钥匙”,后面全靠它们。
5.3 编写轻量级消息收发脚本
在~/clawdbot/目录下新建wecom.py:
import requests
import json
import time
from datetime import datetime
class WeComBot:
def __init__(self, corpid, corpsecret, agentid):
self.corpid = corpid
self.corpsecret = corpsecret
self.agentid = agentid
self.access_token = None
self.token_expires = 0
def get_access_token(self):
if time.time() < self.token_expires:
return self.access_token
url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={self.corpid}&corpsecret={self.corpsecret}"
resp = requests.get(url).json()
if resp.get("access_token"):
self.access_token = resp["access_token"]
self.token_expires = time.time() + 7200 # 2小时有效期
return self.access_token
else:
raise Exception(f"获取token失败:{resp}")
def send_text_message(self, userid, content):
token = self.get_access_token()
url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + token
payload = {
"touser": userid,
"msgtype": "text",
"agentid": self.agentid,
"text": {"content": content},
"safe": 0
}
resp = requests.post(url, json=payload)
return resp.json()
def get_user_list(self):
token = self.get_access_token()
url = f"https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token={token}&department_id=1"
resp = requests.get(url)
return resp.json().get("userlist", [])
# 使用示例
bot = WeComBot("ww1234567890abcdef", "your-secret-here", 1000001)
# 发送消息给张三
bot.send_text_message("zhangsan", "你好,我是家庭小助手!")
这个脚本足够轻量,没有多余依赖,连requests都用最简模式。我把send_text_message封装成一个函数,后面Clawdbot生成回复后直接调用就行。
5.4 与Clawdbot Webhook集成
Clawdbot支持Webhook,我们利用这个特性把企业微信消息接入进来。编辑~/.clawdbot/config.json,在根节点加一个webhooks段:
"webhooks": {
"wecom": {
"url": "http://localhost:18789/api/webhook/wecom",
"method": "POST"
}
}
然后在~/clawdbot/下新建webhook_server.py,用Python的Flask写一个极简Webhook接收器:
from flask import Flask, request, jsonify
import json
import subprocess
app = Flask(__name__)
@app.route('/api/webhook/wecom', methods=['POST'])
def wecom_webhook():
data = request.get_json()
# 解析企业微信发来的消息
if data.get("MsgType") == "text":
content = data.get("Content", "").strip()
userid = data.get("FromUserName", "")
# 把消息转发给Clawdbot
cmd = ['curl', '-X', 'POST', 'http://localhost:18789/api/chat',
'-H', 'Content-Type: application/json',
'-d', json.dumps({"message": content, "channel": "wecom", "userid": userid})]
subprocess.run(cmd, capture_output=True)
return jsonify({"errcode": 0, "errmsg": "ok"})
return jsonify({"errcode": 1, "errmsg": "unsupported"})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
运行python3 webhook_server.py &让它后台运行。现在企业微信发来的每条消息都会被转发给Clawdbot处理,Clawdbot的回复则通过前面的wecom.py脚本发回去。整套链路不经过公网,全部在局域网内完成,既安全又稳定。
6. 资源限制与长期稳定运行
6.1 内存与CPU的精细化控制
树莓派4B的4GB内存看着不少,但Clawdbot加上Node.js、Vosk、Webhook服务一起跑,很容易吃紧。我观察过,高峰期内存占用能到3.2GB,这时候系统就开始用swap,速度明显变慢。
解决办法是给Node.js加内存限制。编辑/etc/systemd/system/clawdbot.service,把ExecStart行改成:
ExecStart=/usr/bin/node --max-old-space-size=1536 /usr/bin/npx clawdbot gateway start
--max-old-space-size=1536表示Node.js最多用1.5GB内存,剩下的留给系统和其他进程。同时在~/.clawdbot/config.json里把日志级别调低:
"logging": {
"level": "warn",
"file": "/home/pi/clawdbot/logs/app.log"
}
只记录警告和错误,避免日志文件无限增长。我还加了个定时清理脚本~/clawdbot/clean_logs.sh:
#!/bin/bash
find /home/pi/clawdbot/logs -name "*.log" -mtime +7 -delete
用crontab -e添加每天凌晨2点执行:0 2 * * * /home/pi/clawdbot/clean_logs.sh
6.2 温度监控与自动降频
树莓派长时间高负载会发热,温度超过70℃时会自动降频,这时候Clawdbot响应就会变慢。我在/etc/systemd/system/下新建temp_monitor.service:
[Unit]
Description=Temperature Monitor
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'TEMP=$(vcgencmd measure_temp | sed "s/temp=//;s/\'\''//"); if (( $(echo "$TEMP > 70" | bc -l) )); then echo "$(date): 温度过高 $TEMP℃,触发降频" >> /var/log/temp.log; echo "0" | sudo tee /sys/devices/platform/soc/soc:firmware/get_throttled; fi'
[Install]
WantedBy=multi-user.target
这个服务每分钟检查一次温度,超过70℃就记录日志并触发一次降频(实际是清空throttled状态,让系统重新评估)。配合一个简单的散热方案——在树莓派上贴一块铜散热片,再加个5V小风扇,实测满负荷运行温度能稳定在62℃左右。
6.3 故障自愈机制
再稳定的系统也会出问题。我给Clawdbot加了个看门狗脚本~/clawdbot/watchdog.sh:
#!/bin/bash
# 检查Clawdbot是否存活
if ! pgrep -f "clawdbot gateway start" > /dev/null; then
echo "$(date): Clawdbot已停止,正在重启..." >> /var/log/clawdbot_watchdog.log
sudo systemctl restart clawdbot.service
fi
# 检查端口是否响应
if ! curl -s --head --fail http://localhost:18789 > /dev/null; then
echo "$(date): Clawdbot端口无响应,正在重启..." >> /var/log/clawdbot_watchdog.log
sudo systemctl restart clawdbot.service
fi
用crontab -e添加每5分钟执行一次:*/5 * * * * /home/pi/clawdbot/watchdog.sh
这套组合拳下来,我部署的树莓派Clawdbot已经连续运行了47天,期间只因为一次意外断电重启过。它不像云服务那样需要担心账单,也不像笔记本那样要时刻关注电池,就是一台插上电就忘掉的安静设备,真正实现了“部署一次,长期受益”。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐



所有评论(0)