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/