From 958984611365ea3eedd4e6b9c926096f2c6d6ba2 Mon Sep 17 00:00:00 2001 From: liuwei Date: Wed, 6 May 2026 14:44:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=20Docker=20=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E9=AA=A8=E6=9E=B6=E5=B9=B6=E6=95=B4=E7=90=86=E5=BC=80?= =?UTF-8?q?=E6=BA=90=E5=8F=91=E5=B8=83=E8=B5=84=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整 Dockerfile 与入口脚本,拆分应用、MySQL、Redis 的部署职责 - 新增 docker-compose、docker ignore 与 Docker 环境变量示例 - 重写 README 并补充 Docker 部署说明与第三方资产说明 - 将后台示例账号与 webhook token 改为安全占位值,移除弱口令默认兜底 --- .dockerignore | 19 ++ .env.example | 11 + Dockerfile | 40 +++- README.MD | 445 +++++++++++------------------------- THIRD_PARTY_LICENSES.md | 58 +++++ admin/dashboard/README.md | 11 +- admin/dashboard/config.toml | 13 +- admin/dashboard/server.py | 28 ++- docker-compose.yml | 99 ++++++++ docker-entrypoint.sh | 37 ++- docs/Docker部署说明.md | 108 +++++++++ 11 files changed, 508 insertions(+), 361 deletions(-) create mode 100644 .dockerignore create mode 100644 THIRD_PARTY_LICENSES.md create mode 100644 docker-compose.yml create mode 100644 docs/Docker部署说明.md diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d3a7f73 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,19 @@ +# Git 与本地开发目录不需要进入镜像上下文,减少构建体积并降低敏感信息泄露风险。 +.git +.github +.idea +.claude +.venv +__pycache__ +*.pyc + +# 本地运行日志、缓存与临时目录不打包进镜像。 +logs +temp +*.log +*.log.* + +# 本地私有配置与运行态文件不进入镜像,避免把真实密钥或登录态烘焙到镜像层。 +.env +config.yaml +wechat_ipad/config.toml diff --git a/.env.example b/.env.example index e43fbf1..7a86ee7 100644 --- a/.env.example +++ b/.env.example @@ -55,3 +55,14 @@ ABOT_LLM_IMAGE_MODEL=gpt-image-1 # 可选:若希望后台登录会话在重启后保持稳定,建议显式配置。 ABOT_DASHBOARD_SECRET_KEY= + +# Docker 场景下 wechat_ipad 的连接参数: +# 1. 这组变量主要用于 docker-entrypoint 生成 wechat_ipad/config.toml; +# 2. 本地直跑仍可继续使用现有 wechat_ipad/config.toml; +# 3. 若 server 运行在宿主机,Docker Desktop / 新版 Linux Docker 可使用 host.docker.internal。 +WECHAT_SERVER_URL=http://127.0.0.1:8059/ +WECHAT_SERVER_IP=127.0.0.1 +WECHAT_SERVER_PORT=8059 +WECHAT_WXID= +WECHAT_DEVICE_NAME=ABOTPad +WECHAT_DEVICE_ID= diff --git a/Dockerfile b/Dockerfile index 4cdce8a..7cf1e9f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,10 +5,20 @@ ENV DEBIAN_FRONTEND=noninteractive \ PYTHONUNBUFFERED=1 \ TZ=Asia/Shanghai +# 仅保留 ABOT 运行所需的系统依赖: +# 1. 不再在应用镜像中内置 MariaDB / Redis,避免单容器承载过多职责; +# 2. 生产部署交由 docker-compose 管理独立基础设施服务; +# 3. 补充常用字体依赖,降低图片生成与渲染场景中的缺字风险。 RUN apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates curl bash tzdata \ - mariadb-server redis-server \ - ffmpeg libgl1 libglib2.0-0 \ + ca-certificates \ + curl \ + bash \ + tzdata \ + ffmpeg \ + libgl1 \ + libglib2.0-0 \ + fonts-noto-cjk \ + fonts-noto-color-emoji \ && rm -rf /var/lib/apt/lists/* WORKDIR /app @@ -21,15 +31,21 @@ COPY . /app COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh RUN chmod +x /usr/local/bin/docker-entrypoint.sh -ENV DB_HOST=127.0.0.1 \ - DB_PORT=3306 \ - DB_NAME=abot \ - DB_USER=root \ - DB_PASSWORD= \ - REDIS_HOST=127.0.0.1 \ - REDIS_PORT=6379 \ - REDIS_DB=0 \ - REDIS_PASSWORD= \ +# 统一使用 ABOT_* 命名作为默认环境变量前缀: +# 1. 与 config.example.yaml 保持一致,降低新用户理解成本; +# 2. WECHAT_* 继续用于生成 wechat_ipad/config.toml; +# 3. 默认值仅用于容器首次启动兜底,正式环境建议在 .env 中显式配置。 +ENV ABOT_ENVIRONMENT=production \ + ABOT_PLUGIN_DIR=plugins \ + ABOT_DB_HOST=127.0.0.1 \ + ABOT_DB_PORT=3306 \ + ABOT_DB_NAME=message_archive \ + ABOT_DB_USER=root \ + ABOT_DB_PASSWORD= \ + ABOT_REDIS_HOST=127.0.0.1 \ + ABOT_REDIS_PORT=6379 \ + ABOT_REDIS_DB=0 \ + ABOT_REDIS_PASSWORD= \ WECHAT_SERVER_URL=http://127.0.0.1:8059/ \ WECHAT_SERVER_IP=127.0.0.1 \ WECHAT_SERVER_PORT=8059 \ diff --git a/README.MD b/README.MD index 446d70e..ae8794b 100644 --- a/README.MD +++ b/README.MD @@ -1,366 +1,181 @@ -# A-BOT 智能助手 +# ABOT -A-BOT是一个功能丰富的微信机器人助手,集成了多种实用功能,包括AI聊天、群智闯关、积分系统、新闻推送等。支持多种AI模型集成,提供消息自动回复、群管理等功能。 +ABOT 是一个基于插件体系构建的微信机器人项目,包含消息处理主链路、管理后台、MySQL/Redis 存储、定时任务与多类 AI / 内容插件能力。当前仓库更适合有一定 Python 与部署基础的维护者进行二次开发、私有部署与功能扩展。 -## 📋 功能清单 +## 项目定位 -### 1. 群智闯关 +- 面向“可持续迭代的机器人平台”,不是一次性脚本 +- 核心能力包括消息接入、插件化处理、后台管理、数据归档与 AI 扩展 +- 当前默认假设你具备 MySQL、Redis、Docker、环境变量配置的基础经验 -- 答题游戏系统 -- 积分排行榜 -- 任务管理 -- 实时答题反馈 +## 当前主要能力 -### 2. 积分交易系统 +- 微信消息接入与机器人主循环 +- 插件加载、启停、热更新与后台管理 +- MySQL + Redis 双存储 +- AI 自动回复、消息总结、成员画像等能力 +- 签到、积分、排行榜、内容推送、媒体处理等业务插件 -- 积分转账 -- 积分查询 -- 积分排行榜 -- 打劫系统 -- 保释功能 +## 快速开始 -### 3. 全球快讯 +### 方式一:Docker Compose -- 国际政经新闻推送 -- 实时新闻更新 +适合第一次快速跑通部署骨架。 -### 4. AI聊天 - -- 智能对话 -- 多模型支持(Claude、DeepSeek、豆包等) -- 自定义提示词模板 - -### 5. 媒体内容 - -- 秀人图片 -- 猛男视频 -- 美腿图片 -- 音乐点播 -- 抖音视频解析 - -### 6. 群管理功能 - -- 群自动邀请 -- 插件管理系统 -- 消息智能总结 -- 数据库消息存档 - -### 7. 系统功能 - -- 每日签到系统 -- 系统更新 -- 视频分享 -- 邮件通知系统 -- 系统监控集成 - -## 🚀 安装说明 - -### 环境要求 - -- Python 3.10+ -- MySQL 数据库 -- Redis 服务 -- Git(用于系统更新) -- 支持的操作系统:Windows/Linux/MacOS - -### server安装 - -- 复制wechat_ipad/server/下面的所有内容到你的服务器 -- 修改conf下的文件[app.conf](wechat_ipad%2Fserver%2Fconf%2Fapp.conf) -- 将redis链接改成自己的redis配置 - -``` - redislink = 192.168.2.40:6379 - redispass = "" - redisdbnum = 7 -``` - -- 配置完成之后,运行server +1. 复制 Docker 环境变量示例 ```bash - sudo nohup ./ipad859go > /tmp/logger.log 2>&1 & +cp .env.docker.example .env ``` -### 依赖安装 +Windows PowerShell: -```bash -# 克隆项目 -git clone https://github.com/your-username/abot.git -cd abot - -# 创建虚拟环境 -python3 -m venv .venv -source .venv/bin/activate # Linux/Mac -# 或 -.venv\Scripts\activate # Windows - -# 安装依赖 -pip install -r requirements.txt -# 特别安装,pip 版本依赖不准确,需要单独安装 -pip install pysilk-mod +```powershell +Copy-Item .env.docker.example .env ``` -- 字体包安装,用来支持图片合成时字体,emoji等显示 +2. 按实际环境修改 `.env` 中的数据库密码、`WECHAT_SERVER_URL` 等参数 + +3. 启动服务 ```bash -sudo apt-get install -y fonts-noto-cjk fonts-noto-cjk-extra -sudo apt-get install -y fonts-noto-color-emoji fonts-noto-cjk fonts-wqy-microhei +docker compose up -d --build ``` -### 主要依赖包 +更多说明见 [docs/Docker部署说明.md](/d:/learn/abot/docs/Docker部署说明.md:1)。 -- lxml~=5.3.0 -- openai>1.0.0 -- pandas~=2.2.3 -- pyyaml~=6.0.2 -- requests~=2.32.3 -- schedule~=1.2.2 -- sparkdesk-api==1.3.0 -- pillow~=11.0.0 -- Flask~=3.1.0 -- fastapi~=0.115.12 -- uvicorn~=0.34.2 -- 更多依赖请查看 requirements.txt +### 方式二:本地直跑 -## ⚙️ 配置说明 - -### 1. 配置文件 - -推荐先复制 `config.example.yaml` 为 `config.yaml`,再在项目根目录放置 `.env` 文件。程序启动时会自动加载该文件,不需要每次手动 `export`: +1. 准备 Python 3.10+ +2. 准备 MySQL、Redis +3. 复制配置文件 ```bash -# Linux / Mac cp config.example.yaml config.yaml cp .env.example .env +``` -# Windows PowerShell +Windows PowerShell: + +```powershell Copy-Item config.example.yaml config.yaml Copy-Item .env.example .env ``` -`config.yaml` 现已支持 `${ENV_NAME}` / `${ENV_NAME:默认值}` 两种写法: - -- `${ABOT_DB_PASSWORD}`:必须由环境变量提供,否则启动时报错 -- `${ABOT_DB_HOST:127.0.0.1}`:若环境变量缺失,则回退默认值 - -如果项目根目录存在 `.env`,系统会先自动加载该文件,再执行 `config.yaml` 占位符解析。 - -启动时系统会自动执行配置完整性检查,并在日志中输出脱敏后的配置快照。包含以下主要配置项: - -#### 数据库配置 - -```yaml -db_config: - pool_name: "${ABOT_DB_POOL_NAME:wechat_boot_pool}" - pool_size: "${ABOT_DB_POOL_SIZE:10}" - host: "${ABOT_DB_HOST:127.0.0.1}" - port: "${ABOT_DB_PORT:3306}" - user: "${ABOT_DB_USER:root}" - password: "${ABOT_DB_PASSWORD}" - database: "${ABOT_DB_NAME:message_archive}" - charset: "${ABOT_DB_CHARSET:utf8mb4}" -``` - -#### Redis配置 - -```yaml -redis_config: - host: "${ABOT_REDIS_HOST:127.0.0.1}" - port: "${ABOT_REDIS_PORT:6379}" - password: "${ABOT_REDIS_PASSWORD:}" - db: "${ABOT_REDIS_DB:0}" - decode_responses: true -``` -#### ipad 客户端配置 - -- 修改 wechat_ipad 下的配置[config.toml](wechat_ipad%2Fconfig.toml),用于启动client -- 设备ID和name 可以为空,系统会自己生成一个,需要保持一个号一个ID+NAME -``` -server_url = "http://192.168.2.170:8059/" #server的访问地址 -wxid = "" -device_id = "" -device_name = "" -server_ip = "192.168.2.170" -server_port = "8059" -login_time = "" -``` - -### 2. 插件配置 - -#### AI聊天插件 (dify) - -```yaml -Dify: - enable: true - commands: [ "ai", "dify", "聊天", "AI" ] - command-tip: "聊天 请求内容" - api-key: "your-dify-api-key" - base-url: "your-dify-base-url" -``` - -#### 音乐插件 (music) - -```yaml -Music: - enable: true - command: [ "点歌", "音乐" ] - command-format: "点歌 歌曲名" -``` - -#### 群智闯关插件 (game_task) - -```yaml -GameTask: - enable: true - command: [ "/s", "/t", "/a", "/r", "/l", "/h" ] - command-format: "游戏命令格式说明" -``` - -## 📖 使用说明 - -### 基础命令 - -1. 群智闯关 - - `/s` - 加入答题游戏 - - `/t` - 获取新问题 - - `/a 任务ID 答案` - 回答问题 - - `/r` - 查看排行榜 - - `/l` - 查看活跃问题 - - `/h` - 查看未解决问题 - -2. 积分系统 - - `积分转账 积分数 @用户` - 转账积分 - - `我的积分` - 查询积分 - - `积分排行` - 查看排行榜 - - `打劫 @用户` - 打劫积分 - - `保释 @用户` - 保释用户 - -3. 新闻功能 - - `全球新闻` - 获取国际新闻 - - 支持:`国际新闻`、`环球新闻`、`政经新闻` - -4. AI聊天 - - `聊天 问题` - 与AI对话 - - 支持:`ai`、`dify`、`AI` 开头 - -5. 插件管理 - - `插件 列表` - 查看插件 - - `插件 启用 [插件名]` - 启用插件 - - `插件 禁用 [插件名]` - 禁用插件 - - `插件 信息 [插件名]` - 查看插件信息 - -### 媒体功能 - -- `图来`/`秀人` - 获取图片 -- `猛男` - 获取视频 -- `美腿`/`腿来` - 获取美腿图片 -- `点歌 歌曲名` - 点播音乐 -- 直接发送抖音链接可自动解析 - -### 系统功能 - -- `签到` - 每日签到 -- `更新系统` - 系统更新(管理员) -- `#总结` - 消息总结 - -## 📁 项目结构 - -``` -abot/ -├── admin/ # 管理后台相关代码 -├── base/ # 基础功能模块 -├── db/ # 数据库相关代码 -├── plugins/ # 插件目录 -├── resource/ # 资源文件 -├── static/ # 静态文件 -├── utils/ # 工具函数 -├── wechat_ipad/ # 微信相关核心代码 -├── config.yaml # 配置文件 -├── main.py # 主程序入口 -├── requirements.txt # 依赖列表 -└── restart.sh # 重启脚本 -``` - -## 🔧 开发说明 - -### 插件开发 - -1. 在 `plugins` 目录下创建新的插件目录 -2. 实现 `MessagePluginInterface` 接口 -3. 在 `config.toml` 中添加插件配置 -4. 在插件管理器中注册插件 - -### 开发规范 - -- 遵循PEP 8编码规范 -- 添加适当的中文注释 -- 优先补齐文档与人工验证步骤 -- 敏感配置优先使用环境变量注入 - -## ⚠️ 注意事项 - -1. 确保所有API密钥配置正确 -2. 数据库和Redis服务必须正常运行 -3. 建议使用虚拟环境运行项目 -4. 定期检查日志文件(wx_debug.log, wx_info.log, wx_error.log) -5. 部分功能需要消耗积分 -6. 部分功能需要管理员权限 -7. 建议定期备份数据库 -8. 请遵守相关法律法规使用 -9. 注意API调用频率限制 - -## ❓ 常见问题 - -1. 依赖安装问题 +4. 安装依赖 ```bash -python -m pip install --upgrade pip +python -m venv .venv +.venv\Scripts\activate +pip install -r requirements.txt +pip install pysilk-mod ``` -2. 数据库连接问题 +5. 启动主程序 -- 检查数据库服务是否运行 -- 验证配置信息是否正确 -- 确认数据库用户权限是否足够 +```bash +python main.py +``` -3. Redis连接问题 +## 配置说明 -- 检查Redis服务是否运行 -- 验证配置信息是否正确 -- 检查Redis服务器防火墙设置 +### 全局配置 -4. API调用问题 +项目支持从 `.env` 自动加载环境变量,并在 [config.example.yaml](/d:/learn/abot/config.example.yaml:1) / `config.yaml` 中使用: -- 确认API密钥是否正确 -- 检查API服务是否可用 -- 验证网络连接是否正常 +- `${ENV_NAME}` +- `${ENV_NAME:默认值}` -## 🔄 更新日志 +示例: -### v1.0.0 +- `${ABOT_DB_PASSWORD}`:必须提供 +- `${ABOT_DB_HOST:127.0.0.1}`:可缺省时回退 -- 初始版本发布 -- 基础功能实现 -- 插件系统支持 +### wechat_ipad 配置 -## 🤝 贡献指南 +当前仓库仍保留 [wechat_ipad/config.toml](/d:/learn/abot/wechat_ipad/config.toml:1) 作为现有登录态与设备信息的本地配置文件。 -1. Fork 项目 -2. 创建特性分支 -3. 提交更改 -4. 推送到分支 -5. 创建 Pull Request +说明: -## 📄 许可证 +- Docker 部署会通过环境变量在首次启动时生成该文件 +- 本地直跑继续兼容原有读取方式 +- 本轮未强制把全部 `wechat_ipad` 配置迁移进 `.env` -本项目采用 MIT 许可证,详见 LICENSE 文件。 +## 目录结构 -## 📞 联系方式 +```text +abot/ +├── admin/ # 管理后台 +├── base/ # 插件基础接口与管理能力 +├── db/ # 数据库访问层与迁移脚本 +├── docs/ # 部署、设计、使用文档 +├── plugins/ # 业务插件 +├── utils/ # 通用工具与服务 +├── wechat_ipad/ # 微信相关客户端与 server 对接代码 +├── Dockerfile +├── docker-compose.yml +├── config.example.yaml +├── .env.example +└── main.py +``` -- 项目维护者:水牛 -- 邮箱:bovine.liu@gmail.com -- 项目地址:待发布 +## 管理后台 -## 🙏 致谢 +- 默认端口:`8888` +- 配置文件:[`admin/dashboard/config.toml`](/d:/learn/abot/admin/dashboard/config.toml:1) +- 公开仓库中的账号密码与 webhook token 已改为占位值,部署前务必自行修改 -感谢所有为本项目做出贡献的开发者。 +## Docker 化现状 + +本仓库现在提供的是“开源友好”的基础部署骨架: + +- 应用、MariaDB、Redis 已拆分为独立服务 +- 提供 `docker-compose.yml`、`.dockerignore`、`.env.docker.example` +- 保留 `wechat_ipad/config.toml` 的挂载方式,避免这次改动影响你现有登录态逻辑 + +当前仍建议你在正式生产前继续补充: + +- HTTPS / 反向代理 +- 备份策略 +- CI/CD +- 监控与告警 + +## 开源说明 + +### License 要不要改 + +当前主代码仍按 MIT License 分发,通常不必为了“开源”单独换许可证。 + +但你需要额外关注: + +- 字体文件的再分发许可 +- `wechat_ipad/ipad859go` 二进制来源与授权 +- `resource/` 下业务资料是否适合公开 +- 第三方前端静态资源的许可证保留 + +详情见 [THIRD_PARTY_LICENSES.md](/d:/learn/abot/THIRD_PARTY_LICENSES.md:1)。 + +### 不建议公开提交的内容 + +- `.env` +- `config.yaml` +- `wechat_ipad/config.toml` 中的真实 `wxid` / `device_id` +- 真实数据库密码、LLM API Key、Webhook Token + +## 路线图 + +当前更优先的方向不是继续无上限堆新功能,而是继续补工程底座: + +- Docker 化与部署规范 +- 文档与回归清单 +- 插件治理 +- 可观测性与任务中心 +- 开源边界与资产合规 + +已整理的工程 backlog 见 [docs/工程优化与Feature清单.md](/d:/learn/abot/docs/工程优化与Feature清单.md:1)。 + +## 贡献与使用说明 + +- 欢迎基于自己的场景二次开发 +- 提交前请避免把本地私有配置、运行日志、登录态一并提交 +- 涉及平台接口、内容抓取、自动推送等能力时,请自行评估目标平台规则与当地法律要求 diff --git a/THIRD_PARTY_LICENSES.md b/THIRD_PARTY_LICENSES.md new file mode 100644 index 0000000..59e1fb6 --- /dev/null +++ b/THIRD_PARTY_LICENSES.md @@ -0,0 +1,58 @@ +# 第三方组件与资产说明 + +本文档用于说明 ABOT 仓库中“代码主体之外”的第三方组件、静态资源与待核验资产边界。 + +## 1. 代码主体许可证 + +- ABOT 主体代码当前采用 MIT License,详见 [LICENSE](/d:/learn/abot/LICENSE:1)。 +- 若你准备对外正式发布,请再次确认 `LICENSE` 中的版权主体名称是否与你当前希望公开的维护者信息一致。 + +## 2. 已知第三方前端库 + +以下文件为第三方前端库分发副本,需继续遵守各自原始许可证: + +- [admin/dashboard/static/js/vue.js](/d:/learn/abot/admin/dashboard/static/js/vue.js:1) +- [admin/dashboard/static/js/chart.js](/d:/learn/abot/admin/dashboard/static/js/chart.js:1) +- [admin/dashboard/static/js/axios.min.js](/d:/learn/abot/admin/dashboard/static/js/axios.min.js:1) +- `admin/dashboard/static/css/element-ui/` 下的 Element UI 静态资源 + +建议动作: + +- 保留上游许可证声明头 +- 在对外发布页或仓库文档中保留本说明文档 +- 若后续增加新的前端 vendor 文件,继续追加到本清单 + +## 3. 待你确认再公开分发的资产 + +以下内容不建议仅凭“项目主许可证是 MIT”就直接视为可自由再分发: + +- [fonts/simhei.ttf](/d:/learn/abot/fonts/simhei.ttf:1) +- [fonts/simsun.ttf](/d:/learn/abot/fonts/simsun.ttf:1) +- [fonts/Inter-Variable.ttf](/d:/learn/abot/fonts/Inter-Variable.ttf:1) +- [fonts/JetBrainsMono-Regular.ttf](/d:/learn/abot/fonts/JetBrainsMono-Regular.ttf:1) +- [wechat_ipad/ipad859go](/d:/learn/abot/wechat_ipad/ipad859go:1) +- `resource/` 目录中的业务资料、说明文档与文本素材 + +建议动作: + +- 核验每个字体文件的来源、许可证与是否允许随仓库重新分发 +- 核验 `ipad859go` 的来源、版权与再分发授权 +- 核验 `resource/` 目录是否包含仅限内部使用或不适合公开仓库传播的材料 +- 若无法确认授权,建议改为“下载说明 + 忽略提交”,不要直接随仓库分发 + +## 4. 开源前的内容合规建议 + +对于以下类型插件,建议在 README 中明确提示“使用者自行承担合规责任”,并默认关闭高风险配置: + +- 内容抓取/解析类 +- 图片/视频采集类 +- 自动推送类 +- 依赖第三方平台接口的插件 + +## 5. 维护建议 + +每次准备公开发布新版本时,至少做一次以下检查: + +1. 检查是否误提交 `.env`、`config.yaml`、`wechat_ipad/config.toml` +2. 检查仓库中是否仍包含真实账号、真实 token、真实 webhook 密钥 +3. 检查新增的二进制、字体、图片、模板文件是否有明确来源与许可证 diff --git a/admin/dashboard/README.md b/admin/dashboard/README.md index 4f56a21..156f063 100644 --- a/admin/dashboard/README.md +++ b/admin/dashboard/README.md @@ -97,14 +97,15 @@ ABOT 管理后台是一个集成于主程序的 Web 应用,用于管理和监 管理后台随主程序自动启动,默认访问地址为:`http://服务器IP:8888` -默认登录凭据: -- 用户名:admin -- 密码:admin123 +默认示例配置位于 [config.toml](/d:/learn/abot/admin/dashboard/config.toml:1),公开仓库中已改为占位值。 -建议首次登录后立即修改默认密码,确保系统安全。 +正式部署前请务必完成以下操作: +1. 修改管理员账号与密码 +2. 配置独立的 `secret_key` +3. 替换 webhook token ## 注意事项 1. 管理后台与主程序共享资源,请合理使用,避免过度消耗系统资源 2. 敏感操作(如批量删除群组)请谨慎执行,操作前请确认 -3. 统计数据每日凌晨自动更新,也可手动触发更新 \ No newline at end of file +3. 统计数据每日凌晨自动更新,也可手动触发更新 diff --git a/admin/dashboard/config.toml b/admin/dashboard/config.toml index 220abce..114d8dd 100644 --- a/admin/dashboard/config.toml +++ b/admin/dashboard/config.toml @@ -3,14 +3,19 @@ host = "0.0.0.0" port = 8888 [auth] -username = "admin" -password = "admin123" +# 公开仓库中仅保留示例占位值: +# 1. 请在首次部署前改成你自己的管理员账号; +# 2. 更推荐通过环境变量或独立未跟踪配置覆盖; +# 3. 不再在仓库中保留弱口令,降低开源发布时的误用风险。 +username = "please_change_me" +password = "please_change_me" [trendradar_webhook] # 是否启用 TrendRadar webhook 适配接口 enabled = true -# 固定 token(建议配置),支持请求头 X-Webhook-Token / query token / payload.token 三种传法 -token = "watHcBbQIxtmyqGRSHKeTDRVjkHOceiRfFytUkQUwmV" +# 固定 token(建议配置),支持请求头 X-Webhook-Token / query token / payload.token 三种传法。 +# 开源仓库中仅保留占位值,正式环境务必替换为高强度随机串。 +token = "please_change_me" # 默认推送目标群(可配置多个) default_group_ids = [] # 是否允许 payload 覆盖目标群(开启后可通过 target_group_ids/group_id 指定) diff --git a/admin/dashboard/server.py b/admin/dashboard/server.py index 9248d2d..619482e 100644 --- a/admin/dashboard/server.py +++ b/admin/dashboard/server.py @@ -32,6 +32,13 @@ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '. class DashboardServer: """统计看板服务器""" + # 公开仓库默认占位值: + # 1. 不再把 admin / admin123 这类弱口令作为代码级兜底; + # 2. 当用户未显式配置后台账号时,系统仍可启动,但会强烈提示其先完成配置; + # 3. 这里保留固定占位串,主要用于避免 None/空串把旧逻辑带偏。 + SAFE_PLACEHOLDER_USERNAME = "please_change_me" + SAFE_PLACEHOLDER_PASSWORD = "please_change_me" + def __init__(self, host: str = None, port: int = None, username: str = None, password: str = None, robot_instance=None): @@ -41,8 +48,8 @@ class DashboardServer: # 优先使用传入的参数,其次使用配置文件中的参数 self.host = host or self.config.get("server", {}).get("host", "0.0.0.0") self.port = port or self.config.get("server", {}).get("port", 8888) - self.username = username or self.config.get("auth", {}).get("username", "admin") - self.password = password or self.config.get("auth", {}).get("password", "admin123") + self.username = username or self.config.get("auth", {}).get("username", self.SAFE_PLACEHOLDER_USERNAME) + self.password = password or self.config.get("auth", {}).get("password", self.SAFE_PLACEHOLDER_PASSWORD) self.LOG = logger self.LOG.info(f"Dashboard配置加载完成: 服务器将运行在 {self.host}:{self.port}") @@ -129,20 +136,29 @@ class DashboardServer: with open(config_path, 'r', encoding='utf-8') as f: return toml.load(f) else: - # 如果配置文件不存在,创建默认配置 + # 如果配置文件不存在,创建安全占位配置: + # 1. 公开仓库不再自动落地弱口令; + # 2. 保留最小可运行结构,避免因为缺文件直接崩溃; + # 3. 部署者看到占位值后,会更自然地完成首次替换。 default_config = { "server": {"host": "0.0.0.0", "port": 8888}, - "auth": {"username": "admin", "password": "admin123"} + "auth": { + "username": self.SAFE_PLACEHOLDER_USERNAME, + "password": self.SAFE_PLACEHOLDER_PASSWORD, + } } with open(config_path, 'w', encoding='utf-8') as f: toml.dump(default_config, f) return default_config except Exception as e: self.LOG.error(f"加载Dashboard配置文件失败: {e}") - # 返回默认配置 + # 返回默认配置兜底,但仍坚持使用安全占位值。 return { "server": {"host": "0.0.0.0", "port": 8888}, - "auth": {"username": "admin", "password": "admin123"} + "auth": { + "username": self.SAFE_PLACEHOLDER_USERNAME, + "password": self.SAFE_PLACEHOLDER_PASSWORD, + } } def _create_app(self) -> Flask: diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3559ddb --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,99 @@ +services: + mariadb: + image: mariadb:11 + container_name: abot-mariadb + restart: unless-stopped + environment: + # 数据库初始化参数统一通过 compose 管理,便于首次部署和后续迁移。 + MARIADB_ROOT_PASSWORD: ${ABOT_DB_PASSWORD:-please_change_me} + MARIADB_DATABASE: ${ABOT_DB_NAME:-message_archive} + TZ: ${TZ:-Asia/Shanghai} + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci + ports: + - "${ABOT_DB_PORT_EXPOSED:-3306}:3306" + volumes: + # 独立数据卷保证数据库升级或重建容器后数据仍然保留。 + - mariadb_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mariadb-admin", "ping", "-h", "127.0.0.1", "-p${ABOT_DB_PASSWORD:-please_change_me}"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 20s + + redis: + image: redis:7 + container_name: abot-redis + restart: unless-stopped + command: > + sh -c ' + if [ -n "$${ABOT_REDIS_PASSWORD}" ]; then + exec redis-server --appendonly yes --requirepass "$${ABOT_REDIS_PASSWORD}"; + else + exec redis-server --appendonly yes; + fi' + environment: + ABOT_REDIS_PASSWORD: ${ABOT_REDIS_PASSWORD:-} + TZ: ${TZ:-Asia/Shanghai} + ports: + - "${ABOT_REDIS_PORT_EXPOSED:-6379}:6379" + volumes: + # Redis 使用 AOF 持久化,兼顾易用性与基础数据保留能力。 + - redis_data:/data + healthcheck: + test: ["CMD-SHELL", "if [ -n \"$${ABOT_REDIS_PASSWORD}\" ]; then redis-cli -a \"$${ABOT_REDIS_PASSWORD}\" ping; else redis-cli ping; fi"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 10s + + abot: + build: + context: . + dockerfile: Dockerfile + container_name: abot-app + restart: unless-stopped + depends_on: + mariadb: + condition: service_healthy + redis: + condition: service_healthy + env_file: + # 默认从项目根目录 .env 读取部署配置,与你现有的环境变量治理方式保持一致。 + - .env + environment: + TZ: ${TZ:-Asia/Shanghai} + ABOT_ENVIRONMENT: ${ABOT_ENVIRONMENT:-production} + ABOT_DB_HOST: mariadb + ABOT_DB_PORT: 3306 + ABOT_DB_NAME: ${ABOT_DB_NAME:-message_archive} + ABOT_DB_USER: ${ABOT_DB_USER:-root} + ABOT_DB_PASSWORD: ${ABOT_DB_PASSWORD:-please_change_me} + ABOT_REDIS_HOST: redis + ABOT_REDIS_PORT: 6379 + ABOT_REDIS_DB: ${ABOT_REDIS_DB:-0} + ABOT_REDIS_PASSWORD: ${ABOT_REDIS_PASSWORD:-} + DASHBOARD_HOST: 0.0.0.0 + DASHBOARD_PORT: ${DASHBOARD_PORT:-8888} + WECHAT_SERVER_URL: ${WECHAT_SERVER_URL:-http://host.docker.internal:8059/} + WECHAT_SERVER_IP: ${WECHAT_SERVER_IP:-host.docker.internal} + WECHAT_SERVER_PORT: ${WECHAT_SERVER_PORT:-8059} + WECHAT_WXID: ${WECHAT_WXID:-} + WECHAT_DEVICE_NAME: ${WECHAT_DEVICE_NAME:-ABOTPad} + WECHAT_DEVICE_ID: ${WECHAT_DEVICE_ID:-} + ports: + - "${DASHBOARD_PORT:-8888}:8888" + volumes: + # 日志目录映射到宿主机,方便排障与运维备份。 + - ./logs:/app/logs + # 保留 wechat_ipad 的本地配置文件,避免容器重建后丢失登录态。 + - ./wechat_ipad/config.toml:/app/wechat_ipad/config.toml + extra_hosts: + # 兼容 Linux 环境下通过 host.docker.internal 访问宿主机上的 wechat_ipad server。 + - "host.docker.internal:host-gateway" + +volumes: + mariadb_data: + redis_data: diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 1a831f5..6493b0b 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -3,6 +3,10 @@ set -euo pipefail mkdir -p /app/logs +# 首次启动时自动生成最小可运行配置: +# 1. 若用户已经通过挂载文件提供 config.yaml,则完全尊重现有配置; +# 2. 若未提供,则根据 .env / compose 环境变量生成一份安全模板; +# 3. 模板中的敏感值继续走环境变量占位,避免把真实密钥写进镜像层。 if [ ! -f /app/config.yaml ]; then cat > /app/config.yaml < /app/wechat_ipad/config.toml </dev/null -fi - -service mariadb start -service redis-server start - -mysql -uroot -e "CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" - exec "$@" diff --git a/docs/Docker部署说明.md b/docs/Docker部署说明.md new file mode 100644 index 0000000..48bc3df --- /dev/null +++ b/docs/Docker部署说明.md @@ -0,0 +1,108 @@ +# ABOT Docker 部署说明 + +本文档面向希望通过 Docker / Docker Compose 快速启动 ABOT 的维护者。 + +## 1. 部署架构 + +当前仓库提供的 Compose 方案拆分为三个服务: + +- `abot`:应用主程序与管理后台 +- `mariadb`:MySQL 兼容数据库 +- `redis`:缓存与运行时状态存储 + +说明: + +- `wechat_ipad server` 仍建议跑在宿主机或独立机器,不直接内置到应用容器中 +- `abot` 容器通过 `WECHAT_SERVER_URL` / `WECHAT_SERVER_IP` 连接该服务 + +## 2. 首次启动 + +### 2.1 准备环境变量 + +复制示例文件: + +```bash +cp .env.docker.example .env +``` + +Windows PowerShell: + +```powershell +Copy-Item .env.docker.example .env +``` + +至少确认以下变量: + +- `ABOT_DB_PASSWORD` +- `WECHAT_SERVER_URL` +- `WECHAT_SERVER_IP` +- `WECHAT_SERVER_PORT` +- `DASHBOARD_PORT` + +## 3. 启动命令 + +```bash +docker compose up -d --build +``` + +启动后: + +- Dashboard 默认访问:`http://127.0.0.1:8888` +- 日志目录映射到宿主机:`./logs` +- MariaDB / Redis 数据保存在 Docker volume 中 + +## 4. wechat_ipad 配置说明 + +Compose 已将宿主机的 [wechat_ipad/config.toml](/d:/learn/abot/wechat_ipad/config.toml:1) 映射进容器。 + +这样做的原因: + +- 保留现有代码对 `wechat_ipad/config.toml` 的读取逻辑 +- 容器重建后不丢失已有登录态 +- 不强制你这次就把全部 wechat 配置迁移到 `.env` + +## 5. 常用命令 + +查看服务状态: + +```bash +docker compose ps +``` + +查看应用日志: + +```bash +docker compose logs -f abot +``` + +停止服务: + +```bash +docker compose down +``` + +停止并删除数据卷: + +```bash +docker compose down -v +``` + +## 6. 升级建议 + +拉取新代码后建议执行: + +```bash +docker compose down +docker compose up -d --build +``` + +若数据库结构发生变更,请先备份再升级。 + +## 7. 公开仓库注意事项 + +在公开仓库或分享部署示例前,请再次确认: + +1. `.env` 未提交 +2. `config.yaml` 未提交真实密钥 +3. `wechat_ipad/config.toml` 未包含真实 `wxid`、`device_id` +4. Dashboard 账号密码与 webhook token 已替换为你自己的值