• Русский
  • Как настроить управление пакетами PyPI с помощью Nexus Repository

    Overview

    Python Package Index, или PyPI, — это огромный репозиторий открытых Python-пакетов, предоставляемых всемирным сообществом разработчиков Python. Официальный индекс доступен по адресу https://pypi.org, а сам сайт поддерживается Python Software Foundation.

    Nexus Repository поддерживает проксирование Python Package Index. Это позволяет использовать пакеты из официального Python Package Index без повторных загрузок, что сокращает время и трафик при доступе к Python-пакетам.

    Кроме того, вы можете публиковать свои пакеты в приватном индексе в виде hosted-репозитория и объединять удалённые и приватные репозитории в группу репозиториев, которая объединяет и предоставляет содержимое нескольких репозиториев по одному удобному URL.

    Обзор типов репозиториев

    PyPI Proxy — действует как прокси для удалённых PyPI-репозиториев (например, https://pypi.org), кэшируя пакеты локально для более быстрого доступа и снижения использования трафика. При запросе пакета сначала проверяется локальный кэш, и если пакет не найден, он загружается из удалённого репозитория и кэшируется локально.

    PyPI Hosted — хранит пакеты, загруженные непосредственно в ваш экземпляр Nexus. Обычно используется для приватных пакетов, внутренних библиотек или пакетов, которыми вы хотите полностью управлять.

    PyPI Group — объединяет несколько PyPI-репозиториев (proxy, hosted или другие группы) в один логический репозиторий. При запросе пакета из группы Nexus последовательно ищет пакет в репозиториях-участниках в заданном порядке, пока пакет не будет найден. Примечание: репозиторий PyPI Group используется только для загрузки PyPI-пакетов, а не для их публикации.

    Типичная архитектура

    Распространённая конфигурация включает:

    1. PyPI Hosted — для приватных/внутренних пакетов
    2. PyPI Proxy — для кэширования публичных пакетов с PyPI.org
    3. PyPI Group — объединяет hosted и proxy репозитории, предоставляя единый точечный доступ

    Такая архитектура позволяет клиентам использовать один URL репозитория для бесшовного доступа как к приватным, так и к публичным пакетам.

    Требования

    • Экземпляр Nexus развернут, и вы вошли в систему с учетными данными администратора.
    • Локально установлен Python с доступным менеджером пакетов pip.

    Создание PyPI Proxy репозитория

    Если вы хотите использовать PyPI Proxy для кэширования пакетов PyPI, необходимо создать PyPI Proxy репозиторий. Примечание: экземпляр nexus должен быть доступен из интернета.

    Перейдите в интерфейс Nexus и выполните следующие шаги:

    1. Нажмите SettingsRepositoriesCreate repositoryPyPI (proxy)
    2. Заполните параметры конфигурации и нажмите Create repository

    Параметры конфигурации:

    • Name: введите имя репозитория, например, pypi-proxy
    • Remote storage: укажите URL удалённого репозитория, например, https://pypi.org
    • Storage: выберите подходящий тип хранилища в зависимости от ваших требований

    Создание PyPI Hosted репозитория

    Если вы хотите использовать PyPI Hosted для хранения пакетов PyPI, необходимо создать PyPI Hosted репозиторий.

    Перейдите в интерфейс Nexus и выполните следующие шаги:

    1. Нажмите SettingsRepositoriesCreate repositoryPyPI (hosted)
    2. Заполните параметры конфигурации и нажмите Create repository

    Параметры конфигурации:

    • Name: введите имя репозитория, например, pypi-hosted
    • Storage: выберите подходящий тип хранилища в зависимости от ваших требований
    • Deployment policy: выберите Allow redeploy или Disable redeploy в зависимости от потребностей

    Создание PyPI Group репозитория

    Перейдите в интерфейс Nexus и выполните следующие шаги:

    1. Нажмите SettingsRepositoriesCreate repositoryPyPI (group)
    2. Заполните параметры конфигурации и нажмите Create repository

    Параметры конфигурации:

    • Name: введите имя репозитория, например, pypi-group
    • Member repositories: выберите ранее созданные репозитории pypi-proxy и pypi-hosted
    • Order: настройте порядок поиска по репозиториям в соответствии с вашими требованиями

    Использование Nexus репозитория с Python клиентом

    Перед выполнением следующих сценариев получите URL репозитория из веб-интерфейса Nexus. Нажмите Browse, выберите ранее созданный репозиторий и нажмите кнопку Copy, чтобы скопировать URL репозитория. Этот URL будет использоваться в примерах конфигурации ниже.

    Сценарий 1: Загрузка в hosted репозиторий с помощью twine

    Этот сценарий демонстрирует, как использовать PyPI Hosted репозиторий для деплоя и публикации собственных Python-пакетов в Nexus. Это особенно полезно для:

    • Приватных пакетов: внутренних библиотек и приложений, которые не должны публиковаться в публичный PyPI
    • Кастомных сборок: модифицированных версий публичных пакетов с вашими настройками
    • Проприетарного ПО: коммерческих или конфиденциальных пакетов с контролируемым распространением
    • Пакетов для разработки: предварительных версий для внутреннего тестирования и валидации

    Процесс включает сборку Python-пакета, настройку цели деплоя и загрузку пакета в ваш Nexus PyPI Hosted репозиторий.

    # Установите последние версии инструментов build и twine от PyPA
    $ python3 -m pip install --upgrade build twine
    
    # Клонируйте пример проекта, можно использовать и свой проект
    $ git clone https://github.com/pypa/sampleproject.git
    $ cd sampleproject
    # Соберите пакет
    $ python3 -m build
    ....
    adding 'test_pypi_demo_mac_2025-0.1.0.dist-info/RECORD'
    removing build/bdist.macosx-10.13-universal2/wheel
    Successfully built test_pypi_demo_mac_2025-0.1.0.tar.gz and test_pypi_demo_mac_2025-0.1.0-py3-none-any.whl
    
    # Добавьте URL PyPI Hosted репозитория в конфигурацию пользователя, подробнее см. [PyPI Configuration](https://packaging.python.org/en/latest/specifications/pypirc/#pypirc)
    # В секции distutils определяется поле index-servers, перечисляющее имена всех секций с описанием репозиториев.
    $ cat <<EOF > ~/.pypirc
    [distutils]
    index-servers = nexus
    
    [nexus]
    repository = https://your-nexus-server.com/repository/pypi-hosted/
    username = username
    password = password
    EOF
    
    # Загрузите PyPI пакеты
    $ python3 -m twine upload --repository nexus dist/*
    Uploading distributions to http://your-nexus-server.com/repository/pypi-host/
    Uploading test_pypi_demo_mac_2025-0.1.0-py3-none-any.whl
    100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.9/12.9 kB 00:00 ?
    Uploading test_pypi_demo_mac_2025-0.1.0.tar.gz
    100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.9/13.9 kB 00:00 ?

    После успешной загрузки пакетов в PyPI Hosted репозиторий вы можете просматривать и управлять ими через веб-интерфейс Nexus: BrowseВыберите PyPI Hosted RepositoryBrowse Package Contents

    Сценарий 2: Загрузка и установка пакетов с помощью pip из PyPI Group репозитория

    Этот сценарий демонстрирует, как настроить pip для использования PyPI Group репозитория для управления зависимостями Python-пакетов. Это особенно полезно для:

    • Унифицированного доступа к пакетам: использование одного URL репозитория для доступа как к публичным пакетам (через proxy), так и к приватным пакетам (через hosted)
    • Оптимизации производительности: локальное кэширование часто используемых пакетов сокращает время загрузки и использование трафика
    • Централизованного управления: все зависимости управляются через один экземпляр Nexus
    • Контроля безопасности: централизованная аутентификация и контроль доступа к загрузкам пакетов

    Процесс включает настройку pip для использования URL PyPI Group репозитория, который автоматически ищет и загружает необходимые пакеты из репозиториев-участников.

    Настройка pip для анонимного доступа

    # Добавьте URL PyPI Group репозитория в конфигурацию пользователя
    # если у Nexus сервера нет действительного или любого HTTPS-сертификата, можно добавить параметр trusted-host
    $ mkdir -p ~/.pip
    $ cat <<EOF > ~/.pip/pip.conf
    [global]
    index-url = https://your-nexus-server.com/repository/pypi-group/simple/
    timeout = 15
    
    [install]
    trusted-host = your-nexus-server.com 
    EOF
    
    # Установите PyPI пакеты
    $ pip3 install requests
    Looking in indexes: https://your-nexus-server.com/repository/python/simple/
    ...
    Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages (from requests) (2025.8.3)

    Настройка pip для аутентифицированного доступа

    Если в Nexus отключён анонимный доступ, необходимо добавить имя пользователя и пароль в файл pip.conf:

    # Добавьте URL PyPI Group репозитория в конфигурацию пользователя
    # если у Nexus сервера нет действительного или любого HTTPS-сертификата, можно добавить параметр trusted-host
    $ mkdir -p ~/.pip
    $ cat <<EOF > ~/.pip/pip.conf
    [global]
    index-url = https://username:password@your-nexus-server.com/repository/pypi-group/simple/
    timeout = 15
    
    [install]
    trusted-host = your-nexus-server.com
    EOF
    
    # Установите PyPI пакеты
    $ pip3 install requests
    Looking in indexes: https://admin:****@your-nexus-server.com/repository/python/simple/
    ...
    Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages (from requests) (2025.8.3)

    Примечания по конфигурации

    • Специальные символы в паролях должны быть URL-кодированы (например, @ заменяется на %40)
    • Учитывайте вопросы безопасности при хранении учётных данных в открытом виде
    • Всегда добавляйте /simple/ в конец URL репозитория
    • Если Nexus использует небезопасное соединение или недоверенный сертификат, настройте параметр trusted-host