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

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

一、教程目标

本文记录一套已经实际验证成功的 Telegram 文件转存方案:

1
2
3
4
5
6
7
8
9
10
11
Telegram 频道中的视频或文件
↓ 手动转发
私人 Telegram Bot

TG115

rclone

CloudDrive2 WebDAV

115 网盘

最终使用方式很简单:

  1. 在 Telegram 频道中找到需要保存的视频或文件;
  2. 点击“转发”;
  3. 转发给自己创建的 TG115 Bot;
  4. Bot 自动排队、下载和上传;
  5. 文件写入 115 网盘指定目录;
  6. 上传成功后,程序清理 VPS 上的临时文件。

这套方案的定位是“手动选择、自动处理”。它不是自动监听整个频道,也不会自动把频道历史内容全部搬走。这样做的优点是部署相对简单、风险较低,而且可以只保存真正需要的文件。

仅转存你有权保存、备份和使用的内容,并遵守 Telegram、115、内容来源平台及所在地法律法规。


二、本文环境与版本

本文实际测试环境如下:

1
2
3
4
5
6
7
8
9
10
11
系统:Ubuntu 24.04 LTS
架构:x86_64
CPU:2 核
内存:约 2.4 GiB
Swap:约 1.2 GiB
硬盘:约 39 GB
Docker:Docker Engine + Docker Compose v2
TG115:v1.5.0
CloudDrive2:由 TG115 部署脚本一并创建
安装目录:/opt/tg115
源码目录:/root/TG115-src

TG115 官方推荐的基础配置通常高于本文测试机,例如 2 核、4 GB 内存和 50 GB SSD。本文的 2.4 GB 内存、39 GB 硬盘也能运行,但需要把本地临时文件预算和磁盘安全线设置得更保守。

项目地址:

1
https://github.com/whyhhh20/TG115

本文固定使用 v1.5.0,避免直接跟随主分支变更而导致教程命令失效。


三、工作原理

3.1 普通文件模式

当文件大小没有超过本地任务预算时,流程通常为:

1
2
3
4
5
6
7
8
9
10
11
Telegram

TG115 下载到 VPS 临时目录

rclone 上传到 CloudDrive2 WebDAV

CloudDrive2 写入 115

远端校验成功

删除 VPS 临时文件

这种模式的优点是:如果上传失败,本地文件通常还能保留,便于重新尝试。

3.2 大文件流式模式

当单文件超过配置的本地任务预算时,TG115 可以使用流式模式:

1
2
3
4
5
6
7
Telegram
↓ 边读取
rclone
↓ 边写入
CloudDrive2 WebDAV

115

流式模式不要求 VPS 先完整保存一份大文件,因此适合硬盘较小的 VPS。但如果网络中断,任务往往需要重新传输,所以线路稳定性仍然很重要。

3.3 每个组件负责什么

组件 作用
Telegram Bot 接收你手动转发的文件,并作为交互入口
TG115 管理任务队列、状态、重试、资源控制和临时文件
rclone 作为 WebDAV 客户端,把文件写给 CloudDrive2
CloudDrive2 把多个网盘统一为 WebDAV,并把数据写入 115
115 最终存储目的地

TG115 当前正式使用场景是“本人和私人 Bot 的一对一私聊”。部署时需要填写允许使用 Bot 的 Telegram 数字 ID,其他用户即使找到 Bot,也不能正常使用你的转存服务。


四、开始前需要准备的内容

4.1 VPS

建议:

1
2
3
4
5
系统:Ubuntu 22.04/24.04 或 Debian 12
CPU:2 核或以上
内存:4 GB 推荐,2 GB 左右可低并发运行
硬盘:50 GB 推荐,至少保证 8 GB 以上可用空间
网络:能够访问 Telegram、GitHub、Docker 镜像仓库和 115

确认 /dev/fuse 存在:

1
ls -l /dev/fuse

示例:

1
crw-rw-rw- 1 root root 10, 229 ... /dev/fuse

4.2 Telegram 参数

需要准备四项:

1
2
3
4
Telegram API ID
Telegram API Hash
Telegram Bot Token
本人 Telegram 数字 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
2
App api_id
App api_hash

如果创建时只显示笼统的 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
2
3
4
5
6
7
8
VPS root 密码
SSH 私钥
Telegram Bot Token
Telegram API Hash
115 登录信息
CloudDrive2 密码
WebDAV 密码
完整配置文件

