使用文档

本文档介绍 HTML 托管系统的完整使用方法。原生客户端命名:iOS「文链(手机端)」macOS「DocLinks」。生产示例:https://docs.cn.page

客户端命名

Web 版 /files 页面品牌为「文链 · DocLinks」;以下为 App Store 与系统显示名称,二者不可混用:

平台App Store / 显示名称版本Bundle ID用户文档
iOS 17+文链(手机端)1.0.2com.chengyusheng.docsshare.uploadios-app-guide.html
macOS 14+DocLinks1.0.1(已上架)com.chengyusheng.doclinks-macmac-app-guide.html
iOS 勿单独使用「文链」作为 App 名称(与 Mac 端命名策略冲突);Mac 勿在名称中加入 “Mac” 字样。

系统概述

模块入口用途
HTML 托管/(项目目录)、/htmls(管理)托管 HTML/JS/CSS 站点,多文件项目、访问密码、路径重定向
文链(Web)/files上传视频/压缩包等,生成带备注、有效期、密码的分享链接
文链(手机端)iOS App/files API 对齐,全屏三标签;App Store 名 文链(手机端)
DocLinksmacOS App菜单栏客户端;App Store 名 DocLinks

快速开始(本地开发)

npm install
npm run db:migrate:local
npm run dev

访问 http://localhost:8787/ 查看在线项目;管理台 /htmls,文链 /files。本地文档:/privacy-policy.html/ios-app-guide.html/mac-app-guide.html/index.html。管理登录使用 .dev.vars 中的 ADMIN_TOKEN

ADMIN_TOKEN=your-dev-token
# 以下可选,启用大文件 R2 直传
R2_ACCOUNT_ID=...
R2_ACCESS_KEY_ID=...
R2_SECRET_ACCESS_KEY=...
登录成功后服务端写入 HttpOnly Cookiehtmls_admin_session),不再使用 localStorage。

部署上线

1. 创建 Cloudflare 资源

wrangler d1 create htmls-lib-db
# 将 database_id 写入 wrangler.toml

wrangler r2 bucket create htmls-lib-bucket

2. 应用数据库迁移

npm run db:migrate:remote
迁移内容
0001files 表
0002projects 表
0003项目访问密码字段
00040005文链分享(share_groups + shared_file_items)
0006app_settings(在线修改 Admin Token)
0007pending_share_uploads、rate_limits(上传会话与安全)
0008(保留编号;若本地曾有实验迁移请重置 D1)
0009多用户表 users、user_sessions、默认配额
0010share_groups.user_id 分享归属
0011用户资料(display_name、phone、email)
0012默认注册配额改为 50 MB
重要:未执行远程迁移时 API 会返回 503。已有环境请确保含 0012

3. 设置 Bootstrap Token

wrangler secret put ADMIN_TOKEN

应急凭证。在线修改 Token 后,D1 中 SHA-256 哈希优先生效。

4. 配置 R2 直传(推荐)

wrangler r2 bucket cors set htmls-lib-bucket --file scripts/r2-cors.json
./scripts/setup-r2-secrets.sh

详见 R2 直传配置

5. 部署

npm run deploy

docs/ 目录通过 wrangler.toml[assets] 随 Worker 发布,包括隐私政策、客户端说明与本文档。公网示例:

路由 /admin 自动重定向至 /htmls

登录与会话

系统支持两种身份:

