- Go 94.4%
- TypeScript 5.2%
- Makefile 0.2%
|
|
||
|---|---|---|
| .forgejo/workflows | ||
| cmd | ||
| docs | ||
| panel | ||
| web-react | ||
| .gitignore | ||
| CHANGELOG.md | ||
| config.example.yaml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| Makefile | ||
| merge.sh | ||
| README.md | ||
| start.sh | ||
Layla S3
Layla S3 是面向个人开发者自托管场景的 S3 服务。项目基于固定版本的 MinIO 核心进行二次开发,并把 React 管理面板、文件索引、外部 S3 连接和 SMB/NAS 备份集成在同一个 Go 二进制中。
主要功能
- 本地 Bucket 创建、删除和访问策略管理
- 本地及远程 S3 Bucket 的统一文件管理与统一 S3 API 代理
- 跨 Bucket / 跨 S3 连接复制与移动,任务记录及重启恢复
- 文件夹上传、同名处理、大文件 Multipart 断点续传、服务端 ZIP/7Z 打包下载
- 基于数据库状态的统一回收站;删除不产生 S3 IO,30 天后自动永久清理
- 24 小时默认有效的稳定分享链接、续期、撤销和到期清理
- Access Key 的本地/远程 Bucket 级只读或读写授权,Secret 查看强制 TOTP
- SQLite 本地文件索引、容量统计、MD5 状态和近 10 分钟调用记录
- 可选把
file_index单向同步到外部 PostgreSQL,断线不影响本地功能 - SMB2/SMB3 增量快照、覆盖恢复、恢复前校验和快照清单发现
远程 S3 凭据只保存在加密的连接配置中。Layla S3 Key 通过统一 S3 API 代理访问 本地与远程 Bucket;代理执行 Bucket 授权、禁用状态和回收站状态检查。MD5 可在 “系统设置 → 文件校验”中选择全部或单个 Bucket 执行。 Layla S3 管理的 Key 和匿名公开读都只通过统一代理生效;本地 MinIO 原生策略会在 升级时迁移并清除,从而避免直连绕过回收站或 Bucket 禁用状态。内部扫描、备份和 清理任务不受禁用影响。
技术栈
| 层 | 技术 |
|---|---|
| S3 核心 | MinIO RELEASE.2025-04-22T22-12-26Z 基线 |
| 前端 | React 19、TypeScript、Vite、Tailwind CSS v4、Radix/shadcn 风格组件 |
| 面板后端 | Go、Gin、minio-go、madmin-go |
| 本地数据库 | SQLite(WAL + FULL synchronous,纯 Go 驱动) |
| 可选外部同步 | PostgreSQL(pgx,仅镜像文件索引) |
| 认证 | JWT HS256、bcrypt、TOTP |
| 部署 | 前端 Go embed,单二进制 |
构建
前置要求:Go 1.25+、Node.js 20+、GNU Make(Windows 可分别执行命令)。
本仓库保存 Layla S3 的差异源码,不包含 MinIO 的全部 internal/ 等目录,不能在
当前目录直接生成完整服务。构建时先检出固定的 MinIO 基线,再将本仓库内容覆盖
到基线工作目录;最终产物仍是融合了 S3 核心、管理 API 和 React 前端的单一二进制。
git clone --depth 1 --branch RELEASE.2025-04-22T22-12-26Z \
https://github.com/minio/minio.git minio-src
# 在 Layla S3 仓库目录执行;不要复制 .git、node_modules 和临时工作目录。
rsync -a --exclude='.git' --exclude='node_modules' --exclude='.tmp' ./ minio-src/
cd minio-src/web-react
npm ci
npm run build
cd ..
rm -rf cmd/panel-static
cp -r web-react/dist cmd/panel-static
CGO_ENABLED=0 go build -trimpath -o minio .
完成基线覆盖后,Linux/macOS 也可以在 minio-src 中执行:
make build-panel
运行
首次运行不需要准备数据库或环境变量。只需为 /data 提供持久化目录:
./minio server /data --address ':9000' --console-address ':9001'
| 服务 | 默认地址 |
|---|---|
| 本地 MinIO S3 API | http://localhost:9000 |
| Layla S3 面板 | http://localhost:9001 |
| Layla S3 统一 S3 API | http://localhost:9002 |
面板初始账号为 admin / admin123。首次登录会进入个人中心并持续提示修改默认
用户名和密码。未显式设置 MinIO root 凭据时,服务会生成随机高强度凭据并保存到
/data/.laylas3/root-credentials.json;日常 S3 客户端应使用面板 Key 管理页面创建的
Bucket 级 Key,并连接统一 S3 API 端口。统一端口默认是面板端口加 1,可通过
LAYLAS3_S3_PROXY_PORT 修改,设为 0 或 off 可关闭。
Docker 示例:
docker run -d --name layla-s3 --restart unless-stopped \
-p 9000:9000 -p 9001:9001 -p 9002:9002 \
-v /opt/layla-s3/data:/data \
git.cloverdo.cn/cloverdo/layla-s3:<version>
/data 同时保存 MinIO 对象和隐藏目录 /data/.laylas3。后者包含 SQLite、
自动生成的 JWT/加密密钥、面板配置以及内部 root 凭据,所以不能使用临时卷。
反向代理部署后,在“系统设置 → 系统信息”填写真实的对外 S3 根地址,例如
https://s3.example.com。它必须指向统一 S3 API 的 9002 服务,而不是面板的 9001
服务。只有可信代理会清理并重写 X-Forwarded-* 时才打开“信任反向代理请求头”。
开发服务器仍可通过 VITE_DEV_API_TARGET 修改 /api 代理目标,默认是
http://localhost:9001。
最近 10 分钟 S3 调用
Layla S3 会在本地 SQLite 中生成内部 Token,并自动配置本机 MinIO Audit Webhook,不需要手工协调环境变量。接收端兼容单个 JSON、换行分隔 JSON 和 JSON 数组批次。记录保留 7 天,仪表盘只查询最近 10 分钟的 100 条。
可选 PostgreSQL 文件索引
“系统设置 → PostgreSQL 文件索引”可配置外部 PostgreSQL。启用后系统会创建
laylas3_file_index,先全量同步,再通过 SQLite 持久队列单向增量同步。外部
PostgreSQL 只保存文件索引镜像,不保存账号、Key、任务、分享链接或其他配置。
连接失败只会显示错误并保留待同步队列,不影响 S3 和面板正常使用。
数据安全说明
- SQLite 保存管理元数据和可恢复任务;S3 对象仍是文件事实来源。
- SQLite 使用 WAL 和
synchronous=FULL;PostgreSQL 始终是可选的文件索引镜像。 - 索引扫描只有在完整列举成功后才删除过期记录,远端错误不会被当作空 Bucket。
- 上传成功后先写入持久化索引队列再响应,有限并发后台写入文件索引;队列失败时 回滚刚写入的对象,后台扫描仍作为最终修复机制。
- 软删除、恢复只修改 SQLite 状态;永久删除先声明记录、成功删除对象后再删索引, 存储端失败时记录会回到回收站,避免对象与数据库永久分叉。
- 复制/移动先持久化任务和最终目标;移动在复制完成后再进入删除阶段,重启后续做。
- 64 MiB 以上的浏览器上传使用 Multipart,会话保存在 SQLite 和浏览器本地。
- SMB Blob 与 manifest 先写临时文件、同步并验证,再原子重命名;恢复前先校验全部 Blob。
- 修改面板密码或用户名会使已有 JWT 会话立即失效。
- 登录和 Secret TOTP 连续失败 5 次后,同一客户端会暂停 5 分钟。
应把整个 /data 纳入停机备份或支持一致性快照的文件系统备份;不要在运行中只复制
laylas3.db 而遗漏 -wal 文件。SMB 快照仍应单独保护。上线前至少执行一次从
SMB 快照恢复到测试 Bucket 的演练,并轮换任何曾经提交到版本库的凭据。
验证
go test ./panel/... -count=1
cd web-react && npm ci && npm run build
PostgreSQL 只在可选文件索引同步功能中使用,相关验证应指向可丢弃的外部数据库。
许可证
本项目基于 MinIO 源码修改。MinIO 主体采用 GNU AGPLv3;公开分发衍生二进制时, 必须遵守相应许可证和源码提供义务。