<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://blog.kali-team.cn/feed_style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <tabi:metadata xmlns:tabi="https://github.com/welpo/tabi">
        <tabi:base_url>https://blog.kali-team.cn</tabi:base_url>
        <tabi:separator>
            •
        </tabi:separator>
        <tabi:about_feeds>
            这是Web Feed，又称为Atom Feed，把现在的网址复制到新闻阅读器即可订阅本站文章。造访「About Feeds」来了解更多资讯。
        </tabi:about_feeds>
        <tabi:visit_the_site>
            造访网站
        </tabi:visit_the_site>
        <tabi:recent_posts>
            近期文章
        </tabi:recent_posts>
        <tabi:last_updated_on>
            更新于 $DATE
        </tabi:last_updated_on>
        <tabi:default_theme></tabi:default_theme>
        <tabi:post_listing_date>date</tabi:post_listing_date>
        <tabi:current_section>nexus</tabi:current_section>
    </tabi:metadata><link rel="extra-stylesheet" href="https://blog.kali-team.cn/skins/arch.css?h=8b651815fde702215b07" /><title>Kali-Team - nexus</title>
        <subtitle>三米前有蕉皮的博客</subtitle>
    <link href="https://blog.kali-team.cn/tags/nexus/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://blog.kali-team.cn/tags/nexus/" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2026-10-18T00:00:00+00:00</updated><id>https://blog.kali-team.cn/tags/nexus/atom.xml</id><entry xml:lang="en">
        <title>安全开发-Nexus</title>
        <published>2026-10-18T00:00:00+00:00</published>
        <updated>2026-10-18T00:00:00+00:00</updated>
        <author>
            <name>三米前有蕉皮</name>
        </author>
        <link rel="alternate" href="https://blog.kali-team.cn/blog/2026/09/安全开发-Nexus/" type="text/html"/>
        <id>https://blog.kali-team.cn/blog/2026/09/安全开发-Nexus/</id>
        
            <content type="html">&lt;h2 id=&quot;qian-yan&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#qian-yan&quot; aria-label=&quot;Anchor link for: qian-yan&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
