现代化的 Cloudflare R2 文件管理面板(Nuxt 4)。
- 上传、移动、删除 R2 文件
- 虚拟文件夹树 / 面包屑导航
- 文件预览(含图片)、批量操作
- URL 复制(原始链接 & Markdown)
- GitHub OAuth 登录与会话保护
- 域名白名单与通配符 Origin 校验
- 深浅色主题、响应式 UI、Toast 提示
为什么推荐:将本仓库作为子模块/子目录嵌入主项目,后续只需拉取子仓库更新即可同步最新面板能力,主仓库可保留自身配置与密钥。
- 子模块添加与独立配置:
git submodule add https://github.com/QuentinHsu/oh-cloudflare-r2.git oh-cloudflare-r2"preinstall": "git submodule sync --recursive && git submodule update --init --recursive --remote --force --checkout",
"test": "echo \"Error: no test specified\" && exit 1",
"build": "cd oh-cloudflare-r2 && NITRO_PRESET=cloudflare_module pnpm build",
"deploy": "ROOT=$(pwd); pnpm -C oh-cloudflare-r2 dlx wrangler deploy --config \"$ROOT/wrangler.jsonc\"",
"postinstall": "pnpm -C oh-cloudflare-r2 install"- 子模块内部
.env只用于本地;生产密钥放私有仓库根wrangler.jsonc或 Cloudflare Dashboard。 - 需要更新面板时:在子模块目录执行
git pull(或git subtree pull),即可同步新版本。
- 克隆与安装
- 要求:Node 20+、pnpm 10+(已在
packageManager标注)。
git clone https://github.com/QuentinHsu/oh-cloudflare-r2.git
cd oh-cloudflare-r2
pnpm install- 配置环境变量(仅本地开发用
.env)
cp .env.example .env
# 编辑 .env,填入本地调试用的 GitHub OAuth、SESSION、ORIGIN 白名单- 变量说明:
NUXT_OAUTH_GITHUB_CLIENT_ID/NUXT_OAUTH_GITHUB_CLIENT_SECRETNUXT_SESSION_PASSWORD(至少 32 位,可用openssl rand -base64 32生成)NUXT_ALLOWED_ORIGINS(可选,用逗号分隔,支持*.example.com)
- 本地开发
pnpm dev# 必填
NUXT_OAUTH_GITHUB_CLIENT_ID=your_github_client_id
NUXT_OAUTH_GITHUB_CLIENT_SECRET=your_github_client_secret
NUXT_SESSION_PASSWORD=your_session_password_at_least_32_characters
# 可选
NUXT_ALLOWED_ORIGINS=https://example.com,https://app.example.com,https://*.example.com提示:上述变量在本地开发可放
.env;部署时请改为 Cloudflare Secrets /wrangler.jsoncvars,以免泄露。
# 开发
pnpm dev
# 构建
pnpm build
# 类型检查
pnpm typecheck
# 代码规范(Biome)
pnpm lint
pnpm format
# 部署 Cloudflare(包含 NITRO_PRESET=cloudflare_module)
pnpm run deploy-cloudflare
# 部署 Vercel
pnpm run deploy-vercelapp/
├── components/ # shadcn-vue 及业务组件
├── pages/ # Nuxt 路由页面
├── layouts/ # 布局
└── middleware/ # 前端路由中间件
server/
├── api/ # 文件/认证 API(R2 + OAuth)
└── middleware/ # CORS 等服务端中间件
- 文件:
GET /api/files— 列表GET /api/files/folders— 文件夹路径POST /api/files/upload— 上传POST /api/files/move— 移动DELETE /api/files/[pathname]— 删除
- 认证:
GET /api/auth/session— 获取会话POST /api/auth/logout— 退出登录
-
Nuxt 4.2.2、Vue 3
-
NuxtHub Blob (Cloudflare R2)
-
nuxt-auth-utils(GitHub OAuth)
-
shadcn-vue + Radix Vue + Tailwind CSS 4
-
Lucide Vue Next、vue-sonner
-
CI / 生产的密钥请在 Cloudflare Dashboard 或 CI Secret 管理,
.env仅限本地开发。
MIT License
{ "name": "r2-dashboard", "$schema": "oh-cloudflare-r2/node_modules/wrangler/config-schema.json", "main": "./oh-cloudflare-r2/.output/server/index.mjs", "assets": { "directory": "./oh-cloudflare-r2/.output/public" }, "compatibility_date": "2025-12-11", "observability": { "logs": { "enabled": true, "head_sampling_rate": 1, "invocation_logs": true, "persist": true }, "traces": { "enabled": true, "head_sampling_rate": 1, "persist": true } }, "r2_buckets": [ { "binding": "BLOB", "bucket_name": "your-bucket-name" } ], "vars": { "NUXT_OAUTH_GITHUB_CLIENT_ID": "xxxxx", "NUXT_OAUTH_GITHUB_CLIENT_SECRET": "xxxxx", "NUXT_SESSION_PASSWORD": "xxxxx", "NUXT_ALLOWED_ORIGINS": "xxxxx" } }