Как сделать локальное зеркало Pypi без доступа в интернет и с возможностью поиска?

Я пытаюсь создать полное локальное зеркало Pypi-репозитория с функцией поиска pip на сервере, к которому я могу подключить только внешний жесткий диск. Чтобы было ясно, я не хочу простой системы кеширования, сервер подключен к другим машинам в полностью закрытой сети, нет доступа к Интернету вообще.

До сих пор я делал дамп всех пакетов pypi с помощью bandersnatch, и я могу выполнить установку pip с помощью простого http-сервера перед ним. Я также получил унаследованный исходный код pypi и заставил его работать без пакетов Python внутри. Проблема, с которой я сталкиваюсь сейчас, состоит в том, чтобы связать обе стороны, и я даже не уверен, что это можно сделать таким образом.

Я также тестировал pypiserver. Он мог бы сделать то, что я хотел, но он слишком медленный и заканчивался тайм-аутом поиска в пипсах (похоже, он не был создан для обработки такого количества пакетов).

Наконец, я взглянул на devpi. Кажется, хорошо справляется со своей работой, но я ищу способ легко импортировать в нее мой дамп Bandersnatch. Не похоже, что я могу создать индекс на основе локального каталога.

Спасибо за любой ответ.

1 ответ

Я мог бы также дать правильный ответ на это о том, как мы получили DevPi работает довольно хорошо в нашей среде:

  1. Установите DevPi

DevPi требует Python 3! Поэтому убедитесь, что у вас есть версия Python 3 pip установлены. Используя это:

pip install -U devpi

(вероятно, как корень) должен сделать свое дело.

  1. Убедитесь, что ваш сервер брандмауэр открыт

DevPi использует порт 3141 по умолчанию. Если у вас есть firewall-cmd установлено что-то вроде

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

или эквивалентная команда в вашей системе.

  1. конфигурировать 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
  1. Начни это

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

  2. Попробуйте установить пакет

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

Если что-то пойдет не так, проверьте логи, в нашем случае они были в /var/www/pypi/.xproc/devpi-server/xprocess.log

На этом этапе, если все вышеуказанные настройки были успешно выполнены, вы сможете открыть веб-браузер и указать его на devpi сервер с

http://localhost:3141/myuser/myindex
  1. Сделайте так, чтобы 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
  1. Настроить клиента

Чтобы указать вашим клиентам 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/
Другие вопросы по тегам