前言&lt;/h2&gt;
&lt;p&gt;内网 DevSecOps 体系搭到这一步，还差一个更根本的问题：&lt;strong&gt;内网到不了公网，开发需要的一堆“外网的东西“从哪来？&lt;/strong&gt; Go 依赖、SonarScanner 可执行文件、某个特定版本的 Go 编译器——默认全都去公网下载，内网全都不通。&lt;/p&gt;
&lt;p&gt;这篇在内网部署 &lt;strong&gt;Nexus&lt;/strong&gt; 制品仓库（&lt;code&gt;https://nexus.kali-team.internal&lt;/code&gt;，3.96.1）：Nexus 替你去上游取一份制品、缓存在本地，第二次起就不用出网了。全文按“概念 → 搭建 → 使用 → CI/CD 联动“展开。&lt;/p&gt;
&lt;h2 id=&quot;1-bei-jing-gai-nian&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#1-bei-jing-gai-nian&quot; aria-label=&quot;Anchor link for: 1-bei-jing-gai-nian&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
1 背景概念&lt;/h2&gt;
&lt;h3 id=&quot;1-1-zhi-pin-yu-dai-li-cang-ku&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#1-1-zhi-pin-yu-dai-li-cang-ku&quot; aria-label=&quot;Anchor link for: 1-1-zhi-pin-yu-dai-li-cang-ku&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
1.1 制品与代理仓库&lt;/h3&gt;
&lt;p&gt;源代码是自己写的，但把程序跑起来还要从外部下载一堆“拿来就能用的成品“：Go 第三方模块（example 项目有 16 个，含 gin 框架）、SonarScanner 可执行文件、特定版本的 Go 编译器（&lt;strong&gt;工具链&lt;/strong&gt;，&lt;code&gt;go&lt;/code&gt;/&lt;code&gt;gofmt&lt;/code&gt; 等命令打包成的发行包）。这类统称&lt;strong&gt;制品（artifact）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代理仓库（proxy repository）&lt;/strong&gt; 就是架在客户端和公网之间的缓存层：客户端请求某个制品，本地没有就去 &lt;strong&gt;上游（upstream，公网源站）&lt;/strong&gt; 取一份、缓存下来再返回；第二次再有人要同一个制品，直接命中缓存。对内网的三重价值：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;可达&lt;/strong&gt;：任务容器到不了公网，但一定到得了内网的 Nexus；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;快且稳&lt;/strong&gt;：同一版本的依赖缓存后是本地速度，还省公网流量；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可控&lt;/strong&gt;：下载了什么、从哪下的、什么时候下的，全部记录在 Nexus 里，天然是审计点。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;1-2-nexus-yu-san-chong-cang-ku-lei-xing&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#1-2-nexus-yu-san-chong-cang-ku-lei-xing&quot; aria-label=&quot;Anchor link for: 1-2-nexus-yu-san-chong-cang-ku-lei-xing&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
1.2 Nexus 与三种仓库类型&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Nexus Repository（3.x）&lt;/strong&gt; 是 Sonatype 的开源制品仓库，支持 Go 模块、Maven、npm、Docker 镜像以及 &lt;strong&gt;raw（通用文件）&lt;/strong&gt; 等格式。本文只用三种能力：&lt;strong&gt;Go 模块代理&lt;/strong&gt;， &lt;strong&gt;debian源&lt;/strong&gt; 和 &lt;strong&gt;raw 文件代理&lt;/strong&gt;（Docker 镜像功能不开——镜像归 Harbor 管）。&lt;/p&gt;
&lt;p&gt;仓库分三种核心类型：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;仓库类型&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proxy&lt;/strong&gt;（代理）&lt;/td&gt;&lt;td&gt;代理外部仓库，缓存下载的制品&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Hosted&lt;/strong&gt;（托管）&lt;/td&gt;&lt;td&gt;存储内部私有制品&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Group&lt;/strong&gt;（组）&lt;/td&gt;&lt;td&gt;聚合多个仓库，提供统一访问入口&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;本文建的 6 个仓库全是 Proxy；Hosted/Group 是“下一步“（见小结）。&lt;/p&gt;
&lt;h3 id=&quot;1-3-nexus-zai-ti-xi-li-de-wei-zhi&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#1-3-nexus-zai-ti-xi-li-de-wei-zhi&quot; aria-label=&quot;Anchor link for: 1-3-nexus-zai-ti-xi-li-de-wei-zhi&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
1.3 Nexus 在体系里的位置&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;使用方&lt;/th&gt;&lt;th&gt;下载什么&lt;/th&gt;&lt;th&gt;Nexus 仓库&lt;/th&gt;&lt;th&gt;配置在哪&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Go 构建（Dockerfile / 本地）&lt;/td&gt;&lt;td&gt;Go 模块依赖（gin 等）&lt;/td&gt;&lt;td&gt;&lt;code&gt;goproxy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;GOPROXY&lt;/code&gt; 环境变量&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Go 模块完整性校验&lt;/td&gt;&lt;td&gt;sumdb 校验数据&lt;/td&gt;&lt;td&gt;&lt;code&gt;go-sumdb&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;GOSUMDB&lt;/code&gt; 环境变量（可选）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;需要特定 Go 版本的流水线&lt;/td&gt;&lt;td&gt;Go 工具链压缩包&lt;/td&gt;&lt;td&gt;&lt;code&gt;go-dev-dl&lt;/code&gt;&lt;/td&gt;&lt;td&gt;setup-go 的 &lt;code&gt;go-download-base-url&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SonarQube 流水线&lt;/td&gt;&lt;td&gt;SonarScanner CLI 安装包&lt;/td&gt;&lt;td&gt;&lt;code&gt;sonar-scanner-cli&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;sonarqube.yaml&lt;/code&gt; 的 &lt;code&gt;scannerBinariesUrl&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Dockerfile apt 装包（构建镜像）&lt;/td&gt;&lt;td&gt;Debian apt 包（索引文件 + .deb）&lt;/td&gt;&lt;td&gt;&lt;code&gt;debian&lt;/code&gt; / &lt;code&gt;debian-security&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Dockerfile 的 sed 源改写&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Harbor 管容器镜像，Nexus 管代码级制品，两个仓库分工明确。&lt;/p&gt;
&lt;h2 id=&quot;2-da-jian&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#2-da-jian&quot; aria-label=&quot;Anchor link for: 2-da-jian&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
2 搭建&lt;/h2&gt;
&lt;p&gt;版本：Nexus 3.96.1 / nxrm-ha chart 96.1.0，PostgreSQL 18.4 / bitnami chart 18.7.9，经 Rancher + Helm 部署。&lt;/p&gt;
&lt;h3 id=&quot;2-1-zong-ti-si-lu-yao-na-xie-zu-jian&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#2-1-zong-ti-si-lu-yao-na-xie-zu-jian&quot; aria-label=&quot;Anchor link for: 2-1-zong-ti-si-lu-yao-na-xie-zu-jian&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
2.1 总体思路：要哪些组件&lt;/h3&gt;
&lt;p&gt;部署分四块，顺序是“先数据库、后 Nexus“（没有库连，Nexus 起不来）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL 数据库&lt;/strong&gt;：Nexus 的元数据（仓库定义、用户、权限、缓存索引）都存这里。给 &lt;code&gt;middleware&lt;/code&gt;（中间件）命名空间单装一个&lt;strong&gt;共享&lt;/strong&gt; PostgreSQL，后面还被 Dependency-Track 复用；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nexus 本体&lt;/strong&gt;：官方 &lt;strong&gt;nxrm-ha&lt;/strong&gt; Helm chart，放 &lt;code&gt;sonatype&lt;/code&gt; 命名空间；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;chart 源&lt;/strong&gt;：内网到不了 bitnami 官方 chart 源，PostgreSQL 的 chart 走 &lt;strong&gt;daocloud 镜像源&lt;/strong&gt;（同步了官方 chart 的国内镜像）；Nexus 用 Sonatype 官方 chart 源；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;入口&lt;/strong&gt;：域名 &lt;code&gt;nexus.kali-team.internal&lt;/code&gt;，证书由内网 CA 签发。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-2-an-zhuang-postgresql-gong-xiang-shu-ju-ku&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#2-2-an-zhuang-postgresql-gong-xiang-shu-ju-ku&quot; aria-label=&quot;Anchor link for: 2-2-an-zhuang-postgresql-gong-xiang-shu-ju-ku&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
2.2 安装 PostgreSQL（共享数据库）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;添加 chart 源（Rancher 界面）。&lt;/strong&gt; 地址填 daocloud 镜像源 &lt;code&gt;oci://docker.m.daocloud.io/bitnamicharts&lt;/code&gt;（&lt;strong&gt;OCI&lt;/strong&gt; 是容器镜像的发布格式规范，Helm chart 现在也能打成 OCI 产物放在镜像仓库兼容的地址上——daocloud 把 bitnami 的 chart 同步到这个地址，内网可达），名称起 postgresql：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/rancher-pg-chart-repo.png&quot; alt=&quot;Rancher 添加 OCI chart 仓库&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 1：Rancher「添加 Chart 仓库」页：经 daocloud OCI 镜像源（oci://docker.m.daocloud.io/bitnamicharts）添加 PostgreSQL 的 chart 仓库&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装并改关键项。&lt;/strong&gt; 商店里找到 &lt;code&gt;postgresql&lt;/code&gt; chart，版本 &lt;strong&gt;18.7.9&lt;/strong&gt;（对应的 PostgreSQL 实际版本是 &lt;strong&gt;18.4&lt;/strong&gt;，见下面的安装输出），点安装：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/rancher-pg-install.png&quot; alt=&quot;Rancher 安装 postgresql chart&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 2：bitnami postgresql chart 18.7.9 的安装页（安装进 middleware 命名空间）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;默认值大部分不用动，只改下面几处（&lt;code&gt;-&lt;/code&gt; 为 chart 默认值，&lt;code&gt;+&lt;/code&gt; 为本次部署值）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; auth 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  database: &amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  database: nexus                    # 预创建名为 nexus 的数据库（Nexus 的元数据库）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  postgresPassword: &amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  postgresPassword: &amp;lt;POSTGRES_PASSWORD&amp;gt;   # postgres 超级用户密码（强密码，本文占位）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; primary.configuration 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  configuration: &amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  configuration: |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    listen_addresses = &amp;#39;*&amp;#39;           # 监听所有网卡（默认只监听本机）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    max_connections = 500            # 最大并发连接数（默认 100）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    shared_buffers = 256MB           # PG 内存缓冲（默认约为内存的 1/4）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; primary.resources / replica.resources 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  resources: {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  resources:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    limits:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;      cpu: 2                         # 资源上限：最多用 2 核 / 2Gi 内存&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;      memory: 2Gi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    requests:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;      cpu: 1                         # 资源保底：预留 1 核 / 2Gi 内存&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;      memory: 2Gi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;配置&lt;/th&gt;&lt;th&gt;原因&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;auth.database: nexus&lt;/code&gt;&lt;/td&gt;&lt;td&gt;安装时预创建 &lt;code&gt;nexus&lt;/code&gt; 数据库，Nexus 的元数据全部住在这个库里&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;auth.postgresPassword&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;postgres&lt;/code&gt; 超级用户密码，强密码，只存在于 values 与 k8s secret（K8s 内置的“密钥存储“对象）里，本文占位&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;configuration&lt;/code&gt;（三个 PG 参数）&lt;/td&gt;&lt;td&gt;最关键的是 &lt;code&gt;listen_addresses=&#39;*&#39;&lt;/code&gt;——PostgreSQL 默认只监听 pod 自己的本机，而 Nexus 是“隔壁 pod“，走 Service 域名来连，必须放开监听；&lt;code&gt;max_connections=500&lt;/code&gt; 给并发留余量（Nexus 和 Dependency-Track 共享这个库）；&lt;code&gt;shared_buffers=256MB&lt;/code&gt; 是 PG 读数据页的内存缓冲&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;resources&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;requests&lt;/code&gt; 是保底、&lt;code&gt;limits&lt;/code&gt; 是上限。PostgreSQL 是吃内存的组件，不设上限可能被 OOM kill 或把节点内存吃光，2Gi 是这台小节点上求稳的值（diff 里第二段 resources 属于 &lt;code&gt;replica&lt;/code&gt; 备库段，本次 &lt;code&gt;replicaCount: 1&lt;/code&gt; 只起主库，备库配置留着是为了将来上高可用省事）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;读安装输出。&lt;/strong&gt; 安装命令末尾输出：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;Release&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;postgresql&amp;quot; has been upgraded. Happy Helming!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;NAME:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; postgresql&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;NAMESPACE:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; middleware&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;        # 装进了 middleware 命名空间&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;STATUS:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; deployed&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;             # 部署成功&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;REVISION:&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;                  # 修订号：首次安装是 1，改 values 再跑一次 → 2（本次是升级）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;NOTES:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;CHART&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; NAME: postgresql&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;CHART&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; VERSION:&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 18.7.9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;APP&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; VERSION:&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 18.4.0&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # PostgreSQL 实际版本&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;⚠&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; WARNING: Since August 28th, 2025, only a limited subset of&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;    images/charts&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; are available for free.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;PostgreSQL&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; can be accessed via port&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 5432&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; on the following DNS names&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;    from&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; within your cluster:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;    postgresql.middleware.svc.cluster.local&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; - Read/Write connection&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;To&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; get the password for &amp;quot;postgres&amp;quot; run:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;    export&lt;/span&gt;&lt;span&gt; POSTGRES_PASSWORD&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; get secret --namespace middleware&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;      postgresql -o jsonpath=&amp;quot;{.data.postgres-password}&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt; base64&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两个点：&lt;strong&gt;&lt;code&gt;postgresql.middleware.svc.cluster.local&lt;/code&gt;&lt;/strong&gt; 是数据库的&lt;strong&gt;集群内域名&lt;/strong&gt;——K8s 里每个 Service 都有这种 &lt;code&gt;&amp;lt;服务名&amp;gt;.&amp;lt;命名空间&amp;gt;.svc.cluster.local&lt;/code&gt; 形式的域名，别的 pod 直接用它就能连上（2.3 里 Nexus 的配置用的就是它）；&lt;strong&gt;⚠ bitnami 警告&lt;/strong&gt;：2025-08-28 起 bitnami 只对“有限子集“的镜像/chart 免费，本次安装不受影响，将来升级 chart 遇到“拉不到镜像“时先想到这条。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;怎么验证&lt;/strong&gt;：&lt;code&gt;kubectl get pods -n middleware&lt;/code&gt; 能看到 &lt;code&gt;postgresql-0&lt;/code&gt; 处于 &lt;code&gt;Running&lt;/code&gt;；NOTES 里的命令能读出数据库密码（secret 里是 base64 编码，&lt;code&gt;base64 -d&lt;/code&gt; 解码）；终极验证在 2.3——Nexus 能连上库并正常启动。&lt;/p&gt;
&lt;h3 id=&quot;2-3-an-zhuang-nexus&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#2-3-an-zhuang-nexus&quot; aria-label=&quot;Anchor link for: 2-3-an-zhuang-nexus&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
2.3 安装 Nexus&lt;/h3&gt;
&lt;p&gt;同样在 Rancher 加一个 chart 源，地址是 Sonatype 官方 &lt;code&gt;https://sonatype.github.io/helm3-charts/&lt;/code&gt;，更新完成后安装 &lt;strong&gt;nxrm-ha&lt;/strong&gt; chart（版本 &lt;strong&gt;96.1.0&lt;/strong&gt;，对应 &lt;strong&gt;Nexus 3.96.1&lt;/strong&gt;；ha 是 high availability 的缩写，指“支持多副本部署“）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/rancher-nexus-install.png&quot; alt=&quot;Rancher 安装 nxrm-ha chart&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 3：Sonatype 官方 nxrm-ha chart 96.1.0 的安装页（对应 Nexus 3.96.1，装进 sonatype 命名空间）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;chart 默认值是按“云上生产“给的（16 核 16G、3 副本），本环境节点小，按实际缩水；同时把“连外部数据库 + 内网域名 + 本地存储“三件事配掉：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; ingress 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  enabled: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  defaultRule: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  defaultRule: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  host: null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  host: nexus.kali-team.internal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  ingressClassName: null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  ingressClassName: traefik&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; pvc 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  storage: 2Gi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  storage: 20Gi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  volumeClaimTemplate:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;    enabled: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  volumeClaimTemplate:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; storageClass 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  name: nexus-storage&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  provisioner: provisionerName&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  name: local-path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  provisioner: rancher.io/local-path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; secret.db 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;    host: nxrm_db_host&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    host: postgresql.middleware.svc.cluster.local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;    password: nxrm_db_password&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    password: &amp;lt;POSTGRES_PASSWORD&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;    user: nxrm_db_user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    user: postgres&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   dbSecret:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;    enabled: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; secret.nexusAdminSecret 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     adminPassword: &amp;lt;NEXUS_ADMIN_PASSWORD&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;    enabled: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; nexus.env 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;      install4jAddVmParams: &amp;#39;-Xms2703m -Xmx2703m&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;      install4jAddVmParams: &amp;#39;-Xms1024m -Xmx1024m&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       nexusDBName: nexus&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       nexusDBPort: 5432&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; nexus.resources 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       limits:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;        cpu: 16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;        memory: 16Gi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;        cpu: 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;        memory: 2Gi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       requests:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;        cpu: 8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;        memory: 8Gi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;        cpu: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;        memory: 2Gi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; nexusNs 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;    enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;    name: nexusrepo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    enabled: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    name: sonatype&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; config / supportContent 段&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   config:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;    enabled: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     mountPath: /sonatype-nexus-conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   supportContent:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;    enabled: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;    enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     path: /nexus-data/tmp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     sizeLimit: 50Gi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;@@&lt;/span&gt;&lt;span&gt; 副本数&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;  replicaCount: 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;  replicaCount: 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;配置&lt;/th&gt;&lt;th&gt;原因&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ingress&lt;/code&gt;&lt;/td&gt;&lt;td&gt;经域名 &lt;code&gt;nexus.kali-team.internal&lt;/code&gt; 对内网暴露（ingress 走集群现有的网关，证书由内网 CA 签发）；&lt;code&gt;defaultRule: true&lt;/code&gt; 启用 chart 自带的默认路由规则，把入口流量转到 Nexus 的 8081 端口&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;secret.db&lt;/code&gt;&lt;/td&gt;&lt;td&gt;数据库连接：&lt;code&gt;host&lt;/code&gt; 指向 2.2 装好的 PostgreSQL 的集群内域名，&lt;code&gt;user&lt;/code&gt; / &lt;code&gt;password&lt;/code&gt; 与装 PG 时相同（占位）；&lt;code&gt;dbSecret.enabled: true&lt;/code&gt; 让 chart 把数据库密码存进 k8s secret 再注入容器，密码不以明文出现在 pod 定义和日志里&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;secret.nexusAdminSecret&lt;/code&gt;&lt;/td&gt;&lt;td&gt;初始 &lt;strong&gt;admin 密码&lt;/strong&gt;也写进 secret（取回命令见下，值本文占位）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;pvc&lt;/code&gt; + &lt;code&gt;storageClass&lt;/code&gt;&lt;/td&gt;&lt;td&gt;20Gi 持久卷（&lt;strong&gt;PVC&lt;/strong&gt; 是给 pod 申请的“跨重启不丢的磁盘“；chart 默认 2Gi 对制品仓库太小）；&lt;code&gt;volumeClaimTemplate&lt;/code&gt; 是“每个副本各自一块 PVC“，将来扩副本、上高可用的前提；&lt;code&gt;local-path&lt;/code&gt;（rancher.io/local-path）是 k3s 自带的本地存储类，数据落在节点本地磁盘&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;install4jAddVmParams: &#39;-Xms1024m -Xmx1024m&#39;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Nexus 是 Java 程序，&lt;code&gt;-Xms/-Xmx&lt;/code&gt; 是 JVM 堆内存的初始与最大值；容器内存上限 2Gi，要给元空间、线程栈留余量，1G 是安全线&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;resources&lt;/code&gt; + &lt;code&gt;replicaCount: 1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;资源额度从默认 16C/16Gi、3 副本缩到 2C/2Gi、单副本；&lt;strong&gt;数据库已经外置（共享 PostgreSQL），将来把 &lt;code&gt;replicaCount&lt;/code&gt; 改 3 即可多副本高可用&lt;/strong&gt;，不用迁数据&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nexusNs: enabled: false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;关掉 chart 自带的“自动建新命名空间“开关，资源统一放 &lt;code&gt;sonatype&lt;/code&gt; 命名空间&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;config&lt;/code&gt; / &lt;code&gt;supportContent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;两个持久化目录：&lt;code&gt;config&lt;/code&gt; 存 admin 密码文件、license 等配置，&lt;code&gt;supportContent&lt;/code&gt; 是临时/上传暂存（限 50Gi）；都开启持久化，容器重建配置不丢&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nexus.docker.enabled: false&lt;/code&gt;（保持默认）&lt;/td&gt;&lt;td&gt;Nexus 本身可以当 Docker 镜像仓库，本环境镜像归 Harbor 管，不重复开&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;安装完成后，取回 admin 密码：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 做什么：读回 chart 存好的初始 admin 密码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 怎么做：chart 把密码存在 sonatype 命名空间的 nxrm-ha-adminsecret 里；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;#         secret 内容是 base64 编码的，-o jsonpath 取出后 base64 -d 解码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 为什么：密码不落文章、不进 shell 历史，只在凭据管理里留存&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;kubectl&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; get secret nxrm-ha-adminsecret -n sonatype&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  -o jsonpath=&amp;#39;{.data.nexus-admin-password}{&amp;quot;\n&amp;quot;}&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt; base64&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -d&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 输出即初始 admin 密码（本文占位 &amp;lt;NEXUS_ADMIN_PASSWORD&amp;gt;；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 建议首次登录后立即修改，并按团队凭据规范存放）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后浏览器打开 &lt;code&gt;https://nexus.kali-team.internal&lt;/code&gt;，用 admin 账号登录，看到 &lt;strong&gt;Dashboard（Usage Center）&lt;/strong&gt; 页面即 Nexus 起来了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-dashboard.png&quot; alt=&quot;Nexus Dashboard&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 4：安装成功后浏览器进入的 Nexus Dashboard（Usage Center）首页——管理界面的入口&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nexus 的登录也接入了 Gitea OIDC 体系：开发者用 Gitea 账号登录一次，进 Nexus 的 Web 界面不用再输密码。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;2-4-blob-store-zhi-pin-wen-jian-de-cun-fang-wei-zhi&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#2-4-blob-store-zhi-pin-wen-jian-de-cun-fang-wei-zhi&quot; aria-label=&quot;Anchor link for: 2-4-blob-store-zhi-pin-wen-jian-de-cun-fang-wei-zhi&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
2.4 Blob Store：制品文件的存放位置&lt;/h3&gt;
&lt;p&gt;建仓库之前先认识 &lt;strong&gt;Blob Store&lt;/strong&gt;：Nexus 里“仓库“是目录 + 元数据，真正的文件内容存在 Blob Store 里。每个仓库单独建一个：文件独立存放，磁盘可以按仓库单独扩容、迁移，某个仓库换盘/换机器时只动它自己的目录——这也是官方 chart 的推荐布局（每个 Blob Store 是 &lt;code&gt;/nexus-data&lt;/code&gt; 数据根目录下的一个子目录）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;操作&lt;/strong&gt;（Nexus 界面）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;strong&gt;Blob Stores&lt;/strong&gt;，初始列表是空的：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-blobstores-empty.png&quot; alt=&quot;Blob Stores 空列表&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 5：安装成功后的 Blob Stores 页：列表为空，需要手工创建存储库&lt;/em&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;点 &lt;strong&gt;Create Blob Store&lt;/strong&gt;：类型选 &lt;strong&gt;File&lt;/strong&gt;（本地磁盘型；Nexus 还支持 S3 等云对象存储类型，本环境全用本地磁盘），名称 &lt;code&gt;goproxy&lt;/code&gt;，路径 &lt;code&gt;/nexus-data/blobs/goproxy&lt;/code&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-blobstore-create.png&quot; alt=&quot;创建 goproxy Blob Store&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 6：创建 Blob Store：类型 File、名称 goproxy、路径 /nexus-data/blobs/goproxy（数据根目录下的子目录）&lt;/em&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;同样方式再建一个 &lt;code&gt;go-sumdb&lt;/code&gt;，建完两个都是 &lt;strong&gt;Started&lt;/strong&gt;（就绪）状态：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-blobstores-started.png&quot; alt=&quot;Blob Stores 均就绪&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 7：Blob Stores 列表：go-sumdb 与 goproxy 均为 Started 状态&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;顺序提醒&lt;/strong&gt;：Blob Store 必须&lt;strong&gt;先于仓库&lt;/strong&gt;创建——建仓库时要在已有的 Blob Store 里选一个，没建就没得选。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;2-5-chuang-jian-liu-ge-dai-li-cang-ku&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#2-5-chuang-jian-liu-ge-dai-li-cang-ku&quot; aria-label=&quot;Anchor link for: 2-5-chuang-jian-liu-ge-dai-li-cang-ku&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
2.5 创建六个代理仓库&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Repositories&lt;/strong&gt; 页同样是空列表起步：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-repositories-empty.png&quot; alt=&quot;Repositories 空列表&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 8：Repositories 页：空列表，准备创建第一个代理仓库&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;点 &lt;strong&gt;Create Repository&lt;/strong&gt;，第一个要选的是 &lt;strong&gt;Recipe（配方）&lt;/strong&gt;：Nexus 为每种制品格式预置了“表单模板“——选 go 就是 Go 模块的表单，选 raw 就是通用文件的表单。本部署共建 6 个仓库：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;仓库&lt;/th&gt;&lt;th&gt;Recipe&lt;/th&gt;&lt;th&gt;上游&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;goproxy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;go (proxy)&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://goproxy.cn&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Go 模块依赖代理&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;go-sumdb&lt;/code&gt;&lt;/td&gt;&lt;td&gt;raw (proxy)&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://goproxy.cn/sumdb/sum.golang.org&lt;/code&gt;&lt;/td&gt;&lt;td&gt;校验数据库（sumdb）查询代理&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;go-dev-dl&lt;/code&gt;&lt;/td&gt;&lt;td&gt;raw (proxy)&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://go.dev/dl/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Go 工具链下载代理&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sonar-scanner-cli&lt;/code&gt;&lt;/td&gt;&lt;td&gt;raw (proxy)&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;SonarScanner 安装包代理&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;debian&lt;/code&gt;&lt;/td&gt;&lt;td&gt;apt (proxy)&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://deb.debian.org/debian/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Docker 构建 apt 主源代理&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;debian-security&lt;/code&gt;&lt;/td&gt;&lt;td&gt;apt (proxy)&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://deb.debian.org/debian-security/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Debian 安全更新源代理&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;goproxy（Go 模块代理）。&lt;/strong&gt; Recipe 选 &lt;strong&gt;go (proxy)&lt;/strong&gt;——&lt;code&gt;go&lt;/code&gt; 命令只认这套协议，raw 顶替不了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-repo-recipe-go.png&quot; alt=&quot;选择 go (proxy) Recipe&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 9：Create Repository：Recipe 下拉选择 go (proxy)——Go 模块代理的专用模板&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;填写：名称 &lt;code&gt;goproxy&lt;/code&gt;，上游（remote）&lt;code&gt;https://goproxy.cn&lt;/code&gt;，Blob Store 选 2.4 建的 goproxy：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-goproxy-create.png&quot; alt=&quot;创建 goproxy 仓库&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 10：创建 goproxy 代理仓库：上游填 https://goproxy.cn，Firewall 选 Disabled（本环境没有 IQ 服务）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;上游为什么是 &lt;code&gt;goproxy.cn&lt;/code&gt; 而不是官方 &lt;code&gt;proxy.golang.org&lt;/code&gt;：goproxy.cn 是公共 Go 模块代理（国内维护），内网出口到它更快更稳，“Nexus 从 goproxy.cn 取、goproxy.cn 从官方取“双重缓存更可靠。表单里的 &lt;strong&gt;Firewall&lt;/strong&gt; 是 Nexus 的“仓库防火墙”：要连商业版 &lt;strong&gt;IQ&lt;/strong&gt; 服务，在制品入库前做安全策略检查；本环境没有 IQ 服务，只能选 &lt;strong&gt;Disabled&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;go-sumdb（校验数据库代理）。&lt;/strong&gt; Go 下载模块后，为了防“代理递给你一个被换过的包“，会到&lt;strong&gt;校验数据库（sumdb，checksum database）&lt;strong&gt;里核对模块的&lt;/strong&gt;哈希&lt;/strong&gt;（能唯一识别文件内容的摘要值，内容变一个字节哈希就变）——官方数据库是 &lt;code&gt;sum.golang.org&lt;/code&gt;，内网到不了，所以要代理。sumdb 的查询就是&lt;strong&gt;普通 HTTP GET&lt;/strong&gt;（按路径取一个小文本文件），不属于任何包管理器协议，所以用 &lt;strong&gt;raw (proxy)&lt;/strong&gt;（通用文件代理）表单：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-repo-recipe-raw.png&quot; alt=&quot;选择 raw (proxy) Recipe&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 11：Create Repository：Recipe 下拉选择 raw (proxy)——通用文件代理，这里用于 sumdb 查询&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;填写：名称 &lt;code&gt;go-sumdb&lt;/code&gt;，上游 &lt;code&gt;https://goproxy.cn/sumdb/sum.golang.org&lt;/code&gt;（goproxy.cn 在这个路径下聚合了官方 sumdb），&lt;strong&gt;Strict Content Type Validation 不勾选&lt;/strong&gt;——开启时 Nexus 会对存入文件的“内容类型“（Content-Type）做严格校验，sumdb 查询返回的是短文本，勾了会把缓存文件拦掉：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-gosumdb-create.png&quot; alt=&quot;创建 go-sumdb 仓库&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 12：创建 go-sumdb 代理仓库：上游填 https://goproxy.cn/sumdb/sum.golang.org，Strict Content Type Validation 未勾选&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;验证代理生效。&lt;/strong&gt; 打开 goproxy 仓库的 &lt;strong&gt;Browse&lt;/strong&gt; 页，模块已经列出来了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-goproxy-browse.png&quot; alt=&quot;goproxy Browse 页&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 13：goproxy 仓库的 Browse 页：pelletier/go-toml v2.2.2（example 项目的间接依赖）已缓存在库中——代理生效的直接证据&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;这个模块此前在 Nexus 里不存在，是这次请求从 goproxy.cn 取回来缓存的，再跑一次秒回——全部命中缓存。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;go-dev-dl（Go 工具链代理）。&lt;/strong&gt; CI/CD 里装 Go 经常要下载&lt;strong&gt;不同版本&lt;/strong&gt;的工具链（&lt;code&gt;go&lt;/code&gt;/&lt;code&gt;gofmt&lt;/code&gt; 等命令打包的 tar 包），官方下载目录 &lt;code&gt;https://go.dev/dl/&lt;/code&gt; 内网访问&lt;strong&gt;不稳且慢&lt;/strong&gt;，所以代理：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-godevdl-create.png&quot; alt=&quot;创建 go-dev-dl 仓库&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 14：创建 go-dev-dl 代理仓库：Recipe raw (proxy)，上游填 https://go.dev/dl/（Go 官方工具链下载目录）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;建完浏览，&lt;code&gt;go1.26.3&lt;/code&gt; 的工具链压缩包已缓存（团队 CI 引用的就是这个版本）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-godevdl-browse.png&quot; alt=&quot;go-dev-dl Browse 页&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 15：go-dev-dl 的 Browse 页：go1.26.3 工具链压缩包已缓存&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sonar-scanner-cli（扫描器安装包代理）。&lt;/strong&gt; SonarQube 流水线要下载 SonarScanner CLI 可执行文件，官方站 &lt;code&gt;sonarsource.com&lt;/code&gt; 内网不通，代理它：跑工作流时免出网、省流量：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-scanner-create.png&quot; alt=&quot;创建 sonar-scanner-cli 仓库&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 16：创建 sonar-scanner-cli 代理仓库：上游填 https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;浏览可见扫描器包已缓存：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-scanner-browse.png&quot; alt=&quot;sonar-scanner-cli Browse 页&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 17：sonar-scanner-cli 的 Browse 页：sonar-scanner-cli-8.1.0.6389 安装包已缓存（流水线 scannerFile 引用的就是它）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;这个仓库在&lt;strong&gt;权限&lt;/strong&gt;上比较特别：为了让流水线免凭据下载，给 &lt;strong&gt;anonymous 角色&lt;/strong&gt;（“未登录“身份的统称）授予了该仓库的读权限（权限 ID &lt;code&gt;nx-repository-view:sonar-scanner-cli:*&lt;/code&gt;）；其余仓库保持默认“必须登录”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;debian / debian-security（apt 源代理）。&lt;/strong&gt; 构建镜像基于 debian bookworm，Dockerfile 里 apt 装包，官方源 &lt;code&gt;deb.debian.org&lt;/code&gt; 内网不通，再建两个 apt (proxy) 仓库（Nexus 的 apt 专用表单，理解成“专门代理 Debian 源的 raw 仓库“即可），上游分别指向官方主源与安全更新源。apt 请求不带凭据，所以这两个仓库同样开匿名读（只代理公开内容）。&lt;/p&gt;
&lt;p&gt;六个仓库建完，Repositories 列表的最终状态：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-repositories-all.png&quot; alt=&quot;Nexus Repositories 列表&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 18：Nexus Repositories 列表：&lt;code&gt;goproxy&lt;/code&gt;（Go 模块代理，已缓存 589.6 MB）/ &lt;code&gt;go-sumdb&lt;/code&gt;（校验数据库代理）/ &lt;code&gt;go-dev-dl&lt;/code&gt;（工具链代理）/ &lt;code&gt;sonar-scanner-cli&lt;/code&gt;（扫描器安装包存放）/ &lt;code&gt;debian&lt;/code&gt; / &lt;code&gt;debian-security&lt;/code&gt;（apt 主源与安全更新源代理）全部 Online&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;3-shi-yong-ba-go-xiang-mu-zhi-dao-nei-wang-nexus&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#3-shi-yong-ba-go-xiang-mu-zhi-dao-nei-wang-nexus&quot; aria-label=&quot;Anchor link for: 3-shi-yong-ba-go-xiang-mu-zhi-dao-nei-wang-nexus&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
3 使用：把 Go 项目指到内网 Nexus&lt;/h2&gt;
&lt;h3 id=&quot;3-1-si-ge-go-huan-jing-bian-liang-ge-si-qi-zhi&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#3-1-si-ge-go-huan-jing-bian-liang-ge-si-qi-zhi&quot; aria-label=&quot;Anchor link for: 3-1-si-ge-go-huan-jing-bian-liang-ge-si-qi-zhi&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
3.1 四个 Go 环境变量，各司其职&lt;/h3&gt;
&lt;p&gt;把 Go 项目指向 Nexus = 把下面四个环境变量配正确：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;变量&lt;/th&gt;&lt;th&gt;干什么&lt;/th&gt;&lt;th&gt;本环境的值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GOPROXY&lt;/code&gt;&lt;/td&gt;&lt;td&gt;模块下载走哪个渠道。逗号分隔 = “前面 404 再试后面”；特殊值 &lt;code&gt;direct&lt;/code&gt; = “直接去源码仓库（git）拿”&lt;/td&gt;&lt;td&gt;本地开发 &lt;code&gt;…/goproxy/,direct&lt;/code&gt;；流水线 &lt;code&gt;…/goproxy/&lt;/code&gt;（不带 &lt;code&gt;,direct&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GOSUMDB&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下载后到校验数据库核对模块哈希&lt;/td&gt;&lt;td&gt;流水线指向内网 &lt;code&gt;go-sumdb&lt;/code&gt; 代理，在线校验保持开启&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GOPRIVATE&lt;/code&gt;&lt;/td&gt;&lt;td&gt;声明“这些模块路径是私有的“：&lt;strong&gt;同时跳过&lt;/strong&gt;代理和校验库（私有模块公共代理里没有）&lt;/td&gt;&lt;td&gt;未设置（本例模块都是公开的）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GOINSECURE&lt;/code&gt;&lt;/td&gt;&lt;td&gt;对指定域名跳过 TLS 证书校验（给自签证书的自家服务用）&lt;/td&gt;&lt;td&gt;未设置（Nexus 由内网 CA 正规签发，系统已信任）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-2-zen-me-pei&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#3-2-zen-me-pei&quot; aria-label=&quot;Anchor link for: 3-2-zen-me-pei&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
3.2 怎么配&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;层级一：临时（当前终端）&lt;/strong&gt;——shell 环境变量，先试通再固化：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 做什么：让当前 shell 里的 go 命令走 Nexus&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 怎么做：export 成环境变量&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 为什么：先试通再固化；关掉终端即失效，不影响别人&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;export&lt;/span&gt;&lt;span&gt; GOPROXY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;https://nexus.kali-team.internal/repository/goproxy/,direct&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;export&lt;/span&gt;&lt;span&gt; GOSUMDB&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;sum.golang.org https://nexus.kali-team.internal/repository/go-sumdb/&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;层级二：持久（本用户所有 go 命令，推荐）&lt;/strong&gt;——&lt;code&gt;go env -w&lt;/code&gt; 写进 Go 自己的用户级配置文件（路径用 &lt;code&gt;go env GOENV&lt;/code&gt; 可查，与 shell 无关）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; env -w GOPROXY=&amp;quot;https://nexus.kali-team.internal/repository/goproxy/,direct&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; env -w GOSUMDB=&amp;quot;sum.golang.org https://nexus.kali-team.internal/repository/go-sumdb/&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;GOSUMDB 的两种写法&lt;/strong&gt;（最容易绕晕的一点，单独说）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 写法一（推荐，流水线在用）：sumdb 查询指向 Nexus 的 go-sumdb 代理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; env -w GOSUMDB=&amp;quot;sum.golang.org https://nexus.kali-team.internal/repository/go-sumdb/&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 写法二（不推荐）：关掉在线校验&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; env -w GOSUMDB=&amp;quot;off&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;写法一 两个字段（推荐）&lt;/strong&gt;：格式是 &lt;code&gt;&quot;校验库域名 + 代理基础 URL&quot;&lt;/code&gt;。Go 要查 &lt;code&gt;sum.golang.org&lt;/code&gt; 时不再直连公网，而是按这个基础 URL 拼出查询地址（大致是 &lt;code&gt;&amp;lt;基础URL&amp;gt;/sum.golang.org/lookup/&amp;lt;模块&amp;gt;@&amp;lt;版本&amp;gt;&lt;/code&gt;），请求走内网的 go-sumdb 仓库转发到 goproxy.cn——“在线校验在内网也通了”。流水线与 Dockerfile 都用这一写法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写法二 &lt;code&gt;off&lt;/code&gt;（不推荐）&lt;/strong&gt;：&lt;code&gt;off&lt;/code&gt; 是“不去校验数据库在线核对“，但&lt;strong&gt;不等于“完全不校验“&lt;/strong&gt;——&lt;code&gt;go.sum&lt;/code&gt; 文件记录的哈希在构建时仍会逐个本地比对，依赖内容被换掉、哈希对不上，构建直接失败。但 &lt;code&gt;go.sum&lt;/code&gt; 是仓库里&lt;strong&gt;自己维护&lt;/strong&gt;的文件：条目缺失、和恶意改动一起提交、新拉一个没有历史记录的模块时，它拦不住——sumdb 的在线校验（官方签名的校验数据）才是防“模块被篡改 / 供应链投毒“的&lt;strong&gt;最后一道防线&lt;/strong&gt;，内网也不能把这条通道断掉：go-sumdb 代理就是为此而建。只有“代理确实无法部署、且团队明确接受完整性降级“时才允许用 &lt;code&gt;off&lt;/code&gt;，并把风险写进文档——&lt;strong&gt;本环境不采用&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;坑（必读）&lt;/strong&gt;：不要写成“带路径的完整 URL“当单值——例如 &lt;code&gt;GOSUMDB=&quot;https://nexus…/go-sumdb/sumdb/sum.golang.org&quot;&lt;/code&gt; 会直接报错（&lt;code&gt;malformed verifier id&lt;/code&gt;）。&lt;code&gt;GOSUMDB&lt;/code&gt; 接受的是“域名（可选再加公钥/基础 URL）“，带路径的 URL 不是合法域名。那个带路径的 URL 是“Go 最终查询到的地址”，不是“要填的值“。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;关于 GOPROXY 末尾的 &lt;code&gt;,direct&lt;/code&gt;&lt;/strong&gt;：带上它，模块在 Nexus 里 404 时，go 会退回“直接去源码仓库（git）拿“——在内网到不了公网的场景里，这个回退基本必然失败，它的价值更多是让报错信息说清楚“是代理里没有这个模块“而不是含糊的网络错。流水线（dependency-track.yaml）选择&lt;strong&gt;不写&lt;/strong&gt; &lt;code&gt;,direct&lt;/code&gt;：失败就失败，绝不偷偷出网；本地开发可以保留，无实质差别。&lt;/p&gt;
&lt;h3 id=&quot;3-3-zen-me-yan-zheng-san-ceng-yan-zheng&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#3-3-zen-me-yan-zheng-san-ceng-yan-zheng&quot; aria-label=&quot;Anchor link for: 3-3-zen-me-yan-zheng-san-ceng-yan-zheng&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
3.3 怎么验证：三层验证&lt;/h3&gt;
&lt;p&gt;以 example 项目为例（16 个依赖，含 gin 框架）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 客户端：在项目目录里跑依赖下载&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; ~/IdeaProjects/example&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;   # 换成你自己的 Go 项目目录&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; mod download -x&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # -x 打印执行细节，方便看&amp;quot;卡在哪一步&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 检查当前生效的配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; env GOPROXY GOSUMDB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 预期输出（与 10.12 配的值一致）：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# https://nexus.kali-team.internal/repository/goproxy/,direct&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# sum.golang.org https://nexus.kali-team.internal/repository/go-sumdb/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;客户端层&lt;/strong&gt;：&lt;code&gt;go mod download&lt;/code&gt; 成功——内网到不了公网，这是唯一路径，成功即证明代理链路通了；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务端层&lt;/strong&gt;：Nexus 的 goproxy Browse 页（图 13）里，16 个模块陆续出现——每一条都是“这次请求从上游取回并缓存“的结果；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓存层&lt;/strong&gt;：再跑一次 &lt;code&gt;go mod download&lt;/code&gt;，秒级完成（全部命中缓存，不再请求上游）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;再回 goproxy 仓库的 Browse 页看一眼，缓存已经备齐：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kali-team.cn/blog/2026/09/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91-Nexus/nexus-goproxy-browse-all.png&quot; alt=&quot;goproxy Browse 全量缓存&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图 19：goproxy 的 Browse 页：代理缓存的模块路径列齐——&lt;code&gt;golang.org&lt;/code&gt;、&lt;code&gt;github.com&lt;/code&gt;、&lt;code&gt;k8s.io&lt;/code&gt; 等顶层路径；example 项目的 16 个依赖及其间接依赖都在这个仓库的缓存里&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-4-kuo-zhan-chang-jing-you-si-you-mo-kuai-shi-zen-me-pei&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#3-4-kuo-zhan-chang-jing-you-si-you-mo-kuai-shi-zen-me-pei&quot; aria-label=&quot;Anchor link for: 3-4-kuo-zhan-chang-jing-you-si-you-mo-kuai-shi-zen-me-pei&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
3.4 扩展场景：有私有模块时怎么配&lt;/h3&gt;
&lt;p&gt;example 的 16 个依赖全是公开模块，所以 &lt;code&gt;GOPRIVATE&lt;/code&gt; / &lt;code&gt;GOINSECURE&lt;/code&gt; 都没设。但团队将来难免要把&lt;strong&gt;私有模块&lt;/strong&gt;（代码放在自家 Gitea 上、公网代理里不可能有的 Go 模块）引进来，核心原则一句话：&lt;strong&gt;私有模块不能走公开代理、也不能去公开校验库查哈希&lt;/strong&gt;——代理里没有、校验库里也没有，硬走只会得到 404。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;声明私有模块路径：&lt;code&gt;GOPRIVATE&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 做什么：告诉 go &amp;quot;这个域名前缀下的模块路径都是私有的&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 怎么做：填模块路径里的域名（本环境示例 hub.kali-team.internal）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 为什么：命中后 go 对该模块同时跳过 GOPROXY 与 GOSUMDB，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;#         直接用 git 去源码仓库取&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;export&lt;/span&gt;&lt;span&gt; GOPRIVATE&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;hub.kali-team.internal&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;填的是“模块路径的域名“，不一定是 Web 域名。&lt;/strong&gt; 模块路径是 Go 项目引用一个模块时，在 &lt;code&gt;go.mod&lt;/code&gt; 的 &lt;code&gt;require&lt;/code&gt; 行里写的那个地址——比如 Gitea 上 &lt;code&gt;dev-sec-ops/example&lt;/code&gt; 组织里的代码，被引用时写 &lt;code&gt;hub.kali-team.internal/dev-sec-ops/example&lt;/code&gt;，&lt;code&gt;hub.kali-team.internal&lt;/code&gt; 就是模块路径的第一段。Gitea 的惯例是模块路径默认用代码托管域名，所以本环境两者恰好重合——但规则本身是“看模块路径“：如果哪天用独立域名给模块寻址（vanity path），要填那个域名，而不是 Web 域名。&lt;code&gt;GOPRIVATE&lt;/code&gt; 支持逗号分隔多个、也支持通配符（如 &lt;code&gt;*.example.com&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;git 认证：两种写法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;跳过代理之后，go 靠 &lt;strong&gt;git&lt;/strong&gt; 从源码仓库取私有模块——于是需要凭据。本环境（Gitea 托管）两种写法都可行：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 写法一：HTTPS + Gitea 访问令牌&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 做什么：git 每次要访问 &amp;quot;https://hub.kali-team.internal&amp;quot; 前，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;#         自动改写成&amp;quot;带令牌&amp;quot;的地址&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 怎么做：git config 的 url.&amp;lt;新前缀&amp;gt;.insteadOf &amp;quot;&amp;lt;旧前缀&amp;gt;&amp;quot;——git 的&amp;quot;URL 改写&amp;quot;机制，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;#         发送请求前把旧前缀替换成新前缀，令牌随之带上&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 为什么：不用每次手动输凭据；&amp;lt;GITEA_TOKEN&amp;gt; 是 Gitea 的访问令牌&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;#         （&amp;quot;让程序代表你操作仓库&amp;quot;的凭据，Gitea 个人设置里创建、长期有效，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;#          按密码级别管理：只进凭据管理，不进文章 / 代码）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; config --global url.&amp;quot;https://&amp;lt;GITEA_TOKEN&amp;gt;@hub.kali-team.internal&amp;quot;.insteadOf &amp;quot;https://hub.kali-team.internal&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 写法二：SSH 公钥（本机公钥已加入 Gitea）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 做什么：git 去 &amp;quot;https://hub.kali-team.internal/&amp;quot; 取模块时，改走 SSH 通道&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 怎么做：同样的 insteadOf 改写；SSH 通道是 Gitea 的 NodePort 32222&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# 为什么：机器不用持有令牌（长期凭据），认证靠公钥；本机同步内网仓库用的就是这条通道&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; config --global url.&amp;quot;ssh://git@hub.kali-team.internal:32222/&amp;quot;.insteadOf &amp;quot;https://hub.kali-team.internal/&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;怎么选：&lt;strong&gt;长期跑在机器上的自动化（开发机、Runner）推荐 SSH&lt;/strong&gt;——公钥没有“过期“一说，一台机器一把钥匙、互不影响；HTTPS 令牌更简单（一行配置），但令牌是长期凭据，要按密码的纪律保管（泄露即轮换）。流水线里要取私有模块，思路不变：job 级 env 设 &lt;code&gt;GOPRIVATE&lt;/code&gt;，再在步骤里加一段上面的 git config。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;GOINSECURE&lt;/code&gt;：只给自签证书的域名用，本环境用不到&lt;/strong&gt;：它专门服务于“证书自签、系统不信任“的服务。Nexus 与 Gitea 的证书都是内网 CA 正规签发、系统信任库已包含该 CA，没有跳过校验的必要——而且跳过校验是安全降级，不该顺手就开。&lt;/p&gt;
&lt;h3 id=&quot;3-5-go-mo-kuai-xia-zai-bao-cuo-zen-me-du-pai-cha-shun-xu&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#3-5-go-mo-kuai-xia-zai-bao-cuo-zen-me-du-pai-cha-shun-xu&quot; aria-label=&quot;Anchor link for: 3-5-go-mo-kuai-xia-zai-bao-cuo-zen-me-du-pai-cha-shun-xu&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
3.5 Go 模块下载报错怎么读：排查顺序&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;go mod download&lt;/code&gt; 的报错五花八门，但&lt;strong&gt;第一行错误基本都标明了卡在哪一层&lt;/strong&gt;。按“客户端配置 → 网络 → 凭据 → 服务端代理“的顺序逐层排除，大多数问题能在前三层定位：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;报错关键字（第一行）&lt;/th&gt;&lt;th&gt;卡在哪&lt;/th&gt;&lt;th&gt;先做什么&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;取模块时 &lt;code&gt;404 Not Found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;代理里没有这个模块&lt;/td&gt;&lt;td&gt;先怀疑自己：模块路径拼写错误（大小写敏感）；是私有模块却报 404 → &lt;code&gt;GOPRIVATE&lt;/code&gt; 没设；公开模块代理里没有 → 模块不存在 / 已改名 / 上游也没有&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;malformed verifier id&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;GOSUMDB&lt;/code&gt; 写法非法&lt;/td&gt;&lt;td&gt;改成 3.2 的两字段写法&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;lookup …: no such host&lt;/code&gt; / &lt;code&gt;connection refused&lt;/code&gt; / &lt;code&gt;i/o timeout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;网络层：根本到不了代理&lt;/td&gt;&lt;td&gt;查 &lt;code&gt;go env GOPROXY&lt;/code&gt; 的地址端口；内网域名要能解析（hosts / DNS）；用 &lt;code&gt;curl&lt;/code&gt; 直接访问代理基础 URL——返回任何 HTTP 状态码都说明网络通，连不上才是网络问题&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;git 取私有模块报 &lt;code&gt;401&lt;/code&gt; / &lt;code&gt;403&lt;/code&gt;&lt;/td&gt;&lt;td&gt;git 认证没配或失效&lt;/td&gt;&lt;td&gt;检查 3.4“git 认证“里的 insteadOf 改写是否存在、令牌是否有效&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;checksum mismatch&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下载内容的哈希与 &lt;code&gt;go.sum&lt;/code&gt; 记录不符&lt;/td&gt;&lt;td&gt;依赖被篡改、或 &lt;code&gt;go.sum&lt;/code&gt; 本身损坏——&lt;strong&gt;不要&lt;/strong&gt;顺手删掉 &lt;code&gt;go.sum&lt;/code&gt; 重新生成（那等于放弃这道防线），先核对 &lt;code&gt;go.sum&lt;/code&gt; 的来源与模块版本&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;module lookup disabled by GOPROXY=off&lt;/code&gt;&lt;/td&gt;&lt;td&gt;代理通道被关了&lt;/td&gt;&lt;td&gt;本环境不该出现；查 &lt;code&gt;go env GOPROXY&lt;/code&gt; 为什么是 &lt;code&gt;off&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;第二步（看完报错必做）：&lt;code&gt;go env GOPROXY GOSUMDB GOPRIVATE GOINSECURE&lt;/code&gt; 核对实际生效值——常见情况是“改了没生效“：shell 环境变量与 &lt;code&gt;go env -w&lt;/code&gt; 写的不是一处，临时 &lt;code&gt;export&lt;/code&gt; 关掉终端就没了。&lt;/p&gt;
&lt;p&gt;第三步（客户端排完才走这步）：到服务端查——Nexus 的 goproxy Browse 页（图 13）看该模块有没有新条目；代理本身报错的话，再看仓库的上游配置。&lt;/p&gt;
&lt;h2 id=&quot;4-ci-cd-lian-dong-liu-shui-xian-zen-me-yong-nexus&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#4-ci-cd-lian-dong-liu-shui-xian-zen-me-yong-nexus&quot; aria-label=&quot;Anchor link for: 4-ci-cd-lian-dong-liu-shui-xian-zen-me-yong-nexus&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
4 CI/CD 联动：流水线怎么用 Nexus&lt;/h2&gt;
&lt;h3 id=&quot;4-1-quan-jing-shui-zai-yong-na-ge-cang-ku&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#4-1-quan-jing-shui-zai-yong-na-ge-cang-ku&quot; aria-label=&quot;Anchor link for: 4-1-quan-jing-shui-zai-yong-na-ge-cang-ku&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
4.1 全景：谁在用哪个仓库&lt;/h3&gt;
&lt;p&gt;三条现有流水线（&lt;code&gt;docker.yaml&lt;/code&gt; / &lt;code&gt;sonarqube.yaml&lt;/code&gt; / &lt;code&gt;dependency-track.yaml&lt;/code&gt;）和将来的工具链安装，都以 Nexus 为下载源：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;使用方&lt;/th&gt;&lt;th&gt;下载什么&lt;/th&gt;&lt;th&gt;Nexus 仓库&lt;/th&gt;&lt;th&gt;配置在哪&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Dockerfile&lt;/code&gt; 构建阶段&lt;/td&gt;&lt;td&gt;Go 模块依赖（gin 等）&lt;/td&gt;&lt;td&gt;&lt;code&gt;goproxy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ENV GOPROXY=… GOSUMDB=&quot;sum.golang.org https://nexus.kali-team.internal/repository/go-sumdb/&quot;&lt;/code&gt;（当前依赖已预烤进 &lt;code&gt;gomod-cache&lt;/code&gt; 镜像，此 env 是现场需要取件时的兜底）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dependency-track.yaml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;cyclonedx-gomod&lt;/code&gt; 及其模块依赖&lt;/td&gt;&lt;td&gt;&lt;code&gt;goproxy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;job 级 &lt;code&gt;env&lt;/code&gt; + “准备 Go 模块依赖“步骤&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sonarqube.yaml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;SonarScanner CLI 安装包&lt;/td&gt;&lt;td&gt;&lt;code&gt;sonar-scanner-cli&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;scannerBinariesUrl&lt;/code&gt; + &lt;code&gt;scannerFile&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Dockerfile&lt;/code&gt; apt 步骤&lt;/td&gt;&lt;td&gt;Debian apt 包（索引文件 + .deb）&lt;/td&gt;&lt;td&gt;&lt;code&gt;debian&lt;/code&gt; / &lt;code&gt;debian-security&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Dockerfile 的 sed 源改写&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;（将来）需要特定 Go 版本的流水线&lt;/td&gt;&lt;td&gt;Go 工具链压缩包&lt;/td&gt;&lt;td&gt;&lt;code&gt;go-dev-dl&lt;/code&gt;&lt;/td&gt;&lt;td&gt;setup-go 的 &lt;code&gt;go-download-base-url&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;4-2-dependency-track-yaml-mo-kuai-yi-lai-zou-goproxy&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#4-2-dependency-track-yaml-mo-kuai-yi-lai-zou-goproxy&quot; aria-label=&quot;Anchor link for: 4-2-dependency-track-yaml-mo-kuai-yi-lai-zou-goproxy&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
4.2 dependency-track.yaml：模块依赖走 goproxy&lt;/h3&gt;
&lt;p&gt;实际文件的相关片段（已入库 example 仓库）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;  dependency-track&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;    runs-on&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; ubuntu-host&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;    env&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;      # 做什么：本 job 里所有 Go 模块下载走 Nexus 的 goproxy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;      # 为什么：任务容器到不了公网；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;      #         不写 ,direct——失败就失败，绝不偷偷出网&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;      GOPROXY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;https://nexus.kali-team.internal/repository/goproxy/&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;      GOSUMDB&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;sum.golang.org https://nexus.kali-team.internal/repository/go-sumdb/&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;  # sumdb 校验走 Nexus go-sumdb 代理，保持在线校验不关闭（go.sum 本地哈希校验始终生效）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;    steps&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;      # … Init / Checkout / Verify Certificate（与另两条流水线一致，此处省略）…&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;      -&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt; name&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; 准备 Go 模块依赖&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;        run&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;          go version        # 确认任务容器里可用的 Go 版本（1.25.14）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;          go mod download   # 先把项目依赖批量拉好（经代理，缓存进任务容器）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;      -&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt; name&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; 生成 CycloneDX SBOM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;        uses&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; https://hub.kali-team.internal/actions/cyclonedx-gomod-generate-sbom@v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;        with&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # cyclonedx-gomod 的 Go 模块版本：action 用 `go run` 现场编译，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # 它这个模块本身也经 Nexus goproxy 下载&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          version&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;v1.10.0&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          args&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;app -json -output bom.json -packages -files -licenses -main .&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重点在 &lt;code&gt;env&lt;/code&gt; 两行：写在 &lt;strong&gt;job 级&lt;/strong&gt;，意味着本 job 所有步骤（包括生成 SBOM 那步——它自己就要编译 Go 代码）都走同一个内网下载源——整条流水线零公网连接。&lt;code&gt;go mod download&lt;/code&gt; 步骤是“把依赖提前“：先把项目的 16 个模块批量拉好，后面生成 SBOM 的步骤不用再拉。补一句容易忽略的：常规构建（模块已在 &lt;code&gt;gomod-cache&lt;/code&gt; 预烤缓存里、&lt;code&gt;go.sum&lt;/code&gt; 完整）根本不会触发 sumdb 查询，go-sumdb 代理只在“全新模块要校验“时出场——兜底通道平时安静，但必须活着。&lt;/p&gt;
&lt;h3 id=&quot;4-3-sonarqube-yaml-scanner-lai-zi-raw-dai-li&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#4-3-sonarqube-yaml-scanner-lai-zi-raw-dai-li&quot; aria-label=&quot;Anchor link for: 4-3-sonarqube-yaml-scanner-lai-zi-raw-dai-li&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
4.3 sonarqube.yaml：scanner 来自 raw 代理&lt;/h3&gt;
&lt;p&gt;实际文件的相关片段（已入库 example 仓库）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;      -&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt; name&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; SonarQube Scan 静态代码扫描&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;        uses&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; https://hub.kali-team.internal/actions/sonarqube-scan-action@v9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;        env&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          SONAR_TOKEN&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; ${{ secrets.SONAR_TOKEN }}&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;       # SonarQube 用户级 API token（长期有效）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          SONAR_HOST_URL&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; ${{ secrets.SONAR_HOST_URL }}&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt; # https://sonarqube.kali-team.internal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          NODE_EXTRA_CA_CERTS&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; /usr/local/share/ca-certificates/kali-team-ca.crt&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;  # 信任内网 CA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;        with&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # 做什么：scanner 的下载源改为 Nexus 的 sonar-scanner-cli 仓库&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # 为什么：官方站 sonarsource.com 内网不通；代理更快更稳、省流量&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          scannerBinariesUrl&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; https://nexus.kali-team.internal/repository/sonar-scanner-cli/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # 做什么：显式指定要下载的文件名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # 为什么：raw 仓库没有目录列表接口，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          #         不能&amp;quot;运行时列目录挑一个&amp;quot;，必须写死文件名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          scannerFile&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; sonar-scanner-8.1.0.6389-linux.tgz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          projectBaseDir&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # 官方 action 原本会对下载包做 GPG 签名校验；内网 Nexus 里的包&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # 没有签名可验（是从官方站取回缓存的同一文件），兼容需要关掉&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          skipSignatureVerification&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;三个值得注意的点：一是&lt;strong&gt;全程没传任何用户名密码&lt;/strong&gt;——靠的是 2.5 给这个仓库开的匿名读权限，流水线侧比“机器账号“更省事（且该仓库只存公开扫描器包，无敏感内容）；二是 &lt;code&gt;scannerFile&lt;/code&gt; 显式写死是 raw 仓库“无目录列表“逼出来的；三是 action 用 &lt;code&gt;wget&lt;/code&gt; 下载、解压后执行——scanner 本体约 9MB，大头（JRE 运行时）已在任务镜像里预装。&lt;/p&gt;
&lt;h3 id=&quot;4-4-go-dev-dl-go-gong-ju-lian-zhe-yang-xia&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#4-4-go-dev-dl-go-gong-ju-lian-zhe-yang-xia&quot; aria-label=&quot;Anchor link for: 4-4-go-dev-dl-go-gong-ju-lian-zhe-yang-xia&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
4.4 go-dev-dl：Go 工具链这样下&lt;/h3&gt;
&lt;p&gt;场景：任务容器自带默认 Go 版本（1.25.14）；如果某个项目要更新的版本（比如 1.26.3），流水线需要&lt;strong&gt;现场安装&lt;/strong&gt;。&lt;code&gt;setup-go&lt;/code&gt; 这个 action 的 &lt;code&gt;go-download-base-url&lt;/code&gt; 输入就是为此设计的：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;      -&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt; name&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; 安装 Go 1.26.3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;        # 注意：setup-go 官方包托管在 github.com，内网到不了；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;        # 在本环境使用前需自托管进 actions 组织&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;        uses&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; actions/setup-go@v7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;        with&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          go-version&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;1.26.3&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;   # 要装的 Go 版本&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # 做什么：把工具链下载源从官方站改为 Nexus&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          # 为什么：第一次请求由 Nexus 转发到 go.dev/dl 并缓存（图 15 即缓存证据），&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;          #         之后装同一版本直接命中缓存，不再依赖外网&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3&quot;&gt;          go-download-base-url&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;https://nexus.kali-team.internal/repository/go-dev-dl/&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现状说明：example 仓库的三条流水线目前&lt;strong&gt;没走这条路&lt;/strong&gt;——任务容器已预装 Go，Docker 构建拉 golang 镜像走 Harbor 镜像代理、依赖走预烤缓存。go-dev-dl 仓库属于“先建好、要用即用“，图 15 的 &lt;code&gt;go1.26.3&lt;/code&gt; 缓存就是它已就绪的证据。&lt;/p&gt;
&lt;h3 id=&quot;4-5-dockerfile-apt-yuan-zou-liang-ge-dai-li&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#4-5-dockerfile-apt-yuan-zou-liang-ge-dai-li&quot; aria-label=&quot;Anchor link for: 4-5-dockerfile-apt-yuan-zou-liang-ge-dai-li&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
4.5 Dockerfile：apt 源走两个代理&lt;/h3&gt;
&lt;p&gt;构建镜像（debian bookworm 基座）在 Dockerfile 里 apt 装包，官方源内网不通。Debian 12 的源文件是 deb822 格式的 &lt;code&gt;/etc/apt/sources.list.d/debian.sources&lt;/code&gt;，在 Dockerfile 里直接 sed 把源域名改写到 Nexus 的两个代理仓库：&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;docker&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;RUN&lt;/span&gt;&lt;span&gt; set -eux; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    sed -i \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -e &lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;#39;s|http://deb.debian.org/debian|https://nexus.kali-team.internal/repository/debian|g&amp;#39;&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -e &lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;#39;s|https://deb.debian.org/debian|https://nexus.kali-team.internal/repository/debian|g&amp;#39;&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      /etc/apt/sources.list.d/debian.sources&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两个细节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一条替换同时覆盖两个源&lt;/strong&gt;：&lt;code&gt;-security&lt;/code&gt; 是域名后的前缀延续，替换域名后 &lt;code&gt;deb.debian.org/debian-security/...&lt;/code&gt; 变成 &lt;code&gt;…/repository/debian-security/...&lt;/code&gt;，主源与安全更新源各进各的仓库，不需要第二条规则；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;http / https 两条都改写&lt;/strong&gt;：镜像里的源文件两种写法都存在，漏一条就有那一路继续出公网。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;效果和其余仓库一样：apt 请求的索引文件与 .deb 从 Nexus 取，首次取回缓存、第二次构建命中本地。两个前提：构建阶段信任内网 CA（https 源要过 TLS 校验）；apt 不带凭据，所以这两个仓库开了匿名读。&lt;/p&gt;
&lt;h3 id=&quot;4-6-jia-zhi-nei-wang-tong-yi-xia-zai-ru-kou&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#4-6-jia-zhi-nei-wang-tong-yi-xia-zai-ru-kou&quot; aria-label=&quot;Anchor link for: 4-6-jia-zhi-nei-wang-tong-yi-xia-zai-ru-kou&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
4.6 价值：内网统一下载入口&lt;/h3&gt;
&lt;p&gt;回看六个仓库，它们背后的模式是同一个：&lt;strong&gt;凡是“公网来的“，先取回内网缓存一份，再用&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;可达&lt;/strong&gt;：任务容器只能到内网——把“下载源“一改（GOPROXY / scannerBinariesUrl / go-download-base-url / apt 源改写），整条流水线就通了，业务逻辑一行不动；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一份取回，全员共享&lt;/strong&gt;：第一次付“出网取件“的成本，之后第 N 条流水线、第 N 个开发者都是本地速度，公网流量也省了；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可控可审计&lt;/strong&gt;：团队下载了什么、从哪下、何时下的，Nexus 仓库和日志里都有记录，制品出了问题能追到具体条目；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可切换&lt;/strong&gt;：上游地址是配置项。哪天官方代理慢了，改仓库的上游地址即可，下游全部无感——下游只认内网入口。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Harbor 管容器镜像、Nexus 管代码级制品，两个仓库分工明确，内网的依赖下载通道就此齐了。&lt;/p&gt;
&lt;h2 id=&quot;xiao-jie&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#xiao-jie&quot; aria-label=&quot;Anchor link for: xiao-jie&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
小结&lt;/h2&gt;
&lt;p&gt;这一篇给内网 DevSecOps 体系补上了&lt;strong&gt;依赖下载通道&lt;/strong&gt;：Nexus 制品仓库（3.96.1）装进 k3s，配好六个代理仓库（&lt;code&gt;goproxy&lt;/code&gt; / &lt;code&gt;go-sumdb&lt;/code&gt; / &lt;code&gt;go-dev-dl&lt;/code&gt; / &lt;code&gt;sonar-scanner-cli&lt;/code&gt; / &lt;code&gt;debian&lt;/code&gt; / &lt;code&gt;debian-security&lt;/code&gt;），Go 依赖、校验数据、工具链、扫描器、apt 源这些“公网来的“东西，从此在内网都能取到并缓存。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;搭建&lt;/strong&gt;：共享 PostgreSQL 先行（middleware 命名空间，bitnami chart，关键是库名、三个 PG 参数、2Gi 资源上限），Nexus 随后（sonatype 命名空间，官方 nxrm-ha chart，关键是外置数据库、20Gi local-path PVC、1G JVM 堆、单副本起步）；界面里先建 Blob Store 再建六个代理仓库；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用&lt;/strong&gt;：四个环境变量各司其职；sumdb 两种写法——两字段代理写法（推荐，在线校验保持开启）与 &lt;code&gt;off&lt;/code&gt;（不推荐，本环境不采用）；验证三层：客户端下载成功、服务端 Browse 有条目、再跑命中缓存；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI/CD 联动&lt;/strong&gt;：&lt;code&gt;dependency-track.yaml&lt;/code&gt; 的 job env 把 GOPROXY 指到 goproxy（整条流水线零公网）、&lt;code&gt;sonarqube.yaml&lt;/code&gt; 的 scanner 走 raw 代理（文件名必须显式写死）、go-dev-dl 为将来的“特定版本 Go 安装“备好、Dockerfile 的 apt 源 sed 改写走 debian 代理；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;坑&lt;/strong&gt;：raw 无目录列表、GOSUMDB 格式、strictContentTypeValidation 位置、Blob Store 顺序、上游不稳、Bitnami 警告（见“常见问题与坑“）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下一步可选：建 &lt;strong&gt;Hosted&lt;/strong&gt; 仓库发布内部 Go 模块与内部二进制包（团队的“自己的仓“）、用 &lt;strong&gt;Group&lt;/strong&gt; 仓库把“代理 + 托管“聚合成统一入口（客户端 GOPROXY 只配一行）；再往后可以接 Nexus 的 OIDC 登录细化与漏洞扫描能力（Nexus 有内置漏洞扫描插件，商业版）。至此内网各平台就位：Gitea（代码）→ Harbor（镜像）→ Nexus（制品）→ SonarQube（代码质量）→ Dependency-Track（依赖安全）。&lt;/p&gt;
&lt;h2 id=&quot;can-kao&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#can-kao&quot; aria-label=&quot;Anchor link for: can-kao&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https://help.sonatype.com/en/go-repositories.html&quot;&gt;Sonatype：Go repositories（官方 Go 模块代理配置指南）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https://help.sonatype.com/en/nexus-repository-3.html&quot;&gt;Nexus Repository 3 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https://go.dev/ref/mod#authenticating&quot;&gt;Go：Module authentication（GOSUMDB / sumdb 协议）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https://go.dev/ref/mod#proxy-protocol&quot;&gt;Go：Module proxy protocol（GOPROXY）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https://goproxy.cn&quot;&gt;goproxy.cn（本部署 goproxy / go-sumdb 的上游）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https://sonatype.github.io/helm3-charts/&quot;&gt;Sonatype Helm chart 仓库（nxrm-ha chart 来源）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/&quot;&gt;SonarScanner CLI 官方发行目录（本部署 sonar-scanner-cli 仓库的上游）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        <summary type="html">在内网 DevSecOps 体系里部署 Nexus 制品仓库：讲清制品 / 代理 / sumdb 概念与搭建过程，给出 GOPROXY/GOSUMDB 完整用法，以及流水线下载依赖、SonarScanner、Go 工具链、Docker 构建 apt 源的联动</summary>
        </entry>
</feed>
