fish-not-phish/siene
GitHub: fish-not-phish/siene
Siene 是一个轻量级可自托管的容器镜像仓库 UI,为中小团队提供项目管理、RBAC 访问控制、漏洞扫描、镜像签名与复制等原生 registry 所缺乏的企业级功能。
Stars: 0 | Forks: 0

**Siene**
一个面向中小型工程团队的可自托管 container registry UI。Siene 构建于 [Docker Distribution v3](https://github.com/distribution/distribution) 之上,并添加了原生 registry 所缺乏的项目管理、安全扫描和访问控制功能——同时避免了 Harbor 的运维复杂性。


## 功能
- **项目** - 命名空间隔离,支持按项目划分的存储配额以及公开/私有可见性
- **RBAC** - 每个项目包含四种角色:访客、开发者、维护者、管理员
- **Robot accounts** - 用于 CI/CD pipelines 的受限 service accounts
- **个人访问令牌** - 用于 API 和 `docker login` 访问的 tokens
- **多架构镜像** - 支持 manifest 列表(OCI index);每个平台子镜像均独立存储、扫描和显示;index tags 会显示一个包含各架构扫描状态的卡片
- **漏洞扫描** - push 时自动执行 Trivy 扫描;基于严重程度防止拉取;CVE 允许列表;为所有平台提供定时重新扫描
- **密钥和错误配置扫描** - push 时为每个平台自动执行;可配置的防拉取阈值
- **SBOM** - push 时自动生成 Syft SPDX;提供可浏览的包列表及许可证明细
- **镜像签名** - 支持 Cosign v2 和 Notation v1 验证,并可选择强制拉取
- **复制** - 支持配置针对 11 种远程 registry 提供商(包括 Docker Hub、GHCR、ECR、GCR、ACR、Harbor 和 JFrog)的 push/pull 规则
- **审计日志** - 记录每一次 push、pull、删除和管理员操作;支持过滤并可配置保留期
- **垃圾回收** - 定时或手动执行;移除孤立的 blobs 并强制执行 tag 保留规则
- **OIDC SSO** - 已通过 Keycloak、Authelia 和 Authentik 测试
- **深色和浅色主题**
## 要求
- Docker Engine 24+
- Docker Compose v2.24+
### 系统规格
最低和推荐规格取决于是否启用了安全扫描。扫描是主要的资源消耗大户:Trivy 和 Syft 会在分析期间将每个 image layer 解压到内存中,因此峰值 RAM 会随着您所 push 的最大镜像的**未压缩**大小而变化——通常是您在磁盘上看到的压缩大小的 2 到 4 倍。
**未开启扫描(仅限 registry + UI)**
| | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4 核 |
| RAM | 2 GB | 4 GB |
| 磁盘 | 镜像存储 + 10 GB 额外开销 | 镜像存储 + 20 GB 额外开销 |
**开启扫描**
| 最大镜像(压缩后) | 扫描峰值 RAM | 推荐主机 RAM |
|---|---|---|
| 最高 200 MB(Alpine、slim 镜像) | ~1 GB | 4 GB |
| 最高 500 MB(Debian/Ubuntu 应用) | ~2 GB | 6 GB |
| 最高 1 GB(JVM、Node、Python 应用) | ~4 GB | 8 GB |
| 最高 2 GB(数据科学、ML 镜像) | ~6 GB | 12 GB |
| 最高 4 GB(PyTorch、CUDA、Spark) | ~10–12 GB | 16–24 GB |
扫描峰值 RAM 是指 Trivy 子进程的 RSS。同一时间仅运行一个扫描(`--concurrency 1`)。如果扫描超出可用内存,内核将对 worker container 执行 OOM-kill;Docker 会自动重启它(`restart: always`)。未确认的任务将在 1 小时的可见性超时后从 Redis 队列中重新分发并再次运行——但如果镜像对于可用 RAM 来说实在太大,它将在每次尝试时都被 OOM-kill。请为您的最大镜像设置足够大的 `mem_limit`,或者对于镜像超出您可用 RAM 的项目禁用扫描。
## 部署
在仓库根目录下运行设置脚本:
```
./setup.sh
```
该脚本会询问部署模式、您的域名或 IP 以及您的时区,随后生成密钥并写入 `docker/.env`。
| 模式 | Compose 文件 | 适用场景 |
|---|---|---|
| Basic | `docker-compose.yml` | 局域网、评估或由外部处理 TLS |
| Traefik | `docker-compose.traefik.yml` | 结合 Traefik 和 Cloudflare DNS 的生产环境 |
| Nginx | `docker-compose.nginx.yml` | 结合您自己的 TLS 证书的生产环境 |
### 存储后端
| 后端 | 说明 |
|---|---|
| 文件系统 | 默认选项。镜像存储在命名的 Docker volume 中。无外部依赖。 |
| S3 / 兼容 S3 的服务 | 支持 AWS S3、MinIO、Cloudflare R2 以及任何兼容 S3 的服务。 |
### 推送镜像
```
docker login siene.example.com
docker tag myimage:latest siene.example.com/myproject/myimage:latest
docker push siene.example.com/myproject/myimage:latest
```
## 注意事项
### 首位用户为超级用户
### NEXT_PUBLIC_BASE_URL 在构建时被固化
如果 `REGISTRY_EXTERNAL_URL` 在镜像构建完成后发生更改,请重新构建前端:
```
docker compose build frontend && docker compose up -d frontend
```
### Token 颁发者一致性
### Registry 证书卷
标签:DevSecOps, Docker, LLM防护, PyVis, SBOM管理, 上游代理, 安全防御评估, 容器镜像仓库, 搜索引擎查询, 漏洞探索, 版权保护, 签名验证, 自动化攻击, 请求拦截