我正在尝试在只能连接外部硬盘驱动器的服务器上创建一个具有 pip 搜索功能的完整本地 PyPI 存储库镜像。需要明确的是,我不需要一个简单的缓存系统,服务器与完全封闭的网络中的其他机器连接,根本无法访问互联网。
到目前为止,我所做的就是使用 bandersnatch 转储每个 PyPI 包,并且我可以在其前面使用一个简单的 http 服务器进行 pip install。我还检索了 PyPI 遗留源代码并使其在没有任何 python 包的情况下工作。我现在遇到的问题是链接双方,我什至不确定是否可以通过这种方式完成。
我还测试了 pypiserver。它本来可以完成我想要的,但它太慢了,最终导致 pip search 抛出超时(看起来它不是为了处理那么多包而构建的)。
最后,我看了一下 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
此时,如果以上所有设置均已成功完成,您应该能够打开 Web 浏览器并将其指向
devpi
服务器,并使用
http://localhost:3141/myuser/myindex
这各不相同。我们使用
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/