本文所有示例均使用占位符。


五、安装 Docker

已经安装 Docker 的读者可跳过本节。

先更新系统并安装基础工具:

1
2
apt update
apt install -y ca-certificates curl git gnupg fuse3 kmod tar gzip openssh-client

若出现:

1
Could not get lock /var/lib/dpkg/lock-frontend

通常是系统正在运行 unattended-upgrades。不要直接删除锁文件,可以等待:

1
2
3
4
5
6
while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do
echo "系统自动更新仍在运行,10 秒后再次检查..."
sleep 10
done

echo "APT 锁已释放"

安装 Docker:

1
2
3
curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
sh /tmp/get-docker.sh
systemctl enable --now docker

检查:

1
2
3
docker --version
docker compose version
systemctl is-active docker

最后一项应返回:

1
active

六、下载 TG115 v1.5.0 源码

1
2
3
4
5
6
7
8
9
cd /root

rm -rf /root/TG115-src

git clone --depth 1 --branch v1.5.0 \
https://github.com/whyhhh20/TG115.git \
/root/TG115-src

cd /root/TG115-src

检查版本和部署文件:

1
2
git describe --tags --always
ls -lah payload/

应能看到类似:

1
2
3
4
5
6
Dockerfile
docker-compose.yml
manage.sh
remote_install.sh
requirements.txt
app/

七、安全生成 TG115 配置文件

7.1 输入 Telegram 和 WebDAV 参数

先设置严格的默认文件权限:

1
umask 077

逐项输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
read -rp "Telegram API ID: " TG_API_ID

read -rsp "Telegram API Hash: " TG_API_HASH
echo

read -rsp "Telegram Bot Token: " TG_BOT_TOKEN
echo

read -rp "你的 Telegram 数字 ID: " TG_USER_ID

read -rp "CloudDrive2 WebDAV 用户名 [tg115]: " CD2_USER
CD2_USER="${CD2_USER:-tg115}"

read -rsp "CloudDrive2 WebDAV 密码: " CD2_PASS
echo

其中 WebDAV 用户现在还可以没有创建,但这里输入的用户名和密码,稍后必须在 CloudDrive2 中创建成完全相同的一组。

7.2 生成 Base64 配置

定义函数:

1
2
3
b64() {
printf '%s' "$1" | base64 -w0
}

生成配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
cat > /root/tg115-config.env <<EOF_CONFIG
TELEGRAM_API_ID=$TG_API_ID
TELEGRAM_API_HASH_B64=$(b64 "$TG_API_HASH")
BOT_TOKEN_B64=$(b64 "$TG_BOT_TOKEN")
ALLOWED_USER_ID=$TG_USER_ID

CD2_WEBDAV_URL_B64=$(b64 "http://clouddrive2:19798/dav")
CD2_WEBDAV_USERNAME_B64=$(b64 "$CD2_USER")
CD2_WEBDAV_PASSWORD_B64=$(b64 "$CD2_PASS")
CD2_TARGET_PATH_B64=

LOCAL_TEMP_BUDGET_GB=8
MIN_FREE_DISK_GB=8

CONTROL_INTERVAL_SECONDS=3
CPU_TARGET_LOW_PERCENT=60
CPU_TARGET_HIGH_PERCENT=80
CPU_PRESSURE_PERCENT=90

MEMORY_SOFT_MIN_MB=1024
MEMORY_HARD_MIN_MB=512

RAMP_UP_STEP=1
RAMP_DOWN_FACTOR=0.5
MAX_RETRIES=3
REMOTE_HEALTH_INTERVAL_SECONDS=30

TZ=Asia/Shanghai
DEPLOY_CLOUDDRIVE2=true
EOF_CONFIG

chmod 600 /root/tg115-config.env

Base64 只是编码,不是加密。真正的保护来自文件权限、服务器权限和不公开配置文件。

查看变量名,不显示值:

1
cut -d= -f1 /root/tg115-config.env

检查 WebDAV URL:

1
2
3
4
5
grep '^CD2_WEBDAV_URL_B64=' /root/tg115-config.env \
| cut -d= -f2- \
| base64 -d

echo

应输出:

1
http://clouddrive2:19798/dav

