Зеркало PyPI: как настроить pip, Poetry и свой сервер

Один раз PyPI уже отваливался на сутки…

Зеркало PyPI: как настроить pip, Poetry и свой сервер

PyPI работает как общий каталог, откуда программисты со всего мира скачивают готовые модули, и сейчас в нём больше 800 тысяч пакетов. Когда доступ к такому хранилищу пропадает, встают и рабочие проекты, и учебные задачи, и автоматические сборки на серверах. Разбираемся, почему установка пакетов зависит сразу от двух доменов, делимся списком рабочих зеркал и показываем, как поднять свой сервер.

ВАМ ПРИШЛО ПРИГЛАШЕНИЕ 💌
Приходите к нам в соцсети поделиться своим мнением и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!

Что случилось с PyPI и при чём здесь РКН?

1 июня 2026 года разработчики в России заметили, что PyPI не открывается. Данные сервиса Detector404 подтвердили, что проблема затронула пользователей в разных регионах — жалобы приходили из Петербурга, Саратова, Сочи и Хабаровска. Соединение обрывалось на этапе TLS — когда браузер или команда pip пытается установить защищённый канал с сервером.

Роскомнадзор в тот же день ответил на вопросы журналистов. Пресс-служба ведомства сообщила «Коммерсанту», что блокировок в отношении Python не вводили. Получилась ситуация с двумя версиями: пользователи видят обрыв соединения, регулятор отрицает свою причастность. Технические признаки сбоя напоминают работу фильтрующего оборудования, однако официального подтверждения этому нет.

К вечеру 1 июня жалоб стало меньше, а тесты Web Connectivity на следующий день показали частичное восстановление доступа. Сам эпизод закончился, а общая ситуация — нет.

Разработчику, впрочем, спор о причинах мало что даёт. Полезнее посмотреть на хронологию. 12 февраля 2026 года перестал открываться git.kernel.org, а следом встали обновления Astra Linux, «Альта» и Ред ОС — вендорам российских дистрибутивов пришлось качать ядро через VPN. 5 мая доля неудачных подключений к GitHub выросла с апрельских 4% примерно до 10%, на следующий день дошла до 16% и там осталась; при этом в США, Великобритании и Германии, по данным OONI, ничего похожего не происходило. 1 июня — PyPI. Каждый эпизод по отдельности выглядит случайностью, но вместе уже похоже на закономерность.

Почему PyPI считается критической точкой отказа?

За командой pip install стоит целая инфраструктура. PyPI устроен как связка двух узлов:

  • Первый узел находится по адресу pypi.org и работает как индекс, то есть каталог с названиями пакетов, их версиями и метаданными.
  • Второй узел расположен на домене files.pythonhosted.org, там лежат файлы библиотек.

Когда разработчик запускает установку, pip сначала обращается к индексу на pypi.org и узнаёт, где скачать нужную версию пакета. Затем инструмент идёт уже на files.pythonhosted.org за самим архивом. Если хотя бы один из двух доменов недоступен, зависимости Python перестают ставиться, и проект останавливается на этапе сборки.

Зеркало или прокси, настроенные только на индекс, решают задачу наполовину. Список пакетов при таком раскладе загрузится, однако ссылки внутри него всё равно ведут на files.pythonhosted.org, и скачивание завершится ошибкой. Нужно настраивать обход для обоих узлов сразу, иначе pip будет находить пакеты, но не сможет их получать.

Есть ещё одна деталь, которая помогает выбрать зеркало. Оба домена PyPI обслуживаются через CDN-сеть Fastly, а один адрес такой сети обслуживает тысячи чужих доменов разом. Фильтрующее оборудование может резать точечно по имени домена, а может рубить по диапазону адресов — и тогда уходит всё, что на этом адресе живёт. Отсюда правило: зеркало стоит выбирать на другой инфраструктуре, а не на той же, что и оригинал. Зеркала Цинхуа и Aliyun живут не на Fastly — и в июне продолжали работать, когда pypi.org не отвечал.

