纯开源 Nexus 替代方案 kkRepo 1.0.0 正式发布,新增 R/CRAN、Go Hosted 和多套 UI 主题

g632104866 2026-08-27 15:56 1

前言


从 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 校验

  • DENYALLOW_ONCEALLOW 写入策略

  • Admin UI 和 Components API 上传

  • Cleanup Policy

  • 制品安全扫描和下载阻断

  • Nexus Go Hosted 数据迁移

  • Hosted 与多个 Proxy 组成统一 Group

  • 真实 go listgo mod downloadgo 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 原地升级。


升级前请注意:



  1. 同时备份关系数据库和 blob store 。

  2. 等待 Flyway 迁移完成后再恢复业务流量。

  3. 新 schema 应用后,不要混合运行 v0.9.0 和 v1.0.0 实例。

  4. 新的 R/CRAN 仓库不会自动创建,需要管理员手动配置。

  5. 现有 PyPI Proxy 在未配置 Remote Index Path 时继续使用 /simple

  6. 现有 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 、反馈和参与贡献。

最新回复 (2)
  • yidinghe 08-27 16:12
    1
    这就是特别赚钱的公司吗,还有精力搞这个
    ⊙﹏⊙
  • g632104866 楼主 08-28 10:31
    2
    @yidinghe 正好解决自己公司的问题,然后发现这个还是普遍存在的问题,且这个领域纯开源的几乎么有,都是带有商业性质的开源。所以我就开源了,开源 2 个月后,就收获了多家公司包括几个上市公司已经在生产环境无缝替换 Nexus 到 kkRepo 了,而且也收获了好几个海外公司使用,Docker 镜像下载也超 1.5k 了。虽然这个项目是纯开源的,但是我希望以这个项目的价值,通过解决企业级的问题,可以让企业反哺下项目,所以我开通了 github 的捐赠渠道,然后以此促进项目持续健康发展下去。这就是我会花精力开源 kkRepo 的全部。
* 帖子来源V2EX
返回