前言
从 0.x 一路迭代到现在,kkRepo 终于迎来了首个稳定版本:kkRepo 1.0.0。
这个版本新增了完整的 R/CRAN 仓库、Go Hosted 仓库和多套可切换 UI 主题,同时完善了 PyPI 代理、组件上传、全局搜索与 Maven Snapshot 删除等能力。
- GitHub:https://github.com/klboke/kkRepo
- v1.0.0 Release:https://github.com/klboke/kkRepo/releases/tag/v1.0.0
- 完整变更:v0.9.0...v1.0.0
kkRepo 是什么?
kkRepo 是一款社区驱动、完全开源的自托管制品仓库,目标是解决 Sonatype Nexus Community Edition 在格式支持、容量限制、迁移和高可用部署等方面的痛点。
项目围绕 Nexus 的客户端协议、权限模型和 /repository/<repo>/... URL 布局实现兼容,并提供存量仓库、制品、用户、角色和权限迁移能力,尽量让原有客户端配置和 CI 工作流保持不变。
目前已经支持 20+ 种仓库格式和代理类型:
Maven 、npm 、PyPI 、Go 、Helm 、Cargo/Rust 、Dart/Pub 、Composer/PHP 、Terraform 、Swift Package Registry 、Ansible Galaxy 、Conda 、APT/Debian 、Conan 2 、Alpine/APK 、R/CRAN 、Hugging Face Models 、Docker/OCI 、NuGet 、RubyGems 、Yum 和 Raw 。
不同格式根据官方协议支持 hosted 、proxy 或 group 仓库。
为什么是 1.0.0 ?
1.0.0 是 kkRepo 的首个稳定版本。
这并不意味着项目已经停止演进,而是代表核心仓库、权限、存储、迁移、搜索、多副本协调以及 JVM/Native 部署能力已经形成一条稳定发布线。
v1.0.0 主要更新
1. 新增 R / CRAN 仓库
v1.0.0 新增 R/CRAN 的 hosted 、proxy 和 group 三种仓库类型。
主要能力包括:
- Hosted 保存企业内部 R source package
- Proxy 缓存公开 CRAN 镜像
- Group 统一解析私有包和公共包
- 自动生成确定性的
PACKAGES.gz - Package coordinate 不可变,相同内容重试幂等
- Group 按 snapshot 固定具体成员和 checksum
- 支持 Cleanup Policy 和制品安全扫描
- 支持多副本发布协调和故障恢复
- 支持经过数据结构验证的 Nexus 3.94 迁移
- 使用真实 R 4.5/4.6 客户端完成兼容性验证
R 客户端可以直接配置 kkRepo:
local({
repos <- getOption("repos")
repos["KKRepo"] <- "https://repo.example.com/repository/r-group"
options(repos = repos)
})
然后正常使用:
install.packages(
"acmepkg",
repos = "https://repo.example.com/repository/r-group",
type = "source"
)
当前 hosted 和 group 聚焦 source .tar.gz package ; Windows 、macOS binary package 可以通过 proxy 透传缓存。
2. Go 仓库补齐 Hosted 能力
此前 kkRepo 的 Go 仓库主要用于 proxy 和 group 。v1.0.0 增加了完整的 Go hosted repository ,可以正式托管企业内部 Go Module 。
上传一个规范的 Module ZIP 后,kkRepo 会在同一个数据库事务中生成并发布:
.mod.info.zip
这样即使部署了多个副本,客户端也不会读取到只发布了一部分的 Module Version 。
Go hosted 还支持:
- Module Path 、Version 、ZIP Root 和
go.mod校验 DENY、ALLOW_ONCE和ALLOW写入策略- Admin UI 和 Components API 上传
- Cleanup Policy
- 制品安全扫描和下载阻断
- Nexus Go Hosted 数据迁移
- Hosted 与多个 Proxy 组成统一 Group
- 真实
go list、go mod download和go mod verify验证
客户端只需要把 GOPROXY 指向 group:
go env -w GOPROXY=https://repo.example.com/repository/go-group/,direct
3. 新增多套 UI 主题
Admin 、Browse 和登录页面现在支持统一切换主题。
v1.0.0 内置:
- kkRepo Original
- Indigo
- Ocean
- Sunset
- JFrog-inspired
- Nexus-inspired
主题设置保存在数据库中,多副本之间保持一致。
管理员可以在保存前实时预览主题,配置异常时也会安全回退到默认样式。升级用户默认继续使用原来的 kkRepo 设计,不会因为升级突然改变界面。
4. PyPI Proxy 支持自定义远程 Index Path
过去 PyPI Proxy 默认假设上游索引位于 /simple,但 PyTorch 等仓库的 Package Index 可能直接位于 Remote URL 根路径。
v1.0.0 新增 Remote Index Path:
- 普通 PyPI 保持
/simple - 上游 URL 本身就是 Index Root 时可以留空
- 也可以配置
/api/simple等自定义路径 - 客户端访问 kkRepo 的地址仍保持
/repository/<repo>/simple
例如代理 PyTorch CPU Index 时,可以把 Remote URL 配置为:
https://download.pytorch.org/whl/cpu/
然后将 Remote Index Path 留空。
现有 PyPI Proxy 升级后仍然保留 /simple,原有行为不会改变。
5. 一批兼容性和使用体验修复
v1.0.0 还修复和优化了:
- Maven Release 、Snapshot 和 Timestamped Snapshot 在 Browse 中删除后,能够正确重建对应 metadata
- PyPI Hosted 可以接收包含大量 metadata 字段的 Twine multipart 上传
- MySQL 全局搜索不会再因为
com等 InnoDB Stopword 丢失有效结果 - 上传页面根据仓库能力展示目录、文件名和多文件控件
- NuGet 、RubyGems 等格式继续保持严格的单文件上传
- Browse 搜索导航、格式选择、侧栏滚动和包详情布局得到优化
- Admin 与 Browse 使用统一的滚动条样式
- 仓库请求路由改为 fail-closed 的协议 Handler SPI ,为后续扩展新格式提供统一边界
现有核心能力
除了仓库格式,kkRepo 目前还支持:
- Nexus 存量仓库、制品、用户、角色和权限迁移
- Local 、LDAP 、OIDC 认证
- 匿名访问策略和细粒度权限管理
- 带权限校验的全局制品搜索
- CycloneDX SBOM 和漏洞扫描
- 安全策略、豁免和可选下载阻断
- 面向全部仓库格式的 Cleanup Policy
- Prometheus 指标和 Grafana 面板
- MySQL 或 PostgreSQL 元数据存储
- OSS 、S3 和 File blob storage
- JVM 与 GraalVM Native 两种运行时
- 多副本高可用部署
- 按仓库配置 HTTP 或 SOCKS5 出站代理
Native 版本通常约 1 秒启动就绪,内存占用低于 200 MB 。
快速体验
机器上安装好 Docker 与 Docker Compose 后执行:
curl -fsSL https://raw.githubusercontent.com/klboke/kkrepo/main/scripts/quickstart.sh | bash
使用 PostgreSQL:
curl -fsSL https://raw.githubusercontent.com/klboke/kkrepo/main/scripts/quickstart.sh | KKREPO_DATABASE_TYPE=postgresql bash
启动 Native 版本:
curl -fsSL https://raw.githubusercontent.com/klboke/kkrepo/main/scripts/quickstart.sh | KKREPO_RUNTIME=native bash
启动后访问:
- 管理控制台:
http://127.0.0.1:19090/admin/ - 用户侧浏览器:
http://127.0.0.1:19090/browse/ - 健康检查:
http://127.0.0.1:19091/actuator/health
首次进入页面时,在 UI 中创建 Local/admin 管理员密码。
Quickstart 默认使用 File blob storage ,适合本地试用;生产环境建议使用独立的 MySQL/PostgreSQL 和 OSS/S3 ,并替换默认加密密钥。
容器镜像
JVM:
ghcr.io/klboke/kkrepo:1.0.0
ghcr.io/klboke/kkrepo:latest
Native:
ghcr.io/klboke/kkrepo:1.0.0-native
ghcr.io/klboke/kkrepo:native-latest
安全扫描器:
ghcr.io/klboke/kkrepo-scanner:1.0.0
所有发行镜像均支持 Linux AMD64 和 ARM64 。
GitHub Release 同时提供 JVM 压缩包、AMD64/ARM64 Native 压缩包以及统一的 SHA-256 校验文件。
从 v0.9.0 升级
现有 v0.9.0 MySQL 和 PostgreSQL 部署可以通过 Flyway V49–V50 原地升级。
升级前请注意:
- 同时备份关系数据库和 blob store 。
- 等待 Flyway 迁移完成后再恢复业务流量。
- 新 schema 应用后,不要混合运行 v0.9.0 和 v1.0.0 实例。
- 新的 R/CRAN 仓库不会自动创建,需要管理员手动配置。
- 现有 PyPI Proxy 在未配置 Remote Index Path 时继续使用
/simple。 - 现有 Go Proxy 和 Group 行为保持不变,只有显式创建或加入 Go Hosted 成员后才会启用新的 Hosted 能力。
最后
从 Maven 、npm 、PyPI ,到 Docker 、Conda 、APT 、Conan 、Alpine 、R/CRAN 和 Hugging Face Models ,kkRepo 正在逐步补齐一套真正开源、可迁移、支持多副本部署的制品仓库方案。
如果你正在使用 Nexus ,欢迎拿真实仓库、真实客户端和实际 CI 流程测试 kkRepo 。
遇到兼容性问题或者希望支持新的仓库格式,可以直接提交 Issue:
https://github.com/klboke/kkRepo/issues
如果项目对你有帮助,也欢迎 Star 、反馈和参与贡献。