7.3 为什么 WebDAV 地址写容器名

本文让安装脚本同时部署:

1
2
tg115-bot
tg115-clouddrive2

它们位于同一 Docker 网络中,所以 Bot 通过内部地址访问 CloudDrive2:

1
http://clouddrive2:19798/dav

不要在这里填写 VPS 公网 IP。内部 Docker 地址更稳定,也不会让实际文件传输绕到公网端口。

7.4 清理当前 Shell 中的秘密变量

1
2
unset TG_API_ID TG_API_HASH TG_BOT_TOKEN TG_USER_ID CD2_USER CD2_PASS
unset -f b64

八、在 VPS 上安装 TG115 与 CloudDrive2

执行:

1
2
3
4
INSTALL_DIR=/opt/tg115 \
bash /root/TG115-src/payload/remote_install.sh \
/root/TG115-src/payload \
/root/tg115-config.env

安装脚本会完成:

1
2
3
4
5
6
7
8
创建 /opt/tg115
复制程序文件
创建持久化目录
构建 tg115-bot 镜像
部署 CloudDrive2
建立 Docker 网络和 clouddrive2 别名
启动容器
执行基础健康检查

39 GB 系统盘可能出现:

1
警告:系统盘总容量低于推荐的 50GB

只要可用空间满足安装脚本最低要求,并且已经把本地任务预算和磁盘安全线设为 8 GB,一般可以继续。

理想的结束输出:

1
2
3
TG115_REPAIR=SUCCESS
TG115_BOT_HEALTH=healthy
TG115_RESULT=SUCCESS

检查容器:

1
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

预期:

1
2
3
NAMES               STATUS                    PORTS
tg115-bot Up ... (healthy)
tg115-clouddrive2 Up ... 127.0.0.1:19798->19798/tcp

如果为了临时配置改成公网访问,也可能看到:

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
2
Phone migrated to 1
Reconnecting to new data center 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
2
cp /opt/tg115/docker-compose.yml \
/opt/tg115/docker-compose.yml.before-public

修改:

1
2
3
4
5
6
sed -i \
's/127\.0\.0\.1:19798:19798/0.0.0.0:19798:19798/' \
/opt/tg115/docker-compose.yml

cd /opt/tg115
docker compose up -d --force-recreate clouddrive2

检查:

1
2
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
ss -ltnp | grep ':19798'

浏览器访问:

1
http://VPS_IP:19798

若 UFW 已启用:

1
ufw allow 19798/tcp

不要长期裸露该端口。后文会改成“域名 + Nginx + HTTPS”。


十、在 CloudDrive2 中挂载 115

登录 CloudDrive2 后:

1
2
3
4
云存储
→ 添加云存储
→ 115
→ 根据页面完成登录或授权

建议把存储名称设置为:

1
115open

确认能够浏览 115 文件后,在 115 中创建:

1
Telegram

最终结构:

1
2
115open/
└── Telegram/

如果 CloudDrive2 的路径选择器加载很慢,可以先在 115 官方客户端创建 Telegram 文件夹,再回 CloudDrive2 刷新。


十一、创建 TG115 专用 WebDAV 用户

进入:

1
2
CloudDrive2
→ WebDAV

开启 WebDAV 服务,然后创建独立用户。

建议:

1
2
3
4
用户名:tg115
密码:与 /root/tg115-config.env 中配置的密码完全一致
根路径:/115open/Telegram
只读:关闭

如果实际使用了其他用户名,例如 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
2
3
4
5
上传测试文件
检查大小
远端重命名
再次检查
删除测试文件

WebDAV 用户需要读、写、改名和删除权限。


十二、先手工验证 WebDAV

在 VPS 中输入 WebDAV 凭据:

1
2
3
read -rp "CloudDrive2 WebDAV 用户名: " WUSER
read -rsp "CloudDrive2 WebDAV 密码: " WPASS
echo

执行:

1
2
3
4
5
6
curl -i \
-u "$WUSER:$WPASS" \
-X PROPFIND \
-H 'Depth: 0' \
--connect-timeout 10 \
http://127.0.0.1:19798/dav/

成功标志:

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
2
TG115_DESTINATION=OK
TG115_TEST_PATH=.tg115-verify-xxxxxxxxxxxxxxxx.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
2
3
Telegram 频道中的视频
→ 转发
→ @your_tg115_bot