Как быстро переключиться на готовое зеркало PyPI?

Зеркало — это копия каталога PyPI на другом сервере. Если основной сайт недоступен, pip можно направить на такое зеркало, и установка пакетов продолжит работать.

Самый простой способ — флаг --index-url. Он меняет источник пакетов:

pip install requests --index-url https://pypi.tuna.tsinghua.edu.cn/simple

Чтобы не дописывать флаг каждый раз, зеркало прописывают в настройки насовсем. Команда pip config делает это одной строкой:

# Зеркало университета Цинхуа (Китай)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# Зеркало Aliyun (Китай)
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

Тот же результат даёт правка конфигурационного файла вручную. Внутри достаточно двух строк:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

В российском сегменте есть и публичное зеркало Яндекса, переключиться на него можно одной командой:

pip config set global.index-url https://mirror.yandex.ru/pypi/web/simple/

Крупные компании поднимают зеркала внутри периметра на базе Nexus или Artifactory — про них дальше отдельный раздел.

Технически зеркало может отдавать изменённые пакеты, поэтому подключать стоит только источники с известной репутацией — университетские или корпоративные. Хеш пакета стоит сверять с оригиналом на PyPI — так вы убедитесь, что зеркало отдало то же самое. Вернуться к стандартному источнику можно командой pip config unset global.index-url.

Когда есть смысл поднимать своё зеркало?

Свой PyPI-сервер выручает команды, которые собирают проекты по многу раз в день и не хотят каждый раз ходить в интернет. Среди прочих причин нестабильное соединение с публичными зеркалами, закрытый контур без внешнего доступа или нежелание зависеть от чужой инфраструктуры. Если pypi.org недоступен, локальное зеркало продолжит отдавать пакеты из своего кэша, и сборки не остановятся.

Разработчики используют два популярных инструмента — devpi и pypiserver. Devpi работает как кэширующий прокси: при первом запросе он скачивает пакет с pypi.org, сохраняет у себя и отдаёт локальную копию. Pypiserver раздаёт пакеты из обычной папки на диске.

Сложность в том, что кэшировать нужно две вещи сразу:

  • Индекс, то есть список пакетов и их версий, по которому pip ищет нужную сборку.
  • Сами файлы пакетов в форматах wheel и tar.gz. Если сохранить только файлы без индекса, pip не сможет их найти.

Devpi решает обе задачи из коробки через встроенный индекс root/pypi. Запускается тремя командами:

pip install devpi-server devpi-client
devpi-init
devpi-server --host 0.0.0.0 --port 3141

После этого pip переключается на локальный сервер одной настройкой:

pip config set global.index-url http://localhost:3141/root/pypi/+simple/

Теперь каждый запрошенный пакет оседает в кэше devpi, и повторные установки идут без обращения к pypi.org.

Маленьким командам хватает и pypiserver: pypi-server run -p 8080 ~/packages поднимет сервер, раздающий содержимое папки packages.

Полезный блок со скидкой

Если хочется не только переключать источники одной командой, но и понимать, как устроены зависимости, окружения и сборка Python-проектов, у Практикума есть программы для разных уровней. «Python-разработчик» подойдёт для изучения языка и бэкенда с нуля, а «Мидл Python-разработчик» — для тех, кто уже пишет на Python и хочет глубже разобраться в рабочих инструментах.

При оплате используйте промокод: KOD (можно просто нажать) на платное обучение действует скидка. 

Бесплатная вводная часть тоже есть — карту привязывать не нужно.

Чем отличаются корпоративные варианты Nexus и Artifactory для PyPI?

Локальные инструменты решают проблему одного разработчика. Когда пакеты нужны команде из 20 человек и сборочным серверам, приходится поднимать общий прокси-репозиторий. Речь про Sonatype Nexus и JFrog Artifactory — серверы, которые хранят пакеты разных экосистем, включая Python.

