Telegram 文件转存到 115 网盘:TG115 + rclone + CloudDrive2 WebDAV 完整部署教程

Telegram 文件转存到 115 网盘:TG115 + rclone + CloudDrive2 WebDAV 完整部署教程
落魄君子Telegram 文件转存到 115 网盘:TG115 + rclone + CloudDrive2 WebDAV 完整部署教程
一、教程目标
本文记录一套已经实际验证成功的 Telegram 文件转存方案:
1 | Telegram 频道中的视频或文件 |
最终使用方式很简单:
- 在 Telegram 频道中找到需要保存的视频或文件;
- 点击“转发”;
- 转发给自己创建的 TG115 Bot;
- Bot 自动排队、下载和上传;
- 文件写入 115 网盘指定目录;
- 上传成功后,程序清理 VPS 上的临时文件。
这套方案的定位是“手动选择、自动处理”。它不是自动监听整个频道,也不会自动把频道历史内容全部搬走。这样做的优点是部署相对简单、风险较低,而且可以只保存真正需要的文件。
仅转存你有权保存、备份和使用的内容,并遵守 Telegram、115、内容来源平台及所在地法律法规。
二、本文环境与版本
本文实际测试环境如下:
1 | 系统:Ubuntu 24.04 LTS |
TG115 官方推荐的基础配置通常高于本文测试机,例如 2 核、4 GB 内存和 50 GB SSD。本文的 2.4 GB 内存、39 GB 硬盘也能运行,但需要把本地临时文件预算和磁盘安全线设置得更保守。
项目地址:
1 | https://github.com/whyhhh20/TG115 |
本文固定使用 v1.5.0,避免直接跟随主分支变更而导致教程命令失效。
三、工作原理
3.1 普通文件模式
当文件大小没有超过本地任务预算时,流程通常为:
1 | Telegram |
这种模式的优点是:如果上传失败,本地文件通常还能保留,便于重新尝试。
3.2 大文件流式模式
当单文件超过配置的本地任务预算时,TG115 可以使用流式模式:
1 | Telegram |
流式模式不要求 VPS 先完整保存一份大文件,因此适合硬盘较小的 VPS。但如果网络中断,任务往往需要重新传输,所以线路稳定性仍然很重要。
3.3 每个组件负责什么
| 组件 | 作用 |
|---|---|
| Telegram Bot | 接收你手动转发的文件,并作为交互入口 |
| TG115 | 管理任务队列、状态、重试、资源控制和临时文件 |
| rclone | 作为 WebDAV 客户端,把文件写给 CloudDrive2 |
| CloudDrive2 | 把多个网盘统一为 WebDAV,并把数据写入 115 |
| 115 | 最终存储目的地 |
TG115 当前正式使用场景是“本人和私人 Bot 的一对一私聊”。部署时需要填写允许使用 Bot 的 Telegram 数字 ID,其他用户即使找到 Bot,也不能正常使用你的转存服务。
四、开始前需要准备的内容
4.1 VPS
建议:
1 | 系统:Ubuntu 22.04/24.04 或 Debian 12 |
确认 /dev/fuse 存在:
1 | ls -l /dev/fuse |
示例:
1 | crw-rw-rw- 1 root root 10, 229 ... /dev/fuse |
4.2 Telegram 参数
需要准备四项:
1 | Telegram API ID |
创建 Bot
在 Telegram 中找到 @BotFather,发送:
1 | /newbot |
按提示设置 Bot 名称和用户名,最后会得到类似:
1 | 1234567890:AAxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
这就是 Bot Token。
获取 API ID 和 API Hash
在浏览器打开:
1 | https://my.telegram.org |
进入:
1 | API development tools |
创建应用后保存:
1 | App api_id |
如果创建时只显示笼统的 ERROR,可尝试:
- 使用稳定且固定地区的代理节点;
- 不要在填写和提交过程中频繁切换 IP;
- 使用浏览器无痕窗口重新登录;
- 应用名称只用英文和数字;
- 停止连续重复提交,稍后再试。
获取 Telegram 数字 ID
需要的是纯数字 ID,例如:
1 | 123456789 |
不是 @username。可以通过可信的 Telegram ID 查询 Bot 获取,也可以使用 Telegram API 查询。
4.3 CloudDrive2 与 115
需要:
- 一个能够正常使用的 CloudDrive2 账号;
- 一个能够正常登录、容量足够的 115 账号;
- 如果要创建独立 WebDAV 用户,需要 CloudDrive2 相应会员权益。
4.4 敏感信息安全
以下内容不要发到公开仓库、Issue、截图、聊天群或博客:
1 | VPS root 密码 |
本文所有示例均使用占位符。
五、安装 Docker
已经安装 Docker 的读者可跳过本节。
先更新系统并安装基础工具:
1 | apt update |
若出现:
1 | Could not get lock /var/lib/dpkg/lock-frontend |
通常是系统正在运行 unattended-upgrades。不要直接删除锁文件,可以等待:
1 | while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do |
安装 Docker:
1 | curl -fsSL https://get.docker.com -o /tmp/get-docker.sh |
检查:
1 | docker --version |
最后一项应返回:
1 | active |
六、下载 TG115 v1.5.0 源码
1 | cd /root |
检查版本和部署文件:
1 | git describe --tags --always |
应能看到类似:
1 | Dockerfile |
七、安全生成 TG115 配置文件
7.1 输入 Telegram 和 WebDAV 参数
先设置严格的默认文件权限:
1 | umask 077 |
逐项输入:
1 | read -rp "Telegram API ID: " TG_API_ID |
其中 WebDAV 用户现在还可以没有创建,但这里输入的用户名和密码,稍后必须在 CloudDrive2 中创建成完全相同的一组。
7.2 生成 Base64 配置
定义函数:
1 | b64() { |
生成配置:
1 | cat > /root/tg115-config.env <<EOF_CONFIG |
Base64 只是编码,不是加密。真正的保护来自文件权限、服务器权限和不公开配置文件。
查看变量名,不显示值:
1 | cut -d= -f1 /root/tg115-config.env |
检查 WebDAV URL:
1 | grep '^CD2_WEBDAV_URL_B64=' /root/tg115-config.env \ |
应输出:
1 | http://clouddrive2:19798/dav |
7.3 为什么 WebDAV 地址写容器名
本文让安装脚本同时部署:
1 | tg115-bot |
它们位于同一 Docker 网络中,所以 Bot 通过内部地址访问 CloudDrive2:
1 | http://clouddrive2:19798/dav |
不要在这里填写 VPS 公网 IP。内部 Docker 地址更稳定,也不会让实际文件传输绕到公网端口。
7.4 清理当前 Shell 中的秘密变量
1 | unset TG_API_ID TG_API_HASH TG_BOT_TOKEN TG_USER_ID CD2_USER CD2_PASS |
八、在 VPS 上安装 TG115 与 CloudDrive2
执行:
1 | INSTALL_DIR=/opt/tg115 \ |
安装脚本会完成:
1 | 创建 /opt/tg115 |
39 GB 系统盘可能出现:
1 | 警告:系统盘总容量低于推荐的 50GB |
只要可用空间满足安装脚本最低要求,并且已经把本地任务预算和磁盘安全线设为 8 GB,一般可以继续。
理想的结束输出:
1 | TG115_REPAIR=SUCCESS |
检查容器:
1 | docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' |
预期:
1 | NAMES STATUS PORTS |
如果为了临时配置改成公网访问,也可能看到:
1 | 0.0.0.0:19798->19798/tcp |
查看状态:
1 | /opt/tg115/manage.sh status |
查看 Bot 日志:
1 | docker logs --tail 100 tg115-bot |
正常会看到:
1 | Telegram Bot 已登录:@your_tg115_bot |
类似下面的日志是 Telegram 自动切换数据中心,不是报错:
1 | Phone migrated to 1 |
九、访问 CloudDrive2 管理后台
CloudDrive2 管理界面默认使用:
1 | http://服务器地址:19798 |
9.1 推荐方式:SSH 隧道
如果端口映射为:
1 | 127.0.0.1:19798->19798/tcp |
在电脑上执行:
1 | ssh -N -L 127.0.0.1:19799:127.0.0.1:19798 root@VPS_IP |
保持窗口打开,然后浏览器访问:
1 | http://127.0.0.1:19799 |
本地端口使用 19799,是为了避免电脑上 19798 已被占用。
9.2 临时公网访问
仅用于短时间配置。先备份:
1 | cp /opt/tg115/docker-compose.yml \ |
修改:
1 | sed -i \ |
检查:
1 | docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' |
浏览器访问:
1 | http://VPS_IP:19798 |
若 UFW 已启用:
1 | ufw allow 19798/tcp |
不要长期裸露该端口。后文会改成“域名 + Nginx + HTTPS”。
十、在 CloudDrive2 中挂载 115
登录 CloudDrive2 后:
1 | 云存储 |
建议把存储名称设置为:
1 | 115open |
确认能够浏览 115 文件后,在 115 中创建:
1 | Telegram |
最终结构:
1 | 115open/ |
如果 CloudDrive2 的路径选择器加载很慢,可以先在 115 官方客户端创建 Telegram 文件夹,再回 CloudDrive2 刷新。
十一、创建 TG115 专用 WebDAV 用户
进入:
1 | CloudDrive2 |
开启 WebDAV 服务,然后创建独立用户。
建议:
1 | 用户名:tg115 |
如果实际使用了其他用户名,例如 tguser,则配置文件中也必须使用同一个用户名。
11.1 为什么根路径直接指向 Telegram
WebDAV 用户的根路径设置为:
1 | /115open/Telegram |
该用户访问 WebDAV 的 / 时,实际上看到的就是:
1 | 115open/Telegram/ |
因此配置中的:
1 | CD2_TARGET_PATH_B64= |
保持为空。
不要再填:
1 | 115open/Telegram |
否则可能形成套娃目录:
1 | /115open/Telegram/115open/Telegram/ |
11.2 权限要求
不要开启只读,因为 TG115 的验收流程不只读取目录,还会:
1 | 上传测试文件 |
WebDAV 用户需要读、写、改名和删除权限。
十二、先手工验证 WebDAV
在 VPS 中输入 WebDAV 凭据:
1 | read -rp "CloudDrive2 WebDAV 用户名: " WUSER |
执行:
1 | curl -i \ |
成功标志:
1 | HTTP/1.1 207 Multi-Status |
常见状态:
| 状态码 | 含义 |
|---|---|
207 Multi-Status |
WebDAV 认证和目标根目录正常 |
401 Unauthorized |
用户名或密码错误,或 Bot 使用了旧凭据 |
403 Forbidden |
用户存在,但权限不足或只读设置有问题 |
500 Internal Server Error |
CloudDrive2 访问后端网盘或根路径时失败、超时 |
验证后清理变量:
1 | unset WUSER WPASS |
十三、执行 TG115 官方目的端验收
1 | /opt/tg115/manage.sh verify |
真正成功的输出:
1 | TG115_DESTINATION=OK |
这比简单的 curl 更完整,因为它会从 TG115 容器内部使用实际 rclone 配置,完成写入、查询、改名和清理。
需要特别注意:
1 | tg115-bot healthy |
只代表 Bot 进程本身健康,不代表 CloudDrive2/115 目的端一定可写。最终以:
1 | TG115_DESTINATION=OK |
为准。
十四、实际 Telegram 文件转存测试
14.1 先测试 Bot
打开自己的 Bot:
1 | @your_tg115_bot |
发送:
1 | /start |
确认 Bot 有响应。
14.2 第一次转存使用小文件
建议先选:
1 | 10 MB ~ 100 MB |
操作:
1 | Telegram 频道中的视频 |
不需要先下载到手机,再重新上传给 Bot。
14.3 实时查看日志
1 | docker logs -f tg115-bot |
结束查看时按:
1 | Ctrl+C |
这只会退出日志界面,不会停止容器。
14.4 在 115 中核对
打开:
1 | 115 |
检查:
- 文件是否存在;
- 文件大小是否正确;
- 文件能否正常播放或打开。
完成小文件测试后,再逐级测试:
1 | 100 MB |
不要第一次就转发数 GB 文件,否则出现问题时排查成本很高。
十五、实测遇到的 401 Unauthorized 问题
这是本次部署中最值得记录的故障。
15.1 故障表现
Bot 容器显示健康,Telegram 登录也成功:
1 | Telegram Bot 已登录:@your_tg115_bot |
但日志每约 30 秒出现:
1 | CloudDrive2/115 健康检查失败 |
15.2 第一步:不要直接重装
先用刚创建的 WebDAV 用户手工测试:
1 | read -rp "CloudDrive2 WebDAV 用户名: " WUSER |
如果返回:
1 | HTTP/1.1 207 Multi-Status |
说明 CloudDrive2 的 WebDAV 用户和密码本身正确。此时 Bot 仍然报 401,通常意味着 TG115 保存的用户名或密码与 CloudDrive2 当前设置不一致,或者容器仍在使用旧配置。
15.3 更新配置文件中的 WebDAV 凭据
备份:
1 | cp /root/tg115-config.env /root/tg115-config.env.bak |
生成 Base64:
1 | NEW_USER_B64="$(printf '%s' "$WUSER" | base64 -w0)" |
更新:
1 | sed -i \ |
只查看变量名:
1 | grep -E '^CD2_WEBDAV_(URL|USERNAME|PASSWORD)_B64=' \ |
检查 URL:
1 | grep '^CD2_WEBDAV_URL_B64=' /root/tg115-config.env \ |
必须是:
1 | http://clouddrive2:19798/dav |
15.4 重新应用配置
1 | INSTALL_DIR=/opt/tg115 \ |
安装脚本会保留现有 CloudDrive2 容器的登录和挂载数据,并重新处理 Bot 配置。
15.5 容器没有重建,仍在使用旧配置
本次实测中,重新运行脚本后,状态仍显示:
1 | tg115-bot Up 3 hours (healthy) |
这说明 Bot 容器并没有真正重新创建,启动时加载的旧配置仍在内存中。
强制重建:
1 | cd /opt/tg115 |
确认:
1 | docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' |
此时应看到:
1 | tg115-bot Up 30 seconds (healthy) |
而不是 Up 3 hours。
查看新日志:
1 | docker logs --tail 50 tg115-bot |
实测修复后只看到:
1 | 重启恢复结果:{'queued': 0, 'waiting_upload': 0, 'failed': 0} |
不再出现新的 401。
最终执行:
1 | /opt/tg115/manage.sh verify |
返回:
1 | TG115_DESTINATION=OK |
问题解决。
清理变量:
1 | unset WUSER WPASS NEW_USER_B64 NEW_PASS_B64 |
15.6 不要被旧日志误导
直接运行:
1 | docker logs -f tg115-bot |
会先输出容器以前积累的所有日志,包括已经解决的 401。
排查当前状态应使用:
1 | docker logs --since 2m tg115-bot |
或者:
1 | docker logs --tail 50 tg115-bot |
如果 --since 1m 没有任何输出,不一定是故障,只可能表示最近一分钟没有新的事件。
十六、其他常见问题
16.1 CloudDrive2 浏览器访问不了
先在 VPS 检查:
1 | docker ps --filter name=tg115-clouddrive2 |
如果容器只绑定 127.0.0.1,直接访问 http://VPS_IP:19798 本来就不会成功,需要 SSH 隧道或 Nginx 反向代理。
16.2 PROPFIND 返回 401
说明认证失败,重点检查:
1 | WebDAV 服务是否开启 |
16.3 PROPFIND 返回 500,耗时约 10 秒
通常表示 CloudDrive2 已经收到请求,但访问后端网盘或用户根路径时失败、超时。检查:
- 115 是否仍处于登录状态;
/115open/Telegram是否确实存在;- CloudDrive2 中能否打开该目录;
- VPS 到 115 的线路是否稳定;
- 是否遇到 115 临时限流或接口异常。
16.4 根目录加载很慢
路径选择器需要实时获取云盘目录。可先在 115 官方客户端创建目标目录,再回 CloudDrive2 刷新。
16.5 文件出现在套娃目录
例如:
1 | Telegram/115open/Telegram/文件.mp4 |
原因通常是:
1 | WebDAV 用户根目录已经是 /115open/Telegram |
修复:
1 | WebDAV 根目录:/115open/Telegram |
16.6 Bot healthy,但不能上传
healthy 只代表 Bot 进程本身存活。必须执行:
1 | /opt/tg115/manage.sh verify |
只有:
1 | TG115_DESTINATION=OK |
才能说明目的端真正可写。
16.7 VPS 磁盘持续增加
检查:
1 | df -h / |
可能原因:
- 上传仍在进行;
- 上传失败后保留了本地文件;
- 任务被取消但临时文件未清理;
- CloudDrive2 缓存占用空间;
- 同时转发过多大文件。
39 GB 硬盘建议保持:
1 | LOCAL_TEMP_BUDGET_GB=8 |
并尽量一次只测试或处理一个大文件。
十七、日常管理命令
查看容器:
1 | docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' |
查看 TG115 状态:
1 | /opt/tg115/manage.sh status |
查看日志:
1 | /opt/tg115/manage.sh logs |
查看 Bot 最近日志:
1 | docker logs --tail 100 tg115-bot |
实时日志:
1 | docker logs -f tg115-bot |
验证目的端:
1 | /opt/tg115/manage.sh verify |
重启服务:
1 | /opt/tg115/manage.sh restart |
强制重新创建 Bot:
1 | cd /opt/tg115 |
强制重新创建 CloudDrive2:
1 | cd /opt/tg115 |
查看资源:
1 | docker stats |
检查磁盘:
1 | df -h / |
停止:
1 | cd /opt/tg115 |
启动:
1 | cd /opt/tg115 |
重新拉起:
1 | cd /opt/tg115 |
十八、使用域名 + Nginx + HTTPS 保护 CloudDrive2
完成部署后,不建议长期使用:
1 | http://VPS_IP:19798 |
目标架构:
1 | https://cd2.example.com |
TG115 内部仍然使用:
1 | http://clouddrive2:19798/dav |
所以 Nginx 只负责浏览器管理入口,不会增加 TG115 实际转存链路的绕行和延迟。
18.1 配置 DNS
为域名添加 A 记录:
1 | 类型:A |
等待解析生效:
1 | getent ahosts cd2.example.com |
18.2 把 CloudDrive2 改回本机监听
1 | cd /opt/tg115 |
检查:
1 | docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' |
应看到:
1 | 127.0.0.1:19798->19798/tcp |
18.3 安装 Nginx 和 Certbot
1 | apt update |
18.4 配置 WebSocket 连接映射
1 | cat > /etc/nginx/conf.d/websocket-map.conf <<'EOF_MAP' |
18.5 创建反向代理配置
把 cd2.example.com 改成自己的域名:
1 | cat > /etc/nginx/sites-available/clouddrive2 <<'EOF_NGINX' |
启用:
1 | ln -sfn \ |
访问:
1 | http://cd2.example.com |
18.6 申请 HTTPS 证书
1 | certbot --nginx \ |
检查自动续期计时器:
1 | systemctl status certbot.timer --no-pager |
最后访问:
1 | https://cd2.example.com |
18.7 再增加一层 Nginx Basic Auth(可选)
创建认证用户:
1 | htpasswd -c /etc/nginx/.htpasswd cd2admin |
在 location / 中加入:
1 | auth_basic "CloudDrive2 Admin"; |
然后:
1 | nginx -t |
这样访问 CloudDrive2 登录页之前,还要先通过 Nginx 的用户名和密码。
18.8 不需要外部 WebDAV时,阻止公网访问 /dav/(可选)
TG115 使用 Docker 内网访问 WebDAV,不需要公网 /dav/。可在同一个 server 中、location / 之前加入:
1 | location ^~ /dav/ { |
修改后先测试 CloudDrive2 管理页面是否正常,再正式启用。
18.9 防火墙只保留必要端口
1 | ufw allow OpenSSH |
最终公网只需要:
1 | SSH 端口 |
19798 只监听本机。
十九、备份与迁移
19.1 停止服务并备份
1 | cd /opt/tg115 |
恢复运行:
1 | cd /opt/tg115 |
如果
downloads中有尚未上传完成的文件,不要排除该目录;否则迁移后无法继续处理这些本地任务。
19.2 迁移到新 VPS
把压缩包复制到新服务器:
1 | scp /root/tg115-backup-YYYY-MM-DD-HHMMSS.tar.gz \ |
在新 VPS 安装 Docker 后:
1 | cd / |
重新部署:
1 | INSTALL_DIR=/opt/tg115 \ |
检查并验收:
1 | docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' |
迁移完成后,先在新 VPS 测试 Bot,再停止旧 VPS,避免同一个 Bot Token 被两个实例同时运行。
二十、更新与卸载
20.1 更新前先备份
不要直接在生产环境盲目 git pull。先按上一节备份配置和数据。
查看当前版本:
1 | cd /root/TG115-src |
拉取新的正式标签后,再切换版本,并重新执行安装脚本。
20.2 暂停而不删除
1 | cd /opt/tg115 |
20.3 删除容器但保留数据
1 | cd /opt/tg115 |
不要随意加 -v,否则可能删除关联卷。
20.4 完整删除
确认已经备份,并且确实不再需要后:
1 | cd /opt/tg115 |
先使用“改名保留”的方式观察一段时间,再决定是否永久删除。
二十一、完整验收清单
1 | [ ] Docker 正常运行 |
二十二、最终架构总结
1 | Telegram 频道 |
管理入口:
1 | https://cd2.example.com |
实际使用时只需要在 Telegram 中完成一次“转发”,后续下载、排队、上传、校验和本地清理都由服务器处理。
参考资料
1 | TG115 GitHub: |