不需要先下载到手机,再重新上传给 Bot。

14.3 实时查看日志

1
docker logs -f tg115-bot

结束查看时按:

1
Ctrl+C

这只会退出日志界面,不会停止容器。

14.4 在 115 中核对

打开:

1
2
3
115
└── Telegram
└── 测试视频.mp4

检查:

  • 文件是否存在;
  • 文件大小是否正确;
  • 文件能否正常播放或打开。

完成小文件测试后,再逐级测试:

1
2
3
4
100 MB
500 MB
1 GB
更大的文件

不要第一次就转发数 GB 文件,否则出现问题时排查成本很高。


十五、实测遇到的 401 Unauthorized 问题

这是本次部署中最值得记录的故障。

15.1 故障表现

Bot 容器显示健康,Telegram 登录也成功:

1
Telegram Bot 已登录:@your_tg115_bot

但日志每约 30 秒出现:

1
2
CloudDrive2/115 健康检查失败
Invalid credentials: 401 Unauthorized

15.2 第一步:不要直接重装

先用刚创建的 WebDAV 用户手工测试:

1
2
3
4
5
6
7
8
9
10
read -rp "CloudDrive2 WebDAV 用户名: " WUSER
read -rsp "CloudDrive2 WebDAV 密码: " WPASS
echo

curl -i \
-u "$WUSER:$WPASS" \
-X PROPFIND \
-H 'Depth: 0' \
--connect-timeout 10 \
http://127.0.0.1:19798/dav/

如果返回:

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
2
NEW_USER_B64="$(printf '%s' "$WUSER" | base64 -w0)"
NEW_PASS_B64="$(printf '%s' "$WPASS" | base64 -w0)"

更新:

1
2
3
4
5
6
7
sed -i \
"s|^CD2_WEBDAV_USERNAME_B64=.*|CD2_WEBDAV_USERNAME_B64=$NEW_USER_B64|" \
/root/tg115-config.env

sed -i \
"s|^CD2_WEBDAV_PASSWORD_B64=.*|CD2_WEBDAV_PASSWORD_B64=$NEW_PASS_B64|" \
/root/tg115-config.env

只查看变量名:

1
2
3
grep -E '^CD2_WEBDAV_(URL|USERNAME|PASSWORD)_B64=' \
/root/tg115-config.env \
| cut -d= -f1

检查 URL:

1
2
3
4
5
grep '^CD2_WEBDAV_URL_B64=' /root/tg115-config.env \
| cut -d= -f2- \
| base64 -d

echo

必须是:

1
http://clouddrive2:19798/dav

15.4 重新应用配置

1
2
3
4
INSTALL_DIR=/opt/tg115 \
bash /root/TG115-src/payload/remote_install.sh \
/root/TG115-src/payload \
/root/tg115-config.env

安装脚本会保留现有 CloudDrive2 容器的登录和挂载数据,并重新处理 Bot 配置。

15.5 容器没有重建,仍在使用旧配置

本次实测中,重新运行脚本后,状态仍显示:

1
tg115-bot   Up 3 hours (healthy)

这说明 Bot 容器并没有真正重新创建,启动时加载的旧配置仍在内存中。

强制重建:

1
2
3
cd /opt/tg115

docker compose up -d --force-recreate tg115-bot

确认:

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
2
重启恢复结果:{'queued': 0, 'waiting_upload': 0, 'failed': 0}
Telegram Bot 已登录:@your_tg115_bot

不再出现新的 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
2
3
docker ps --filter name=tg115-clouddrive2
ss -ltnp | grep ':19798'
curl -I --connect-timeout 5 http://127.0.0.1:19798

如果容器只绑定 127.0.0.1,直接访问 http://VPS_IP:19798 本来就不会成功,需要 SSH 隧道或 Nginx 反向代理。

16.2 PROPFIND 返回 401

说明认证失败,重点检查:

1
2
3
4
5
WebDAV 服务是否开启
用户名是否一致
密码是否一致
用户是否启用
Bot 是否已重新加载配置

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
2
WebDAV 用户根目录已经是 /115open/Telegram
同时 TG115 target path 又填写了 115open/Telegram

修复:

1
2
WebDAV 根目录:/115open/Telegram
TG115 target path:留空

