1. 先备好这些东西
| 东西 | 说明 |
|---|---|
| 2 核 2G 服务器 | 两个容器加起来要吃 1G 多内存,再小容易崩 |
| 宝塔面板 | 用来点点鼠标管 Docker 和文件 |
放行端口 6081 5099 6185 |
在宝塔「安全」和云厂商后台都放开,用来进 WebUI 和远程桌面 |
| 一个 QQ 小号 | 给机器人挂着用的,千万别拿自己的大号试 |
2. 装 AstrBot
这个最简单,直接在「宝塔 → Docker → 应用商店」里搜 astrbot,点一键安装就行,默认配置不用动。
3. 用 docker-compose 装 SnowLuma
SnowLuma 会用到下面这几个端口,装之前先看看有没有跟别的容器撞车:
| 端口 | 干嘛用的 |
|---|---|
5900 |
VNC 远程桌面 |
6081 |
noVNC(直接用浏览器开远程桌面扫码登 QQ) |
5099 |
SnowLuma 自己的 WebUI 后台 |
3000 / 3001 |
OneBot 的 HTTP 和 WebSocket 端口 |
在宝塔文件管理里随便建个目录(比如 /www/wwwroot/snowluma),里面新建一个 docker-compose.yml,把下面这段粘进去。注意最后我加了 baota_net 网络,是为了让它和宝塔应用商店装的 AstrBot 处在同一个局域网里,不然待会儿连不上:
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,跟宝塔装的 astrbot 放同一个网段
networks:
- baota_net
networks:
baota_net:
external: true
volumes:
snowluma-data:
snowluma-qq-config:
snowluma-qq-data:
打开宝塔终端进到这个目录,跑起来:
docker compose up -d
以后要是想更新版本,也是在这个目录里跑:
docker compose pull
docker compose up -d
4. 扫码登 QQ 并连上 AstrBot
- 浏览器打开
http://<你的服务器IP>:6081/,默认密码填vncpasswd,进去就能看到桌面里的 QQ,拿小号扫码登录。 - 再打开
http://<你的服务器IP>:5099/进 SnowLuma 后台。初始密码去宝塔的容器日志里翻一下password。 - 照着下面两张图把两边的 WebSocket 连上:


SnowLuma 里的反向 WS 地址直接填容器名(比如 ws://astrbot_4nKx:6199/ws,具体看你宝塔里 AstrBot 容器叫啥名),这样哪怕容器重启换了内网 IP 也不会断。两边的 Token 随便填个一样的字符串就行。
5. 2G 内存老卡死,加个 Swap 救命
挂上机器人之后,我这台 2G 内存的小机器隔三差五就彻底卡死,看监控每次死之前磁盘读写都拉满,明显是内存爆了。后来照着 B 站一个视频给服务器挂了 2G 的 Swap 虚拟内存,才总算消停下来。
直接在终端挨个跑下面这几条命令:
# 划一个 2G 的 swap 文件
fallocate -l 2G /swapfile
# 改权限只让 root 读写
sudo chmod 600 /swapfile
# 格式化成 swap
sudo mkswap /swapfile
# 立即启用
sudo swapon /swapfile
# 看看挂上没有
free -h
# 调高一点使用 swap 的积极性
sudo sysctl vm.swappiness=60
光这样重启服务器就没了,还得去改 /etc/fstab,在文件最底下加一行:
/swapfile none swap sw 0 0
改完跑一遍下面三条命令验一下,没报错就稳了,不怕重启开不了机:
mount -a
systemctl daemon-reload
swapon -a
参考文献: - https://docs.astrbot.app/ - https://snowluma.github.io/ - https://www.bilibili.com/video/BV1a3QaYjE15