Python 如何使本地Pypi镜像无需internet访问,且具有可用的搜索功能?

Python 如何使本地Pypi镜像无需internet访问,且具有可用的搜索功能?,python,pip,pypi,devpi,pypiserver,Python,Pip,Pypi,Devpi,Pypiserver,我正在尝试在只能连接外部硬盘的服务器上制作一个带有pip搜索功能的完整本地Pypi存储库镜像。要明确的是,我不想要一个简单的缓存系统,服务器在一个完全封闭的网络中连接到其他机器,根本无法访问互联网 到目前为止,我所做的是用bandersnatch转储每个pypi包,我可以用它前面的一个简单http服务器进行pip安装。我还检索了pypi遗留源代码,使其在没有任何python包的情况下工作。我现在遇到的问题是将双方联系起来,我甚至不确定这样做是否可行 我还测试了pypiserver。它本可以完成我

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

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

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

最后,我看了一下devpi。似乎做的很好,我想做的,但我正在寻找一种方法,导入我的bandersnatch转储到它容易。看起来我无法基于本地目录创建索引


感谢您的回复。

我不妨提供一个适当的答案,说明我们是如何让
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服务器--host=0.0.0.0--port=3141--serverdir=/var/www/pypi

  • 尝试安装一个软件包

    pip安装-i simplejson

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

    此时,如果成功地遵循了上述所有设置,您应该能够打开一个web浏览器,并使用

    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/
    
    [全球]
    受信任主机=
    [安装]
    索引url=http://:3141/myuser/myindex/+simple/
    [搜寻]
    index=http://:3141/myuser/myindex/
    
    当我在关注同一个问题时,这个问题的时间安排得非常好:pip客户端将无法访问互联网,需要一个完整的PyPi镜像,从Bandersnatch开始,在我注意到它实际上只做缓存之前,看到devpi勾选了所有的框,现在正试图找出如何通过叠加devpi的索引来挽救我的大量bandersnatch下载@我刚下载完Bandersnatch的大量垃圾。你是说这是在浪费时间、精力和带宽吗?@ArjunJRao好吧,我只能回答:Bandersnatch做了你想做的一切吗?那我想这对你很有用。根据我的评论时间戳,我们已经使用devpi一年了,它非常棒!只有从远程缓存我们真正需要的东西,而不是整个PyPi归档,我们可以无缝地添加我们自己的包存储库,它有一些很好的管理工具来索引和清理存储库。
    [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/