Отметим: когда в Python-команде растёт число внутренних библиотек — утилиты, SDK для API, инструменты аналитики — их нужно централизованно хранить и раздавать через pip install. Копировать .whl файлы по сети или хранить в репозитории — прямой путь к хаосу с версиями и зависимостями. Приватный PyPI-реестр решает эту проблему: без него каждая новая сборка CI/CD рискует получить несовместимую версию зависимости, а время сборки растёт из-за повторных скачиваний.
Мы разворачиваем devpi — легковесный Python-сервер, совместимый с PyPI. В отличие от тяжёлого Nexus (требует 4+ GB RAM и JVM), devpi работает на 256 MB RAM и одном CPU. Он не только хранит ваши пакеты, но и кэширует публичные, ускоряя CI и экономя трафик. Ниже — как это работает на практике.
Как devpi помогает ускорить CI/CD?
Представьте: ваш CI-пайплайн при каждой сборке скачивает pandas, requests и scikit-learn с pypi.org. Это занимает минуты и зависит от внешнего канала. С devpi первый раз пакеты загружаются с PyPI, а затем берутся из локального кэша. Для команды из 50 разработчиков экономия времени сборки достигает 70%, а трафика — до $200 в месяц (при стоимости $0.12/GB). При масштабировании на 100+ разработчиков среднемесячная экономия составляет от $300 до $500.
Готовый docker-compose.yml для быстрого старта
services:
devpi:
image: muccg/devpi:latest
container_name: devpi
ports:
- "3141:3141"
volumes:
- devpi-data:/data
environment:
- DEVPI_SERVERDIR=/data
command: devpi-server --host 0.0.0.0 --port 3141 --serverdir /data
restart: unless-stopped
volumes:
devpi-data:После запуска инициализируем сервер и создаём индекс с upstream на PyPI:
devpi use http://devpi.company.ru:3141
devpi login root --password=""
devpi user -m root password=SecureRootPass
devpi user -c deploy password=DeployPass
devpi login deploy
devpi index -c company/prod bases=root/pypi volatile=False
devpi use company/prodПараметр volatile=False запрещает удаление загруженных пакетов — критично для воспроизводимых сборок.
Публикация внутренних пакетов
Для публикации используем twine. Пример конфигурации пакета:
[project]
name = "company-utils"
version = "1.2.0"
description = "Internal utilities"
[build-system]
requires = ["setuptools>=68", "wheel"]
build-backend = "setuptools.backends.legacy:build"Команды сборки и загрузки:
python -m build
twine upload --repository-url http://devpi.company.ru:3141/company/prod/ --username deploy --password ${DEVPI_PASSWORD} dist/*
В GitLab CI это выглядит так:
publish-pypi:
image: python:3.12-slim
script:
- pip install build twine
- python -m build
- twine upload --repository-url ${DEVPI_URL}/company/prod/ --username deploy --password ${DEVPI_PASSWORD} dist/*
only:
- tags Почему devpi выигрывает у Nexus для Python-команд?
Devpi разворачивается в 3 раза быстрее Nexus и потребляет в 6 раз меньше памяти. Сравнение:
| Критерий | Devpi | Nexus |
|---|---|---|
| Размер и сложность | Лёгкое Python-приложение | Тяжёлая Java (требует JVM) |
| Поддерживаемые форматы | Только PyPI | Maven, npm, Docker, PyPI и др. |
| Кэширование | Встроенное, дедупликация | Есть, но общее хранилище |
| Время развёртывания | 1–2 часа (Docker) | 3–5 часов (с настройкой) |
| Потребление ресурсов | 256 MB RAM, 1 CPU | 4+ GB RAM, 2+ CPU |
Для чисто Python-команды devpi выигрывает по простоте и ресурсам. По данным документации devpi и отзывам пользователей.
Что входит в работу по настройке devpi под ключ
- Установка devpi в Docker или на bare metal с персистентным хранилищем.
- Настройка SSL через nginx (HTTPS обязателен в корпоративной среде). Включаем Let's Encrypt.
- Создание индексов: продовый с кэшем PyPI и девовый для тестов.
- Генерация
pip.confдля разработчиков (Linux/macOS/Windows). - Шаблон CI-пайплайна (GitLab CI / GitHub Actions) для публикации пакетов.
- Предзагрузка популярных пакетов в кэш для air-gapped сред.
- Документация и обучение команды (1–2 часа).
- Поддержка после внедрения: мониторинг здоровья, бекап, обновление версий.
Типичные результаты внедрения:
| Показатель | До внедрения | После внедрения |
|---|---|---|
| Время установки пакетов в CI | 2–5 мин | 10–30 сек |
| Использование трафика | 5–10 GB/мес | 1–2 GB/мес |
| Воспроизводимость сборок | 90% | 99.9% |
| Время на публикацию пакетов | 30 мин | 5 мин |
Процесс работы
- Анализ: аудит существующих пакетов, требования к индексам, политика версионирования.
- Проектирование: схема индексов, ролевая модель, зеркалирование.
- Развёртывание: настройка сервера, SSL, reverse proxy (nginx).
- Интеграция: подключение CI/CD, настройка pip, тестирование.
- Передача: инструкции, доступы, обучение.
Сроки и стоимость
Ориентировочно: от 1 до 3 дней на базовое внедрение. Стоимость рассчитывается индивидуально в зависимости от сложности инфраструктуры и необходимого SLA. Получите консультацию для точной оценки вашего проекта — мы подберём конфигурацию под вашу инфраструктуру.
Практический опыт
За годы практики мы развернули devpi для 20+ компаний — от стартапов с одной командой до enterprise с сотнями разработчиков. Гарантируем стабильную работу: MTTR инцидентов не превышает 2 часов. Используем GitOps-подход для управления конфигурацией и автоматические тесты при публикации. Снижение затрат на CI/CD инфраструктуру на 20–30% — типичный результат.
Закажите настройку приватного PyPI Registry — избавитесь от хаоса с Python-пакетами и получите надёжную систему, которая экономит часы разработчиков каждый день. Свяжитесь с нами, чтобы обсудить детали проекта.







