本文使用通用仓库名、域名和容量。删除 hosted 制品可能不可恢复,所有命令应先在测试环境验证并完成备份。

Nexus 页面提示“实例正在接近使用限制”,这不是磁盘空间告警,也不表示 Kubernetes 不允许运行社区版。

截至本文核对时,Sonatype 官方 Usage Center 说明,Community Edition 的限制为:总组件数 40,000,或每日请求数 100,000;超过任一限制后将无法新增组件,回落到限制以内才会恢复。指标更新最多可能需要约一小时。Usage Center

这些规则取决于产品版本和许可策略,执行前应再次查阅官方页面。

先分清四个容易混淆的概念

概念含义是否等于 CE 用量
ComponentNexus 管理的逻辑组件/版本是,影响组件数
AssetPOM、JAR、校验文件等具体文件不等同于组件数
Blob Store 空间文件实际占用磁盘不等同于组件数
Request客户端下载、查询、上传请求影响每日请求量

maven-public 通常只是一个 Maven Group 仓库名,不代表“Public 版本”或另一种 Nexus 许可证。

Hosted、Proxy、Group 的清理风险不同

hosted

保存企业自己发布的 Release 和 Snapshot。删除这些制品可能导致构建产物永久丢失,必须先确认:

  • 是否仍被生产环境、历史分支或回滚使用。
  • 源码能否重建出完全相同的二进制。
  • 是否满足审计和保留期。
  • 是否已有离线备份。

proxy

保存上游仓库缓存。上游仍存在且网络可靠时,缓存通常可以重新下载,因此更适合作为优先治理对象。

但上游组件可能已被删除、变更,或因网络不可达而无法重新获取。不能把所有 proxy cache 都视为无价值。

group

Group 本身聚合其他仓库,一般不是直接存储制品的清理对象。应清理的是它包含的 hosted/proxy 成员。

第 1 步:备份数据库与 Blob Store

Nexus 使用 PostgreSQL 时,备份必须覆盖:

PostgreSQL 数据库
全部 Blob Store
/nexus-data 中的配置和密钥
Kubernetes Secret 与清单

数据库和 Blob 的时间点要协调。只备份数据库,恢复后会出现元数据指向不存在文件的情况;只备份 Blob,也无法重建完整仓库状态。

pg_dump -Fc -h <postgres-host> -U <backup-user> <nexus-database> \
  -f backup/nexus-before-cleanup.dump

sha256sum backup/nexus-before-cleanup.dump \
  > backup/nexus-before-cleanup.dump.sha256

Blob Store 按底层存储能力创建只读快照或一致性备份。不要在 Nexus 正在大量写入时直接打包目录。

第 2 步:记录清理前基线

在 Usage Center 截图或导出:

  • Total Components。
  • Daily Requests。
  • 指标更新时间。

记录仓库和 Blob:

curl --fail --silent --show-error \
  --netrc-file <secure-netrc> \
  https://repo.example.com/nexus/service/rest/v1/repositories \
  > reports/repositories-before.json

curl --fail --silent --show-error \
  --netrc-file <secure-netrc> \
  https://repo.example.com/nexus/service/rest/v1/blobstores \
  > reports/blobstores-before.json

不要把带凭据的命令、.netrc 或 API 响应中的内部信息提交到公开仓库。

第 3 步:按仓库类型盘点

创建表格:

repository,format,type,owner,retention_days,upstream_recoverable,cleanup_policy
maven-releases,maven2,hosted,release-team,365,false,manual-review
maven-snapshots,maven2,hosted,dev-team,30,true,snapshot-retention
maven-central,maven2,proxy,platform-team,60,true,proxy-cache

优先级通常是:

失效 proxy cache
→ 过期 Snapshot
→ 无引用的临时 hosted 制品
→ Release 人工审计

第 4 步:分页导出组件,避免只看 UI

Nexus Components API 使用 continuation token 分页。单页结果不能代表仓库总量。

请求结构:

curl --fail --silent --show-error \
  --netrc-file <secure-netrc> \
  'https://repo.example.com/nexus/service/rest/v1/components?repository=<repository>'

自动化脚本应:

  1. 保存 items。
  2. 读取 continuationToken。
  3. continuationToken 非空时继续请求。
  4. 只输出脱敏后的 group/name/version/lastModified。
  5. 生成候选,不直接 DELETE。

第 5 步:先找消费者,再决定删除

