使用 Incus LXC 容器部署 QQ 聊天机器人

使用 Incus LXC 容器部署 QQ 聊天机器人

GT610 Lv4

🤖 前言

朋友们对群聊机器人的呼声越来越高,于是就想趁这个时候部署一个玩玩。前端我采用了 NapCat,这是一个通过官方客户端收发消息的 QQ 框架,后端则使用 NoneBot,中间通过 OneBot V11 协议进行对接。

由于服务器上有非常多的业务,使用所以不能直接在服务器上部署 QQ 聊天机器人。我也尝试了 Docker 配置容器和网络部署,但是容器之间的数据互通非常麻烦,甚至需要在容器里创建软链接才能使一些插件正常工作。

所以我考虑系统级隔离的环境,但是 KVM 虚拟机的性能开销较大,对于机器人这种项目来说又有点繁琐。这个时候我就考虑到了 LXC。

LXC 是什么?

LXC (Linux Containers) 是一种操作系统级虚拟化技术,它允许在单个 Linux 主机上运行多个隔离的 Linux 系统实例。与 Docker 和 KVM 相比,LXC 有着不同的底层实现和适用场景:

  • 与 Docker 的区别:Docker 主要针对应用容器化,强调轻量级和微服务架构,而 LXC 提供了更完整的系统环境,相当于轻量级虚拟机。LXC 容器拥有自己的 init 进程、系统服务和网络栈,可以运行几乎任何 Linux 应用,而 Docker 更专注于单个应用的隔离和部署。

  • 与 KVM 的区别:KVM 是全虚拟化技术,需要完整的操作系统镜像,性能开销较大,但隔离性最强。LXC 则是共享主机内核的容器化技术,性能开销小,启动速度快,但隔离性略低于 KVM。LXC 介于 Docker 和 KVM 之间,既有较好的隔离性,又有接近原生的性能。

Incus 是什么?

Incus 则是 LXC 容器的高级管理工具,提供了更友好的接口和丰富的功能,使得容器管理更加便捷。

目前支持管理 LXC 的有 Incus、LXD 和 Libvirt。

为什么选择 Incus?

在众多 LXC 管理工具中,我最终选择了 Incus,主要基于以下几个原因:

与 LXD 的对比

  • 独立发展:Incus 是从 LXD 分叉出来的项目,由原 LXD 主要维护者 Stéphane Graber 领导,采用独立的开发路线
  • 创新速度:Incus 有着更快的创新和更新速度,能够更快地响应用户需求和安全问题
  • 社区驱动:采用更社区化的开发模式,决策更加透明。Canonical 你看你干的好事儿
  • 兼容性:保持与 LXD 命令行接口的高度兼容,学习成本低

与 Libvirt 的对比

  • 易用性:Incus 提供了更简洁直观的命令行接口和 REST API,使用门槛更低
  • 容器专注:Incus 专注于容器技术,对 LXC 的支持更加全面和深入
  • 功能丰富:内置了镜像管理、网络配置、存储管理等丰富功能,无需额外组件
  • 生态系统:拥有更活跃的社区和更丰富的文档资源

对于 QQ 机器人这种需要稳定运行且资源占用适中的应用,Incus 提供的平衡性能和隔离性的特性非常适合,同时其友好的管理界面也让日常维护变得更加简单。

本文将介绍如何利用 Incus 容器技术来部署 QQ 聊天机器人,具体是通过在 Incus 实例中直接安装并配置 NapCat 和 NoneBot 框架来实现。Incus 作为一个强大的容器管理工具,提供了轻量级的虚拟化环境,非常适合运行各类服务,包括聊天机器人。

🛠️ 环境准备

宿主机要求

硬件 推荐配置
CPU 2核及以上
内存 2GB及以上
硬盘 10GB可用空间
操作系统 Linux
网络 稳定的互联网连接

安装 Incus

首先需要在宿主机上安装 Incus。主流发行版均提供了 Incus 包,对于 Ubuntu / Debian 用户,也可以从 Zabbly 提供的 Incus 仓库安装。

Zabbly 的 Incus Stable 仓库有一个中科大镜像源可用,将 zabbly-incus-stable.sources 中的 https://pkgs.zabbly.com/incus/stable 链接替换为 https://mirrors.ustc.edu.cn/incus/stable 即可。

修改命令的这个位置
修改命令的这个位置

安装完成后,运行以下命令进行初始化:

1
2
# 初始化 Incus
sudo incus admin init

然后 Incus 会问你一些问题,一般来说如果你不熟悉它的话,保持默认即可。

🔄 更换 Incus 镜像源

以下 Incus 命令如果权限不够,就使用 root 身份或者 sudo 运行。

创建一个 remote 链接,指向镜像站即可,或替换掉默认的 images 链接。

1
incus remote add mirror-images https://mirror.nju.edu.cn/lxc-images/ --protocol=simplestreams --public

你可以根据 镜像文档 选择适合自己的镜像源,但是目前只有南大的镜像源是正常更新的,所以我强烈建议使用南大的镜像源

国内所有的 LXC 镜像仅适用于 Incus不能用于 LXD

然后执行以下命令查询远程可用的系统镜像:

1
incus image list mirror-images:

该命令可以配合 grep 实现搜索指定镜像。

🐳 创建 Incus 容器

1. 创建并启动容器

Incus 中的每一个容器都称作实例,下文中“实例”均指与 Docker 容器类似的概念。

