基于 Cloudflare 部署的多厂商 OSS 文件管理系统,支持 WebDAV 协议。
- 📁 文件管理: 文件上传、下载、预览、移动、重命名、删除
- 🪣 多存储支持: 支持 Cloudflare R2、AWS S3、阿里云 OSS、腾讯云 COS、华为云 OBS、Backblaze B2、MinIO 等
- 🔄 大文件上传: 分片上传、断点续传、秒传
- 🔗 文件分享: 支持密码保护、过期时间、下载次数限制
- 📝 文件预览: 图片、视频、音频、PDF、Office 文档、代码高亮
- 🔐 权限管理: 文件/文件夹级别的权限控制
- 🏷️ 标签系统: 为文件添加自定义标签
- 🔍 高级搜索: 按名称、类型、大小、时间等条件搜索
- 📥 离线下载: 支持 URL 离线下载到云存储
- 📡 WebDAV: 完整的 WebDAV 协议支持(优化 Windows 资源管理器兼容性)
- 📱 Telegram 存储: 通过 Telegram Bot API 存储文件,支持自定义代理
- 👥 多用户: 用户管理、存储配额、审计日志
- ⏰ 定时任务: 自动清理回收站、过期分享
| 组件 | 技术 |
|---|---|
| 前端 | React 18 + Vite 5 + Tailwind CSS 3 |
| 后端 | Hono 4 + Cloudflare Workers |
| 数据库 | Cloudflare D1 (SQLite) + Drizzle ORM |
| 存储 | S3 兼容协议 (R2/S3/OSS/COS/OBS/B2/MinIO) + Telegram Bot API |
| 认证 | JWT + bcrypt |
- Node.js >= 20.0.0
- pnpm >= 8.0.0
- Cloudflare 账户
# 克隆项目
git clone https://github.com/your-repo/ossshelf.git
cd ossshelf
# 安装依赖
pnpm install
# 配置环境变量
cp apps/api/wrangler.toml.example apps/api/wrangler.toml
# 编辑 wrangler.toml,填入 D1 数据库 ID 和 KV 命名空间 ID
# 创建数据库
wrangler d1 create ossshelf-db
wrangler kv:namespace create KV
# 运行迁移
pnpm db:migrate:local
# 启动开发服务器
pnpm dev:api # API 服务
pnpm dev:web # 前端服务ossshelf/
├── apps/
│ ├── api/ # 后端 API (Hono + Cloudflare Workers)
│ └── web/ # 前端应用 (React + Vite)
├── packages/
│ └── shared/ # 共享代码 (常量、类型)
└── docs/ # 文档
├── api.md # API 文档
├── architecture.md # 架构文档
└── deployment.md # 部署文档
- 拖拽上传、文件夹上传
- 大文件分片上传(>= 100MB 自动启用)
- 文件预览(图片、视频、音频、PDF、Office、代码)
- 文件夹上传类型限制
- 回收站(30天保留期)
- 支持多个存储桶同时配置
- 每个存储桶可独立设置配额
- 支持的存储提供商:
- Cloudflare R2
- AWS S3
- 阿里云 OSS
- 腾讯云 COS
- 华为云 OBS
- Backblaze B2
- MinIO
- 自定义 S3 兼容存储
- Telegram (通过 Bot API)
- 公开/私密分享
- 密码保护
- 过期时间设置
- 下载次数限制
- 三级权限:只读、读写、管理
- 文件/文件夹级别授权
- 权限继承
完整支持 WebDAV 协议,可使用任何 WebDAV 客户端连接,特别优化了 Windows 资源管理器兼容性:
| 配置项 | 值 |
|---|---|
| 服务器地址 | https://your-domain.com/dav |
| 用户名 | 注册邮箱 |
| 密码 | 账户密码 |
| 认证方式 | Basic Auth |
Windows 资源管理器优化:
- 修复 401 响应必须携带 DAV 头的问题
- 确保 PROPFIND 响应路径与请求路径精确匹配
- 实现 LOCK/UNLOCK 操作,解决 Windows 写操作卡死问题
支持的操作:PROPFIND、GET、HEAD、PUT、MKCOL、DELETE、MOVE、COPY、LOCK、UNLOCK、PROPPATCH
通过 Telegram Bot API 存储文件,利用 Telegram 的免费存储资源:
配置方法:
- 创建一个 Telegram Bot(通过 @BotFather)
- 获取 Bot Token
- 创建一个频道或群组,将 Bot 添加为管理员
- 获取 Chat ID(频道/群组/私聊的 ID)
- 在存储桶管理中选择 Telegram 提供商并填入配置
特点:
- 支持自定义 Bot API 代理地址
- 自动根据文件类型选择合适的上传方式
- 支持文件预览和下载
- 静默发送,不打扰聊天
限制:
- 单文件最大 50MB(Bot API 限制)
- 无法真正删除文件,只能删除消息引用
- 需要稳定的网络连接到 Telegram API
- 用户管理(查看、编辑、删除)
- 注册开关控制
- 邀请码系统
- 系统统计
- 审计日志
详细的 API 文档请参阅 docs/api.md。
| 路由前缀 | 说明 |
|---|---|
| /api/auth | 用户认证 |
| /api/files | 文件管理 |
| /api/buckets | 存储桶管理 |
| /api/share | 文件分享 |
| /api/presign | 预签名 URL |
| /api/tasks | 上传任务 |
| /api/downloads | 离线下载 |
| /api/batch | 批量操作 |
| /api/search | 文件搜索 |
| /api/permissions | 权限管理 |
| /api/preview | 文件预览 |
| /api/admin | 管理员接口 |
| /dav | WebDAV |
详细的部署文档请参阅 docs/deployment.md。
# 创建生产资源
wrangler d1 create ossshelf-db
wrangler kv:namespace create KV --preview false
# 配置 wrangler.toml
# 运行迁移
pnpm db:migrate
# 部署 API
pnpm deploy:api
# 构建并部署前端
pnpm build:web
wrangler pages deploy apps/web/dist --project-name=ossshelf-web| 限制项 | 值 |
|---|---|
| 单文件最大大小 | 5 GB |
| 默认存储配额 | 10 GB |
| 分片上传阈值 | 100 MB |
| 分片大小 | 10 MB |
| 最大并发分片 | 3 |
| JWT 有效期 | 7 天 |
| WebDAV 会话有效期 | 30 天 |
| 回收站保留期 | 30 天 |
| 登录失败锁定次数 | 5 次 |
| 登录锁定时长 | 15 分钟 |
# 开发
pnpm dev:web # 启动前端开发服务器
pnpm dev:api # 启动 API 开发服务器
# 构建
pnpm build:web # 构建前端
pnpm build:api # 构建 API
# 部署
pnpm deploy:api # 部署 API 到 Cloudflare Workers
# 数据库
pnpm db:generate # 生成数据库迁移
pnpm db:migrate # 运行数据库迁移
pnpm db:studio # 打开 Drizzle Studio
# 代码质量
pnpm lint # 运行 ESLint
pnpm lint:fix # 自动修复 ESLint 问题
pnpm format # 格式化代码
pnpm typecheck # 类型检查MIT