Выглядит это так: администратор разворачивает Nexus или Artifactory на сервере компании и создаёт там прокси-репозиторий для Python. Разработчики и CI/CD-пайплайны прописывают в настройках pip адрес этого сервера вместо pypi.org. Дальше сервер сам скачивает пакеты из внешнего PyPI, складывает их в кэш и раздаёт внутри сети. Если PyPI недоступен или заблокирован, ранее скачанные версии продолжают ставиться из кэша.

Отличие от devpi в том, что кэш общий, поэтому пакет скачивается из интернета один раз. Также есть права доступа: одним пользователям разрешена только установка, другим ещё и публикация внутренних пакетов. Ещё одно отличие — сборочные агенты в пайплайнах ходят на тот же сервер и не зависят от ноутбука конкретного разработчика с его VPN.

Критерийdevpi / pypiserverNexus RepositoryArtifactory
Для когоОдин разработчик, пет-проекты, стартап или небольшая команда10-100 разработчиков: компания с несколькими командами, 2–5 экосистем, есть DevOps-инженер100+ разработчиков: 5+ экосистем, требования к репликации между дата-центрами, аудиту и безопасности
Сложность настройкиНизкая: пара шаблонных команд для запускаСредняя: нужен выделенный сервер, настройка хранилища, прокси-репозиториевВысокая: требуется выделенный специалист/команда, настройка БД, кластеризации, интеграций с CI/CD
СтоимостьБесплатноCommunity Edition бесплатна: до 40 000 компонентов и 100 000 запросов в сутки. Pro платнаяОфициально из России недоступен

Отдельно про доступность из России. Sonatype и JFrog ушли с российского рынка ещё в 2022 году: коммерческие лицензии не продлеваются, оплата с российских карт не проходит, поддержки для корпоративных клиентов нет. Старые инсталляции продолжают работать, бесплатными редакциями пользуются на свой страх и риск — без обновлений безопасности и без возможности обратиться в поддержку.

Как настроить pip и Poetry на альтернативный источник?

Удобнее один раз прописать зеркало в конфигурации, и тогда все последующие установки пойдут через него автоматически. Утилита pip читает настройки из конфигурационного файла. На Linux и macOS он лежит по пути ~/.config/pip/pip.conf, на Windows — %APPDATA%\pip\pip.ini. Внутри указывается параметр index-url — адрес репозитория, откуда pip будет забирать пакеты. 

Файл pip.conf

Создать можно вручную или командой:

# Разовая установка через зеркало
pip install requests --index-url https://mirror.example.com/pypi/simple/

# Постоянная настройка одной командой
pip config set global.index-url https://mirror.example.com/pypi/simple/

Или то же самое прямо в файле:

[global]
index-url = https://mirror.example.com/pypi/simple/

После сохранения файла все команды pip install начнут ходить на указанный адрес без дополнительных флагов.

Команда source add

Poetry хранит список источников прямо в файле проекта pyproject.toml. Добавление выполняется командой poetry source add. Параметр priority определяет, куда инструмент пойдёт в первую очередь. Значение primary ставит зеркало выше стандартного PyPI:

# Добавить зеркало как основной источник
poetry source add --priority=primary mirror https://mirror.example.com/pypi/simple/

# Проверить список источников
poetry source show

Что делать, если зависимость нужна прямо сейчас?

Если PyPI заблокируют раньше, чем настроите зеркала, то найти нужный пакет можно через альтернативный индекс вручную. У pip есть параметр -i, который указывает другой источник пакетов вместо стандартного. Например, зеркало университета Цинхуа принимает команду вида pip install -i https://pypi.tuna.tsinghua.edu.cn/simple имя-пакета
Похожий индекс держит и Aliyun.

Если pip install не работает даже с чужим индексом, остаётся ручное скачивание. Любой индекс формата simple открывается в обычном браузере как список ссылок. Нужно найти там пакет, выбрать wheel-файл (готовый архив с расширением .whl), и сохранить его на диск. Дальше сработает локальная установка командой pip install путь-к-файлу.whl. Интернет на этом этапе уже не нужен. Зависимости пакета придётся скачать тем же способом, если их нет в системе.

