跳到主要内容

容器架构

容器环境

  • 项目包通过 requirements.in 和 requirements.txt 构建
  • config.py 所需依赖包在主目录下的 requirements.in 里,生成的对应 requirements.txt 在 command 目录下
  • napcat_log 对应的 requiremnets.in 由 config 的依赖包+docker 包合并而成
  • lrobot 对应的 requirements.in 由 config 的依赖包+lrobot 里的依赖包合并而成
  • 进入 lrobot 文件夹,使用命令 docker run -it --rm -v %cd%:/app -w /app python:3.11 bash -c "python -m pip install --upgrade pip && pip install -r requirements.in && pip freeze > requirements.txt" 生成对应的 requirements.txt
  • 其他方法
    • 使用 pip-compile requirements.in 会依赖当前 windows 环境生成包,可能不符合 linux 上的要求
    • 使用 pipreqs 会生成重复包或遗漏包
    • 如果要在不配置好环境的情况下生成包,只有不断运行并往 requirements.in 添加需要的包

lrobot

  • lrobot 服务是消息处理中枢,将各平台的消息汇总并处理成统一格式,进入消息队列进行不同的指令处理,然后调用各平台的发送 API 进行消息反馈

  • 容器内安装 libreoffic 用于处理 word 等文件,ffmpeg 用于处理视频,同时配置 mongodb 4.4 源 lrobot 架构

  • lrobot 系统中,config.py 为基础配置,包含通用函数

  • main.py 负责并发启动其他服务,在初始化中判断平台是否启用。有些平台使用定时任务,有些平台通过注册路由挂载在 fastapi 下

  • fastapi 服务不仅挂载 vue 的静态页面,也实现了对应的后端,同时挂载了平台的 api

  • 定时任务包含消息池清理、数据备份等操作,定期执行

调试配置

  • lrobot 将 5922 端口暴露到本地,方便 vue 调试以及本地直接登录网址测试,在不启动 command 的情况下可以反复调试修改前后端
  • vue 调试使用自带的 5173 端口,调试环境为本地,通过访问本地的 5922 端口来与后端通信(在 api.js 与 vite.config.js 中配置);打包后为静态文件挂载在 fastapi 下

挂载配置

  • lrobot 挂载 lrobot.logic 目录实现指令功能的热更新
  • lrobot 挂载 lrobot.web.frontend 目录实现前端页面的热更新
  • lrobot 挂载 storage 实现配置信息与文件的热更新

napcat

  • napcat 服务提供 LR5921 的运行环境,并将消息上报至 lrobot 服务的 5922 端口上(lrobot:5922),在容器内的 5921 端口提供消息发送 API,lrobot 通过发送至 napcat:5921 来调用 LR5921 的发送 API

调试配置

挂载配置

  • napcat 挂载 storage/file 实现多平台文件接收与发送的共享
  • napcat 挂载 data/napcat 实现快速启动与配置存储

napcat_log

  • napcat_log 通过监听,输出 napcat 部分的日志
  • 调用 config.py 实现日志存储到 mongodb

挂载配置

  • napcat_log 挂载 docker 守护程序执行监听命令

command

  • command 服务提供部分消息的转发(网站消息、LR232 消息、WECHAT 消息)
    • 将远程服务的 10000 端口消息转发到 lrobot 服务的 5922 端口上(lrobot 部署 fastapi 的端口)
    • 同时将容器内的 5923 端口(command:5923)通过 socks5 转发至服务器上,将消息从宿主机转发至服务器,lrobot 通过代理 command:5923 来调用三个平台的发送 API
  • 在构建容器时,复制密钥并赋予执行权限
  • commnad.py 中,先执行端口清理,然后再调用连接,连接时配置-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null不需要输入 yes

mihomo

  • 使用 7891 端口供 lrobot 以 socks 方式调用转发(mihomo:7891)
  • 其中挂载了本地的 agent.yaml 作为配置(记得保留前面几个配置,尤其是 socks-port)
  • 并且挂载了两个下载好的文件geoip.metadbGeoSite.dat防止服务器因网络原因无法下载

mysql&mongodb

  • mysql 和 mongodb 数据库分别在容器内的 3306 和 27017 端口提供服务

调试配置

  • mongodb 和 mysql 分别将 5924 和 5925 端口暴露到本地,方便查看数据(如使用 pycharm 连接到数据库)

挂载配置

  • mysql 和 mongodb 挂载 storage.data.mysql/mongodb 实现数据库的数据存储
  • mysql 和 mongodb 挂载 storage.data.backup 目录实现数据库的定期备份与恢复

其他配置

  • 所有容器的时区都是上海正常时区,以便日志时间正常记录
  • 所有容器都配置固定名称以便引用端口
  • 减小容器大小与构建时间
    • Dockerfile 均使用 python:3.11-slim 作为基础镜像
    • 使用 --no-install-recommends 避免安装不必要包,减少镜像体积
    • 使用 --no-cache-dir 避免 pip 缓存占用空间
  • python 配置国内源,pip 下载配置两个国内源,防止下载失败
    • lrobot 更换国内源后下载包时间由 10 分钟缩短至 3 分钟