身份入口权限
管理员Admin TokenHTML 托管 + 文链 + 用户管理
成员用户用户名 / 密码(可自助注册)仅文链分享,受存储配额限制
  1. 打开 /files:可选择「用户登录」「注册」或「管理员」Tab
  2. 打开 /htmls:仅接受 Admin Token(HTML 托管需管理员权限)
  3. 登录成功后服务端写入 HttpOnly Cookie(用户:htmls_user_session;管理员:htmls_admin_session
  4. 后续 API 请求携带 Cookie(credentials: 'include'
  5. 也支持 Authorization: Bearer {token}(iOS 客户端、脚本场景)
  6. 「退出登录」调用 POST /api/auth/logout 清除 Cookie

Cookie 有效期 7 天,SameSite=Lax,HTTPS 下带 Secure

多用户与配额

用户注册

管理员分配配额

管理员登录 /files 后,页面底部「用户管理」表格可查看所有用户的姓名、电话、邮箱、空间用量,并:

配额按用户在线分享文件总大小计算(used_bytes),上传前校验剩余空间;超额返回 413。

成员只能查看和管理自己的分享;管理员可查看全部分享。将用户 role 设为 admin 可授予与 Admin Token 等同的管理权限。

修改个人资料

成员登录 /files 后,在「我的资料」区域可修改姓名、电话、邮箱(用户名不可改),调用 PATCH /api/auth/profile 保存。iOS「文链(手机端)」与 macOS「DocLinks」设置页提供相同能力;成员可在客户端内调用 DELETE /api/auth/account 永久删除账户。

修改 Admin Token

登录后右上角「修改 Token」:

  1. 输入新 Token(≥8 字符)或点击「随机生成」
  2. PATCH /api/auth/token 将 SHA-256 哈希写入 D1
  3. 响应同时更新 HttpOnly Cookie
修改后访客项目/分享密码 Cookie 失效,需重新输入密码。Wrangler secret 仍可作为应急登录(删除 D1 admin_token 记录可回退)。

安全说明

措施说明
HttpOnly Cookie管理 Token 不存 localStorage,降低 XSS 窃取风险
CSP/htmls/files 响应设置 Content-Security-Policy
输出转义管理台列表渲染统一 escapeHtml,防 Stored XSS
Token 哈希D1 仅存 Admin Token 的 SHA-256,不明文
密码加盐新密码格式 v2:salt:hash,兼容旧 SHA-256
速率限制auth/check、login、密码解锁接口按 IP 限流
恒定时间比较Token / Cookie 校验防时序侧信道
切勿将 R2 密钥、Admin Token 写入仓库。私有部署笔记请放本地 部署.txt(已 gitignore)。

上传文件(HTML 托管)

基本上传

  1. 拖拽或选择文件到 /htmls 上传区
  2. 系统生成 8 位随机 Slug(可「随机」或手动修改)
  3. 可选填项目备注,点击「上传」

多文件 / 文件夹

示例:Slug JvF41iat,上传 docs/index.html,入口 /p/JvF41iat 自动跳转 index。

向已有项目追加

项目管理

按项目分组,默认折叠,点击标题栏展开。支持:备注、访问密码、清除密码、复制/预览入口、删除项目。

文件操作

HTML 公开访问

站点根路径 / 展示所有至少有一个在线文件的项目列表,显示项目编号(Slug)与备注;点击条目进入 /p/{slug},若项目设置了访问密码会先弹出验证页。

地址行为
/公开项目目录(编号 + 备注)
/p/{slug}入口,302 到 index.html 规范路径
/p/{slug}/path/file.html直接访问指定文件
HTML 自动注入 <base target="_blank"> 与 viewport。

项目访问密码

  1. 项目组设置密码并保存
  2. 访客见密码页,验证后 Cookie 7 天有效
  3. 密码 v2 加盐哈希存储(旧数据仍兼容)
  4. 解锁接口每 IP 5 分钟最多 10 次尝试

文链(DocLinks)· 概述

大文件上传

模式条件单片并发
R2 直传R2 API 密钥 + CORS64 MB3 路
Worker 代理未配密钥时回退48 MB1 路

上传流程

  1. POST /api/shares/upload/init — 创建 offline 分享组,初始化 multipart,写入 pending 会话
  2. clientPath 匹配本地文件,分片上传(每片最多重试 4 次)
  3. POST /api/shares/upload/complete — 校验 pending 会话后合并
  4. 失败时自动 abort 清理 R2 multipart 与 pending 记录
页脚显示当前模式:「R2 直传」或「Worker 代理」。

分享管理

分享列表默认折叠。每条支持:改备注、有效期、密码(可随机)、在线/下线、复制链接、删除。

分享访客访问

地址说明
/f/{id}分享列表页
/f/{id}/{路径}单文件(含视频流)
POST /f/{id}/unlock密码验证

过期 410,下线 404。

R2 直传配置

  1. R2 控制台创建 API Token(Object Read & Write,限定 htmls-lib-bucket
  2. 运行 ./scripts/setup-r2-secrets.sh 或手动 wrangler secret put 三个 R2 变量
  3. wrangler r2 bucket cors set htmls-lib-bucket --file scripts/r2-cors.json
  4. npm run deploy/files 页脚应显示「已启用 R2 直传」
wrangler.tomlR2_BUCKET_NAME 须与 R2 binding 桶名一致。

原生客户端

除 Web 版 /files 外,提供两个官方原生客户端,与同一套 API 对接。两应用均免费、无内购、无订阅

平台App Store 名称Bundle ID形态说明文档
iOS 17+文链(手机端)com.chengyusheng.docsshare.upload全屏三标签(上传 / 分享 / 设置)ios-app-guide.html
macOS 14+DocLinkscom.chengyusheng.doclinks-mac菜单栏弹出面板(上传 / 已上传 / 设置)mac-app-guide.html

App Store 必填 URL

用途路径
隐私政策(两平台共用)/privacy-policy.html
iOS 支持 URL/ios-app-guide.html
Mac 支持 URL/mac-app-guide.html
文档中心/index.html

API 接口

管理 API 鉴权方式(二选一):

鉴权与用户

方法路径鉴权说明
POST/api/auth/register成员注册,默认 50 MB 配额
POST/api/auth/login登录(用户或 Admin Token),设置 Cookie / 返回 Bearer
POST/api/auth/logout退出,清除 Cookie
GET/api/auth/check检查会话(限流)
GET/api/auth/me当前用户资料与配额
PATCH/api/auth/profile成员修改姓名/电话/邮箱
DELETE/api/auth/account成员自助删除账户及全部分享(不可撤销)
PATCH/api/auth/token管理员在线修改 Admin Token
GET/api/users管理员用户列表(含用量)
POST/api/users管理员创建用户
PATCH/api/users/:id管理员修改配额/状态/资料
DELETE/api/users/:id管理员删除用户

HTML 托管

方法路径说明
GET/api/files文件列表
POST/api/uploadmultipart 上传
PATCH/api/status更新状态 {id, status}
PATCH/api/projects/:slug备注 / 密码
DELETE/api/projects/:slug删除项目
DELETE/api/files/:id删除单文件

文链(DocLinks)

方法路径说明
GET/api/shares分享列表
PATCH/api/shares/:id更新分享
DELETE/api/shares/:id删除分享
GET/api/shares/upload/capabilities直传/代理模式
POST/api/shares/upload/init初始化分片
POST/api/shares/upload/part-urlR2 预签名 URL
PUT/api/shares/upload/chunkWorker 代理单片
POST/api/shares/upload/complete合并完成
POST/api/shares/upload/abort中止并清理

公开访问

方法路径说明
GET/p/*HTML 项目
POST/p/:project/unlock项目密码
GET/f/:id分享页
GET/f/:id/*分享文件
POST/f/:id/unlock分享密码

常见问题

API 返回 503?

运行 npm run db:migrate:remote,确保含 00070012

新用户配额不是 50 MB?

确认已执行迁移 0012;已有用户配额不会自动变更,需管理员在「用户管理」中调整。

隐私政策 URL 404?

确认 wrangler.toml[assets] directory = "./docs" 并已 npm run deploy

登录后 API 仍 401?

确认请求带 credentials: 'include';或检查 Cookie 是否被浏览器拦截(需同域)。

大文件上传慢/失败?

配置 R2 直传 + CORS;未配置时走 Worker 代理易超时。

上传中断后怎么办?

系统会自动 abort 失败会话;重新选择文件上传即可,勿重复点击旧会话。

子目录资源 404?

/p/{slug} 入口访问,不要跳过 302 重定向。

修改 Token 后分享密码失效?

正常,访客 Cookie 签名密钥已变更,需重新输入密码。

本地 SQLITE_BUSY?

关闭多余 wrangler dev 进程后重启。

应用内如何删除账户?

成员登录后进入「设置 → 删除账户」,调用 DELETE /api/auth/account 永久删除账号及全部分享。管理员 Token 登录不支持此操作。详见 iOS / Mac 说明。

App Store 支持 URL 404?

确认 wrangler.toml[assets] directory = "./docs" 并已 npm run deploy。完整文档列表见 文档中心

iOS 上传时屏幕自动锁定?

请保持「文链(手机端)」在前台;App 前台运行时会禁用自动锁屏,切到后台后恢复系统行为。详见 iOS 界面与显示