搜索:

  • Maven POM、Gradle、npm lockfile。
  • Jenkinsfile 和流水线参数。
  • Kubernetes 镜像与启动脚本。
  • Git tag、Release 和维护分支。
  • 生产回滚清单。

某个 Release 制品没有被当前主干引用,不代表历史版本不再需要它。

候选清单至少需要制品负责人和运维双方确认。

第 6 步:为 Proxy 配置 Cleanup Policy

在 Nexus 管理界面创建 Cleanup Policy,根据目标版本支持的条件设置:

  • Last downloaded before。
  • Last blob updated before。
  • Release type 或格式相关条件。
  • 名称正则,仅匹配明确指定的命名空间。

先关联一个低风险 proxy 仓库,等待任务执行并抽样验证;不要一开始就关联所有仓库。

第 7 步:治理 Snapshot

Snapshot 常见规则:

保留最近 N 个版本
保留最近 N 天
保留仍被活跃分支引用的版本
Release 不套用 Snapshot 规则

删除前用一个隔离 Maven 项目验证最新和历史 Snapshot 的下载路径。清理后验证仍在保留范围内的版本。

第 8 步:按正确顺序运行任务

不同 Nexus 版本的任务名称可能变化,推荐的执行顺序是:

执行 Cleanup Policy
→ 等待逻辑删除完成
→ 删除不再引用的 Blob
→ Compact Blob Store
→ 等待数据库与 Usage Center 指标更新

Compact Blob Store 主要回收磁盘空间,不等于立即降低组件数。不要因为磁盘空间没有立刻变小就再次大批量删除。

执行任务时记录:

  • Task ID、开始和结束时间。
  • 删除候选数量。
  • Task 日志和错误。
  • Blob 空间变化。
  • Usage Center 更新时间。

第 9 步:验证代理缓存能否重新拉取

清理 proxy cache 后,使用一个空的 Maven 本地仓库,重新下载允许删除的组件:

mvn -Dmaven.repo.local=<temporary-empty-directory> \
  dependency:get \
  -Dartifact=<group>:<artifact>:<version>

同时观察 Nexus request log 和 proxy remote 状态。上游不可用时,应停止扩大清理。

第 10 步:验证 Hosted 仓库

至少完成:

  • 下载保留的历史 Release。
  • 下载最新 Snapshot。
  • 上传新的测试 Snapshot。
  • 使用 CI 账号发布与读取。
  • 使用匿名/普通账号验证权限没有变化。

如果已超过 CE 限制,新增组件可能仍被阻止,需要等待指标回落后才能确认;根据官方说明,Usage Center 指标可能最多延迟约一小时。

每日请求数超限怎么办

清理组件不能直接降低请求量。应分析:

  • CI 是否每次都强制更新全部依赖。
  • 是否有错误重试或健康检查高频访问仓库。
  • 开发机构建是否绕过本地缓存。
  • 同一个组件是否被大量重复下载。
  • 代理、镜像和构建缓存策略是否合理。

不要为了减少请求而给 Release 返回过长且不可撤销的缓存头。

为什么不应该修改源码绕过限制

  • 限制可能同时存在于 UI、服务端写入路径和许可状态。
  • 修改源码会失去官方升级和安全补丁路径。
  • 数据库结构和任务行为无法获得支持。
  • 下一次升级可能直接破坏自定义修改。
  • 许可条款不是一个前端数字可以改变的。

正确的选择是降低真实用量、调整架构,或购买符合规模的版本。

什么时候考虑 Pro

  • 正常业务组件数量长期超过 CE 限制。
  • 每日请求量来自合理 CI/CD,而不是错误流量。
  • 制品保留期受审计要求约束,不能继续删除。
  • 需要官方 HA、支持或企业能力。
  • 清理成本已经高于许可证和运维带来的收益。

完成定义

  • 数据库和 Blob Store 完成一致性备份与恢复验证。
  • 每个仓库有所有者、类型和保留策略。
  • Proxy、Snapshot、Release 使用不同清理规则。
  • 删除候选均有引用扫描和人工审批。
  • Cleanup 与 Blob Compact 任务顺序正确且日志完整。
  • Maven 下载、发布和 CI 构建通过。
  • Usage Center 在指标刷新后回到安全范围。
  • 清理规则进入定期审计,而不是接近限制时临时删除。

Nexus 容量治理的目标不是让页面数字暂时变小,而是让制品生命周期、缓存、审计和恢复能力长期处于可控状态。