自己的电脑总有关机的时候,想让 Bot 一直在线,迟早要把它放到服务器上。这种情况下,Desktop 还是装在你的 Windows 电脑上,QQ 和协议端跑在 Linux 服务器上,两边通过 SSH 连接。Linux 那边不需要装 Desktop。
这一篇带你在服务器上跑起一个原生 Bot。打算用 Docker 容器的话,先跟着本篇把主机加好、连接测通,再转到 Docker 部署。
准备信息
| 信息 | 从哪确认 | 示例 |
|---|---|---|
| 主机地址 | 云服务器控制台、路由器管理页或管理员 | 192.168.1.20 |
| SSH 端口 | 服务器的 SSH 配置 | 一般是 22,可能改过 |
| 用户名 | 建服务器时设的 Linux 用户 | ubuntu |
| 认证方式 | 服务器允许的密码或私钥 | 私钥是 Windows 本机上的私钥文件 |
| 安装权限 | 这个用户能否写安装目录、装依赖 | 系统依赖可能需要 sudo |
先确认这台电脑能连到服务器的 SSH 端口。云服务器一般有安全组,主机上可能还有防火墙,这两处都要放行你的来源地址。云控制台上显示「运行中」,只能说明机器开着,不代表 SSH 一定连得上。
如果你还没决定装什么系统,Ubuntu / Debian 是最省事的选择。至于缺不缺 QQ 需要的动态库、CPU 架构对不对,后面的组件检测会告诉你。
1. 添加并测试主机
- 打开「远端」,点添加。
- 在「添加远端服务器」里填「名称」「主机地址」「端口」「用户名」。名称自己能认出来就行,比如
家里的 Linux。 - 「目标系统」选「自动识别」或者「Linux」。
- 「认证方式」选「密码认证」或者「密钥认证」。用密钥的话,选的是私钥文件,不是那个
.pub结尾的公钥。用密码、但暂时不想配免密登录的,把「自动配置免密登录」的勾去掉。 - 保存,然后在主机卡片上点「测试连接」。
- 第一次连接时会显示这台主机的指纹,和服务器那边核对一致以后,再选择信任。
添加远端服务器时填写主机、系统与认证方式 · 演示数据
测试通过了再往下走。地址写错、密码不对、连接超时,是三种不同的问题,按测试结果给出的提示分别处理。以后编辑这个档案时,密码框留空表示继续用原来的密码,并不是把密码清空。
如果你本地已经有 SSH 配置文件,可以用远端页的「从 SSH 配置导入」,省得再手动填一遍。导入后也一样要核对地址和用户名,再测一下连接。
改成免密登录
每次都输密码挺烦的,可以改成免密登录,也就是用本机的私钥来证明身份。Desktop 能给这个档案生成一对专用的密钥,并把公钥写进目标用户的 authorized_keys 里。
- 先用密码把连接测通,核对好主机指纹。
- 在远端卡片上点钥匙图标「配置免密登录」,或者右键卡片选同名的操作。只有还在用密码认证的档案才有这个入口。
- 在弹窗里填「当前 SSH 密码」,点「配置免密」。如果之前还没信任主机指纹,这里会先让你核对并信任。
- 等提示「免密登录已配置」。Desktop 会生成密钥、写入公钥,再用新的私钥真的登录一次,确认能用以后,才会把档案自动切到「密钥认证」。
- 再点一次「测试连接」确认。编辑档案时可以看到「私钥文件路径」。
如果新的私钥验证没通过,档案会继续保持密码认证,不会把你锁在门外。按错误提示去检查远端的 SSH 公钥认证配置和目录权限。
添加主机时一起配置: 新建档案的时候,选「密码认证」、填好密码、勾上「自动配置免密登录」,再点「添加」。Desktop 会先保存档案,然后走一遍同样的流程:测试连接、确认指纹、配置密钥。密码留空的话就只添加档案,不会配置免密。卡片出现了,不代表免密已经配置成功,记得看一眼结果提示。
自动生成的私钥存在本机数据根目录下的 ssh_keys 文件夹里,配置 ZIP 不会包含它。换电脑的时候,要么把私钥单独搬过去,要么用密码重新配一次。私钥的内容不要贴到日志或者反馈里,见 备份与恢复。
2. 在服务器上装组件
- 打开「组件」,在主机选择器里切到这台 Linux。
- 确认没选错主机,然后看 QQ、NapCat / SnowLuma 和运行时的检测结果。
- 安装缺少的组件。原生运行需要 Linux 上自己有 QQ 和协议端,你 Windows 电脑上装的那份是用不上的。
- 在「任务」里看进度。遇到缺系统库或者需要提权的情况,按服务器的实际情况处理,别把同一个任务反复提交好几次。
- 装完刷新一下检测结果,确认协议端和依赖都准备好了。
如果服务器上以前就装过,在「远端 → 库存」里刷新探测,核对一下检测到的目录。注意这里的路径是 Linux 的,比如 /home/ubuntu/...,不是 Windows 那种 C:\...。
远端页按主机显示连接与库存入口 · 演示数据
3. 创建远端原生 Bot
- 打开「机器人」,新建一个 Bot。
- 填「QQ 账号」和「实例名称」,选刚才准备好的 NapCat 或 SnowLuma。
- 「运行场景」选远程运行,「目标远程主机」选这台 Linux。
- 「启动方式」选直接运行,核对目标主机和组件状态。
- 保存,回到卡片上点启动。
- 打开日志,确认程序确实是在这台服务器上启动的。
到这里程序已经在服务器上跑起来了,接下来要登录 QQ。
4. 登录 QQ
NapCat:点卡片上的 WebUI,按页面提示拿到二维码,用手机 QQ 扫码并确认,然后看看卡片和日志里的账号状态。
SnowLuma:点卡片上的「扫码登录」。这个功能默认是开着的,但在远端 Linux 上,它需要 Python 3、AT-SPI、X11 和一个可用的会话 D-Bus。环境不满足的话,就通过 QQ 图形界面 / VNC 来登录,见 SnowLuma 扫码登录。
完成后核对三件事: 进程还在运行,QQ 已经登录,OneBot 连接符合你的用途。光看到进程在跑、WebUI 能打开,并不能说明应用端已经连上了。
5. 连接应用端
先看一下 OneBot 连接,决定用 HTTP、正向还是反向 WebSocket。填地址的时候,想清楚是谁去连谁:
- 应用端和 Bot 在同一台 Linux 上,
127.0.0.1指的就是这台 Linux。 - 应用端在另一台机器上,那么
127.0.0.1在两边指的都是各自所在的机器,不能用它来代表远端服务器。 - 应用端在容器里,回环地址指的是容器自己,见 Docker 的端口说明。
在 Desktop 里把连接配好、保存,需要重启的按提示重启。最后从应用端或者调试台发一次请求,再发一条测试消息,看事件能不能送到。
WebUI 里改的连接又变回去了
这是因为 Desktop 启动远端 Bot 的时候,会用它自己保存的连接配置去覆盖远端的 OneBot 文件。你在 NapCat / SnowLuma WebUI 里直接改的东西,如果没同步回 Desktop,下次一启动就被盖掉了。
解决办法:打开这个 Bot 的「配置 → 连接」,点「从远端读取」,核对一下差异,填回表单并保存,以后再从 Desktop 启动就不会丢了。
按阶段排查
| 卡在哪一步 | 先查什么 | 然后 |
|---|---|---|
| SSH 测试失败 | 地址、端口、用户名、认证和网络路径 | 先让连接测试通过 |
| 组件安装失败 | 「任务」里失败的步骤、远端下载与权限 | 补齐依赖或修好下载后重试 |
| 进程启动就退出 | Bot 日志、QQ 动态库、组件的实际路径 | 回组件页重新检查 |
| 进程在跑,账号不在线 | WebUI / QQ 登录流程、手机确认 | 完成登录,不用重新建 Bot |
| WebUI 打不开或鉴权失败 | SSH 连通性、实际的 WebUI 端口和密码 | 重新连接,核对当前配置 |
| QQ 在线,应用端没反应 | OneBot 方向、地址、端口、token、适配器 | 按 连接排错 检查 |
希望合上电脑以后也能收到掉线通知的话,接着配 远端值守。另外,升级 Desktop 不会顺带升级远端的 ncd-watch,它要在组件页里单独更新。