
飞牛 NAS 部署 CowAgent 并开放局域网访问
周言志飞牛 NAS 部署 CowAgent 并开放局域网访问
环境:飞牛 NAS(主机名
fnnas,普通用户FNNAS,Python 3.11)
CowAgent 源码位于/root/CowAgent/,Web 控制台端口9899
所有命令在 NAS 上以 root 运行(sudo -i)
CowAgent 即 chatgpt-on-wechat(命令名 cow,包名 cowagent),是一个可以把 AI 接入微信/飞书的聊天机器人框架,支持多模型后端(智谱 GLM、OpenAI 等)、技能扩展、Web 控制台等功能。飞牛 NAS 没有自带浏览器,Web 控制台默认只监听 127.0.0.1,本机访问不了,所以需要把监听地址改成 0.0.0.0,让局域网内的电脑/手机能通过浏览器访问。
本文从零开始记录完整部署流程:获取源码、安装依赖、初始配置、用 systemd 托管服务、开放局域网访问,最后附常见坑和速查命令。
为什么选源码部署
项目提供了一个 docker-compose.yml,但引用的预构建镜像只有 amd64 版本。飞牛 NAS 如果是 ARM 架构(aarch64),Docker 方式会触发平台不匹配警告——虽然可以通过 platform: linux/amd64 模拟运行,或本地 docker build 自建 arm64 镜像,但都比较折腾,性能也打折。
源码部署更直接:克隆代码、pip install -e . 装好就能用,改配置方便,后续装技能、改源码都即时生效。所以本次走的是源码 + editable 安装方式。
1. 获取 CowAgent
1.1 前置条件检查
飞牛 NAS(fnOS,Debian 系)自带 Python 3.11,先确认版本:
1 | python3 --version |
确认 git 可用(fnOS 默认带):
1 | git --version |
确认 pip 可用:
1 | python3 -m pip --version |
如果 pip 不存在,用系统包管理器补上:
1 | apt update && apt install -y python3-pip |
如果 python3 -m venv 报错缺模块,装一下 venv 包:
1 | apt install -y python3-venv |
1.2 克隆源码
切到 root,克隆到 /root/CowAgent/:
1 | sudo -i |
如果你的 CowAgent 是定制 fork,换成对应的仓库地址即可。关键是源码最终在
/root/CowAgent/这个路径下。
1.3 创建虚拟环境并安装
建议建一个独立 venv,避免污染系统 Python:
1 | python3 -m venv /root/CowAgent/venv |
editable 安装(-e 参数),这样改源码即时生效,cow 命令也能直接用:
1 | pip install -e . |
这一步会安装依赖(包括 itchat、requests、flask 等),耗时取决于网络,一般几分钟。
1.4 验证安装
1 | cow --version |
看到版本号输出即安装成功。也可以用 Python 方式验证:
1 | python3 -c "import cowagent; print('ok')" |
2. 初始配置
2.1 创建配置文件
CowAgent 的配置文件是 config.json,首次使用需要从模板复制一份:
1 | cd /root/CowAgent |
如果仓库里没有
config-template.json,直接vi config.json手动创建,参考下面的完整示例。
2.2 关键字段说明
| 字段 | 作用 | 示例值 |
|---|---|---|
channel_type |
渠道类型,web 表示 Web 控制台 |
"web" |
cow_lang |
语言 | "zh" |
web_port |
Web 控制台端口 | 9899 |
web_host |
Web 监听地址,默认无(即 127.0.0.1) |
"0.0.0.0" |
web_password |
Web 控制台登录密码 | 自定义 |
bot_type |
AI 后端类型(zhipu / openai) |
"zhipu" |
model |
模型名 | "glm-5-turbo" |
zhipu_ai_api_key |
智谱 API key | 从 open.bigmodel.cn 获取 |
zhipu_ai_api_base |
智谱 API 地址 | "https://open.bigmodel.cn/api/paas/v4" |
agent_max_context_tokens |
上下文 token 上限 | 50000 |
web_host和web_password在模板里默认没有,需要手动加(第 3 节专门讲)。
2.3 最小可用配置示例
以下是接通智谱 GLM 并开放 Web 控制台的最小配置(省略了不相关字段):
1 | { |
如果用 OpenAI 兼容接口,把
bot_type改成"openai",用open_ai_api_key/open_ai_api_base替代智谱相关字段,model填对应模型名。
2.4 填入 API key
拿到智谱 key 后,用 sed 写入(注意替换 你的智谱key):
1 | sed -i 's/"zhipu_ai_api_key": "YOUR_KEY"/"zhipu_ai_api_key": "你的智谱key"/' /root/CowAgent/config.json |
或者直接 vi 编辑,找到 zhipu_ai_api_key 那行改掉。验证:
1 | grep zhipu_ai_api_key /root/CowAgent/config.json |
3. 开放局域网访问
默认配置没有 web_host 字段,因此监听 127.0.0.1,只能本机访问。需要在 config.json 里加两个字段:
web_host:0.0.0.0—— 监听所有网卡web_password: 自己设一个登录密码
推荐做法:用 sed 一行插入
在 "web_port": 9899 前面插入 web_host 和 web_password:
1 | sudo sed -i 's/"web_port": 9899/"web_host": "0.0.0.0","web_password": "你的密码","web_port": 9899/' /root/CowAgent/config.json |
终端自动换行会把长命令断成两行导致报错。如果复制粘贴失败,改用反斜杠续行,或直接用
vi手动编辑。
验证是否改成功:
1 | grep web_host /root/CowAgent/config.json |
看到 "web_host": "0.0.0.0" 即成功。
替代做法:vi 手动编辑
1 | sudo vi /root/CowAgent/config.json |
- 找到
"web_port": 9899那一行 - 按
i进入编辑模式 - 在
"web_port"前面加上"web_host": "0.0.0.0", "web_password": "你的密码", - 按
Esc,输入:wq回车保存
飞牛防火墙放行
如果上一步做完仍然从局域网访问不了,检查 fnOS 防火墙是否放行了 9899 端口:
1 | # 查看当前规则 |
fnOS 大部分版本默认不拦局域网端口,这一步通常不需要。但如果你在飞牛 Docker 网络或虚拟接口环境下部署,可能需要手动放行。
4. 配置 systemd 托管
CowAgent 需要长期运行,最好交给 systemd 管理——开机自启、崩溃自动重启、日志统一收集。
4.1 创建服务文件
1 | cat > /etc/systemd/system/cowagent.service << 'EOF' |
几个关键点:
WorkingDirectory设为/root/CowAgent,确保config.json和源码能被找到ExecStart用 venv 里的 Python,而不是系统 Python,确保依赖正确加载Restart=always+RestartSec=10:进程崩溃后 10 秒自动拉起,避免重启风暴- 日志统一写到
/var/log/cowagent.log
4.2 启动并设置开机自启
1 | systemctl daemon-reload |
看到 active (running) 即成功。确认日志正常输出:
1 | tail -f /var/log/cowagent.log |
看到 Web 控制台启动、监听 0.0.0.0:9899 的日志行就对了。
4.3 日常管理命令
1 | # 查看状态 |
如果暂时不想用 systemd,也可以用
screen或nohup后台运行:
1
2
3
4
5
6
7 # screen 方式
screen -S cowagent
cd /root/CowAgent && source venv/bin/activate && python3 app.py
# 按 Ctrl+A 再按 D 脱离会话
# nohup 方式
nohup /root/CowAgent/venv/bin/python3 app.py > /var/log/cowagent.log 2>&1 &这两种方式都不支持开机自启和崩溃重启,长期运行还是推荐 systemd。
5. 从电脑访问
先查 NAS 的局域网 IP:
1 | hostname -I |
然后在电脑/手机浏览器打开:
1 | http://NAS的IP:9899 |
例如 NAS IP 是 192.168.1.100,就访问 http://192.168.1.100:9899,输入第 3 步设的 web_password 登录。
登录后就能在 Web 控制台里直接跟 AI 对话,也可以从这里安装/管理技能(cow skill install ...)。
如果页面打不开,依次排查:
systemctl status cowagent确认服务在跑grep web_host /root/CowAgent/config.json确认是0.0.0.0hostname -I确认 IP 没错- 浏览器和 NAS 在同一局域网(同网段)
常见坑
| 现象 | 原因 | 解决 |
|---|---|---|
python3 -c "..." 报 IndentationError |
终端自动换行把命令截断、加了缩进 | 改用 sed 或 vi |
heredoc cat > /tmp/fix.py 卡住 |
进了输入模式 | Ctrl+C 退出,改用 sed |
sed: no input files / Permission denied |
命令被换行断成两行 | 用 sudo + 反斜杠续行,或 cd /root/CowAgent 后对 config.json 操作 |
cow skill install ... 报 Permission denied 访问 /root/CowAgent/cli/__init__.py |
cow 是 editable 安装,去 /root/CowAgent/ 找源码;普通用户 FNNAS 没权限读 /root |
用 sudo -i 切到 root 再运行 cow |
| Web 控制台打不开 | web_host 没改成 0.0.0.0,或 systemd 服务没启动 |
grep web_host config.json 确认配置,systemctl status cowagent 确认服务在跑 |
pip install -e . 报权限错误 |
没用 venv,直接装到了系统 Python | 确保先 source venv/bin/activate |
| 浏览器能打开但提示密码错误 | web_password 没设,或设了但没重启服务 |
systemctl restart cowagent |
| 飞牛 NAS 重启后服务没自动起来 | systemctl enable 没执行 |
systemctl enable cowagent |
| 页面能打开但 AI 不回复 | API key 没填对,或 bot_type / model 配错 |
grep -E 'bot_type|model|api_key' config.json 检查,对照第 2 节示例 |
日志报 Address already in use |
9899 端口被占 | lsof -i:9899 找到占用进程,kill 掉或改 web_port |
常用命令速查
1 | # 切到 root(CowAgent 在 /root 下,需要 root 权限) |
文件清单
| 路径 | 作用 |
|---|---|
/root/CowAgent/ |
CowAgent 源码目录 |
/root/CowAgent/venv/ |
Python 虚拟环境(隔离依赖) |
/root/CowAgent/config.json |
主配置文件(端口、监听地址、API key 等) |
/root/CowAgent/config-template.json |
配置模板(初始复制用) |
/etc/systemd/system/cowagent.service |
systemd 服务文件 |
/var/log/cowagent.log |
运行日志 |



