绿联NAS部署MaiBot QQ机器人全记录
从Docker到SnowLuma的踩坑与填坑
前言
最近想在绿联DX4600 Pro上部署一个MaiBot QQ机器人,让它陪群友聊天。原以为拉个镜像、改个配置就完事,结果踩了一堆坑:NapCat被封、Docker Hub下载龟速、SnowLuma频繁断连、连发消息超时……断断续续搞了几天终于稳定运行了。写这篇文章记录一下过程,希望能帮到同样在折腾的朋友。
环境
| NAS | 绿联 DX4600 Pro(UGOS Pro 系统) |
| Docker | 绿联云内置 Docker(自带「项目」功能,支持 docker-compose) |
| 机器人框架 | MaiBot |
| QQ 协议端 | SnowLuma |
| AI 模型 | DeepSeek API |
一、部署方式选择:绿联Docker「项目」功能是神器
绿联云客户端的 Docker 自带「项目」功能,可以直接粘贴 docker-compose.yml 一键部署。全程不用开SSH,编辑配置文件用绿联自带的「文件管理」就能搞定,对不想碰命令行的用户非常友好。
操作路径:绿联云 → Docker → 项目 → 创建 → 粘贴 compose → 立即部署。
二、镜像下载:国内Docker Hub太慢怎么办
MaiBot + SnowLuma 一共需要拉三个镜像,其中 SnowLuma 的镜像最大(压缩后约 900MB)。国内 Docker Hub 速度感人,1MB/s 是常态,有时候干脆卡住不动。
试了一圈免费加速器(中科大、DaoCloud 等)都不太稳定后,最后买了轩辕镜像,900MB 秒拉完。虽然花了一点小钱,但省下的时间和血压绝对值回票价。
如果你有稳定的免费加速器,也欢迎在评论区分享。
三、SnowLuma配置:官方文档才是最终真理
SnowLuma 的 compose 配置有不少坑。我一开始在网上找的模板少了几个关键参数,导致:
- QQ 登录态没法持久化(重启就掉线)
- Hook 注入失败(收不到消息)
- 共享内存不够(QQ 客户端崩溃)
后来老老实实去 SnowLuma 官方文档 对着抄,才把下面这些关键项补上:
| 配置项 | 作用 |
|---|---|
shm_size: 1gb | QQ 是 Chromium 套壳,共享内存不够会崩 |
cap_add: SYS_PTRACE | SnowLuma 注入 QQ 进程的权限 |
security_opt: seccomp=unconfined | 同上,Hook 必须 |
/app/.config 卷 | QQ 配置持久化 |
/app/.local/share 卷 | QQ 数据持久化 |
SNOWLUMA_SCREEN: 1920x1080x24 | 确保 QQ 界面正常渲染 |
官方文档永远是第一参考源。网上的二手资料可能过时或遗漏关键参数。
四、适配器连接:127.0.0.1 是Docker里最大的坑
MaiBot 通过 OneBot 适配器连接 SnowLuma。日志疯狂刷:
NapCat 适配器连接失败: Cannot connect to host 127.0.0.1:3001
问题出在哪?Docker 里 core 和 snowluma 是两个独立容器,127.0.0.1 指的是各自容器内部,互相不通。
解决:配置文件里把 host 从 127.0.0.1 改成 Docker 服务名 snowluma:
[luma_client]
server = "snowluma" # Docker服务名,不是127.0.0.1
port = 3001
改完重启,日志变成 SnowLuma WebSocket 已连接: ws://snowluma:3001,世界清静。
五、连续发送超时:SnowLuma的已知问题
连接成功后,又发现一个新问题:麦麦长回复会被分割成多条消息连发,第二条有概率触发:
send_msg failed: send group message failed:
send reply 179 timed out after 15000 ms
诡异的是——消息其实已经发出去了,群友能看到,但 SnowLuma 还是报错。排查发现 SnowLuma 内部的发送超时是硬编码 15 秒,短时间内 QQ 协议层响应慢就直接报 timeout,但实际上消息已经送达了。
临时解决方案
在 MaiBot 的 bot_config.toml 里限制回复不拆分,避免连发:
[response_splitter]
enable = true
max_split_num = 1 # 禁止分割,一条消息只发一次
[chat]
typing_speed = 2.0 # 发消息间隔拉长,给协议层喘息时间
这样麦麦回复慢一丢丢,但不再触发 timeout 了。
长期解决
去 SnowLuma 的 GitHub 提了 issue,希望开发者能把超时阈值改为可配置,或者加个重试机制。等官方修复。
六、稳定运行后的最终 compose
附上经过多轮踩坑调试后的完整 docker-compose.yml:
services:
core:
container_name: maim-bot-core
image: sengokucola/maibot:latest
environment:
- TZ=Asia/Shanghai
- EULA_AGREE=8e6e7d647f7f82d6ea98456b73908656
- PRIVACY_AGREE=91e5db7659c560bc3545e63859b6ebc0
- MAIBOT_LEGACY_0X_UPGRADE_CONFIRMED=1
- WEBUI_HOST=0.0.0.0
ports:
- "18001:8001"
volumes:
- ./docker-config/mmc:/MaiMBot/config
- ./data/MaiMBot:/MaiMBot/data
- ./data/MaiMBot/emoji:/data/emoji
- ./data/MaiMBot/plugins:/MaiMBot/plugins
- ./data/MaiMBot/logs:/MaiMBot/logs
- ./depends-data:/MaiMBot/depends-data
restart: always
networks:
- maim_bot
snowluma:
container_name: maim-bot-snowluma
image: motricseven7/snowluma:latest
restart: unless-stopped
shm_size: 1gb
cap_add:
- SYS_PTRACE
security_opt:
- seccomp=unconfined
environment:
- VNC_PASSWD=vncpasswd
- SNOWLUMA_UID=1000
- SNOWLUMA_GID=1000
- SNOWLUMA_WEBUI_PORT=5099
- SNOWLUMA_LOG_LEVEL=info
- SNOWLUMA_SCREEN=1920x1080x24
- SNOWLUMA_HOOK_AUTOLOAD=1
- SNOWLUMA_QQ_FLAGS=--disable-gpu --disable-software-rasterizer --disable-gpu-compositing
- TZ=Asia/Shanghai
ports:
- "5900:5900"
- "6081:6081"
- "5099:5099"
- "3000:3000"
- "3001:3001"
volumes:
- ./data/snowluma:/app/snowluma-data
- ./data/snowluma-qq-config:/app/.config
- ./data/snowluma-qq-data:/app/.local/share
networks:
- maim_bot
sqlite-web:
image: coleifer/sqlite-web
container_name: sqlite-web
restart: always
ports:
- "8120:8080"
volumes:
- ./data/MaiMBot:/data/MaiMBot
environment:
- SQLITE_DATABASE=MaiMBot/MaiBot.db
networks:
- maim_bot
networks:
maim_bot:
driver: bridge
七、总结
从零到稳定运行,踩过的坑按时间顺序:
- 部署方式 → 绿联「项目」功能香,不用 SSH
- 镜像下载 → 国内 Docker Hub 慢,氪金解决
- SnowLuma 配置 → 官方文档 vs 网上二手的落差
- 适配器 host → Docker 里
127.0.0.1不是你以为的那个127.0.0.1 - 连发 timeout → SnowLuma 已知问题,限制消息拆分先顶着
整个过程断断续续搞了几天,中间 NapCat 被 QQ 风控、SnowLuma 频繁断连的时候确实有点想放弃。好在最后都解决了,现在麦麦在群里稳定运行,群友表示这机器人「挺像个人的」——这应该是对 MaiBot 最高的评价了。
希望这篇文章能帮你少走些弯路。有问题欢迎在评论区交流。
本文由ds代笔

Comments NOTHING