16.6 Bot healthy,但不能上传

healthy 只代表 Bot 进程本身存活。必须执行:

1
/opt/tg115/manage.sh verify

只有:

1
TG115_DESTINATION=OK

才能说明目的端真正可写。

16.7 VPS 磁盘持续增加

检查:

1
2
3
df -h /
du -sh /opt/tg115/*
find /opt/tg115 -type f -size +100M -printf '%s %p\n' 2>/dev/null

可能原因:

  • 上传仍在进行;
  • 上传失败后保留了本地文件;
  • 任务被取消但临时文件未清理;
  • CloudDrive2 缓存占用空间;
  • 同时转发过多大文件。

39 GB 硬盘建议保持:

1
2
LOCAL_TEMP_BUDGET_GB=8
MIN_FREE_DISK_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
2
cd /opt/tg115
docker compose up -d --force-recreate tg115-bot

强制重新创建 CloudDrive2:

1
2
cd /opt/tg115
docker compose up -d --force-recreate clouddrive2

查看资源:

1
docker stats

检查磁盘:

1
2
df -h /
du -sh /opt/tg115/*

停止:

1
2
cd /opt/tg115
docker compose stop

启动:

1
2
cd /opt/tg115
docker compose start

重新拉起:

1
2
cd /opt/tg115
docker compose up -d

十八、使用域名 + Nginx + HTTPS 保护 CloudDrive2

完成部署后,不建议长期使用:

1
http://VPS_IP:19798

目标架构:

1
2
3
4
5
6
7
https://cd2.example.com

Nginx

127.0.0.1:19798

CloudDrive2

TG115 内部仍然使用:

1
http://clouddrive2:19798/dav

所以 Nginx 只负责浏览器管理入口,不会增加 TG115 实际转存链路的绕行和延迟。

18.1 配置 DNS

为域名添加 A 记录:

1
2
3
类型:A
名称:cd2
内容:VPS 公网 IPv4

等待解析生效:

1
getent ahosts cd2.example.com

18.2 把 CloudDrive2 改回本机监听

1
2
3
4
5
6
7
cd /opt/tg115

sed -i \
's/0\.0\.0\.0:19798:19798/127.0.0.1:19798:19798/' \
docker-compose.yml

docker compose up -d --force-recreate clouddrive2

检查:

1
2
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
ss -ltnp | grep ':19798'

应看到:

1
127.0.0.1:19798->19798/tcp

18.3 安装 Nginx 和 Certbot

1
2
3
apt update
apt install -y nginx certbot python3-certbot-nginx apache2-utils
systemctl enable --now nginx

18.4 配置 WebSocket 连接映射

1
2
3
4
5
6
cat > /etc/nginx/conf.d/websocket-map.conf <<'EOF_MAP'
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
EOF_MAP

18.5 创建反向代理配置

cd2.example.com 改成自己的域名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cat > /etc/nginx/sites-available/clouddrive2 <<'EOF_NGINX'
server {
listen 80;
listen [::]:80;

server_name cd2.example.com;

client_max_body_size 0;

location / {
proxy_pass http://127.0.0.1:19798;
proxy_http_version 1.1;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

proxy_request_buffering off;
proxy_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
EOF_NGINX

启用:

1
2
3
4
5
6
ln -sfn \
/etc/nginx/sites-available/clouddrive2 \
/etc/nginx/sites-enabled/clouddrive2

nginx -t
systemctl reload nginx

访问:

1
http://cd2.example.com

18.6 申请 HTTPS 证书

1
2
3
certbot --nginx \
-d cd2.example.com \
--redirect

检查自动续期计时器:

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
2
auth_basic "CloudDrive2 Admin";
auth_basic_user_file /etc/nginx/.htpasswd;

然后:

1
2
nginx -t
systemctl reload nginx

这样访问 CloudDrive2 登录页之前,还要先通过 Nginx 的用户名和密码。

18.8 不需要外部 WebDAV时,阻止公网访问 /dav/(可选)

TG115 使用 Docker 内网访问 WebDAV,不需要公网 /dav/。可在同一个 server 中、location / 之前加入:

1
2
3
location ^~ /dav/ {
return 403;
}

修改后先测试 CloudDrive2 管理页面是否正常,再正式启用。

18.9 防火墙只保留必要端口

1
2
3
4
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw delete allow 19798/tcp
ufw status

最终公网只需要:

1
2
3
SSH 端口
80/tcp
443/tcp

19798 只监听本机。


十九、备份与迁移

19.1 停止服务并备份

1
2
3
4
5
6
7
8
9
10
11
12
13
cd /opt/tg115
docker compose stop

BACKUP="/root/tg115-backup-$(date +%F-%H%M%S).tar.gz"

tar \
--exclude='/opt/tg115/downloads/*' \
-czf "$BACKUP" \
/opt/tg115 \
/root/tg115-config.env \
/root/TG115-src

echo "$BACKUP"

恢复运行:

1
2
cd /opt/tg115
docker compose start

如果 downloads 中有尚未上传完成的文件,不要排除该目录;否则迁移后无法继续处理这些本地任务。

19.2 迁移到新 VPS

把压缩包复制到新服务器:

1
2
scp /root/tg115-backup-YYYY-MM-DD-HHMMSS.tar.gz \
root@NEW_VPS_IP:/root/

在新 VPS 安装 Docker 后:

1
2
cd /
tar -xzf /root/tg115-backup-YYYY-MM-DD-HHMMSS.tar.gz

重新部署:

1
2
3
4
5
6
7
INSTALL_DIR=/opt/tg115 \
bash /root/TG115-src/payload/remote_install.sh \
/root/TG115-src/payload \
/root/tg115-config.env

cd /opt/tg115
docker compose up -d --build

检查并验收:

1
2
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
/opt/tg115/manage.sh verify

迁移完成后,先在新 VPS 测试 Bot,再停止旧 VPS,避免同一个 Bot Token 被两个实例同时运行。


二十、更新与卸载

20.1 更新前先备份

不要直接在生产环境盲目 git pull。先按上一节备份配置和数据。

查看当前版本:

1
2
cd /root/TG115-src
git describe --tags --always

拉取新的正式标签后,再切换版本,并重新执行安装脚本。

20.2 暂停而不删除

1
2
cd /opt/tg115
docker compose stop

20.3 删除容器但保留数据

1
2
cd /opt/tg115
docker compose down

不要随意加 -v,否则可能删除关联卷。

20.4 完整删除

确认已经备份,并且确实不再需要后:

1
2
3
4
5
cd /opt/tg115
docker compose down

mv /opt/tg115 \
/opt/tg115-disabled-$(date +%F-%H%M%S)

先使用“改名保留”的方式观察一段时间,再决定是否永久删除。


二十一、完整验收清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[ ] Docker 正常运行
[ ] /dev/fuse 存在
[ ] tg115-bot 为 healthy
[ ] tg115-clouddrive2 正常运行
[ ] Telegram Bot 登录成功
[ ] 115 已在 CloudDrive2 中挂载
[ ] 115open/Telegram 已创建
[ ] WebDAV 用户与 TG115 配置完全一致
[ ] WebDAV 用户不是只读
[ ] curl PROPFIND 返回 207
[ ] manage.sh verify 返回 TG115_DESTINATION=OK
[ ] 小文件转发成功
[ ] 115 中能够看到文件
[ ] 文件大小正确且可正常打开
[ ] 上传后 VPS 临时文件被清理
[ ] 19798 不再长期暴露公网
[ ] Nginx + HTTPS 已配置
[ ] 配置文件和 CloudDrive2 数据已备份

二十二、最终架构总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Telegram 频道
↓ 手动选择并转发
私人 Telegram Bot

TG115 持久化任务队列

普通文件:先落盘
大文件:可流式写入

rclone WebDAV 客户端

http://clouddrive2:19798/dav
↓ Docker 内网
CloudDrive2

115open/Telegram

115 官方客户端核验

管理入口:

1
2
3
4
5
6
7
https://cd2.example.com

Nginx

127.0.0.1:19798

CloudDrive2 管理页面

实际使用时只需要在 Telegram 中完成一次“转发”,后续下载、排队、上传、校验和本地清理都由服务器处理。


参考资料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
TG115 GitHub:
https://github.com/whyhhh20/TG115

CloudDrive2 官方帮助:
https://www.clouddrive2.com/help.html

rclone WebDAV 文档:
https://rclone.org/webdav/

Docker 官方文档:
https://docs.docker.com/

Certbot:
https://certbot.eff.org/