基于 Telegram 机器人的 aria2 下载控制系统,支持 OneDrive 自动上传,并集成了文件直链功能。
- Telegram 控制: 基于电报机器人控制 aria2,支持任务管理。
- 自动上传: 下载完成后通过 rclone 自动上传到 OneDrive。
- 数据完整性保障:
- 下载文件大小校验(与 aria2 报告对比)。
- OneDrive 上传后远程文件校验(存在性 + 大小 + MD5)。
- 校验失败自动重试(最多3次)。
- 确保数据安全,防止数据丢失。
- 文件直链: 整合 TG-FileStreamBot,为 Telegram 文件生成可访问的直链。
- 下载管理:
- 支持 HTTP/HTTPS、磁力链接、种子文件下载。
- 支持批量添加任务。
- 支持自定义下载目录。
- 实时进度显示(Bot 消息 & Web 界面)。
- 任务重试/删除/自动重连。
- 智能文件过滤: 支持跳过小于指定大小的媒体文件(可配置最小文件大小)。
- Web 管理界面:
- 集成 AriaNg 和自定义系统管理页面。
- 实时日志流(WebSocket)支持,无需刷新即可查看容器日志。
- 下载记录管理,支持查看跳过文件状态。
- 任务中心: 统一管理下载和上传任务,支持实时状态更新。
- 数据一致性保证: WebSocket 实时同步,确保前后端数据一致。
- 部署友好: Docker 一键部署,集成 aria2、rclone 和前端。
- 性能优化:
- 上传操作完全异步化,不阻塞 API 响应。
- 支持配置热重载,无需重启服务。
下载项目到本地:
git clone https://github.com/Lapis0x0/MistRelay.git
cd MistRelay重命名 db/config.example.yml 为 config.yml 并设置参数(详细配置见文件内注释):
API_ID: xxxx # Telegram API ID
API_HASH: xxxxxxxx # Telegram API Hash
BOT_TOKEN: xxxx:xxxxxxxxxxxx # Telegram Bot Token
ADMIN_ID: management_id # 管理员 Telegram ID
# 下载配置
SKIP_SMALL_FILES: false # 是否跳过小于指定大小的媒体文件
MIN_FILE_SIZE_MB: 100 # 最小文件大小(MB),小于此大小的文件将被跳过
# ... 其他配置 ...由于 VPS 通常没有图形界面,建议在本地配置 rclone 后上传配置文件:
- 本地配置: 在本地电脑运行
rclone config完成 OneDrive 授权。 - 上传配置: 将本地生成的
rclone.conf复制到项目的rclone/目录下。
# 示例:创建目录并上传
mkdir -p rclone
# 将 rclone.conf 放入此目录MistRelay 使用 Docker Compose 进行一键部署,集成了前后端和所有依赖。
# 构建并启动服务
docker compose up -d --build
# 查看日志
docker compose logs -f --tail=100端口说明:
- Web 界面:
http://your-server:8080(端口映射可在docker-compose.yml中修改) - API 接口:
http://your-server:8080/api/*
启动后,访问 http://your-server:8080 即可使用 Web 管理界面。
- AriaNg: 用于管理 Aria2 下载任务。
- 系统管理:
http://your-server:8080/system用于管理 Docker 容器状态。
/start- 开始使用/help- 查看帮助/info- 查看系统信息/web- 获取 Web 控制台地址/path [目录]- 设置下载目录
- 正在下载/等待/已完成: 查看各状态的任务列表。
- 重试/删除: 管理选中任务。
默认启用(可配置)。
- 使用: 发送或转发文件给 Bot。
- 结果: Bot 会返回文件的直链地址(支持文档、视频、音频等)。
- 自动下载:
- 若开启
STREAM_AUTO_DOWNLOAD: true,管理员发送的文件会自动加入 Aria2 下载队列。 - 需配置
BIN_CHANNEL以确保日志存储正常。
- 若开启
- OneDrive 上传优化: 项目默认配置了优化参数(如
--transfers 4,--checkers 8,--buffer-size 64M等)以提升速度。 - 自动删除: 配置
AUTO_DELETE_AFTER_UPLOAD: true可在上传成功后自动清理本地文件。 - 跳过小文件:
- 配置
SKIP_SMALL_FILES: true启用跳过小文件功能。 - 配置
MIN_FILE_SIZE_MB: 100设置最小文件大小(默认 100MB)。 - 小于指定大小的文件会被静默跳过,不会下载和上传。
- 可在下载页面查看被跳过的文件状态。
- 配置
系统管理模块 (/system) 提供 Docker 容器的实时监控与控制。
- 状态查看: 实时查看容器运行状态、镜像信息。
- 热重载: 支持通过 Web 界面一键重启容器 (Restart Container)。
- 日志查看:
- 支持 HTTP 方式获取历史日志(支持筛选行数:50/100/200/500)。
- WebSocket 实时日志流: 点击播放按钮开启实时日志流,自动推送最新日志,无需手动刷新。
- 支持清空日志显示。
系统管理模块依赖于 Docker Socket 挂载 (已在 docker-compose.yml 默认配置):
volumes:
- /var/run/docker.sock:/var/run/docker.sockMistRelay 提供独立的 Windows 桌面客户端,基于 Tauri 2 构建,支持:
- 本地文件下载: 文件直接保存到本地下载目录
- 视频流预览: 边下载边预览,无需等待下载完成
- 自动更新: 内置 updater,检测到新版本后一键更新重启
- 代理支持: 桌面端独立代理配置(HTTP/SOCKS5)
MistRelay/
├── web/ # Web 前端(纯浏览器,独立开发)
├── desktop/ # 桌面客户端(完全独立)
│ ├── frontend/ # 桌面端 Vue 前端
│ │ ├── src/ # 桌面专属前端源码
│ │ ├── vite.config.ts
│ │ └── index.html
│ ├── src/main.rs # Tauri Rust 后端
│ ├── tauri.conf.json # Tauri 配置
│ ├── Cargo.toml
│ └── package.json # 桌面端全部依赖
├── dev-scripts/ # 开发辅助脚本
└── .github/workflows/ # CI/CD
web/ 和 desktop/ 完全独立,各自拥有独立的前端源码、依赖和构建流程,互不影响。
前往 Releases 下载最新的 Windows 安装包。
已知兼容性:如果当前桌面客户端是 v0.2.10,由于该版本内置 updater 密钥配置错误,升级到 v0.2.11+ 需要先手动下载安装包一次;完成后后续版本会恢复自动更新。
cd desktop
npm install
npm run devcd desktop
npm run build当前 Windows NSIS 安装器默认使用简体中文界面。
桌面端本地预发布检查:
cd desktop
npm run check:release实验性 Qt 客户端位于 desktop-qt/,作为独立 Windows Beta 通道发布:
cd desktop-qt
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
python scripts/check_release.pyQt 客户端发布 tag 使用 desktop-qt-v<semver>,客户端会通过 GitHub Releases API 解析该通道下的 qt-latest.json 资产,不影响现有 Tauri 客户端的自动更新链路。
Linux/macOS 开发机默认只做本地预发布校验;正式 Windows 安装包、签名文件和 latest.json 仍以 GitHub Actions 的 windows-latest 构建结果为准。
构建时需设置签名环境变量:
export TAURI_SIGNING_PRIVATE_KEY_PATH="/path/to/MistRelay.key"
export TAURI_SIGNING_PRIVATE_KEY_PASSWORD=""GitHub Actions 中的 TAURI_SIGNING_PRIVATE_KEY 必须填写 MistRelay.key 私钥文件内容本身。
如果使用仓库当前这套新生成的 key,TAURI_SIGNING_PRIVATE_KEY_PASSWORD 应留空。
desktop/tauri.conf.json 里的 updater pubkey 必须填写 MistRelay.key.pub 文件中的 base64 内容本身,不要手动解码成两行 minisign 文本。
不要把下面这些值填到 TAURI_SIGNING_PRIVATE_KEY Secret 里:
tauri.conf.json里的 updaterpubkey- 私钥文件路径
- 带空格拆开的 base64 字符串
推送 v* 或 desktop-v* tag 会自动触发 GitHub Actions 构建 Windows 安装包并创建 Release。
工作流会在发布前校验安装包签名、latest.json 和内置 updater pubkey 是否一致,任一不匹配都会阻止发布。
git tag -a v0.1.1 -m "v0.1.1"
git push origin v0.1.1如果您想参与开发或进行二次开发,请参考以下信息。
- 后端: Python + aiohttp (Port 8080)
- Web 前端: Vue3 + Vite + Element Plus (Dev Port 5173)
- 桌面客户端: Tauri 2 + Vue3(独立前端 + Rust 原生能力)
使用 start-dev.sh 脚本可一键启动前后端分离的开发环境:
./start-dev.sh此模式下:
- 前端支持 HMR (热重载)。
- API 请求会自动代理到后端容器。
- 访问
http://localhost:5173进行开发。
Dockerfile 使用多阶段构建:
node阶段构建前端静态资源 (dist目录)。python阶段通过 aiohttp 提供 API 服务,并将/路由指向前端index.html。
- 🧪 本地预发布检查标准化:
- 桌面端新增
npm run check:release,统一执行前端生产构建和cargo check,用于发版前本地校验。 - 文档明确 Linux/macOS 机器只承担本地预发布检查,正式 Windows 安装包继续以 GitHub Actions 结果为准。
- 桌面端新增
- 🧹 构建产物忽略补全:
- 补充
desktop-qt本地虚拟环境与构建目录忽略规则,避免后续实验性 Qt 客户端污染工作树。
- 补充
- 📦 安装包主程序修正:
- 桌面端 Cargo 配置显式锁定默认运行目标为
mistrelay-desktop,避免发布时把辅助校验工具错误打进 NSIS 安装包。 - Windows Release 工作流新增默认 bin 校验和安装包体积下限校验,打到错误主程序时会在发布前直接失败。
- 桌面端 Cargo 配置显式锁定默认运行目标为
⚠️ 版本警示:v0.2.13的 Windows 安装包体积异常,属于错误打包版本,请不要下载;请改用v0.2.14+。
- 🔄 已知升级问题定向提示:
v0.2.10现在会被识别为已知 updater 密钥配置错误版本,检查到新版本时明确提示“需手动升级一次”。- 其他版本仍保留通用回退逻辑:原生 updater 校验失败时改为给出手动下载安装包入口,不再只报模糊错误。
- 🛡️ 发布前自动验签:
- Windows Release 工作流新增安装包、
.sig、latest.json与内置 updaterpubkey的一致性校验。 - 若签名、下载地址或版本号不匹配,CI 会在创建 Release 前直接失败,避免再次发布出“能发现更新但无法自动安装”的客户端。
- Windows Release 工作流新增安装包、
⚠️ 发布说明:- 该版本的 Windows 安装包错误地打进了辅助工具,体积异常偏小;请跳过此版本,直接升级到
v0.2.14+。
- 该版本的 Windows 安装包错误地打进了辅助工具,体积异常偏小;请跳过此版本,直接升级到
- 🧰 本地下载补足核心操作:
- 桌面端“本地下载”新增取消、重试、打开文件、打开目录操作。
- 失败和已取消任务现在都能在下载页直接重新发起,不必回到网盘页重下。
- 📡 下载状态更完整:
- 本地下载状态补充“取消中 / 已取消”,前端统计与清理逻辑一并对齐。
- 下载速度刷新改得更稳,列表观察时不再频繁跳值。
- 🧭 网盘导航补口:
- 桌面端“我的网盘”顶部补上返回上级入口,媒体组视图支持返回列表。
- 🔄 更新检查兜底:
- 桌面端更新检查在原生 updater 失败时,会回退读取 GitHub 发布的
latest.json。 - 已是最新版本时不再误报“检查失败”;若发现新版本但自动更新暂不可用,会明确给出手动下载安装提示。
- 桌面端更新检查在原生 updater 失败时,会回退读取 GitHub 发布的
- 🧼 页面继续收口:
- 设置中心继续压缩重复说明,减少层层标题和告警块。
- “任务中心 / 本地下载 / 我的网盘”顶部文案进一步简化,页面更紧凑。
- 🗂️ 任务页合并:
- “任务中心”和“任务队列”合并到同一页面,通过 Tab 切换。
- 原独立
/tasks入口重定向到下载页队列 Tab,侧边栏不再重复显示。
- 📁 本地下载职责收口:
- “我的网盘”页面移除本地下载任务面板,避免和“本地下载”页面重复。
- 本地下载任务统一留在“本地下载”和合并后的任务页中查看。
- 🧼 设置页信息压缩:
- 设置中心移除重复的大标题、摘要卡和告警块,客户端/服务端说明改为轻量提示。
- 连接、更新、代理及各类服务端配置统一为更紧凑的操作布局。
- 🧭 下载入口去重:
- 设置中心移除重复的“下载控制”,客户端下载参数统一收口到“本地下载”页面。
- 设置中心新增跳转入口,避免两套入口配置互相冲突。
- 🗂️ 本地下载页重构:
- “本地下载”页面拆分为“下载配置 / 下载任务”两个 Tab。
- 配置与任务分开展示,减少页面混杂感。
- 🌐 PC 端全局代理:
- 桌面代理语义调整为 PC 客户端全局代理。
- 覆盖页面请求、接口访问、更新检查、桌面下载和本地预览等客户端侧流量。
- 📁 本地下载管理独立入口:
- 桌面端侧边栏新增“本地下载”独立页面,不再把本地下载任务只挂在“我的网盘”里。
- 页面支持集中查看下载任务状态、保存位置和失败原因。
- ⚙️ 本地下载配置直达:
- 本地下载页面可直接配置下载目录、最大并发数、每文件线程数。
- 设置中心中的客户端下载配置同步补齐上述参数,两个入口保持一致。
- 🗂️ 原生目录选择器:
- 接入桌面端原生文件夹选择器,可直接选择本地下载目录。
- 留空时自动回退到系统下载目录下的
MistRelay默认目录。
- 🖥️ 桌面客户端独立:
- 桌面端从
web/完全分离为独立desktop/项目。 - 桌面端拥有独立的 Vue 前端源码、依赖和构建流程。
web/不再包含任何 Tauri/桌面相关代码。
- 桌面端从
- 🔄 自动更新:
- 集成
tauri-plugin-updater,支持检查更新、下载安装和自动重启。 - 设置页面新增"软件更新"区域,显示当前版本和下载进度。
- CI 自动生成签名安装包和
latest.json更新清单。
- 集成
- 🏗️ CI/CD:
- GitHub Actions 工作流适配独立桌面项目结构。
- 推送
v*或desktop-v*tag 自动构建 Windows 安装包并发布 Release。
- 🔧 数据一致性增强:
- 修复 WebSocket 下载更新缺少上传信息的问题。
- 优化前端数据同步逻辑,确保上传下载记录数据一致。
- WebSocket 推送现在包含完整的上传信息,前端可正确判断完成状态。
- 改进任务中心的数据更新机制,实时同步关联数据。
- 🗑️ 功能简化:
- 移除下载和上传任务的暂停/恢复功能,简化操作流程。
- 保留重试和删除功能,确保核心功能正常使用。
- 📊 数据同步机制:
- 数据库查询正确关联所有相关表(downloads、uploads、tg_media)。
- WebSocket 推送包含完整关联数据,确保前端显示准确。
- 前端自动同步更新关联数据,保持数据一致性。
- 🎯 智能文件过滤:
- 新增跳过小文件功能,可配置最小文件大小(默认 100MB)。
- 在添加下载任务前检查文件大小,避免不必要的下载。
- 下载页面显示跳过状态和统计信息。
- 静默处理,不发送通知消息。
- ⚡ 性能优化:
- 上传操作完全异步化,使用
asyncio.create_subprocess_exec替代阻塞的subprocess.Popen。 - API 响应不再被上传操作阻塞,提升系统响应速度。
- 支持配置热重载,修改配置后无需重启服务。
- 上传操作完全异步化,使用
- 📊 Web 管理界面增强:
- 新增 WebSocket 实时日志流功能,无需刷新即可查看最新日志。
- 支持开始/停止实时日志流。
- 支持清空日志显示。
- 下载页面适配显示跳过文件状态。
- 🔧 代码优化:
- 修复
asyncio.subprocess.Process的poll()方法错误。 - 优化异步日志读取,避免阻塞事件循环。
- 修复
- 🔒 数据安全:
- 新增下载文件大小校验(与 aria2 totalLength 对比)。
- 新增 OneDrive 上传后远程文件校验(存在性 + 大小)。
- 新增 MD5 哈希校验(可选,提供字节级完整性保证)。
- 新增自动重试机制(校验失败时自动重试最多3次)。
- 🛡️ 防护机制:
- 校验失败时保留本地文件,防止数据丢失。
- 智能降级策略(MD5 不可用时降级为大小校验)。
- 详细的错误日志和用户通知。
- 🎉 发布: 整合了 MistRelay 和 TG-FileStreamBot。
- ✨ 新增:
- 完整的 Aria2 + Rclone 自动化流程。
- 统一的 Web UI。
- Docker 容器集成与系统管理功能。
- 消息美化与实时进度展示。
MistRelay 采用多层数据同步机制,确保任务中心的上传下载记录数据一致性:
- 外键约束: 使用 SQLite 外键约束保证数据完整性
- 事务管理: 所有数据库操作使用事务,确保原子性
- WAL 模式: 启用 Write-Ahead Logging,提升并发性能
- WebSocket 实时推送: 每次数据库更新后立即推送状态变更
- 轮询同步: 定期同步 aria2 状态与数据库,确保一致性
- 关联数据查询: 使用 LEFT JOIN 正确关联 downloads、uploads、tg_media 表
- 实时更新: WebSocket 接收更新后同步更新关联数据
- 状态判断: 基于完整数据(包括上传状态)判断任务完成状态
- 统计计算: 基于实际状态重新计算组统计信息
详细的数据同步机制请参考 DATABASE_SYNC_REPORT.md 和 DATA_CONSISTENCY_CHECK.md。
- 支持文件重命名
- 优化菜单交互 (更清晰的键盘布局)
- 引入大模型 (LLM) 自动整理文件列表
- 更多云存储服务支持
- 文件预览与搜索功能
本项目整合了以下优秀的开源项目:
- TG-FileStreamBot - 文件直链生成
- MistRelay - Aria2 下载控制
- HouCoder/tele-aria2
- jw-star/aria2bot