如何在没有互联网访问且搜索可用的情况下制作本地 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(主接口)[关闭]