容器架构
容器环境
- 项目包通过 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 系统中,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 将 6099 端口暴露到本地,可访问 http://127.0.0.1:6099/webui?token=napcat 进行相关配置
- 在无图形化界面的服务器上需要通过开放 6099 端口远程访问并配置
挂载配置
- 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.metadb和GeoSite.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 分钟