如何在单个网页桌面中统一所有云存储
我的工作电脑上同时打开了四个存储标签页。第一个是工作用的 Google Drive,第二个是个人 Dropbox,第三个是带有备份的 AWS S3 控制台,第四个是家里服务器上的 MinIO。把文件从公司云盘传到 S3 存储桶通常会变成一场闹剧:先下载一个 GB 到笔记本,再打开另一个标签页上传回去,还得记得清理下载文件夹。
最近我偶然发现了一个新鲜的开源项目叫 Drivebase。开发者们用一种相当独特的方式解决了这个日常痛点。他们做了一个自托管的 Web 应用,在浏览器里看起来就像一个完整的窗口化操作系统,可以连接不同的存储提供商,还能在它们之间移动文件。
窗口化界面,告别无尽的标签页
最引人注目的特点是界面。创作者没有做典型的单页仪表盘,而是构建了一个带有任务栏和窗口的桌面。
你可以并排打开两个文件窗口:左边是 Google Drive,右边是 Cloudflare R2 或 Backblaze 上的 S3 存储桶。文件可以用鼠标拖拽,也可以通过批量操作复制。窗口可以最小化、调整大小、相互重叠。感觉就像坐在原生文件管理器里,比如 Finder 或 Total Commander,只不过是在浏览器标签页里。
目前项目支持多种数据源:
- Google Drive
- AWS S3 及任何 S3 兼容存储(MinIO、Wasabi、Cloudflare R2、Backblaze B2)
- 服务器本地文件系统
- Dropbox 和 OneDrive
作者计划添加 Box、Azure Blob Storage 和常规 SFTP。
底层引擎能做什么
界面看起来不错,但底层的技术实现更有意思。不同 API 之间的文件传输通常充满陷阱。
直接上传到 S3,不占用服务器资源
如果你要上传一个 10GB 的视频文件到 S3 存储桶,让流量经过 Drivebase 服务器毫无意义。后端生成一个预签名分段 URL,浏览器直接将分片发送到 AWS 或 MinIO 存储。服务器不会在内存和网络带宽上卡脖子。
可恢复的上传
大文件上传会被分成多个分片。如果浏览器意外关闭或 Wi-Fi 抖动中断,进程会从断点继续。
复制前的冲突分析
批量传输文件夹时,系统会进行预检查。如果目标文件夹中已存在同名文件,Drivebase 会显示警告并提供选项:覆盖、跳过、重命名或手动解决冲突。
实时更新,无需轮询
你不需要通过持续的 AJAX 请求来监控后台任务状态。架构使用 Server-Sent Events(SSE)结合 GraphQL。文件传输进度会在客户端即时显示,事件从队列到达时立即更新。
技术栈一览
这里的技术栈很现代,没有历史包袱。
后端运行在 Bun 运行时上。开发者没有使用传统的 REST,而是基于 GraphQL Yoga 和 graphql-sse 包构建了类型化的 GraphQL API。数据库是 PostgreSQL 配合 Drizzle ORM,后台任务通过 BullMQ 和 Redis 运行,Better Auth 处理会话。
前端基于全新的 React 19、Vite、TanStack Router 和 Tailwind CSS 4 构建。
提供商架构围绕 IStorageProvider 接口构建。如果你有自己的企业存储或特定的 WebDAV,只需实现一个包含基本读写和流媒体方法的接口即可添加支持。
如何自行部署
最快体验 Drivebase 的方式是运行官方安装脚本,它会准备配置文件并启动 Docker Compose:
curl -fsSL https://drivebase.io/install | bash
cd drivebase
docker compose up -d
启动后,Web 界面可在 http://localhost:4000 访问。
如果你想用 Bun 进行开发或本地修改:
git clone https://github.com/drivebase/drivebase.git
cd drivebase
bun install
复制示例配置:
cp packages/config/config.example.toml config.toml
在 config.toml 文件中需要指定 PostgreSQL 和 Redis 连接参数,以及生成加密主密钥和授权密钥:
[server]
env = "prod"
port = 4000
host = "0.0.0.0"
[db]
url = "postgres://user:password@localhost:5432/drivebase"
[redis]
url = "redis://localhost:6379/0"
[crypto]
# Генерация ключа: openssl rand -base64 32
masterKeyBase64 = "ваш-ключ-32-байта"
[auth]
# Генерация секрета: openssl rand -hex 32
betterAuthSecret = "ваш-рандомный-секрет"
baseUrl = "http://localhost:4000"
trustedOrigins = ["http://localhost:3000"]
应用迁移并启动开发服务器:
bun run db:migrate
bun run dev
后端将在 4000 端口启动,Web 客户端在 3000 端口。
适用人群
Drivebase 在两个主要场景下很有用:
- 家庭服务器或 homelab。当你运行着 NAS、外接硬盘上的几 TB 数据和免费云配额时,Drivebase 给你一个统一的入口点,无需安装十几个同步工具。
- 小团队和自由职业者。把源代码放在 S3、客户资料放在 Google Drive,通过浏览器在它们之间传输工作成果非常方便。
该项目目前在 GitHub 上约有 400 颗星,仓库还很新,所以在边缘情况下可能会遇到一些粗糙的地方。然而,在 Bun 和 React 19 上将异构 API 统一在单一桌面界面下的想法很有前景。代码以 MIT 许可证开源,所以你可以随时 fork 并编写自己的存储适配器。
相关项目