虽然部署完成了,但还需要编写并添加插件补充机器人的功能。尝试 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虚拟环境