MinIO management panel - self-hosted alternative to MinIO Console
  • Go 94.4%
  • TypeScript 5.2%
  • Makefile 0.2%
Find a file
Cloverdo ed509a5d62
All checks were successful
Verify Layla S3 / verify (push) Successful in 3m1s
fix(files): cover content above sticky toolbar
2026-07-29 22:46:59 +08:00
.forgejo/workflows fix: include S3 proxy in merged build verification 2026-07-28 15:49:51 +08:00
cmd fix(files): cover content above sticky toolbar 2026-07-29 22:46:59 +08:00
docs feat: add on-demand directory index refresh 2026-07-28 10:10:13 +08:00
panel feat: polish file manager interactions 2026-07-28 20:32:52 +08:00
web-react fix(files): cover content above sticky toolbar 2026-07-29 22:46:59 +08:00
.gitignore fix: 修复登录后白屏 - 补充缺失的NAV_ITEMS定义 2026-07-19 23:39:55 -04:00
CHANGELOG.md fix(files): cover content above sticky toolbar 2026-07-29 22:46:59 +08:00
config.example.yaml feat: add async trash cleanup and storage scheduling controls 2026-07-27 10:31:10 +08:00
Dockerfile feat: add async trash cleanup and storage scheduling controls 2026-07-27 10:31:10 +08:00
go.mod feat: use SQLite for local panel state 2026-07-24 19:51:44 +08:00
go.sum feat: use SQLite for local panel state 2026-07-24 19:51:44 +08:00
main.go feat: integrated MinPanel into MinIO binary - Vue3+NaiveUI frontend + Go backend 2026-07-14 22:38:39 -04:00
Makefile feat: 底层建设 2026-07-26 11:04:42 +08:00
merge.sh chore: add build merge.sh with 9001 port fix 2026-07-24 22:51:02 -04:00
README.md feat: 底层建设 2026-07-26 11:04:42 +08:00
start.sh feat: add async trash cleanup and storage scheduling controls 2026-07-27 10:31:10 +08:00

Layla S3

Layla S3 是面向个人开发者自托管场景的 S3 服务。项目基于固定版本的 MinIO 核心进行二次开发,并把 React 管理面板、文件索引、外部 S3 连接和 SMB/NAS 备份集成在同一个 Go 二进制中。

主要功能

  • 本地 Bucket 创建、删除和访问策略管理
  • 本地及远程 S3 Bucket 的统一文件管理与统一 S3 API 代理
  • 跨 Bucket / 跨 S3 连接复制与移动,任务记录及重启恢复
  • 文件夹上传、同名处理、大文件 Multipart 断点续传、服务端 ZIP/7Z 打包下载
  • 基于数据库状态的统一回收站;删除不产生 S3 IO30 天后自动永久清理
  • 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
本地数据库 SQLiteWAL + FULL synchronous纯 Go 驱动)
可选外部同步 PostgreSQLpgx仅镜像文件索引
认证 JWT HS256、bcrypt、TOTP
部署 前端 Go embed单二进制

构建

前置要求Go 1.25+、Node.js 20+、GNU MakeWindows 可分别执行命令)。

本仓库保存 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 修改,设为 0off 可关闭。

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=FULLPostgreSQL 始终是可选的文件索引镜像。
  • 索引扫描只有在完整列举成功后才删除过期记录,远端错误不会被当作空 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公开分发衍生二进制时 必须遵守相应许可证和源码提供义务。