1
2
# 创建一个名为 qq-bot 的实例,使用 Debian 13 镜像
incus launch images:debian/13 qq-bot

如果遇到报错:Error: Failed instance creation: Failed creating instance record: Failed initializing instance: System doesn't have a functional idmap setup,请尝试使用特权模式运行。

这应该是一个 bug,但我目前没找到除了以特权模式运行以外的更好解决方法
这应该是一个 bug,但我目前没找到除了以特权模式运行以外的更好解决方法

特权模式就是在 launch 时候增加一个参数:-c security.privileged=true。如果你还需要在 Incus 实例中运行 Docker/Podman,你还需要添加参数 -c security.nesting=true

启动实例后进入实例:

1
incus shell qq-bot

2. 容器内环境配置

在容器内更换镜像源。本文不做介绍,具体过程请自行搜索。

然后更换时区。这对于一些时间相关的 NoneBot 插件(例如每日人品)是必要的。

1
2
# 更换时区为东八区
timedatectl set-timezone Asia/Shanghai

然后我们需要安装一些必要的软件包:

1
2
3
# 更新系统并安装依赖
apt update && apt upgrade -y
apt install -y python3 python-is-python3 python3-pip python3-venv curl wget

📦 部署 NapCat

请参照 NapCat 官方文档

🚀 部署 NoneBot

请参照 NoneBot 官方文档

创建 NoneBot 项目的时候,需要安装 OneBot V11 适配器和 FastAPI、WS 驱动器

🛜 对接 NapCat 和 NoneBot 服务

在 NapCat 配置添加反向 WS 地址,地址为 ws://127.0.0.1:8080/onebot/v11/ws

这里的 8080 是 NoneBot 输出的端口号,一般不用动,根据 NoneBot 的实际输出修改即可。

/onebot/v11/ws 是 NoneBot OneBot V11 适配器默认的路径。

然后在 NoneBot 项目目录下,运行 nb run 测试一下是否正确连接。如果出现了 403 错误,那么多半就是两种情况:

  1. WS 地址错误。切记,地址不是 ws://127.0.0.1:8080,是 ws://127.0.0.1:8080/onebot/v11/ws
  2. 未配置 Token 或者 Token 错误。请参阅官方文档给出的解决方案

一切配置就绪后,输出看到 connection open,然后 NoneBot 开始输出 QQ 接收到的消息,即说明一切就绪,可以部署。

🔄 配置服务自启动

为了让 NapCat 和 NoneBot 在容器启动时自动运行,我们需要创建 systemd 服务:

1. 创建 NapCat 服务

请参照 NapCat 官方文档

2. 创建 NoneBot 服务

1
2
# 创建服务文件
vim /etc/systemd/system/nonebot.service

服务文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=NoneBot Framework
After=network.target napcat.service

[Service]
WorkingDirectory=/opt/nonebot2-project
ExecStart=/opt/nonebot-venv/bin/nb run
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target

3. 启用并启动服务

1
2
3
4
5
# 启用服务
systemctl enable napcat nonebot

# 启动服务
systemctl start napcat nonebot

📸 连接测试

1. 检查服务状态

1
2
3
4
5
# 检查 NapCat 状态
systemctl status napcat

# 检查 NoneBot 状态
systemctl status nonebot

2. 测试机器人功能

在 QQ 聊天中发送命令:

1
/echo hello

机器人应该回复相同的 hello 消息。

效果
效果

之后就可以添加插件或者更多功能了!这一部分请自行研究 NoneBot 的官方文档吧。

📈 容器资源管理

设置容器资源限制

1
2
# 限制容器使用的 CPU 和内存
incus config set qq-bot limits.cpu=1 limits.memory=1024MB

limits.cpulimits.memory 按需调整。

容器备份

1
2
3
4
5
# 创建容器快照
incus snapshot create qq-bot backup-$(date +%Y%m%d)

# 导出容器
incus export qq-bot qq-bot-backup.tar.gz

💡 写在最后

写这篇文章的目的,其实还是想为容器化部署提供一种新的思路。现在大多数生产环境部署都是 Docker,而 Docker 确实可以带来诸多好处,如环境隔离、易于管理和迁移等。

但是,在某些场景下,比如需要更接近完整系统环境、更高性能要求或者特定的网络配置时,LXC/Incus 可能会是一个更好的选择。与 Docker 相比,Incus 提供了更完整的系统环境和更灵活的资源控制,同时保持了比虚拟机更低的资源开销。

但是 Incus/LXD 的参考资料特别少,我也是一点一点摸索出来的,想着既然没有资料那我就自己写资料,于是这篇文章就诞生了。

对于 QQ 机器人这类应用,Incus 容器既能够提供足够的隔离性以确保安全运行,又不会像完整虚拟机那样消耗过多资源。这种平衡在资源受限的设备上尤为重要。

希望通过这篇文章,能够让更多人了解到 Incus 这样的容器化技术,在未来的项目中根据实际需求选择最合适的部署方案,而不仅仅局限于 Docker。技术的多样性是我们解决复杂问题的宝贵财富。

  • 标题: 使用 Incus LXC 容器部署 QQ 聊天机器人
  • 作者: GT610
  • 创建于 : 2025-11-02 22:54:16
  • 更新于 : 2025-11-19 08:14:20
  • 链接: https://gt-610.dpdns.org/2025/11/02/deploy-qq-bot-thru-incus/
  • 版权声明: 本文章采用 CC BY 4.0 进行许可。
评论