前言 从 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 、反馈和参与贡献。
kkRepo 1.0.0 正式发布,新增 R/CRAN、Go Hosted 和多套 UI 主题
来源:开源中国
2026年08月27日 18:01
1 阅读
分享到: