nonebot-QQ智障机器人(插件与docker)

nonebot-QQ智障机器人(插件与docker)

虽然部署完成了,但还需要编写并添加插件补充机器人的功能。尝试 docker 部署,自启等。

Docker部署

因为启动一次 nonebot 和 go-cqhttp 就需要占用一个终端窗口,后台启动又比较麻烦,而且每次服务器自启动都要手动启动一次服务,比较麻烦,与其实现一个后台运行和自启脚本,不如直接扔到 docker 里。(然后发现更麻烦了)

docker file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM python:3.10 as requirements-stage

WORKDIR /tmp

COPY ./pyproject.toml ./poetry.lock* /tmp/

RUN curl -sSL https://install.python-poetry.org -o install-poetry.py

RUN python install-poetry.py --yes

ENV PATH="${PATH}:/root/.local/bin"

RUN poetry export -f requirements.txt --output requirements.txt --without-hashes

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9

WORKDIR /app

COPY --from=requirements-stage /tmp/requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir --upgrade -r requirements.txt

RUN rm requirements.txt

COPY ./ /app/

docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: "3"

services:
gocqhttp:
image: pcrbot/gocqhttp:latest
container_name: go-cqhttp
volumes:
- ./gocqhttp:/data # 用于保存 gocqhttp 相关文件,请复制 config.yml 等文件到此
tty: true
stdin_open: true
environment:
- TZ=Asia/Shanghai
depends_on:
- beta-bot

beta-bot:
build: ./beta-bot # 构建nonebot执行环境
container_name: nonebot-beta
ports:
- "8055:8055" # 映射端口到宿主机 宿主机端口:容器端口
env_file:
- ".env.prod" # fastapi 使用的环境变量文件
environment:
- ENVIRONMENT=prod # 配置 nonebot 运行环境,此项会被 .env 文件覆盖
- MAX_WORKERS=1 # 如果你有多个QQ,且存在 self_id 指定,多个 worker 会导致无法找到其他 websocket 连接
- TZ=Asia/Shanghai

networks:
default:
name: workspace-default

手动配置docker

使用 python3.9:lastest 镜像。

1
2
3
4
pip install nb cli
nb create
nb install plugin nonebot_plugin_gocqhttp
nb run
1
2
3
4
5
6
7
8
9
10
11
12
13
# 设置自启
vim /root/start.sh
# start.sh
echo "startup run..." >>/root/start.log
nb run
# 授权
chmod +x /root/start.sh
# 添加到自启
vim /root/.bashrc
# 修改内容
if [ -f /root/start.sh ]; then
./root/start.sh
fi
1
2
3
4
docker container ls	# get container id
docker ps
docker diff id
docker commit id yourname/imagename:tag

docker总结

用 docker 搭建其实勉勉强强,确实能跑起来,但自启、插件添加都非常不方便,因为不熟悉,调试也很麻烦,还是踢回本地挂着。

其中遇到的 bug :

  • 代理报错:unset!!!
  • 容器互通失败:不要在 compose 里搭建,自己再建一个手动连(这有什么区别?)
  • 自启时插件加载失败:不要自启
  • webUI 端口无法映射:反正也没用,爷不要了
  • 启动日志丢失:重定向一个新的(到底有什么区别???)
  • 注释 nonebot.load_from_toml("pyproject.toml") 后,资源加载失败,不注释插件重复下载加载:不要自启
  • 数据持久化卷挂载:COPY一份先。

可以说什么 bug 都踩了个遍,官网文档关于 docker 的还什么都没有,一个个解决完我真的绷不住了。最容易成功的就是手动搭一个然后用插件化的 gocqhttp 完成首次登录,之后的每次登录都手动启动(.sh 自启会报错,手动同样的命令nonebot不会报资源加载失败错误,绷不住了),实在是太不自动化了,很不优雅。

添加插件

如果不是自己编写的,在商店搜索并复制安装命令,或者

1
2
3
4
nb plugin list
nb install plugin <plugin_name>

nb plugin install #交互式

配置

  • bot.py 的主函数前添加声明,nonebot.load_plugin("plugin_name")
  • 在全局配置文件 .env.prod.env.dev 中添加配置项以管理插件功能,具体项见插件 GitHub 页的自述。

插件列表

  • nonebot_plugin_status

  • nonebot_plugin_gocqhttp(会出bug,会暴露端口,不用了。)

本地后台自启

shell 脚本或者 systemd ,这里用个.sh脚本算了。写完记得赋权 chmod +x start.sh

启动 nb

/bin/bash startnb.sh

1
2
3
#!/bin/bash
source /home/usrname/anaconda3/bin/activate env_name
nohup nb run >nbrun.log 2>&1 &

因为 ubuntu 太挫了,默认 shell 解释器是 dash ,所以要指定为 bash ,同时用 bash 执行。

直接 conda activate env_name 写在 .sh 里一般是不行的,会报 CommandNotFoundError:shell not been properly configured to use xx 的错。

如果不改解释器,会报 source: not found

启动 gocqhttp

这个简单。

1
nohup ./go-cqhttp >gocqrun.log 2>&1 &

启动

加到开机自启里就行。

1
cd ~/ && /bin/bash ./starttheta.sh && cd ~/go-cqhttp && ./startgocq.sh

另外写个一键关闭的脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh

pid=$(ps -ef | grep go-cqhttp | grep -v grep | awk '{print $2}')
if [ $pid ]
then
echo "PID: $pid"
kill $pid
echo "Go-cq has been shutdown!"
else
echo "Process go-cq doesn't exist!"
fi

pidbot=$(ps -ef | grep nbtehta | grep -v grep | awk '{print $2}')
if [ $pidbot ]
then
echo "PID: $pidbot"
kill $pidbot
echo "Nonebot has been shutdown!Bye!"
else
echo "Process nbtheta doesn't exist!"
fi
echo "\n (__)\n (oo)\n /------\/ \n / | || \n* /\---/\ \n ~~ ~~\n 超级牛力!"

之类的。

参考

koyeb-nb2

Dockerfile reference

Compose specification

docker容器内服务开机自启动实现方案(以ssh服务为例)

nonebot.plugin

在shell脚本中激活conda虚拟环境

作者

ivy

发布于

2022-01-06

更新于

2023-03-25

许可协议

CC BY-NC-SA 4.0

评论