Astrbot+Napcat QQ机器人部署过程记录

📅 2026/7/24 21:52:41
Astrbot+Napcat QQ机器人部署过程记录
1.绪论近几年大语言模型Large Language Model, LLM的发展可谓是轰轰烈烈、如火如荼。我最初接触到并实际使用的LLM是ChatGPT3.5当时只道是糊弄作业和写报告的又一个新手段。谁曾想在这之后国内外的LLMs以及许多非LLM的专用型AI模型如雨后春笋般相继涌现。截止到我写这篇文章比较关注的LLMs的最新版本如下表所示LLM名称版本模式开发公司ChatGPT5.5闭源OpenAIDeepseekV4开源深度求索Claude5.0闭源AnthropicGLM5.2开源智谱AIGemini3.5闭源GoogleMiMo2.5开源小米Grok4.2闭源xAIKimi2.6开源月之暗面Qwen3.7闭源阿里巴巴MiniMaxM3开源稀宇极智Doubao2.1闭源字节跳动至于接入了LLM的聊天机器人则是在去年才首次接触到直到今年才萌生自己部署聊天机器人的想法。我认为部署一个聊天机器人确实是一个能进一步体验和了解LLM的有趣方式。就我这次部署聊天机器人来说首先是为了折腾将部署机器人这件事本身作为课余时间的娱乐方式其次才是使用和体验机器人功能因此为了增加工作量我走的是本地Linux直接部署方式。1.1平台介绍1️⃣硬件平台从咸鱼搞的小主机CPU为英特尔赛扬J1900主频1.99GHzTDP 仅 10W运存与存储为8120G事实证明对于在Linux环境下部署Astrbot机器人来说即使同时跑着CasaOS这样的性能仍然是十分过剩的☝️看来我还可以再折腾折腾别的。2️⃣系统平台Debian13.5的Linux系统xfce4桌面环境使用systemd来管理服务能实现开机自启、异常退出自动重启这是保证长期稳定运行。3️⃣机器人平台要打造一个QQ智能机器人核心在于两个开源项目AstrBot与NapCat。Asrtbot是一个开源的一体化基座聊天机器人平台负责AI LLM 对话、多模态、代理、技能、知识库、人物设定、自动上下文压缩等职责NapCat采用OneBot11标准作为连接腾讯 QQ 服务器的协议端通过 NTQQ 接口实现无头(headless)运行将复杂的 QQ 协议转换成标准的 HTTP/WebSocket 事件分发给上层的 Asrtbot。1.2整体思路这套方案基于J1900低功耗平台和Debian 13.5系统构建所有服务均以原生进程方式运行由systemd统一管理未使用Docker等容器技术。核心是Asrtbot与NapCat组合实现的QQ机器人其中NapCat负责对接QQ协议、将消息转换为HTTP/WebSocket请求Asrtbot承担语义理解与回复生成两者均编写了systemd服务单元并配置开机自启和异常自动重启保障长期无人值守运行。针对图形操作需求部署了noVNC服务将宿主机桌面通过Web页面暴露出来浏览器即可远程操作。同时部署CasaOS作为轻量管理面板集中展示各项服务的入口并监控系统状态。所有WebUI——包括CasaOS面板、AsrtbotNapcat后台、noVNC远程桌面——通过Tailscale组建的虚拟局域网串联利用WireGuard加密通道实现安全穿透在任何外网环境下均可通过浏览器统一访问和管理。我个人认为这套方案是比较合理的其安全性也较高。2.环境配置2.1BIOS配置与Debian安装这里开始安装Debian系统需要键盘、屏幕、鼠标整体配置完成后可不需要屏幕和外设。Debian中文官网https://www.debian.org/index.zh-cn.htmlRufus中文官网https://rufus.ie/zh/Rufus制作Debian启动盘教程https://www.bilibili.com/video/BV1pT4y1v7z2/Debian13安装教程https://www.bilibili.com/video/BV1YEsazoEsS/注意这里我选用的桌面环境为XFCE与安装教程中有所不同。Debian系统的下载与安装我参照的b站上的已有教程这里补充一下U盘安装时的BIOS配置情况不同主板的BIOS界面和进入方式不同这里以我的为例按开机键→按Del键进入BIOS→BOOT→Hard Drive BBS Priorities→选择具体的启动U盘为保障QQ机器人及其他服务在无人值守情况下的良好平稳运行上电自启动和服务开启自启是配置中不可缺少的一环。我所使用的这款J1900小主机支持上电自启动功能可以在设置U盘引导时顺便开启Chipset→South Bridge→Restore AC Power Loss→设为Power On→SaveExit保存并退出安装完系统后进入终端进一步配置防止自动休眠##1.屏蔽 systemd 的休眠/挂起目标sudosystemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target##2. 配置 logind防止空闲自动挂起、合盖挂起HandleSuspendKeyignoreHandleHibernateKeyignoreHandleLidSwitchignoreHandleLidSwitchExternalPowerignoreIdleActionignoresudosystemctl restart systemd-logind##3.关掉 XFCE 电源管理的自动挂起xfconf-query-cxfce4-power-manager-p/xfce4-power-manager/inactivity-on-ac-s0xfconf-query-cxfce4-power-manager-p/xfce4-power-manager/dpms-enabled-sfalsexfconf-query-cxfce4-power-manager-p/xfce4-power-manager/blank-on-ac-s0##4.确认后重启电脑systemctl status sleep.target#看到结果含 Loaded: masked 就成了2.2网络和代理配置2.1中给出的教程中已经包含了放入官方驱动包的操作幸运的是我的J1900的无线网卡在安装完Debian系统后已经可以运行无需额外安装驱动。下图是我的XFCE桌面经过了一定美化操作美化操作就不再详细展开了。接下来连接网络可以插入网线也可以使用无线网络。XFCE桌面下可以在桌面右下角单击无线网络图标进行配置注意应该选择“连接到隐藏的Wi-Fi网络”这样才能设置安全性和填入密码网络名称填入实际搜到的WiFi网络名称安全性一般选择WPA及WPA2个人最后填入密码连接。2.3VNC桌面配置这里采用的是noVNC TigerVNC的方案在局域网中从浏览器里即能看到完整的XFCE桌面无需安装其他应用。##0.首先查看Debian安装设备的局域网IPhostname-I##1.安装相关软件sudoaptupdatesudoaptinstall-y\tigervnc-scraping-server\novnc\websockify#确认x0vncserver已安装应该输出/usr/bin/x0vncserverwhichx0vncserver##2.设置VNC连接密码会让你输入两次不会显示实际字符输完后回车即可mkdir-p~/.vnc vncpasswd#最后弹出“Would you like to enter a view-only password?”输入n回车即可#确认密码文件存在ls-l~/.vnc/passwd##3.确认当前桌面应输出X11和显示编号应该是:0echo$XDG_SESSION_TYPEecho$DISPLAY##4.创建 X0TigerVNC 服务粘贴下面的x0vncserver.service然后CtrlO保存CtrlX退出sudonano/etc/systemd/system/x0vncserver.service[Unit]DescriptionTigerVNC Serverforcurrent X11 desktopAftergraphical.targetWantsgraphical.target[Service]TypesimpleUser你的实际用户名ExecStart/usr/bin/x0vncserver\-display:0\-rfbport5900\-localhost\-PasswordFile/home/你的实际用户名/.vnc/passwdRestartalwaysRestartSec3[Install]WantedBygraphical.target##5.创建 noVNC 服务粘贴下面的novnc.service然后CtrlO保存CtrlX退出sudonano/etc/systemd/system/novnc.service[Unit]DescriptionnoVNC WebSocket ProxyAfterx0vncserver.serviceRequiresx0vncserver.service[Service]TypesimpleExecStart/usr/bin/websockify\--web/usr/share/novnc/\6080\localhost:5900RestartalwaysRestartSec3[Install]WantedBymulti-user.target##6.重载与设置自启sudosystemctl daemon-reloadsudosystemctlenable--nowx0vncserversudosystemctlenable--nownovnc##7.验证服务状态systemctl status x0vncserver novnc --no-pager#应当看到下面这样结果#x0vncserver.service active (running)#novnc.service active (running)#查看端口ss-tlnp|grep-E5900|6080#应当看到下面这样结果#LISTEN 127.0.0.1:5900#LISTEN 0.0.0.0:6080#查看进程ps-ef|grepX0tigervnc|grep-vgrep配置完一键验证echo X11 echoSession :$(echo$XDG_SESSION_TYPE)echoDisplay :$(echo$DISPLAY)echoecho Services systemctl status x0vncserver novnc --no-pagerechoecho Ports ss-tlnp|grep-E5900|6080echoecho Process ps-ef|grepX0tigervnc|grep-vgrep此时在连接到相同局域网的任意一台设备上输入http://localhost:6080/vnc.htmllocalhost改成刚才用的hostname -I命令查到的debian在局域网中的IP一般是192.168开头。点击连接输入刚才设置的密码进入到VNC屏幕中此时如果在网页上操作屏幕则直连Debian的物理屏也会同步进行操作就好像向日葵远程协助一样。这时候拔掉直连Debian的物理屏插上一个从淘宝9块9买的HDMI诱骗器重新连接VNC如果正常显示则大功告成从此装有Debian的主机便不再需要鼠标、键盘和屏幕我们可以从局域网访问VNC屏幕2.4Tailscale穿透配置Tailscale 能实现了端到端加密的点对点P2P连接但在必要时会通过 中继服务器DERP 进行中转 。整体来说它是一个零配置的 Mesh VPN让所有设备看起来像是在同一个本地局域网LAN内。Tailscale支持Windows、Linux、Mac、Android、iOS设备个人可以免费使用。Tailscale官网下载https://tailscale.com/downloadTailscale控制台https://login.tailscale.com/admin/machines开启并登陆同一个Tailscale账号的设备相当于处于一个Tailscale分配和维系的大局域网之中理论上可以让你的好友和服务器全部登陆同一个Tailscale账号无需额外内网穿透即可进行Minecraft联机游戏。Tailscale提供了Linux一键安装命令其他平台从官网下载后直接安装即可curl-fsSLhttps://tailscale.com/install.sh|sh#安装完成后启动服务并获取登录链接sudotailscale up#复制终端输出的链接在浏览器中打开并使用账号登录即可这样安装的Tailscale默认以systemd服务运行安装时一般已经自动设置为开机启动。可以通过控制台观察设备情况Tailscale会为每台设备分配一个IP地址当然这个IP地址只有在运行Tailscale并登录相同账号时才能访问它的安全性取决于Tailscale账号的安全性。比如我的Debian主机分配的地址为100.83.XXX.XX当然它是无法直接访问的。内网IP的改变不会影响Tailscale分配给设备的地址也就是说即使换了网络环境只要登录了相同Tailscale账号就能从其他设备通过Tailscale分配给设备的这个地址随时随地进行访问。可以说Tailscale可以在保证安全性的前提下让你本地部署的Astrbot机器人也能像托管在服务器上的那样通过WebUI随时随地进行查看和配置。当然VNC远屏幕也可以通过这样随时随地远程访问。3.Napcat与Astrbot配置3.1Napcat与Astrbot的部署Astrbot官方仓库https://github.com/AstrBotDevs/AstrBotAstrbot官方和Napcat官方都提供了一键部署指令因此部署它们是比较容易的。##0.前置环境准备python3和ffmpeg转码工具这两个是必需的sudoaptupdatesudoaptinstall-ygitcurlwgetunzipffmpegsudoaptinstall-ypython3 python3-pip python3-venv##1.安装Napcatcurl-onapcat.sh https://nclatest.znin.net/NapNeko/NapCat-Installer/main/script/install.shsudobashnapcat.sh--tui#装完启动并出二维码(把 QQ号 换成你给bot准备的QQ号)sudonapcat startQQ号sudonapcat logQQ号#日志里会打印登录二维码和WebUI的token,用手机QQ扫码即可登录。##2.安装Astrbot#先装 uvcurl-LsSfhttps://astral.sh/uv/install.sh|shsource~/.bashrc#克隆并启动(uv 会自动建虚拟环境、装依赖)gitclone https://github.com/AstrBotDevs/AstrBotcdAstrBot uv run main.py都跑起来后可分别通过http://localhost:6099http://localhost:6185分别访问Napcat和Astrbot的WebUI界面localhost就是通过hostname -I命令查询到的192.168开头的Debian设备的局域网IP当然填入Tailscale分配的IP还可以让你在非局域网的条件下进入WebUI界面。6099是Napcat默认端口6185是Astrbot默认端口。在连接到同一局域网的设备上打开WebUI我们需要先进行简单配置。这里需要的token在Napcat启动日志中可以通过打开napcat前台或直接浏览日志文件来查看#方法一前台查看sudoxvfb-run-a/root/Napcat/opt/QQ/qq --no-sandbox#注意查看完要按CtrlC关闭这个新进程#方法二日志查看sudotail-f/root/Napcat/opt/QQ/resources/app/app_launcher/napcat/logs/*.logsudocat/root/Napcat/opt/QQ/resources/app/app_launcher/napcat/config/webui.json值得一提的是noVNC提供了共用的剪贴板可以很方便地在浏览器所在系统和VNC远程屏幕之间交换内容在Napcat的WebUI中填入复制的token可以顺利进入。我们首先要打开网络配置→新建→Websocket客户端Websocket客户端的配置如下图所示配置好后可以向bot的QQ发送消息并在猫猫日志里查看是否有反应如果有则可进行下一步Astrbot配置。机器人→创建机器人→OneBot v11注意不是QQ官方机器人两者的原理和配置完全不同机器人名称自行设置其余配置如图然后保存警告无视即可。盯着平台日志待适配器链接完成后再向Bot的QQ号发送消息如果平台日志有反应则可进行下一步操作。[2026-06-1214:18:53.005][Core][INFO][aiocqhttp.aiocqhttp_platform_adapter:107]: aiocqhttp(OneBot v11)适配器已连接。[2026-06-1214:18:55.409][Core][INFO][core.event_bus:74]:[HandsomeBot][HandsomeBot(aiocqhttp)]1758391746/1758391746:接下来返回Debian的终端通过创建systemd服务来设置Astrbot和Napcat开机自启sudotee/etc/systemd/system/napcat.service/dev/nullEOF [Unit] DescriptionNapCat QQ Afternetwork-online.target astrbot.service Wantsnetwork-online.target astrbot.service StartLimitIntervalSec300 StartLimitBurst3 [Service] Typesimple Userroot ExecStart/usr/bin/xvfb-run -a /root/Napcat/opt/QQ/qq --no-sandbox -q 机器人QQ号 Restarton-failure RestartSec30 KillModecontrol-group [Install] WantedBymulti-user.target EOFsudotee/etc/systemd/system/astrbot.service/dev/nullEOF [Unit] DescriptionAstrBot Afternetwork-online.target Wantsnetwork-online.target [Service] Typesimple Userroot WorkingDirectory/root/AstrBot EnvironmentHOME/root EnvironmentHTTP_PROXYhttp://127.0.0.1:7890 EnvironmentHTTPS_PROXYhttp://127.0.0.1:7890 EnvironmentNO_PROXY127.0.0.1,localhost ExecStart/root/AstrBot/.venv/bin/python main.py Restarton-failure RestartSec10 [Install] WantedBymulti-user.target EOF这样Astrbot和Napcat就可以方便地通过systemctl命令来管理了下面是一个总结NapCat 位于/root/NapcatAstrBot 位于/root/AstrBot两者都以root运行、由systemd托管开机自启。登录的 QQ你的QQ号。切记同一 QQ 绝不能同时跑两个 NapCat 实例封号风险。项目说明本机 IP**hostname -I**取第一个 192.168.x.xNapCat WebUI**http://localhost:6099**AstrBot WebUI**http://localhost:6185**aiocqhttp 对接端口**6199**NapCat 的 WS 客户端指向**ws://127.0.0.1:6199/ws**noVNC 网页桌面**http://IP:6080/vnc.html**VNC 端口**5900**FlClash 代理端口**7890**混合端口一键检查端口是否在监听sudoss-tlnp|grep-E6099|6185|6199|6080|5901|7890sudosystemctl restart napcat# NapCat 重启sudosystemctl restart astrbot# AstrBot 重启sudosystemctl stop napcat# 停止sudosystemctl start napcat# 启动sudosystemctl status napcat astrbot --no-pager# 看状态绿色 active 即正常实时看日志sudojournalctl-unapcat-f# NapCat 实时日志sudojournalctl-uastrbot-f# AstrBot 实时日志sudojournalctl-uastrbot-n50--no-pager# 看最近 50 行通用 systemd 命令任意服务名通用sudosystemctl start|stop|restart|status服务名sudosystemctlenable|disable服务名# 开/关开机自启sudojournalctl-u服务名-f# 实时日志AstrBot 前台带代理exportHTTP_PROXYhttp://127.0.0.1:7890exportHTTPS_PROXYhttp://127.0.0.1:7890exportNO_PROXY127.0.0.1,localhostcd/root/AstrBotuv run main.pyNapCat 前台sudoxvfb-run-a/root/Napcat/opt/QQ/qq --no-sandbox-q机器人QQ号调试前先停掉对应的 systemd 服务sudo systemctl stop napcat/astrbot避免双实例。NapCat 日志文件 / WebUI tokensudotail-f/root/Napcat/opt/QQ/resources/app/app_launcher/napcat/logs/*.logsudocat/root/Napcat/opt/QQ/resources/app/app_launcher/napcat/config/webui.json#取token3.2Napcat与Astrbot的配置3.2.1Napcat相关配置由于腾讯的风控策略在Napcat登录QQ的开始这段时间内约1个星期QQ比较容易掉线我的解决方法是通过Server酱进行提醒收到提醒后重新扫码登录即可。待稳定后QQ基本不掉线。「Server酱」英文名「ServerChan」是一款「手机」和「服务器」、「智能设备」之间的通信软件。说人话就是从服务器、路由器等设备上推消息到手机的工具。开通并使用上它只需要一分钟①微信扫码②登入设置消息通道③发消息一般有两种方式在支持Server酱的软件界面或配置文件中填入SendKey即可使用也可以自己往 https://sctapi.ftqq.com/.send 发送请求。Server酱官方网址https://sct.ftqq.com/首先微信登录拿到Sendkey然后在WebUI配置Napcat这次需要创建HTTP服务器按下图配置即可然后新建脚本进行进一步配置脚本和配套文件/usr/local/bin/qq_watch.sh、/etc/systemd/system/qq_watch.service、/etc/systemd/system/qq_watch.timer以下操作每块整体修改后复制到终端再回车即可。注意下面的文件需要根据实际情况修改修改时不保留cat/usr/local/bin/qq_watch.shEOF #!/bin/bash SENDKEYServer酱 SendKey #这里要填入刚才获取的SendKey APIhttp://127.0.0.1:3000/get_status TOKENNapCat HTTP token #这里填入刚才创建的HTTP服务器的Token COOLDOWN600 #重启冷却 10 分钟 BOT机器人QQ号 #这里填入机器人QQ号 STATEFILE/run/qq_watch.state LASTFILE/run/qq_watch.lastact notify(){ curl -s https://sctapi.ftqq.com/${SENDKEY}.send -d title$1 -d desp$2 /dev/null; } STATUS$(curl -s --max-time 5 -H Authorization: Bearer $TOKEN $API) if echo $STATUS | grep -qE online[[:space:]]*:[[:space:]]*true; then CURonline elif echo $STATUS | grep -qE online[[:space:]]*:[[:space:]]*false; then CURoffline else CURerror # 读不到真状态:token错/网络/NapCat没起 → 只提醒不重启 fi PREV$(cat $STATEFILE 2/dev/null || echo online) echo $CUR $STATEFILE NOW$(date %s); LAST$(cat $LASTFILE 2/dev/null || echo 0) case $CUR in offline) if [ $((NOW-LAST)) -ge $COOLDOWN ]; then if [ $PREV online ]; then notify QQ掉线 Bot ${BOT} 离线正在重启 NapCat 尝试快速登录 else notify QQ仍离线 Bot ${BOT} 仍未恢复再次重启若风控请手动去 WebUI 重扫 fi systemctl restart napcat echo $NOW $LASTFILE fi ;; online) if [ $PREV offline ]; then notify QQ已恢复 Bot ${BOT} 重新上线 echo 0 $LASTFILE fi ;; error) if [ $PREV ! error ] [ $((NOW-LAST)) -ge $COOLDOWN ]; then notify 监控异常 get_status 读不到状态(token/网络/NapCat未起)未重启请人工检查 echo $NOW $LASTFILE fi ;; esac EOFcat/etc/systemd/system/qq_watch.serviceEOF # /etc/systemd/system/qq_watch.service [Service] Typeoneshot ExecStart/usr/local/bin/qq_watch.sh EOFcat/etc/systemd/system/qq_watch.timerEOF # /etc/systemd/system/qq_watch.timer [Timer] OnBootSec2min OnUnitActiveSec2min [Install] WantedBytimers.target EOFchmodx /usr/local/bin/qq_watch.sh systemctl daemon-reload systemctlenable--nowqq_watch.timer逻辑掉线→立刻推送重启一次10 分钟冷却内不重复仍离线且冷却过→再推再重启恢复→推已恢复。error态读不到状态只提醒、绝不重启避免误判把 QQ 踢下线。自检这里也要改成自己的SendKeycurlhttp://127.0.0.1:3000/get_status# 应见 online:truecurlhttps://sctapi.ftqq.com/你的SendKey.send-dtitle测试-ddesp通了systemctl list-timers|grepqq_watch这样便能在微信服务号上收到掉线提醒3.2.2Astrbot相关配置接下来是最为关键的Astrbot配置我整体的思路如下图所示接下来详细讲解模型提供商配置①DeepseekDeepseek 开放平台https://platform.deepseek.com/在Deepseek充值并获得APIkey后填入到模型提供商中②Mistral经过我的考察Mistral系列模型不容易被拦截和发生错误不过其识别精准度相较于头部的多模态模型仍有差距。并且在据我了解的中转站点中提供Mistral系列模型的仅有302ai一家。当然也可以使用其他具有视觉能力的模型。302aihttps://302.ai/③MIMOMIMO开放平台https://platform.xiaomimimo.com/由于我在MiMo官网的认证遇到了一些问题这里使用的是第三方APIModelmesh胜算云https://console.shengsuanyun.com/拿到APIkey后填入到语音转文字的模型提供商中配置按下图所示即可④豆包语音复刻模型凭证获取教程https://github.com/Radiant303/astrbot_plugin_clonetts机器人的语音输出功能既可以使用Astrbot官方提供的文字转语音服务也可以使用文字转语音插件其中插件astrbot_plugin_clonetts提供了语气描述效果要更好一些。Astrbot官方提供的文字转语音服务配置⑤嵌入与重排序模型硅基流动https://cloud.siliconflow.cn/获取APIkey后如下配置分别使用openai_embedding格式和vllm_rerank⑥文转图服务Astrbot提供了文本转图像服务这里直接配置即可接下来是在配置文件中应用我们已经导入完的模型应用配置文件在知识库中应用嵌入和重排序模型这样一个全能机器人的基本配置便完成了。接下来推荐几个插件来拓展机器人功能具体的插件配置不再展开叙述。刚兴趣的小伙伴可以自行研究。①通用生图https://github.com/Railgun19457/astrbot_plugin_image_generation②万能解析器https://github.com/Zhalslar/astrbot_plugin_parser③入群欢迎与验证https://github.com/qiyueling2716/astrbot_plugin_welcome_verification④克隆语音https://github.com/Radiant303/astrbot_plugin_clonetts4.功能展示与小结经过我的配置和测试我的Bot逐渐成为一个能看图、会说话、会听语音、会写文章、善于管理群、能下载作品、可以解析视频的全能机器人助理。折腾了这么长时间也算是折腾出了点名堂我感觉在我之前应该没有人会自己从头开始在Debian上本地部署AstrbotNapcat的QQ机器人吧也算是开创先河了。这次折腾是关于AI的能完成这次折腾也少不了各个AI的帮助总之AI正在越来越渗透进我们生活的方方面面没人知道未来它又会进化成什么样子。最后Astrbot还有许多功能AI还会带来许多惊喜这就需要你去慢慢尝试和研究啦