diff --git a/README.md b/README.md
index ba77061..77044ec 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,3 @@
-> 本地保存位置:新安装可选服务器目录;升级保留原挂载、不迁移。详见 [本地存储位置](docs/local-storage.md)。
-

@@ -19,7 +17,7 @@
·
Bot 命令
·
-
生产部署
+
部署指南
@@ -29,7 +27,6 @@
-
@@ -43,282 +40,90 @@
## ✨ 功能概览
-- **Web 管理** — 文件上传、分片大文件上传、文件夹、预览、删除和存储源管理
-- **多存储源** — 本地、OneDrive、Google Drive、阿里云 OSS、S3 兼容存储和 WebDAV
-- **账号级下载器** — 频道/群组按日期或标签批量抓取、订阅同步和大文件下载
-- **自动归档** — 默认按来源、频道和文件类型保存,例如 `telegram/channel/images/file.jpg`
-- **安全防护** — 首次初始化管理员、HttpOnly Cookie、Origin 校验、签名 URL 和 TOTP 双重验证
-
+- **文件管理**:上传、预览、整理文件夹,在浏览器中管理归档内容。
+- **Telegram 转存**:发送文件给 Bot,或从频道、群组批量保存媒体。
+- **订阅同步**:订阅频道,自动保存后续更新。
+- **多种存储**:支持本地磁盘、OneDrive、Google Drive、OSS、S3 和 WebDAV。
+- **自动归档**:按来源、频道和文件类型整理文件。
+- **访问保护**:管理员登录、Bot 用户权限和双重验证。
---
## 🚀 快速部署 (Docker Compose)
-需要 Linux、Bash 4+、Python 3.6+、Git、Docker Engine、Compose 插件和 Buildx,以及已解析到服务器的 Web/API 域名。HTTPS 由宿主机反向代理提供,不包含在 Compose 中。
+准备一台 Linux 服务器,以及用于网页和 API 的两个域名。
-默认构建包含 SBOM/provenance,需要 Compose 2.39+ 和支持构建证明的 builder/镜像存储。较旧环境可主动选择 `--compat`(验证基线为 Compose 2.18+),代价是本次构建不生成这些证明;不改变应用和数据库配置。安装器按实际能力检查,不支持 `docker-compose` v1。详见[部署指南](deploy/DEPLOY.md)。
-
-### 1. 克隆仓库
+### 1. 下载项目
```bash
git clone https://github.com/hicocos/tg-vault.git
cd tg-vault
```
-### 2. 运行安装向导
+### 2. 运行一键脚本
```bash
./deploy/install.sh
```
-安装器先检查源码更新和运行环境。缺少组件时,可选择从现有仓库安装、查看手动安装提示或退出;只有输入 `1` 才会安装软件,按 Enter 不授权安装。首次部署填写 Web 和 API 的 HTTPS 地址,确认后生成 `.env`、数据库密码和应用密钥,再构建并启动服务。
+按提示检查环境,填写 Web 和 API 地址,确认后开始安装。
-安装器先等待 PostgreSQL 健康,再启动前后端;升级时保留数据库容器和持久卷。后续使用同一命令更新,详情见[维护与更新](#-维护与更新)。
+### 3. 开始使用
-- **配置 HTTPS**
- 将 Web 域名代理到 `127.0.0.1:47832`,API 域名代理到 `127.0.0.1:51947`,为两个入口配置证书后再初始化管理员。
-- **启用 Telegram Bot 基础能力**
- 首次打开 Web 并完成管理员初始化后,进入 **设置 → Telegram → Telegram Bot 连接**,填写 Bot Token、API ID、API Hash 和 Bot PIN。凭证会加密保存且不回显;不要把这些内容写入 `.env`。
-- **启用账号级 Telegram 下载器**
- 需要频道/群组批量抓取、订阅同步或大文件下载时,再在 **设置 → Telegram → Telegram 账号下载器** 中登录。session 加密保存在服务端。
+按照[部署指南](deploy/DEPLOY.md#4-配置宿主机反向代理)为两个域名配置 HTTPS,然后打开网页创建管理员账号。
-> [!IMPORTANT]
-> `VITE_API_URL` 会打包进前端静态文件。修改该地址后必须重新运行 `deploy/install.sh`;仅重启容器不会更新 API 地址。
+进入 **设置 → Telegram** 连接 Bot;需要频道转存或订阅同步时,再登录 Telegram 账号。其他存储服务可在 **设置 → 存储** 中添加。
----
-
-## 🛠️ 环境变量配置
-
-常用变量如下,完整模板见 [`.env.example`](.env.example)。
-
-
-新手只需填写(2 项)
-
-- **`VITE_API_URL`** — 前端访问后端的公网地址;示例:`https://api.example.com`
-- **`CORS_ORIGIN`** — 允许跨域的前端来源;示例:`https://cloud.example.com`
-
-两项填写完整 origin(协议、域名及可选端口),不带路径、查询参数或末尾 `/`;生产环境使用 HTTPS。安装器会询问并校验地址,无需预先复制模板。若已复制 `.env.example`,必须将示例地址换成实际域名;按 Enter 会保留已有值。
-
-
-
-
-安装脚本自动生成
-
-- **`DB_PASSWORD`** — 自动生成 64 位十六进制 PostgreSQL 密码
-- **`SESSION_SECRET`** / **`STORAGE_CREDENTIALS_SECRET`** — 新安装时自动生成并保留;升级旧部署时不会覆盖 `/data/secrets` 中已有的持久密钥
-
-版本号不保存在 `.env`。安装时会直接从 `backend/package.json` 读取应用版本,并从当前 Git 提交读取源码修订号,只把它们临时传给 Docker 构建。
-
-
-
-
-高级部署覆盖
-
-- **`OAUTH_CALLBACK_BASE_URL`** — 默认继承 `VITE_API_URL`;仅特殊 API 入口时填写
-- **`OAUTH_FRONTEND_ORIGIN`** — 默认继承 `CORS_ORIGIN` 的第一个地址;仅多前端入口时填写
-
-
-
-
-Telegram 运行配置
-
-Telegram 凭证、允许用户、账号登录、来源白名单和下载并发均属于运行配置,统一在 Web **设置 → Telegram** 中管理。新部署不需要在 `.env` 中填写 Telegram 变量,也不需要手动生成 session 文件。
-
-旧版本 `.env` 变量仍会被兼容读取,但只用于升级和迁移;不要在新部署中同时维护两套配置。Web 中的设置优先于环境变量。
-
-
-
-
-常用可选项
-
-- **`PORT`** `51947` — 后端监听端口
-- **`UPLOAD_DIR`** `/data/uploads` · **`THUMBNAIL_DIR`** `/data/thumbnails` · **`CHUNK_DIR`** `/data/chunks`
-- **`DUPLICATE_FILE_MODE`** `copy` — `copy` 生成副本;`skip` 跳过同名、同目录且同大小的文件
-- **`AUTO_CLEANUP_ORPHANS`** `true` — 自动清理未登记到数据库的本地孤儿文件
-
-
-
-
-限流与安全项
-
-- **普通消息限流** — `TELEGRAM_RATE_WINDOW_MS=60000`,`TELEGRAM_RATE_MAX=30`
-- **重型命令限流** — `TELEGRAM_HEAVY_RATE_WINDOW_MS=600000`,`TELEGRAM_HEAVY_RATE_MAX=5`
-- **`TRUST_PROXY`** `loopback` · **`COOKIE_SECURE`** `true` · **`JSON_BODY_LIMIT`** `2mb`
-- **分片限制** — `MAX_UPLOAD_CHUNK_MB=32`,`MAX_CHUNK_UPLOAD_GB=20`,`CHUNK_GLOBAL_BUDGET_GB=40`
-- **磁盘与数量保护** — `CHUNK_DISK_RESERVE_GB=8`,`MAX_TOTAL_CHUNKS=50000`
-- **`ORPHAN_CLEANUP_MIN_AGE_MS`** `600000` — 10 分钟内不清理本地孤儿文件
-
-
-
----
-
-## 🤖 Telegram 配置与能力
-
-### Bot 与账号级下载器的区别
-
-**只启用 Bot 即可使用:**
-
-- ✅ 私聊发送文件给 Bot 转存
-- ✅ 任务管理、存储统计和删除文件
-
-**额外启用账号级下载器后增加:**
-
-- ✅ 频道/群组按日期或标签批量抓取
-- ✅ 频道订阅自动同步
-- ✅ 下载受 Bot 限制影响的大文件(仍受 Telegram 账号权限和限流约束)
-
-### 获取 Bot Token
-
-1. 在 Telegram 中搜索 [@BotFather](https://t.me/BotFather) 并开始对话。
-2. 发送 `/newbot`,按提示创建机器人。
-3. 复制 BotFather 返回的 `HTTP API TOKEN`。
-4. 在 TG Vault Web 的“设置 → Telegram”中填写 Token。
-
-### 获取 API ID 和 API Hash
-
-1. 访问 [my.telegram.org](https://my.telegram.org) 并登录 Telegram 账号。
-2. 进入 `API development tools`。
-3. 创建应用后复制 `api_id` 和 `api_hash`。
-4. 在 **设置 → Telegram → Telegram Bot 连接** 中与 Bot Token 一起填写,先测试连接,再保存并启用。
-5. 需要账号级下载器时,在同页使用手机号、验证码和可选两步验证密码登录;无需手工生成或编辑 session 文件。
-
-### Telegram Bot 允许用户
-
-TG Vault 会限制能通过 Bot PIN 登录的 Telegram 用户。推荐进入 **设置 → Telegram → Telegram Bot 用户权限**,填写一个或多个数字 user id;多个 ID 用英文逗号分隔。
-
-获取 user id:让用户在 Telegram 私聊 `@userinfobot` 查看 `Id`。如果允许列表留空,并且后台还没有任何 Telegram 用户认证成功,第一个正确输入 Bot PIN 的用户可自动加入允许列表。之后应在 Web 中明确维护列表。
-
-### 账号级下载器什么时候需要?
-
-账号级下载器使用登录的 Telegram 用户账号读取媒体,适用于:
-
-- 频道/群组转存:用户账号需要加入对应频道/群组,并确保能看到历史媒体。
-- 按日期/标签批量抓取:`/tg_download date`、`/tg_download tag` 依赖用户账号访问来源消息。
-- 频道订阅同步:`/tg_sub` 后台扫描依赖用户账号读取频道/群组新消息。
-- 大文件下载:Bot 无法直接下载的文件,可尝试通过有访问权限的用户账号下载。
-
-仅登录或明确启用账号时才应连接个人账号;更改界面语言或查看设置不应激活账号。只转存有权访问和保存的内容,遵守 Telegram 限流;遇到冷却或账号限制时,不要反复重试或提高并发。
-
-### Telegram 下载设置
-
-下载并发在 Web **设置 → 维护 → 高级任务设置** 中调整。先查看适用范围和风险提示,保留默认值,确有需要时再修改;不要通过提高并发绕过账号冷却。
+[查看完整部署指南](deploy/DEPLOY.md) · [Telegram 配置说明](docs/configuration.md#-telegram-配置与能力)
---
## 🧭 Telegram Bot 命令
-
-常用命令
+连接 Bot 后,发送 `/start` 开始使用,发送 `/help` 查看帮助。
-- `/start` 认证 · `/help` 帮助 · `/list [数量] [页码]` 最近文件
-- `/delete <至少 8 位 ID 前缀>` 删除文件 · `/setup_2fa` 配置 TOTP
+| 命令 | 用途 |
+| --- | --- |
+| `/list` | 查看最近文件 |
+| `/tasks` | 查看和管理任务 |
+| `/storage` | 查看存储状态 |
+| `/path_rules` | 设置保存位置 |
+| `/tg_download` | 打开频道、群组下载向导 |
+| `/tg_sub` | 添加频道订阅 |
+| `/tg_subs` | 查看订阅 |
-
+频道下载与订阅需要登录有访问权限的 Telegram 账号。
-任务、下载与清理设置
+更多命令
-- **任务控制** — `/task_pause [任务ID]` · `/task_resume [任务ID]` · `/task_cancel <任务ID或all>` · `/stop_tasks`
-- **并发设置** — `/download_workers`(别名 `/workers`)· `/file_concurrency`(别名 `/file_workers`、`/download_files`)
-- **文件策略** — `/duplicate_mode`(别名 `/duplicate`、`/dup`)· `/cleanup_settings`(别名 `/cleanup`)
-
-> Web 设置中的“删除任务历史”、`/cleanup_settings` 管理的临时文件清理,以及 `/storage` 中删除本地实体文件,是三类不同操作;危险操作均需单独确认。
+- **文件管理**:`/delete <至少 8 位 ID 前缀>` 删除文件;`/setup_2fa` 设置双重验证。
+- **任务控制**:`/task_pause [任务ID]`、`/task_resume [任务ID]`、`/task_cancel <任务ID或all>`、`/stop_tasks`。
+- **保存目录**:`/p <目录>` 仅用于下一次下载;`/ps <目录>` 用于当前会话;`/pc` 清除自定义目录。
+- **批量下载**:`/tg_download date <频道> <开始日期> <结束日期>`、`/tg_download tag <频道> <#标签>`。
+- **订阅与重试**:`/tg_unsub <频道或订阅ID前缀>` 取消订阅;`/tg_retry [数量] [任务ID]` 重试失败任务。
+- **下载设置**:`/download_workers`、`/file_concurrency`、`/duplicate_mode`、`/cleanup_settings`。
-
-保存位置命令
-
-- `/path_rules` — 打开保存位置面板;别名 `/path`、`/save_rules`
-- `/p <目录>` — 仅下一次下载使用该目录
-- `/ps <目录>` — 当前会话持续使用该目录
-- `/pc` — 清除下一次 / 本会话自定义目录
-
-未设置时按来源、频道和文件类型自动归档;设置后直接保存到指定目录。
-
-
-
-
-频道/群组转存与订阅(需要账号级下载器)
-
-- `/tg_download` — 打开按日期 / 标签下载向导;别名 `/tg_dl`
-- `/tg_download date <频道> <开始日期> <结束日期>` — 按日期范围抓取
-- `/tg_download tag <频道> <#标签>` — 按标签抓取
-- `/tg_retry [数量] [任务ID]` — 重试失败任务
-- `/tg_sub <频道>` · `/tg_subs` · `/tg_unsub <频道或订阅ID前缀>` — 添加、查看和取消订阅
-
-兼容旧命令 `/tg_date`、`/tg_tag`。多文件达到 9 个及以上时自动静默排队,可用 `/tasks` 查看进度。
-
-
-
----
-
-## 🔐 安全与访问控制
-
-TG Vault 默认采用“首次初始化”模式保护 Web 和 API:
-
-1. 服务启动后,首次访问 Web 页面需创建至少 8 位的管理员密码,使用 `scrypt` 加盐哈希保存到数据库。请在开放给其他用户前完成初始化。
-2. 如果此时已经通过环境变量配置 Telegram Bot,初始化页还会要求创建 Bot 4 位 PIN;新安装也可以先完成网页初始化,再到 **设置 → Telegram** 配置 Bot 和 PIN。
-3. 登录成功后,浏览器会获得 HttpOnly Cookie 会话,前端不再把访问 token 写入 `localStorage`。
-4. 修改类请求会校验 `Origin`,请确保 `.env` 中的 `CORS_ORIGIN` 与前端公网地址一致。
-
-> [!IMPORTANT]
-> 生产环境请使用 HTTPS。默认 `COOKIE_SECURE=true` 时,浏览器只会在 HTTPS 下发送登录 Cookie;如果你只在本地 HTTP 调试,可临时设置 `COOKIE_SECURE=false`。
-> `deploy/install.sh` 生成的正式部署会额外写入 `COOKIE_SECURE_FORCE=true`,防止遗留环境值意外关闭 HTTPS Cookie;本地 HTTP 调试请不要沿用该强制值,或同时设为 `false`。
-
-### 自动密钥说明
-
-安装器为新部署生成 `.env` 密钥;未显式配置的内部密钥由应用保存到数据卷的 `/data/secrets/`。迁移时同时备份 `.env`、数据库和完整数据卷。丢失密钥可能导致登录会话失效,TOTP 和第三方存储凭证无法解密。
-
-完整的宿主机 Nginx 部署、健康检查、协调备份与隔离恢复校验流程见 [`deploy/DEPLOY.md`](deploy/DEPLOY.md)。仓库提供 `deploy/backup.sh` 和只读归档检查脚本 `deploy/restore-verify.sh`;备份包含密钥材料,必须加密并异地保存。
-
-### 双重验证 (TOTP)
-
-TG Vault 内置支持 TOTP 双重验证(如 Google Authenticator):
-
-- Web 端:在个人设置中扫码激活
-- Telegram Bot:发送 `/setup_2fa` 获取设置二维码,并在对话框输入验证码激活
-- 启用后,网页登录和使用 Bot 均需二次验证
-
----
-
-## 🌐 反向代理建议
-
-如果你使用 Nginx、Nginx Proxy Manager 或 Caddy 部署,请参考以下映射:
-
-- **前端 / 网页入口**
- - 示例域名:`https://cloud.example.com`
- - 转发地址:`127.0.0.1:47832`
-- **后端 / API 接口**
- - 示例域名:`https://api.example.com`
- - 转发地址:`127.0.0.1:51947`
-
-如果前后端使用不同域名,请在后端环境变量中设置:
-
-```env
-VITE_API_URL=https://api.example.com
-CORS_ORIGIN=https://cloud.example.com
-COOKIE_SECURE=true
-```
-
-> [!CAUTION]
-> 开启 HTTPS 后,`.env` 中的 `VITE_API_URL` 和 `CORS_ORIGIN` 都应使用 `https://`,否则浏览器可能拦截请求。修改 `VITE_API_URL` 后必须重新构建前端镜像,因为它会被打包进静态文件。
-
---
## 🔄 维护与更新
-升级前先备份 `.env`、数据库和文件卷,并安排短暂的服务中断。然后从项目目录运行:
+进入自己的 TG Vault 项目目录,运行一键升级脚本:
```bash
./deploy/install.sh
```
-- 自动拉取当前分支的最新代码;遇到本地修改、detached HEAD 或无法快进的更新会停止,不强制覆盖文件。
-- 已有地址按 Enter 保留,输入 `e` 返回编辑。已手动更新源码或需要离线部署时,主动添加 `--skip-source-update`。
-- 仅重建前后端;已有 PostgreSQL 容器使用 `--no-recreate` 保留,停止的数据库会恢复启动。健康检查通过后才报告完成。
+---
-不要用 `docker compose down -v` 排查安装故障,它会永久删除持久化数据。清理 Docker 资源前先检查影响范围,并保留回滚所需的镜像。
+## 📚 文档
+
+- [部署指南](deploy/DEPLOY.md):安装、域名配置、环境兼容与故障排查。
+- [配置与使用](docs/configuration.md):Telegram 接入、访问权限与高级配置。
+- [本地存储位置](docs/local-storage.md):选择和查看文件保存目录。
+- [版本更新](https://github.com/hicocos/tg-vault/releases):查看新增功能与修复。
---
diff --git a/backend/src/services/reproducibleBuildContract.test.ts b/backend/src/services/reproducibleBuildContract.test.ts
index dc09303..87a1244 100644
--- a/backend/src/services/reproducibleBuildContract.test.ts
+++ b/backend/src/services/reproducibleBuildContract.test.ts
@@ -68,8 +68,12 @@ test('installer keeps beginner input to two public origins and derives the rest'
assert.match(envExample, /高级覆盖:OAuth/);
assert.doesNotMatch(envExample, /^TELEGRAM_/m);
assert.match(envExample, /Telegram 不在这里配置/);
- assert.match(readme, /新手只需填写(2 项)/);
- assert.match(readme, /不要把这些内容写入 `.env`/);
+ assert.match(readme, /填写 Web 和 API 地址/);
+ assert.match(readme, /设置 → Telegram/);
+ assert.match(readme, /docs\/configuration\.md/);
+ const configurationGuide = fs.readFileSync(new URL('../../../docs/configuration.md', import.meta.url), 'utf8');
+ assert.match(configurationGuide, /新手只需填写(2 项)/);
+ assert.match(configurationGuide, /新部署不需要在 `.env` 中填写 Telegram 变量/);
assert.match(deployGuide, /首次运行只需要填写以下 2 项/);
assert.match(deployGuide, /Telegram 不属于首次部署的 `.env` 配置/);
assert.match(deployGuide, /docker inspect/);
diff --git a/docs/configuration.md b/docs/configuration.md
new file mode 100644
index 0000000..2464fb1
--- /dev/null
+++ b/docs/configuration.md
@@ -0,0 +1,168 @@
+# 配置与使用指南
+
+[返回首页](../README.md) · [部署指南](../deploy/DEPLOY.md)
+
+## 🛠️ 环境变量配置
+
+常用变量如下,完整模板见 [`.env.example`](../.env.example)。
+
+
+新手只需填写(2 项)
+
+- **`VITE_API_URL`** — 前端访问后端的公网地址;示例:`https://api.example.com`
+- **`CORS_ORIGIN`** — 允许跨域的前端来源;示例:`https://cloud.example.com`
+
+两项填写完整 origin(协议、域名及可选端口),不带路径、查询参数或末尾 `/`;生产环境使用 HTTPS。安装器会询问并校验地址,无需预先复制模板。若已复制 `.env.example`,必须将示例地址换成实际域名;按 Enter 会保留已有值。
+
+
+
+
+安装脚本自动生成
+
+- **`DB_PASSWORD`** — 自动生成 64 位十六进制 PostgreSQL 密码
+- **`SESSION_SECRET`** / **`STORAGE_CREDENTIALS_SECRET`** — 新安装时自动生成并保留;升级旧部署时不会覆盖 `/data/secrets` 中已有的持久密钥
+
+版本号不保存在 `.env`。安装时会直接从 `backend/package.json` 读取应用版本,并从当前 Git 提交读取源码修订号,只把它们临时传给 Docker 构建。
+
+
+
+
+高级部署覆盖
+
+- **`OAUTH_CALLBACK_BASE_URL`** — 默认继承 `VITE_API_URL`;仅特殊 API 入口时填写
+- **`OAUTH_FRONTEND_ORIGIN`** — 默认继承 `CORS_ORIGIN` 的第一个地址;仅多前端入口时填写
+
+
+
+
+Telegram 运行配置
+
+Telegram 凭证、允许用户、账号登录、来源白名单和下载并发均属于运行配置,统一在 Web **设置 → Telegram** 中管理。新部署不需要在 `.env` 中填写 Telegram 变量,也不需要手动生成 session 文件。
+
+旧版本 `.env` 变量仍会被兼容读取,但只用于升级和迁移;不要在新部署中同时维护两套配置。Web 中的设置优先于环境变量。
+
+
+
+
+常用可选项
+
+- **`PORT`** `51947` — 后端监听端口
+- **`UPLOAD_DIR`** `/data/uploads` · **`THUMBNAIL_DIR`** `/data/thumbnails` · **`CHUNK_DIR`** `/data/chunks`
+- **`DUPLICATE_FILE_MODE`** `copy` — `copy` 生成副本;`skip` 跳过同名、同目录且同大小的文件
+- **`AUTO_CLEANUP_ORPHANS`** `true` — 自动清理未登记到数据库的本地孤儿文件
+
+
+
+
+限流与安全项
+
+- **普通消息限流** — `TELEGRAM_RATE_WINDOW_MS=60000`,`TELEGRAM_RATE_MAX=30`
+- **重型命令限流** — `TELEGRAM_HEAVY_RATE_WINDOW_MS=600000`,`TELEGRAM_HEAVY_RATE_MAX=5`
+- **`TRUST_PROXY`** `loopback` · **`COOKIE_SECURE`** `true` · **`JSON_BODY_LIMIT`** `2mb`
+- **分片限制** — `MAX_UPLOAD_CHUNK_MB=32`,`MAX_CHUNK_UPLOAD_GB=20`,`CHUNK_GLOBAL_BUDGET_GB=40`
+- **磁盘与数量保护** — `CHUNK_DISK_RESERVE_GB=8`,`MAX_TOTAL_CHUNKS=50000`
+- **`ORPHAN_CLEANUP_MIN_AGE_MS`** `600000` — 10 分钟内不清理本地孤儿文件
+
+
+
+## 🤖 Telegram 配置与能力
+
+### Bot 与账号级下载器的区别
+
+**只启用 Bot 即可使用:**
+
+- ✅ 私聊发送文件给 Bot 转存
+- ✅ 任务管理、存储统计和删除文件
+
+**额外启用账号级下载器后增加:**
+
+- ✅ 频道/群组按日期或标签批量抓取
+- ✅ 频道订阅自动同步
+- ✅ 下载受 Bot 限制影响的大文件(仍受 Telegram 账号权限和限流约束)
+
+### 获取 Bot Token
+
+1. 在 Telegram 中搜索 [@BotFather](https://t.me/BotFather) 并开始对话。
+2. 发送 `/newbot`,按提示创建机器人。
+3. 复制 BotFather 返回的 `HTTP API TOKEN`。
+4. 在 TG Vault Web 的“设置 → Telegram”中填写 Token。
+
+### 获取 API ID 和 API Hash
+
+1. 访问 [my.telegram.org](https://my.telegram.org) 并登录 Telegram 账号。
+2. 进入 `API development tools`。
+3. 创建应用后复制 `api_id` 和 `api_hash`。
+4. 在 **设置 → Telegram → Telegram Bot 连接** 中与 Bot Token 一起填写,先测试连接,再保存并启用。
+5. 需要账号级下载器时,在同页使用手机号、验证码和可选两步验证密码登录;无需手工生成或编辑 session 文件。
+
+### Telegram Bot 允许用户
+
+TG Vault 会限制能通过 Bot PIN 登录的 Telegram 用户。推荐进入 **设置 → Telegram → Telegram Bot 用户权限**,填写一个或多个数字 user id;多个 ID 用英文逗号分隔。
+
+获取 user id:让用户在 Telegram 私聊 `@userinfobot` 查看 `Id`。如果允许列表留空,并且后台还没有任何 Telegram 用户认证成功,第一个正确输入 Bot PIN 的用户可自动加入允许列表。之后应在 Web 中明确维护列表。
+
+### 账号级下载器什么时候需要?
+
+账号级下载器使用登录的 Telegram 用户账号读取媒体,适用于:
+
+- 频道/群组转存:用户账号需要加入对应频道/群组,并确保能看到历史媒体。
+- 按日期/标签批量抓取:`/tg_download date`、`/tg_download tag` 依赖用户账号访问来源消息。
+- 频道订阅同步:`/tg_sub` 后台扫描依赖用户账号读取频道/群组新消息。
+- 大文件下载:Bot 无法直接下载的文件,可尝试通过有访问权限的用户账号下载。
+
+仅登录或明确启用账号时才应连接个人账号;更改界面语言或查看设置不应激活账号。只转存有权访问和保存的内容,遵守 Telegram 限流;遇到冷却或账号限制时,不要反复重试或提高并发。
+
+### Telegram 下载设置
+
+下载并发在 Web **设置 → 维护 → 高级任务设置** 中调整。先查看适用范围和风险提示,保留默认值,确有需要时再修改;不要通过提高并发绕过账号冷却。
+
+## 🔐 安全与访问控制
+
+TG Vault 默认采用“首次初始化”模式保护 Web 和 API:
+
+1. 服务启动后,首次访问 Web 页面需创建至少 8 位的管理员密码,使用 `scrypt` 加盐哈希保存到数据库。请在开放给其他用户前完成初始化。
+2. 如果此时已经通过环境变量配置 Telegram Bot,初始化页还会要求创建 Bot 4 位 PIN;新安装也可以先完成网页初始化,再到 **设置 → Telegram** 配置 Bot 和 PIN。
+3. 登录成功后,浏览器会获得 HttpOnly Cookie 会话,前端不再把访问 token 写入 `localStorage`。
+4. 修改类请求会校验 `Origin`,请确保 `.env` 中的 `CORS_ORIGIN` 与前端公网地址一致。
+
+> [!IMPORTANT]
+> 生产环境请使用 HTTPS。默认 `COOKIE_SECURE=true` 时,浏览器只会在 HTTPS 下发送登录 Cookie;如果你只在本地 HTTP 调试,可临时设置 `COOKIE_SECURE=false`。
+> `deploy/install.sh` 生成的正式部署会额外写入 `COOKIE_SECURE_FORCE=true`,防止遗留环境值意外关闭 HTTPS Cookie;本地 HTTP 调试请不要沿用该强制值,或同时设为 `false`。
+
+### 自动密钥说明
+
+安装器为新部署生成 `.env` 密钥;未显式配置的内部密钥由应用保存到数据卷的 `/data/secrets/`。迁移时同时备份 `.env`、数据库和完整数据卷。丢失密钥可能导致登录会话失效,TOTP 和第三方存储凭证无法解密。
+
+完整的宿主机 Nginx 部署、健康检查、协调备份与隔离恢复校验流程见 [`deploy/DEPLOY.md`](../deploy/DEPLOY.md)。仓库提供 `deploy/backup.sh` 和只读归档检查脚本 `deploy/restore-verify.sh`;备份包含密钥材料,必须加密并异地保存。
+
+### 双重验证 (TOTP)
+
+TG Vault 内置支持 TOTP 双重验证(如 Google Authenticator):
+
+- Web 端:在个人设置中扫码激活
+- Telegram Bot:发送 `/setup_2fa` 获取设置二维码,并在对话框输入验证码激活
+- 启用后,网页登录和使用 Bot 均需二次验证
+
+---
+
+## 🌐 反向代理建议
+
+如果你使用 Nginx、Nginx Proxy Manager 或 Caddy 部署,请参考以下映射:
+
+- **前端 / 网页入口**
+ - 示例域名:`https://cloud.example.com`
+ - 转发地址:`127.0.0.1:47832`
+- **后端 / API 接口**
+ - 示例域名:`https://api.example.com`
+ - 转发地址:`127.0.0.1:51947`
+
+如果前后端使用不同域名,请在后端环境变量中设置:
+
+```env
+VITE_API_URL=https://api.example.com
+CORS_ORIGIN=https://cloud.example.com
+COOKIE_SECURE=true
+```
+
+> [!CAUTION]
+> 开启 HTTPS 后,`.env` 中的 `VITE_API_URL` 和 `CORS_ORIGIN` 都应使用 `https://`,否则浏览器可能拦截请求。修改 `VITE_API_URL` 后必须重新构建前端镜像,因为它会被打包进静态文件。