# 教程更新日期 2024-12-17
最后更新: 去掉 GitHub 的 config.yml 文件,改为通过 API 在 Worker 里获取账户信息。好处是账户信息只需在一处设置即可。
# 视频教程
[![](https://pic.forvps.gq/20241208173533970.webp)](https://youtu.be/5i-86oBLWP8)
# 前言与项目特点
在当今文件存储需求日益增长的环境下,我成功打造了一个 **高效、灵活的私人文件存储集群**,结合了 R2、GitHub 和 GitLab 多平台的优势,形成了一个高度可靠、分布式的存储系统。这套方案的核心亮点包括:
- **多节点分布式存储**:文件按策略分散存储,规避单点故障风险。
- **自动化备份与同步**:数据在不同节点间高效同步,确保一致性和安全性。
- **智能加速访问**:借助 Cloudflare 全球边缘服务,访问速度得到极大提升,用户体验极为流畅。
- **无限扩展潜力**:得益于分布式架构,理论上可以存储几乎无限量的文件。
这不仅是一个简单的图床解决方案,更是一个适合代码、文档乃至任何数据存储的多功能分布式存储系统。
# 部署条件
- **GitHub 账号**,https://github.com
- **GitLab 账号**,https://gitlab.com
- **Cloudflare 账号**,https://www.cloudflare.com
- **安装 PicGo**,https://molunerfinn.com/PicGo
# 流程和工具介绍
**PicGo 上传文件**:使用 PicGo,并安装 s3 插件,上传文件到 Cloudflare R2 存储桶。
**GitHub action 1**:定时迁移 Cloudflare R2 存储桶上的文件到 GitHub,负载存储文件。
**GitHub action 2**:定时把 GitHub 节点镜像到 GitLab,避免文件全部丢失的风险。
**获取经过 Worker 重写的链接**:通过 Worker 隐藏 GitHub, GitLab 和 R2 私库的 PAT,输出自定义域名 url。
**利用全球 Edge CDN 加速访问**: 通过 Cache Rules 缓存静态文件,减少回源请求,大幅提升访问速度与稳定性。
## GitHub 建 n 个私库作节点,获取一个 PAT
访问 https://github.com/new ,以建 3 个为例子,建 3 个私库,要求有相同的前缀,加数字序号,如 node-1, node-2, node-3 ...
![](https://pic.forvps.gq/202410291708206.webp)
![](https://pic.forvps.gq/202410291713622.webp)
为这 3 个私库创建 PAT,访问 https://github.com/settings/tokens
![](https://pic.forvps.gq/202410291721521.webp)
![](https://pic.forvps.gq/202410291728671.webp)
![](https://pic.forvps.gq/202410291732111.webp)
![](https://pic.forvps.gq/202410291736127.webp)
## GitLab 建 n 个同名私库作节点,获取 n 个 PAT 和 Repo ID
访问 https://gitlab.com/projects/new#blank_project ,建 3 个同名的私库,要求与前面建的私库名字完全一样,数量也一样
![](https://pic.forvps.gq/202410291851447.webp)
![](https://pic.forvps.gq/202410291854521.webp)
![](https://pic.forvps.gq/202410291857530.webp)
![](https://pic.forvps.gq/202410291859689.webp)
![](https://pic.forvps.gq/202410291900196.webp)
![](https://pic.forvps.gq/202410291927745.webp)
## n 个 Cloudflare 账户各自建 R2 存储桶,获取 n 个 API 密钥
![](https://pic.forvps.gq/20241120222120.webp)
![](https://pic.forvps.gq/20241120222533.webp)
![](https://pic.forvps.gq/20241120222648.webp)
![](https://pic.forvps.gq/20241120222908.webp)
![](https://pic.forvps.gq/20241120223221.webp)
![](https://pic.forvps.gq/20241120223531.webp)
## (2024-12-17更新需要处理的)在 Cloudflare 里建一个 API 用于读取 Worker 里的账户信息
https://dash.cloudflare.com/profile/api-tokens
![image](https://github.com/user-attachments/assets/a80e3083-3eac-42db-acfc-c8f08177870d)
![image](https://github.com/user-attachments/assets/9e49b29a-54ae-46f0-aeda-28d95f4a9041)
![image](https://github.com/user-attachments/assets/11dceb4b-ab2e-41a8-b8e4-7317bcf4b50f)
![image](https://github.com/user-attachments/assets/b1e6f1c3-3d8d-4ba3-8d98-35ab4f061b14)
![image](https://github.com/user-attachments/assets/81e66642-cd5c-43d3-bb72-7fecf24e16a3)
![image](https://github.com/user-attachments/assets/3c832e81-bfc6-480d-939c-1d0731a07c17)
## 把所有的 PAT 和 Project ID 记录起来
![](https://pic.forvps.gq/20241120223742.webp)
## PicGo 压缩插件 s3
- 安装好 PicGo 后,继续在软件里安装 s3 插件,(2024-12-13 更新) 版本是 1.4.0-beta.3 +
![](https://pic.forvps.gq/20241214073015380.webp)
![](https://pic.forvps.gq/20241120234440.webp)
![](https://pic.forvps.gq/20241120234507.webp)
![](https://pic.forvps.gq/20241120234615.webp)
- 文件路径 < 自定义上传目录>/{fullName}
- (2024-12-13 更新) 自定义输出 URL 模板 https://< 自定义域名>/{fileName}
![](https://pic.forvps.gq/20241214071620461.webp)
![](https://pic.forvps.gq/20241214071743172.webp)
## GitHub 两个定时任务同步数据
- 2024-12-17更新,不再需要 config.yml 文件,账户信息从 Worker 里通过 API 获取,两个同步策略也已经改到 worker.js 里。
- 2024-12-17更新,使用项目模板创建同步库,替代原方案所有文件都要手动处理路径和内容,简化部署。
[点击使用模板创建同步库。R2 ---> GitHub, GitHub ---> GitLab 都在此](https://github.com/new?template_name=files-hosting-template-2&template_owner=fscarmen2)
![](https://pic.forvps.gq/20241217115623087.webp)
![](https://pic.forvps.gq/20241217124644324.webp)
- 设置 GitHub Actions secrets 变量
根据前面获取的 ACCOUNT_ID, WORKER_NAME, API_TOKEN 设置
![](https://pic.forvps.gq/20241217121357845.webp)
## Cloudflare Worker 配置
- 把项目仓库的 [cloudflare_worker/github_gitlab_r2.js](https://github.com/fscarmen2/pic-hosting-cluster/blob/main/cloudflare_worker/github_gitlab_r2.js) 复制到 worker 处,接在开头处根据前面记录的 R2,GitHub 和 GitLab 账户信息填写。
![](https://pic.forvps.gq/20241213090905488.webp)
- 2024-12-17 更新需要设置两个同步策略的变量
![](https://pic.forvps.gq/20241217122004212.webp)
| 同步变量 | 可选值 | 说明 |
| --------------- | ------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| strategy | [size (默认) \| quantity \| 指定节点] | size: 选择容量最少的仓库来存储文件; quantity: 选择文件最少的仓库来存储文件; 指定节点: 比如 pic1 或者 pic2 |
| delete | [true (默认) \| false] | 已复制到 GitHub 的文件,是否从 R2 删除 |
# 正式使用流程
## 上传文件
通过 PicGo 上传文件到 GitHub,可以使用快捷键(默认 Ctrl + Shift + P)或拖拽文件到 PicGo 界面。
上传成功进度条是蓝色的,如果是红色,请检查设置是否有误。上传成功后自定义域名链接会自动在粘贴板
![](https://pic.forvps.gq/202410292035516.webp)
![](https://pic.forvps.gq/202410292038084.webp)
## 在 GitHub Action 里手动运行定时任务
![](https://pic.forvps.gq/20241120235830.webp)
![](https://pic.forvps.gq/20241120235935.webp)
![](https://pic.forvps.gq/20241120233203.webp)
![](https://pic.forvps.gq/20241120233314.webp)
# 进阶
url 的参数有以下这些
| 参数 query | 说明 |
| ----------------------------------------- | ---------------------- |
| https://<自定义域名>/<自定义检测密码> | 检测各节点状态 |
| https://<自定义域名>/<文件名>?from=r2 | 指定从 R2 获取 |
| https://<自定义域名>/<文件名>?from=github | 指定从 GitHub 获取 |
| https://<自定义域名>/<文件名>?from=gitlab | 指定从 GitLab 获取 |
| https://<自定义域名>/<文件名>?from=where | 查询文件和归属节点信息 |
## 检测各节点状态
![](https://pic.forvps.gq/20241121000036.webp)
## 指定文件从 R2 获取
![](https://pic.forvps.gq/20241121001644.webp)
## 指定文件从 GitHub 获取
![](https://pic.forvps.gq/20241121000230.webp)
## 指定文件从 GitLab 获取
![](https://pic.forvps.gq/20241121001703.webp)
## 查询文件和归属节点信息
![](https://pic.forvps.gq/20241121001733.webp)
# 总结
通过本方案,我们成功搭建了一个融合 R2、GitHub 和 GitLab 的高效分布式文件存储集群。这一架构不仅提升了文件的安全性与备份可靠性,还充分利用了 Cloudflare 全球 Edge CDN 的加速能力,让文件访问更快、更稳定。
无论是存储图片、代码,还是其他重要文件,这个集群都能以低成本、高效率的方式满足需求。希望这个方案能够为你的工作和学习带来启发和便利。如果你对这个集群感兴趣,不妨尝试搭建,享受创新带来的乐趣!
兄弟,遮住你的私密信息,注意信息安全问题
回复删除谢谢这位兄弟提醒,我已经在发布之前把所有的token换掉了。其他客户信息的应该不敏感,没有必要打码吧。
删除R2存储免费层10GB后,$0.015/GB/月≈10元/10GB/年,n 个 cloudflare 及选择文件移动到容量最少的库/数量最少的库,是不是省一点钱,但增加了文件管理的复杂度
回复删除如果用到了10个号,总共10G*10的免费层,但不会都放满,实际可能30~50GB,放一个号里几十块钱/年,会不会更好一点呢
对于≤100MB的小文件,放GitHub,这样大大减轻 R2 存储免费层的容量啊,可以不需要那么多Cloudflare账户绑定银行卡做认证了。
删除只是一个善意的提醒,防止被人利用,因为我以前写博客吃过这种亏,哈哈
回复删除真心请教一下,像这样只显示账户信息的,问题大吗?你之前吃亏是如何的?如果不方便公开,请email给我 fscarmen@gmail.com
删除