- 后端
- 对象存储
【免费下载链接】cloudreve
🌩 Self-hosted file management and sharing system, supports multiple storage providers
Cloudreve 是一个开源的、自托管的"公有云文件系统",官方定位是支持多家云存储驱动的文件管理与分享平台。它以 Go 编写后端、React 编写前端,并以 All-in-One 方式打包,开箱即用。本文以仓库根目录的 README_zh-CN.md 为骨架,结合仓库源码逐项印证其核心特性、部署方式、构建流程与代码架构,帮助你既能在生产环境中快速落地,也能从源码层面理解它的工作方式。
一、项目定位:从 README 看 Cloudreve 是什么
README_zh-CN.md 用一句话概括了项目本质:支持多家云存储驱动的公有云文件系统。英文版 README 则将其描述为 "Self-hosted file management system with multi-cloud support",而仓库中 cmd/root.go 的命令行长帮助文本进一步明确为 "Self-hosted file management and sharing system, supports multiple storage providers"。
从仓库的模块声明(go.mod 首行module github.com/cloudreve/Cloudreve/v4)可以看出,当前仓库对应 Cloudreve 的 v4 主线,后端基于 Go 1.26 开发。它的整体形态是:一个可独立部署的 Web 服务(默认监听 5212 端口,见 Dockerfile 的EXPOSE 5212 443 6888 6888/udp),既可作为单机"网盘"使用,也可扩展成由多个从机节点组成的下载/存储集群。
二、核心特性与源码级印证
README 列出的一系列特性并非宣传语,而是可以在仓库中一一找到对应实现的真实能力。下面逐项对照。
2.1 多存储驱动:本机、从机与各大云厂商
README 明确列出支持的存储端:本机、从机、七牛 Kodo、阿里云 OSS、腾讯云 COS、华为云 OBS、金山云 KS3、又拍云、OneDrive(包括世纪互联版)以及 S3 兼容协议。
这一清单与源码目录完全对应:在 pkg/filemanager/driver 下,可以看到每个存储后端的独立驱动包——local(本机存储)、remote(从机节点)、qiniu(七牛 Kodo)、oss(阿里云 OSS)、cos(腾讯云 COS)、obs(华为云 OBS)、ks3(金山云 KS3)、upyun(又拍云)、onedrive(含 OAuth 认证)以及s3(S3 兼容协议)。存储策略(Policy)在数据模型层也有完整定义(ent/schema 下的policy.go、storagepolicy.go,以及 inventory/policy.go)。
值得说明的是"从机"这一特殊存储端:Cloudreve 支持主从(Master/Slave)架构,从机节点既承担存储职责,也可分担离线下载等任务。路由层 routers/router.go 的InitRouter会根据配置中的系统模式(conf.MasterMode与conf.SlaveMode)分别初始化主节点路由与从节点路由,日志中会打印 "Current running mode: Master." 或 "Current running mode: Slave."。
2.2 上传/下载:客户端直传、并行分片与限速
README 提到的上传/下载能力包括:客户端直传、下载限速、拖拽上传、目录上传与并行分片上传。
- 并行分片上传:分片逻辑集中在 pkg/filemanager/chunk,负责大文件的分片切分与断点续传。
- 客户端直传:对于七牛、阿里云 OSS、腾讯云 COS、S3 等支持直传的存储端,客户端可绕过服务端中转直接与存储服务交互,服务端只负责签发凭证与回调校验(service/callback/upload.go 即为上传回调处理)。
- 从机上传接口:在从节点路由中,routers/router.go 的
initSlaveFileRouter注册了三条上传相关接口——上传分片(POST upload/:sessionId)、创建上传会话(PUT upload)、删除上传会话(DELETE upload/:sessionId)。 - 下载限速:从节点下载接口
GET file/content/:nodeId/:src/:speed/:name的 URL 路径中直接携带speed参数,配合 middleware 层实现对下载速率的控制,这与 README 中"下载限速"的表述一致。
2.3 离线下载:Aria2 与 qBittorrent,多节点分担
README 指出可对接Aria2/qBittorrent 离线下载,并支持使用多个从机节点分担下载任务。源码中对应 pkg/downloader/aria2(内含完整实现的 RPC 客户端子包rpc,支持通知、任务进度等)与 pkg/downloader/qbittorrent。官方 Docker 镜像也默认内置了 Aria2:见 Dockerfile 中安装aria2并设置环境变量CR_ENABLE_ARIA2=1,同时暴露 6888 端口(Aria2 RPC 默认端口,TCP 与 UDP)。
2.4 在线压缩/解压缩/预览与批量打包下载
README 提到的归档能力(压缩、解压缩、压缩包预览、多文件打包下载)对应 pkg/filemanager/workflows 下的archive.go(打包下载)与extract.go(解压)。值得注意的细节是,go.mod 中引入了github.com/bodgit/sevenzip依赖,说明解压流程原生支持 7z 格式,而不只限于 zip/tar 等常见格式。
2.5 覆盖全部存储策略的 WebDAV
README 承诺WebDAV 协议支持覆盖全部存储策略。这一点在后端有独立模块支撑:pkg/webdav 实现了完整的 WebDAV 服务端(含内部 XML 序列化与解析),service/setting/webdav.go 提供 WebDAV 账号/挂载配置业务逻辑,routers/controllers/webdav.go 负责将 WebDAV 请求接入路由层。由于 WebDAV 建立在统一的文件系统抽象之上,因此无论底层存储是本机、对象存储还是 OneDrive,都可经由同一套 WebDAV 接口访问。
2.6 媒体元数据提取与标签搜索
README 提到"提取媒体元数据,通过元数据或标签搜索文件"。对应实现分两层:
- 元数据提取:pkg/mediameta 提供 EXIF 提取(
exif.go)、音视频探测(ffprobe.go,基于 FFprobe)、地理位置反查(geocoding.go)与音乐标签解析(music.go);pkg/filemanager/manager/mediameta.go 负责将提取结果写入文件元数据。 - 搜索索引:pkg/searcher 定义了索引器抽象(
indexer.go),并提供基于 Meilisearch 的实现(indexer/meilisearch.go)与内置的文本抽取器(extractor,支持 Tika 与 Noop 两种策略)。
2.7 多用户、用户组与多存储策略
README 声称支持多用户、用户组、多存储策略。数据模型层面,ent/schema 中user.go定义用户、group.go定义用户组,storagepolicy.go与policy.go定义存储策略;业务层面,service/admin/group.go、service/admin/user.go 与 service/admin/policy.go 分别负责用户组、用户与存储策略的后台管理。管理员可以按用户组分配不同的存储配额与策略,实现多租户式的资源隔离。
2.8 分享链接
README 提到可"创建文件、目录的分享链接,可设定自动过期"。对应 service/share 下的manage.go(分享的创建与管理)与visit.go(访客访问分享的流程),数据模型见 ent/schema/share.go。
2.9 在线预览与在线编辑
README 声称支持视频、图像、音频、ePub 在线预览,以及文本、Office 文档在线编辑:
- 预览:查看器逻辑集中在 pkg/filemanager/manager/viewer.go,配合 pkg/thumb 的缩略图管线(内置支持 FFmpeg、vips、libreoffice、libraw 等后端)为图片、视频生成预览。
- Office 在线编辑:通过WOPI协议实现,pkg/wopi 提供 WOPI 服务端实现与协议类型定义,middleware/wopi.go 与 routers/controllers/wopi.go 将其接入中间件与路由。
2.10 前端体验与 All-in-One 打包
README 提到自定义配色、黑暗模式、PWA 应用、全站单页应用(SPA)与国际化。这些能力属于前端工程(React + Redux + Material-UI,见 README 技术栈一节),仓库中的assets目录存放前端静态资源。
All-in-One 打包的实现方式是:前端构建产物以go:embed方式内嵌进 Go 二进制,application/statics/embed.go 与 application/statics/statics.go 负责将静态文件系统注入应用。如果需要把内嵌的静态文件释放到磁盘进行二次定制,可以使用eject命令(见下文命令章节)。官方 Dockerfile 也在单镜像内预装了 ffmpeg、libreoffice、vips-tools、libraw-tools 等处理工具,并通过环境变量默认开启缩略图与媒体元数据能力,体现了"开箱即用"的设计。
三、部署实践:从快速开始到生产集群
3.1 快速开始:单二进制直接运行
Cloudreve 以单一可执行文件分发,部署门槛很低。其命令行体系基于 Cobra 构建,入口在 main.go,所有子命令定义在 cmd 包。
运行前只需准备一个配置文件。相关的命令行参数(定义于 cmd/root.go):
| 参数 | 简写 | 默认值 | 说明 |
|---|---|---|---|
--conf | -c | data/conf.ini | 配置文件路径(util.DataPath基于数据目录解析) |
--use-working-dir | -w | false | 使用当前工作目录作为数据目录,而非可执行文件所在目录 |
启动服务的子命令是server(cmd/server.go)。不过更省事的是:不指定任何子命令直接运行,cmd/root.go 的Execute会把默认命令重定向为server,即./cloudreve与./cloudreve server等价。服务启动时会读取配置文件、初始化数据库并开始监听 5212 端口(该端口在 Dockerfile 与 docker-compose.yml 中均可印证)。
服务进程对中断信号做了优雅关闭处理(监听os.Interrupt、SIGTERM、SIGHUP、SIGQUIT,见 cmd/server.go 的shutdown函数),适合在容器与 systemd 等环境中运行。
3.2 生产部署:Docker Compose 三件套
仓库根目录提供了完整的 docker-compose.yml,展示了一个推荐的生产部署形态:Cloudreve 后端 + PostgreSQL 17 + Redis三个服务。
几个值得注意的工程细节:
- 配置注入方式:Cloudreve 的配置项支持通过环境变量覆盖,命名规则为
CR_CONF_<分组>.<字段>。compose 文件中用CR_CONF_Database.Type=postgres、CR_CONF_Database.Host=postgresql等环境变量将数据库指向容器内的 PostgreSQL,用CR_CONF_Redis.Server=redis:6379指向 Redis 缓存。 - 端口映射:
5212(Web 服务)与6888(TCP/UDP,Aria2 下载端口)对外暴露。 - 数据持久化:后端数据目录
/cloudreve/data通过卷backend_data持久化;PostgreSQL 与 Redis 数据也各自挂载独立卷。三个服务均配置了restart: unless-stopped保证异常退出后自动拉起。 - 镜像内的运行环境:Dockerfile 设置了
CR_ENABLE_ARIA2=1及CR_SETTING_DEFAULT_thumb_ffmpeg_enabled=1、CR_SETTING_DEFAULT_thumb_vips_enabled=1、CR_SETTING_DEFAULT_thumb_libreoffice_enabled=1、CR_SETTING_DEFAULT_media_meta_ffprobe=1、CR_SETTING_DEFAULT_thumb_libraw_enabled=1等环境变量,使缩略图与媒体元数据能力默认开启。
3.3 主从模式:多节点扩容的基础
如需扩容,Cloudreve 采用主从(Master/Slave)架构:主节点负责 API 与前端服务,从节点专注存储与下载任务。路由初始化时(routers/router.go 的InitRouter)会根据配置的System.Mode分流,从节点注册独立的上传、下载与文件接口;节点通信与注册逻辑位于 pkg/cluster 与 middleware/cluster.go,从机任务调度见 service/node。
3.4 从 v3 迁移到 v4:migrate命令
如果已有 Cloudreve v3 实例,v4 提供了专门的迁移命令migrate(cmd/migrate.go),用法为:
./cloudreve migrate -v3-conf /path/to/v3/conf.ini关键行为:
-v3-conf为必填参数,指定 v3 配置文件路径,缺失时程序直接报错退出;- 迁移支持断点续迁:进度状态保存在 v3 配置同目录下的
migration_state.json,若中途失败,重跑同一命令即可从最后成功的步骤继续; --force-reset可强制清空迁移状态、从头开始;- 迁移逻辑本身由 application/migrator 承载,其中按领域拆分了用户、文件、文件夹、分组、存储策略、分享、WebDAV、节点等迁移模块(
user.go、file.go、folders.go、group.go、policy.go、share.go、webdav.go、node.go等),并在migrator.go中编排整体流程。
3.5 文件加密主密钥管理:master-key命令
Cloudreve v4 对上传的文件实体提供加密支持,其加密体系以"主密钥 + 每文件密钥"的分层方式实现(相关实现见 pkg/filemanager/encrypt,其中aes256ctr.go是 AES-256-CTR 加解密,masterkey.go是主密钥保管与加解密工具)。master-key命令(cmd/masterkey.go)提供三个子命令:
master-key generate:生成一个 32 字节(256 位)随机主密钥,以 base64 输出到 stdout;也可用-o <文件>直接写入密钥文件(文件权限 0600),避免密钥出现在终端历史中。master-key get:读取并打印当前生效的主密钥。主密钥的存放位置可配置,从代码路径可见支持设置库、环境变量(CR_ENCRYPT_MASTER_KEY)与密钥文件三种保管方式(MasterEncryptKeyVaultTypeSetting/MasterEncryptKeyVaultTypeEnv/MasterEncryptKeyVaultTypeFile)。master-key rotate-n <新密钥文件>:轮换主密钥。流程为:用旧主密钥逐个解密所有已加密实体的文件密钥 → 用新主密钥重新加密 → 回写数据库。若密钥原本存放在设置库中,命令会自动更新encrypt_master_key设置项;若存放在环境变量或密钥文件中,命令会打印提示,要求手动替换为新密钥。
注意:轮换主密钥属于高危操作,命令的长帮助文本明确警告"请先备份数据库";且新密钥必须为 32 字节的 base64 字符串,否则校验失败。
四、从源码构建
README 提到可以从源码构建 Cloudreve。仓库本身是一个标准的 Go 模块(go.mod),核心依赖包括:
entgo.io/ent v0.13.0:ent 实体框架,仓库中 ent 目录下所有*_create.go、*_query.go、*_update.go等文件均为其代码生成产物;github.com/gin-gonic/gin v1.11.0:Web 框架;- 数据库驱动:SQLite、MySQL、PostgreSQL(go.mod 中可见对应驱动);
- 云厂商 SDK:阿里云 OSS、AWS S3、华为云 OBS 等;
- 媒体与文档处理:exif、heic、tiff 等图像元数据解析库,
bodgit/sevenzip(7z 解压)等。
入口文件 main.go 只做两件事:注册命令行参数(-c、-w等)并调用cmd.Execute()进入 Cobra 命令树。构建产出是一个包含全部静态资源(前端已通过 application/statics/embed.go 内嵌)的单体二进制;Dockerfile 中COPY cloudreve ./cloudreve也印证了镜像内运行的正是一个名为cloudreve的可执行文件。若需要将内嵌静态文件释放出来自行托管或定制,可使用eject命令(cmd/eject.go,功能描述为 "Eject all embedded static files")。
需要说明的适用前提:仓库工具链要求 Go 1.26+(见 go.mod 的go 1.26.0与toolchain go1.26.5),构建时需准备相应的 Go 工具链;完整构建命令与版本兼容细节请以官方文档为准。
五、技术栈与代码架构
README 的"技术栈"一节给出了项目两大阵营:
- 后端:Go + Gin + ent
- 前端:React + Redux + Material-UI
结合仓库目录结构,可以进一步勾勒出后端的分层组织:
| 目录 | 职责 |
|---|---|
| cmd | Cobra 命令树:server、migrate、master-key、eject |
| application | 应用装配层:依赖注入(application/dependency)、常量、v3→v4 迁移器(application/migrator)、静态资源 |
| routers/controllers | HTTP 路由与控制器,处理 Gin 请求的绑定与响应 |
| service | 业务服务层:按领域划分(user、share、explorer、admin、callback、setting 等) |
| middleware | 中间件:鉴权(auth)、验证码(captcha)、集群(cluster)、会话(session)、WOPI 等 |
| pkg | 可复用的领域包:文件管理(filemanager)、下载器(downloader)、WebDAV、媒体元数据、缩略图、搜索、加密、队列(queue)等 |
| ent | ent 框架生成的实体与数据访问代码 |
| inventory | 数据访问层的封装(对 ent 客户端的领域化封装),并带有调试与类型定义子包 |
这种分层使得"存储驱动、文件系统抽象、业务服务、HTTP 层"彼此解耦:存储驱动统一实现 pkg/filemanager/driver/handler.go 定义的处理器接口,上层(WebDAV、分享、在线预览等)只需面向统一抽象编程,这正是"一套 API 覆盖全部存储策略"得以成立的根本原因。
六、贡献与许可证
Cloudreve 欢迎社区参与贡献,仓库根目录提供 CONTRIBUTING.md 说明贡献流程与规范。开源许可证为GPL V3(见 LICENSE),这意味着你可以自由获取、修改与部署它,但基于它的衍生作品同样需要以 GPL 兼容方式开源。
结语
从 README 出发,可以看到 Cloudreve 的特性清单几乎全部能在仓库源码中找到一一对应的实现:十种存储驱动、分片直传与限速、Aria2/qBittorrent 离线下载、全策略 WebDAV、元数据搜索、主从集群,以及开箱即用的容器化部署。对于希望快速搭建私有云盘的个人用户,docker compose up即可起步;对于需要深度定制或大规模部署的团队,v4 的命令行体系(迁移、主密钥轮换、静态文件释放)与清晰的包分层,也提供了足够的扩展空间。
- 后端
- 对象存储
【免费下载链接】cloudreve
🌩 Self-hosted file management and sharing system, supports multiple storage providers
相关推荐
Cloudreve 自托管文件管理系统:多存储驱动、离线下载与 WebDAV 全栈解析
Cloudreve 自托管文件管理系统:多存储驱动、离线下载与 WebDAV 全栈解析 导读 Cloudreve 是一个采用 Go 编写的自托管文件管理与分享系
后端对象存储探索云存储新境界:Cloudreve——自托管文件管理系统
探索云存储新境界:Cloudreve——自托管文件管理系统 在这个数字化时代,管理和分享文件变得越来越重要。Cloudreve是一个强大的自托管文件管理系统,它
后端对象存储Cloudreve:自托管的多云文件管理系统
Cloudreve:自托管的多云文件管理系统 项目介绍 Cloudreve 是一款开源的自托管文件管理系统,支持多种云存储服务。通过 Cloudreve,用户可
后端对象存储
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考