完善 Docker 部署骨架并整理开源发布资料
- 调整 Dockerfile 与入口脚本,拆分应用、MySQL、Redis 的部署职责 - 新增 docker-compose、docker ignore 与 Docker 环境变量示例 - 重写 README 并补充 Docker 部署说明与第三方资产说明 - 将后台示例账号与 webhook token 改为安全占位值,移除弱口令默认兜底
This commit is contained in:
19
.dockerignore
Normal file
19
.dockerignore
Normal file
@@ -0,0 +1,19 @@
|
||||
# Git 与本地开发目录不需要进入镜像上下文,减少构建体积并降低敏感信息泄露风险。
|
||||
.git
|
||||
.github
|
||||
.idea
|
||||
.claude
|
||||
.venv
|
||||
__pycache__
|
||||
*.pyc
|
||||
|
||||
# 本地运行日志、缓存与临时目录不打包进镜像。
|
||||
logs
|
||||
temp
|
||||
*.log
|
||||
*.log.*
|
||||
|
||||
# 本地私有配置与运行态文件不进入镜像,避免把真实密钥或登录态烘焙到镜像层。
|
||||
.env
|
||||
config.yaml
|
||||
wechat_ipad/config.toml
|
||||
11
.env.example
11
.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=
|
||||
|
||||
40
Dockerfile
40
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 \
|
||||
|
||||
445
README.MD
445
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)。
|
||||
|
||||
## 贡献与使用说明
|
||||
|
||||
- 欢迎基于自己的场景二次开发
|
||||
- 提交前请避免把本地私有配置、运行日志、登录态一并提交
|
||||
- 涉及平台接口、内容抓取、自动推送等能力时,请自行评估目标平台规则与当地法律要求
|
||||
|
||||
58
THIRD_PARTY_LICENSES.md
Normal file
58
THIRD_PARTY_LICENSES.md
Normal file
@@ -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. 检查新增的二进制、字体、图片、模板文件是否有明确来源与许可证
|
||||
@@ -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. 统计数据每日凌晨自动更新,也可手动触发更新
|
||||
3. 统计数据每日凌晨自动更新,也可手动触发更新
|
||||
|
||||
@@ -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 指定)
|
||||
|
||||
@@ -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:
|
||||
|
||||
99
docker-compose.yml
Normal file
99
docker-compose.yml
Normal file
@@ -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:
|
||||
@@ -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 <<EOF
|
||||
environment: "\${ABOT_ENVIRONMENT:production}"
|
||||
@@ -11,22 +15,22 @@ plugin_dir: "\${ABOT_PLUGIN_DIR:plugins}"
|
||||
db_config:
|
||||
pool_name: "\${ABOT_DB_POOL_NAME:wechat_boot_pool}"
|
||||
pool_size: "\${ABOT_DB_POOL_SIZE:10}"
|
||||
host: "\${DB_HOST:127.0.0.1}"
|
||||
port: "\${DB_PORT:3306}"
|
||||
prot: "\${DB_PORT:3306}"
|
||||
user: "\${DB_USER:root}"
|
||||
password: "\${DB_PASSWORD}"
|
||||
database: "\${DB_NAME:message_archive}"
|
||||
host: "\${ABOT_DB_HOST:127.0.0.1}"
|
||||
port: "\${ABOT_DB_PORT:3306}"
|
||||
prot: "\${ABOT_DB_PORT:3306}"
|
||||
user: "\${ABOT_DB_USER:root}"
|
||||
password: "\${ABOT_DB_PASSWORD}"
|
||||
database: "\${ABOT_DB_NAME:message_archive}"
|
||||
charset: "utf8mb4"
|
||||
use_unicode: true
|
||||
get_warnings: true
|
||||
pool_reset_session: true
|
||||
|
||||
redis_config:
|
||||
host: "\${REDIS_HOST:127.0.0.1}"
|
||||
port: "\${REDIS_PORT:6379}"
|
||||
password: "\${REDIS_PASSWORD:}"
|
||||
db: "\${REDIS_DB:0}"
|
||||
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
|
||||
|
||||
email_config:
|
||||
@@ -45,6 +49,10 @@ wx_config:
|
||||
EOF
|
||||
fi
|
||||
|
||||
# wechat_ipad 配置保留为独立文件:
|
||||
# 1. 兼容现有代码对 wechat_ipad/config.toml 的读取方式;
|
||||
# 2. 仅在文件缺失时生成,避免覆盖用户已有的登录态与设备信息;
|
||||
# 3. 这样既支持 Docker 一键部署,也不强行改动用户本地运行方式。
|
||||
mkdir -p /app/wechat_ipad
|
||||
if [ ! -f /app/wechat_ipad/config.toml ]; then
|
||||
cat > /app/wechat_ipad/config.toml <<EOF
|
||||
@@ -58,13 +66,4 @@ login_time = ""
|
||||
EOF
|
||||
fi
|
||||
|
||||
if [ ! -d /var/lib/mysql/mysql ]; then
|
||||
mysql_install_db --user=mysql --ldata=/var/lib/mysql >/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 "$@"
|
||||
|
||||
108
docs/Docker部署说明.md
Normal file
108
docs/Docker部署说明.md
Normal file
@@ -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 已替换为你自己的值
|
||||
Reference in New Issue
Block a user