虽然部署完成了,但还需要编写并添加插件补充机器人的功能。尝试 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-stageWORKDIR /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 tty: true stdin_open: true environment: - TZ=Asia/Shanghai depends_on: - beta-bot beta-bot: build: ./beta-bot container_name: nonebot-beta ports: - "8055:8055" env_file: - ".env.prod" environment: - ENVIRONMENT=prod - MAX_WORKERS=1 - 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 echo "startup run..." >>/root/start.lognb run chmod +x /root/start.shvim /root/.bashrc if [ -f /root/start.sh ]; then ./root/start.sh fi
1 2 3 4 docker container ls 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 页的自述。
插件列表
本地后台自启 shell
脚本或者 systemd
,这里用个.sh脚本算了。写完记得赋权 chmod +x start.sh
启动 nb /bin/bash startnb.sh
1 2 3 #!/bin/bash source /home/usrname/anaconda3/bin/activate env_namenohup 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虚拟环境