用 ChatGPT Sites 搭一个带登录的私有文件 Host
上一篇写了 ChatGPT Sites 怎么快速发一个网站(链接)。
这篇讲一个更偏工程向的玩法:用 Sites 搭一个带登录的私有文件 Host——可以上传、下载、浏览文件,也能用脚本把本地目录同步到站点。重点不是空间有多大,而是 Sites 把 Workers + 对象存储 + 鉴权 串成可部署的文件服务时,链路怎么走。
先看成品长什么样
第一张是登录页——访问者看到的是 "Continue with ChatGPT",没有 ChatGPT 账号就进不来。
进去之后是主界面——叫 Codexorage,一个私有文件 Host:支持上传文件、上传文件夹、文件预览、搜索,侧边栏预留了新建文件夹和回收站入口。界面里会显示已用存储量,这只是站点自己的用量统计,不是在宣传“无限网盘”。
左侧边栏还有一个 Codex MCP,这个后面说。它可以把这个文件 Host 暴露成一个 MCP 服务,让 Codex 这类本地 Agent 读取文件清单、搜索文件、拿文件链接。
背后是什么技术
用一句话解释:ChatGPT Sites 底层是 Cloudflare 的基础设施。
具体是三件东西:
- Workers:运行你的网站逻辑,相当于一个随时在线的小服务器
- R2:对象存储,就是你上传的文件实际住的地方;Sites 项目通过绑定把读写接到 R2 上(具体限额以 Cloudflare / Sites 当前产品说明为准)
- D1:SQLite 数据库,可以存文件名、目录结构、元数据
这三个东西以前要自己配、自己写代码接在一起。现在 ChatGPT 可以帮你生成代码、绑定存储、一键部署、给你一个真实链接。
我这次做的 Codexorage Demo 里,网页上传走的是 Sites 绑定的 R2 对象存储。也就是说,文件不是存在浏览器本地,也不是存在 「public/」 静态目录里,而是通过网站自己的 「/api/upload」 接口写入 Sites 给这个项目分配的 R2 桶。
对应的项目配置长这样:
这里的 「"r2": "FILES"」 就是关键。它告诉 Sites:给这个网站挂一个叫 「FILES」 的对象存储绑定。代码里上传文件时,实际调用的是这个绑定。
如果你还要做复杂文件夹、重命名、回收站、权限、上传历史,最好再加 D1 保存元数据。我这个版本为了尽量简单,先没有用 D1,而是直接从 R2 列对象,再和静态文件清单合并展示。
Sign in with ChatGPT 是 Sites 内置的鉴权方案。访问者用自己的 ChatGPT 账号登录,你的网站收到的是它们的邮箱地址,不需要自己维护用户系统。
怎么搭:提示词(可直接复制)
在 ChatGPT 桌面版打开 Sites,或者在对话框里输入 「@Sites」 触发,然后粘贴下面这段提示词,按你的需求替换括号里的内容:
关键词解释几个:
- R2:让 ChatGPT 把文件存进 Cloudflare 的对象存储,而不是临时内存
- D1:让文件列表、文件夹结构能持久保存,刷新页面不消失
- 先保存版本再部署:Sites 的机制是每次发布直接上线,这句话可以防止你在没检查完之前就公开
我这次实际生成 Codexorage 时,是分几轮提示词做的,不是一次到位。这样成功率更高。
第一轮,先要一个最小可用版本:
ChatGPT 生成了一个带 Sign in with ChatGPT 的文件浏览网站。这个阶段的文件来自 「public/」 目录:比如 「public/a.txt」 上线后就是 「/a.txt」。
第二轮,加本地同步脚本:
这里要注意,它不是真的把本地硬盘“挂载”到线上网站。最后生成的是一个同步脚本:
$ npm run sync:files -- ~/Documents/share
它做的事情是:
本地文件夹 → 复制进项目 public/files/ → 重新 build → 重新发布 Sites
所以这是“发布式同步”,不是实时网盘同步。
第三轮,改 UI,变成 Codexorage:
第四轮,加 MCP 接入并修正上传:
实现 MCP 接入的功能。
这一轮 ChatGPT 同时做了几件事:新增 「/api/upload」 把文件真正写入 Sites 的 R2 绑定,新增 「/api/files/[...path]」 从 R2 读出文件,同时暴露 「/api/mcp」 端点让外部 Agent 读取文件清单。经过几轮迭代,最终版本是白色主题、小字号、小缩略图,右侧预览默认关闭,点击文件才展开。
本地同步:到底用的哪种方式
这里要讲清楚,因为很容易混。
本地同步大概有三种路线:
- 方案 A:rclone 直连 R2 桶
把 R2 当成远程盘,本地一条 「rclone sync」 同步过去。这个最像传统网盘同步。
- 方案 B:Wrangler CLI 直传 R2
用 Cloudflare 官方工具,比如 「wrangler r2 object put」,把本地文件传到桶里。
- 方案 C:ChatGPT Sites 项目发布式同步
把本地文件复制到 Sites 项目的 「public/」 目录,然后重新构建、重新发布。
我这个 Codexorage Demo 当前用的是:
也就是说:
- 没有用 rclone
- 没有用 Wrangler CLI 直传 R2
- 本地同步脚本不是双向同步,也不是实时挂载
- 网页上传的文件才是直接进入 Sites 自带 R2 存储
本地同步脚本长这样:
$ npm run sync:files -- ~/Documents/share
默认会把本地目录复制到:
public/files/
然后重新发布后,文件会变成:
/files/你的文件名
如果要做真正的“本地文件夹 ↔ R2 桶”双向同步,后续更适合用 rclone,也就是方案 A。但这已经不是 ChatGPT Sites 项目本身自动提供的能力了,需要你自己拿到对应 R2 的访问凭证,再配置 rclone。
Codex MCP:现在能做什么
MCP(Model Context Protocol)是让 AI 工具连接外部系统的协议。
我在 Codexorage 里加了一个端点:
/api/mcp
它现在支持三类读取操作:
所以你可以让 Codex 通过 MCP 读取这个文件 Host 的清单,知道里面有什么。
但是,有一个很重要的现实状态:
当前 Demo 里的 MCP token 只是 UI 展示,还没有做真正的后端 token 校验。
现在真正保护 「/api/mcp」 的,是 Sign in with ChatGPT 登录态。也就是你登录后能访问,没登录访问不了。
如果你想让 Codex 在本地用一个长期 token 调用 MCP,那还需要继续做一层真实鉴权:
如果还要让 MCP 写入文件,也就是让 Codex 直接上传到 R2,可以再加:
这样才算完整的“Codex 通过 MCP 读写 Codexorage”。
做不了什么,以及使用边界
这个方案有几处实际限制,提前知道:
1. 不支持实时共享编辑 文件可以分享链接让别人下载,但多人同时编辑同一个文档做不到,因为没有冲突解决机制。
2. Beta 与速率限制 Sites 仍在公测/产品演进阶段,Sites 数量、部署频次、接口调用都可能被平台限流。频繁“发布式同步”比偶尔网页上传更容易撞到速率墙。
3. 它不是专业网盘产品 适合个人资料、项目素材、Demo 资源的私有托管;不适合当成对外公开下载站,更不要用来分发侵权内容。权限模型、审计、合规备份都还是 Demo 级别。
4. 遵守平台条款 ChatGPT Sites 和底层 Cloudflare 资源都有使用条款与配额。按官方文档理解用途即可,不要把“能上传文件”理解成“可以随便当无限云盘用”。配额、封禁策略以平台最新说明为准。
一句话总结
用几段提示词,可以把 ChatGPT Sites 做成一个带登录的私有文件 Host:Workers 跑逻辑,R2 存文件,ChatGPT 登录做鉴权,再加本地同步脚本和 MCP 读取入口。半年前这套链路通常要自己租服务器、配域名、写后端;现在可以先快速验证想法,再决定要不要迁到更正式的基础设施。
土豆哥 | 一人公司手册系列
- 001 — 20 分钟注册域名
- 002 — GitHub Pages 建站
- 003 — 人在国内开美国银行卡
- 004 — 终身免费 Oracle VPS:4 核 24G,从申请到跑起来
- 005 — 全球免费的前后端部署平台
- 006 — 给 AI 装上腿,人在地铁 AI 在家跑
- 007 — 从 0 到 EIN,人在国内也能注册一家美国公司
- 008(上)— 独立站 GEO 实战:流量逻辑变了
- 008(中) — 独立站 GEO 实战:用 Reddit 做 SEO 和 GEO
- 008(下) — 独立站 GEO 实战:从 JSON-LD 到内容矩阵,10 步配置清单
- 009 — 有公司有账户,怎么用 Stripe 收第一笔钱
- 010 — Stripe 以外还有 Paddle,独立站收款怎么选
mousepotato(土豆哥)| 美国计算机全奖博士 | 硅谷 11 年技术管理 | AI · OPC · 产品 | X @iluciddreaming
关注我,获取 AI 前沿、技术、管理、产品、英语和硅谷生活见闻。
土豆哥 AI 交流群:OPC 一人公司 · AI 赋能 · 出海讨论 · 海外生活聊天吹水。加微信 tudou_peak 参与交流。 土豆哥 AI Notes 电报群:https://t.me/tudouge_ai_notes (免费)