想让 QQ 小号变成能自由回复的「伪人」?不用自己写机器人代码,把两个现成项目在宝塔面板里一装、扫个码就能跑起来。astorbot 负责接 AI 聊天模型对话,SnowLuma 负责托管 QQ 机器人,两者连起来就是一台 24 小时在线的 QQ 伪人。唯一要付出的就是一台小服务器的钱。
你需要准备
| 工具 | 用途 | 获取方式 |
|---|---|---|
| 2 核 2G 服务器 | 跑两个容器,加起来要 1G 多内存 | 任意云厂商 |
| 宝塔面板 | 可视化管理 Docker、文件和网站 | 官网一键安装 |
防火墙放行 6081 5099 6185 |
SnowLuma 的 WebUI 和 noVNC 访问 | 宝塔「安全」里放行 |
| 一个 QQ 小号 | 给机器人用,别拿主号 | 注册一个 |
部署 astorbot
在宝塔 → Docker → 应用商店里搜索 astorbot,一键下载安装即可,不用改配置。
部署 SnowLuma
容器会占用以下端口,确保没有与其他容器冲突:
| 端口 | 用途 |
|---|---|
5900 |
VNC(远程桌面,密码登录 QQ 用) |
6081 |
noVNC(浏览器版 VNC,无客户端访问) |
5099 |
SnowLuma WebUI |
3000 |
OneBot HTTP(默认) |
3001 |
OneBot WebSocket(默认) |
使用 docker-compose 部署
在宝塔文件下新建一个文件夹(比如 /www/wwwroot/snowluma),在里面新建 docker-compose.yml 并复制粘贴以下内容:
services:
snowluma:
image: ${SNOWLUMA_IMAGE:-motricseven7/snowluma:latest}
container_name: ${SNOWLUMA_CONTAINER:-snowluma}
restart: unless-stopped
shm_size: 1gb
cap_add:
- SYS_PTRACE
security_opt:
- seccomp=unconfined
environment:
VNC_PASSWD: ${VNC_PASSWD:-vncpasswd}
SNOWLUMA_UID: ${SNOWLUMA_UID:-1000}
SNOWLUMA_GID: ${SNOWLUMA_GID:-1000}
SNOWLUMA_WEBUI_PORT: ${SNOWLUMA_WEBUI_PORT:-5099}
SNOWLUMA_LOG_LEVEL: ${SNOWLUMA_LOG_LEVEL:-info}
SNOWLUMA_SCREEN: ${SNOWLUMA_SCREEN:-1920x1080x24}
SNOWLUMA_HOOK_AUTOLOAD: ${SNOWLUMA_HOOK_AUTOLOAD:-1}
SNOWLUMA_EXTRA_QQ_HOMES: "${SNOWLUMA_EXTRA_QQ_HOMES:-}"
SNOWLUMA_QQ_FLAGS: "${SNOWLUMA_QQ_FLAGS:---disable-gpu --disable-software-rasterizer --disable-gpu-compositing}"
ports:
- "${VNC_PORT:-5900}:5900"
- "${NOVNC_PORT:-6081}:6081"
- "${SNOWLUMA_WEBUI_HOST_PORT:-5099}:${SNOWLUMA_WEBUI_PORT:-5099}"
- "${ONEBOT_HTTP_PORT:-3000}:3000"
- "${ONEBOT_WS_PORT:-3001}:3001"
volumes:
- snowluma-data:/app/snowluma-data
- snowluma-qq-config:/app/.config
- snowluma-qq-data:/app/.local/share
# 新增:接入baota_net与astorbot同一个宝塔网络,否则后续ws连接不上
networks:
- baota_net
networks:
baota_net:
external: true
volumes:
snowluma-data:
snowluma-qq-config:
snowluma-qq-data:
这里有个坑必须提醒:要让 SnowLuma 和 astorbot 处在同一个宝塔网络 baota_net 里,否则后面两个容器之间连 WebSocket 会连不上。上面 compose 里的 networks 段就是干这个的。
点击宝塔「终端」进入这个文件夹并启动:
docker compose up -d
后续要升级镜像:
docker compose pull
docker compose up -d
启动机器人 QQ
- 启动容器后在浏览器访问
http://<IP>:6081/,输入vncpasswd - 扫码登录机器人 QQ 号
- 浏览器访问
http://<IP>:5099/打开 SnowLuma WebUI - 打开容器日志,找到
password输入
按图设置连接 ws


SnowLuma 反向 URL 输入 ws://astrbot_4nKx:6199/ws,这样在 astorbot 容器重启更换 IP 时也能连上。授权 token 两边填成一样的即可。
部署之后服务器经常卡住怎么办
部署过机器人之后我经常遇到服务器卡死只能重启的情况,每次卡死前都是磁盘大量读写,估计是内存不足。我的解决办法是给服务器加 swap 交换文件(具体做法参考了 B 站一个视频,链接放文末)。依次运行以下命令:
# 创建 2G swap 文件
fallocate -l 2G /swapfile
# 权限只给 root
sudo chmod 600 /swapfile
# 格式化为 swap
sudo mkswap /swapfile
# 启用
sudo swapon /swapfile
# 查看内存和 swap 是否生效
free -h
# 调高 swap 使用倾向
sudo sysctl vm.swappiness=60
想要重启不丢失,必须把 swap 写入开机挂载表 /etc/fstab,编辑 /etc/fstab,在末尾增加一行:
/swapfile none swap sw 0 0
再验证一下配置(防止开机启动失败):
# 加载fstab全部挂载项,无报错即配置正确
mount -a
# 重载系统挂载单元
systemctl daemon-reload
# 启用所有fstab里定义的swap
swapon -a
重启后执行 free -h / swapon --show 就能看到交换空间正常存在。