如何在没有互联网访问且搜索可用的情况下制作本地 Pypi 镜像?

Posted

技术标签:

【中文标题】如何在没有互联网访问且搜索可用的情况下制作本地 Pypi 镜像?【英文标题】:How to make a local Pypi mirror without internet access and with search available? 【发布时间】:2016-11-22 23:40:42 【问题描述】:

我正在尝试在只能连接外部硬盘驱动器的服务器上创建具有 pip 搜索功能的完整本地 Pypi 存储库镜像。明确一点,我不想要一个简单的缓存系统,服务器连接到一个完全封闭的网络中的其他机器,根本无法访问互联网。

到目前为止,我所做的是用 bandersnatch 转储每个 pypi 包,我可以在它前面使用一个简单的 http 服务器进行 pip 安装。我还检索了 pypi 遗留源代码,并让它在没有任何 python 包的情况下工作。我现在遇到的问题是链接双方,我什至不确定这是否可以这样做。

我还测试了 pypiserver。它本可以完成我想要的,但它太慢了,最终导致 pip 搜索抛出超时(看起来它不是为处理那么多包而构建的)。

最后,我看了一下 devpi。似乎可以很好地完成我想做的工作,但我正在寻找一种方法可以轻松地将我的 bandersnatch 转储导入其中。看来我不能根据本地目录创建索引。

感谢您的回复。

【问题讨论】:

非常及时的问题,因为我正盯着同一个问题:pip 客户端将没有任何 Internet 访问权限,需要一个完整的 PyPi 镜像,在我注意到它基本上只做缓存之前从 Bandersnatch 开始,看到devpi 勾选了所有框 - 现在试图弄清楚如何通过叠加 devpi 的索引来挽救我大量的 bandersnatch 下载! @Marakai 我刚刚下载完 Bandersnatch 的大量转储。你是在告诉我这是在浪费时间、精力和带宽吗?? @ArjunJRao 好吧,我只能这样回答:Bandersnatch 会做你想做的一切吗?那我想它对你有用。根据我的评论时间戳,我们已经使用 devpi 一年了,它非常棒!只缓存我们实际需要的远程而不是整个 PyPi 档案,我们可以无缝地添加我们自己的包存储库,它有一些很好的管理工具来索引和清理存储库。 【参考方案1】:

关于我们如何让DevPi 在我们的环境中很好地工作,我不妨提供一个正确的答案:

    安装 DevPi

DevPi 需要 Python 3!因此,请确保您安装了 Python 3 版本的 pip。使用它:

pip install -U devpi

(可能以 root 身份)应该可以解决问题。

    确保您的服务器防火墙已打开

DevPi 默认使用端口 3141。如果你有 firewall-cmd 安装了类似的东西

firewall-cmd --zone=public --add-port=3141/tcp --permanent
firewall-cmd --reload

或系统上的等效命令。

    配置DevPi

DevPi 将使用开箱即用的PyPi。我们还希望能够“覆盖”我们自己的包,这些包仅在组织内部提供。对于本地 nabCERT 包,需要一个内部索引。好在这个本身可以使用 PyPi 作为后备!

选择要使用的 devpi 服务器 - 可能是您正在使用的服务器

devpi use  http://localhost:3141

现在创建一个可以添加和管理内部包并使用它们登录的用户

devpi user -c myuser  password=mypassword
devpi login myuser --password mypassword

现在创建我们的内部索引来保存本地包,同时确保它将使用 PyPi 作为“后备”

devpi index -c myindex bases=/root/pypi volatile=True

    启动它

    devpi-server --host=0.0.0.0 --port=3141 --serverdir=/var/www/pypi

    尝试安装一个包

    pip install -i http://localhost:3141/root/pypi/simplejson

如果出现问题,请检查日志,在我们的例子中,它们位于 /var/www/pypi/.xproc/devpi-server/xprocess.log

此时,如果上述所有设置都已成功执行,您应该可以打开网络浏览器并将其指向devpi 服务器

http://localhost:3141/myuser/myindex
    让 DevPi 自动启动

这会有所不同。我们使用systemd,所以我创建了一个文件/usr/lib/systemd/system/devpi.service

[Unit]
Requires=network-online.target
After=network-online.target 

[Service]
EnvironmentFile=-/etc/sysconfig/devpi
Type=forking
PIDFile=/var/www/pypi/.xproc/devpi-server/xprocess.PID
Restart=always
ExecStart=/bin/devpi-server --host=0.0.0.0 --port 3141 --serverdir /var/www/pypi --start
ExecStop=/bin/devpi-server --host=0.0.0.0 --port 3141 --serverdir /var/www/pypi --stop
User=root 

[Install]
WantedBy=multi-user.target

保存文件并通知systemd。

systemctl daemon-reload
systemctl enable devpi
    配置客户端

要让您的客户的pip 使用新的DevPi 存储库,请创建一个类似这样的/etc/pip.conf 文件

[global]
trusted-host = <server IP or FQDN>

[install]
index-url = http://<server IP or FQDN>:3141/myuser/myindex/+simple/

[search]
index = http://<server IP or FQDN>:3141/myuser/myindex/

【讨论】:

以上是关于如何在没有互联网访问且搜索可用的情况下制作本地 Pypi 镜像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有互联网访问的情况下运行颤振应用程序

如何在没有互联网连接、没有 eth0 且没有使用 C 的任何硬编码常量的情况下获取我的外部 IP(主接口)[关闭]

在没有任何库的情况下从多个图像用 Javascript 制作 GIF

我可以在没有互联网的情况下在本地托管网站吗

在没有互联网的情况下在 iPad 上下载和查看原型

如何在没有可信 SSL 证书的情况下在 Intranet 中运行 PWA?