隔离网生存指南:内网 Nexus 搭建 PyPI 离线镜像全攻略

最近在一个与外网完全物理隔离的内网环境里折腾 Python 项目,第一道坎就是 pip install 根本无法联网。

折腾了一圈,最终选定 Sonatype Nexus Repository Manager 作为私有 PyPI 镜像站。它不仅免费、成熟、权限管理完善,同一套实例还能顺手管 Maven 和 npm。


今天把这套完整的内网搭建流程记录下来,特别是带 CUDA 版 PyTorch 的踩坑细节,帮你少走弯路。

🔧 前置避坑指南

在开始之前,有一个致命前提必须满足:
外网跳板机的 Python 版本,必须与内网开发机完全一致!

Python 打包时会根据版本和系统架构生成对应的 .whl 文件名(比如 cp311-win_amd64)。如果不一致,你千辛万苦拷进内网的包,根本装不上。
(本文环境均为 Windows)

🏗️ 第一步:配置 Nexus 仓库

登录 Nexus 管理后台(默认端口 8081)。进入 Repository → Repositories → Create repository。
按顺序建两个仓库:

  1. PyPI (hosted):建议命名为 pypi-local,专门用来接收我们手动上传的离线包。
  2. PyPI (group):建议命名为 pypi-group,把刚才的 local 加进去。以后内网机器只用认准这个 group 地址就行。

📦 第二步:外网跳板机下载离线包

找一台能上网的 Windows,确保 Python 版本没问题,执行:

# 进入存放 requirements.txt 的目录
cd d:\PyPI

# 下载所有项目依赖(含 PyTorch CUDA 专属包)到 offline_packages 文件夹
pip download -r requirements.txt -d ./offline_packages --extra-index-url https://download.pytorch.org/whl/cu121

# 顺带把上传工具 twine 和它的依赖也扒下来
pip download twine -d ./offline_packages

重点注意:--extra-index-url 是搞定带 CUDA 12.1 支持的 PyTorch 专属包的关键参数,不加这个你只会下到纯 CPU 版本。

🚛 第三步:人肉搬运

拿上你的 U盘,或者通过内网共享,把整个 offline_packages 文件夹完整拷进内网开发机。

🔨 第四步:内网离线安装 twine

在内网机打开命令行,进入离线包目录,执行安装:

pip install --no-index --find-links=.\offline_packages twine

--no-index 彻底掐断 pip 联网的念头,--find-links 让它老老实实从本地读包。

🚀 第五步:向 Nexus 批量推包

用刚才装好的 twine,把几百个包一次性轰进 Nexus 的 pypi-local 仓库里:

twine upload ^
  --repository-url http://<Nexus_IP>:8081/repository/pypi-local/ ^
  -u <Nexus用户名> ^
  -p <Nexus密码> ^
  .\offline_packages\*

推完稍等片刻,Nexus 会自动重建索引。此时在管理界面的包列表里就能看到了。

⚙️ 第六步:把 pip 指向内网

内网机不能上网,我们要让它默认去 Nexus 找包。
修改 Windows 的 pip 全局配置,路径在 %APPDATA%\pip\pip.ini。如果文件不存在就手动新建:

[global]
index-url = http://<Nexus_IP>:8081/repository/pypi-group/simple/
trusted-host = <Nexus_IP>

因为没配 HTTPS,trusted-host 必须加上,不然 pip 会一直报 SSL 验证失败的错。

✅ 第七步:见证奇迹

在内网开发机上敲下最终命令:

pip install -r d:\PyPI\requirements.txt

如果没有满屏红字,全部包都从内网 Nexus 极速拉取,这套环境就彻底跑通了。

🐛 高频报错排查

如果你还是翻车了,对照这里抢救一下:

  • 报错 SSL: CERTIFICATE_VERIFY_FAILED:pip 把你的 HTTP 地址当成 HTTPS 处理了。检查 pip.ini 里的 trusted-host 填对了没。
  • 某些包 404 Not Found:跳板机和内网机的 Python 版本或系统不一致,回外网重新下。
  • 找不到 +cu121 后缀的包:你外网下载时漏了那个巨长的 --extra-index-url 参数。
  • twine 上传报 403 Forbidden:Nexus 用户权限没给够。去确认下你的账号有没有 nx-repository-view-pypi-pypi-local-* 的权限。
  • pip 还在尝试连外网:你的 pip.ini 压根没生效,敲一行 pip config list 看看它到底读了哪个路径的配置。

这套体系搭好,后续再加什么新依赖,只需要“外网下载 → 内网上传”两步走。一次折腾,团队所有人都能直接连这个内网镜像站。

posted @ 2026-03-25 14:26  偶尔栖息  阅读(682)  评论(0)    收藏  举报