Третий вариант заключается во временном включении VPN. Он годится как крайняя мера, когда предыдущие шаги не сработали. Некоторые VPN-сервисы и корпоративные прокси подменяют сертификаты, а значит трафик с пакетами проходит через чужие руки. Скачанный код стоит проверять по контрольным суммам с официальной страницы пакета. Специалисты по безопасности предупреждают о риске перехвата токенов и SSH-ключей через скомпрометированные прокси-ноды и телеграм-ботов, обещающих «доступ к репозиториям». Через непроверенный шлюз не стоит пускать ни установку пакетов, ни тем более git-операции с ключами.

Отдельная история — идея централизованного решения. 8 июня 2026 года Роскомнадзор провёл семинар «Решение проблем с доступом к зарубежным репозиториям», где предложили создать единый государственный VPN и рекомендовать разработчикам ходить через него. Технического документа опубликовано не было, а инженеры отнеслись к идее сдержанно, и одна из причин прямо касается pip: этот инструмент носит с собой собственный набор доверенных сертификатов через пакет certifi,  российского государственного там нет. Если шлюз станет расшифровывать трафик и переподписывать сертификаты, pip install начнёт падать с ошибкой SSL: CERTIFICATE_VERIFY_FAILED — то есть работать будет хуже, чем вообще без шлюза.

Ответы на частые вопросы

Работает ли PyPI в России сейчас?

Сбой 1 июня 2026 года продлился около суток, дальше доступ восстановился. Но доступность зависит от оператора, региона и времени суток: у одного провайдера всё открывается, у другого в то же время нет.

Можно ли полностью отказаться от pypi.org и работать только через зеркало?

Да, параметр index-url в настройках pip заменяет источник пакетов. Учтите задержку синхронизации, ведь свежие версии появляются на зеркалах на несколько часов позже.

Безопасно ли использовать сторонние зеркала?

Зеркала крупных компаний и университетов копируют пакеты без изменений, риск минимален. Малоизвестные источники лучше проверять через --require-hashes.

Нужно ли менять источник пакетов в Docker-образах отдельно?

Да, потому что контейнер не видит настройки основной системы. Адрес зеркала указывают в Dockerfile через --index-url у pip install или добавляют pip.conf внутрь образа.

Что делать, если зеркало недоступно?

Опция <code>--extra-index-url добавляет запасные источники, установка продолжится через них. В CI-системах также выручает заранее собранный локальный кэш пакетов.

Как проверить, что проблема именно в PyPI, а не в собственной сети?

Страница status.python.org показывает состояние pypi.org и files.pythonhosted.org. Если оба сервиса в статусе Operational, причина на стороне провайдера или локальной сети.

Июньский сбой продлился около суток, и в этом главная ловушка: проблема ушла раньше, чем большинство команд успели что-то поменять. А между командой pip install и готовым пакетом по-прежнему стоят два домена, чужая CDN-сеть, оборудование провайдера и фильтрующие системы, о работе которых можно только догадываться. Настроить зеркало и локальный кэш можно за полчаса — и это те полчаса, которые лучше потратить сейчас, а не когда сборка уже встала.

Хорошая новость в том, что экосистема Python изначально строилась с расчётом на подобные ситуации. Протокол индексов открытый, поэтому зеркала, кэширующие прокси и корпоративные репозитории подключаются штатными средствами.

Советуем дополнительно почитать

Бонус для читателей

Если вам интересно погрузиться в мир ИТ и при этом немного сэкономить, держите наш промокод на курсы Практикума. Он даст вам скидку при оплате, безлимит на маркетплейсах и поможет с льготной ипотекой. Ладно, окей, это просто скидка, без остального, но хорошая.

Вам может быть интересно
medium