Налаштування приватного PyPI на Linux з devpi і Nginx
16.06.2026Навіщо налаштовувати приватний PyPI на Linux
Якщо вам потрібно зручно зберігати внутрішні Python-пакети, проксувати публічні залежності через власний сервер і обмежувати доступ до артефактів, приватний PyPI на Linux — практичне рішення. У цій інструкції розглянемо, як налаштувати devpi на Linux, автоматизувати запуск через systemd і безпечно відкрити сервіс через Nginx.
Такий підхід особливо корисний для команд, які підтримують кілька проєктів, мають власні бібліотеки або хочуть зменшити залежність від зовнішнього доступу до публічного індексу пакетів.
Що потрібно підготувати
Перед початком переконайтеся, що у вас є Linux-сервер із правами sudo, встановлений Python 3, доступ до мережі та домен або піддомен для HTTPS через Nginx. Також бажано одразу визначити окремого системного користувача для сервісу, щоб не запускати devpi від root.
- Linux-сервер із доступом адміністратора
- Python 3 і pip
- Nginx
- systemd
- Доменне ім’я для HTTPS
Крок 1. Створіть користувача та каталоги
Почнемо з окремого користувача для devpi. Це допоможе ізолювати файли сервісу та спростити контроль доступу.
sudo adduser --system --home /var/lib/devpi --group devpi
sudo mkdir -p /var/lib/devpi
sudo chown -R devpi:devpi /var/lib/devpi
Якщо ви плануєте зберігати конфігурацію окремо, можна також створити каталог для логів і тимчасових файлів. Важливо, щоб усі ці шляхи були доступні користувачу devpi.
Крок 2. Встановіть devpi
Найзручніше встановлювати devpi у віртуальному середовищі Python або в окремому системному середовищі для сервісів. Нижче приклад через pip. За потреби адаптуйте команди під вашу дистрибуцію.
sudo apt update
sudo apt install -y python3 python3-pip python3-venv
sudo python3 -m venv /opt/devpi-venv
sudo /opt/devpi-venv/bin/pip install --upgrade pip
sudo /opt/devpi-venv/bin/pip install devpi-server devpi-web devpi-client
Після встановлення перевірте, що бінарні файли доступні, і що ви можете запустити сервер вручну для первинної ініціалізації.
Крок 3. Ініціалізуйте сховище devpi
Перший запуск потрібен, щоб створити структуру даних і підготувати сервер до роботи.
sudo -u devpi /opt/devpi-venv/bin/devpi-server --serverdir /var/lib/devpi --init
Після ініціалізації можна зробити тестовий запуск, щоб переконатися, що сервер стартує без помилок. На цьому етапі зручно запускати його лише локально, без публічного доступу.
sudo -u devpi /opt/devpi-venv/bin/devpi-server --serverdir /var/lib/devpi --host 127.0.0.1 --port 3141
Якщо все працює, зупиніть процес і переходьте до автоматизації через systemd.
Крок 4. Створіть service unit для systemd
Щоб devpi запускався автоматично після перезавантаження і керувався стандартними командами systemd, створіть unit-файл.
sudo nano /etc/systemd/system/devpi.service
Вміст файлу може бути таким:
[Unit]
Description=devpi server
After=network.target
[Service]
User=devpi
Group=devpi
Type=simple
ExecStart=/opt/devpi-venv/bin/devpi-server --serverdir /var/lib/devpi --host 127.0.0.1 --port 3141
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Після збереження файлу виконайте:
sudo systemctl daemon-reload
sudo systemctl enable --now devpi
sudo systemctl status devpi
Це дає змогу перевірити, чи сервіс запустився коректно. Якщо status показує помилку, перегляньте журнали через journalctl.
sudo journalctl -u devpi -f
Крок 5. Налаштуйте базову роботу з репозиторієм
Після запуску сервера потрібно створити індекс і, за потреби, користувача для роботи з пакунками. Для взаємодії з сервером зручно використовувати devpi-client.
/opt/devpi-venv/bin/devpi use http://127.0.0.1:3141
/opt/devpi-venv/bin/devpi user -m admin password='ваш_пароль'
/opt/devpi-venv/bin/devpi index -c dev bases=root/pypi
Після цього ви можете завантажувати власні пакети до приватного індексу та налаштовувати клієнтські проєкти на використання цього репозиторію як джерела залежностей.
Крок 6. Поставте Nginx як reverse proxy
Щоб забезпечити безпечний доступ до приватного PyPI, використовуйте Nginx як проксі до локального devpi-сервера. Це дає змогу обробляти HTTPS на рівні вебсервера та приховати внутрішній порт сервісу.
sudo apt install -y nginx
Створіть конфігурацію сайту:
sudo nano /etc/nginx/sites-available/devpi
Приклад конфігурації:
server {
listen 80;
server_name pypi.example.com;
location / {
proxy_pass http://127.0.0.1:3141;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Активуйте сайт і перевірте конфігурацію:
sudo ln -s /etc/nginx/sites-available/devpi /etc/nginx/sites-enabled/devpi
sudo nginx -t
sudo systemctl reload nginx
Крок 7. Увімкніть HTTPS
Для приватного PyPI бажано використовувати HTTPS, особливо якщо до нього звертаються з кількох серверів або робочих станцій. Сертифікат можна отримати через ваш поточний механізм керування сертифікатами або інший інструмент, який використовується у вашій інфраструктурі.
Після встановлення сертифіката оновіть конфігурацію Nginx, щоб слухати 443 порт і перенаправляти HTTP на HTTPS. Також перевірте, що проксі-заголовки передаються коректно, щоб devpi бачив реальний хост і схему запиту.
Крок 8. Перевірте доступ із клієнтської машини
Коли Nginx і systemd налаштовані, протестуйте доступ до репозиторію з іншого Linux-клієнта або з вашого робочого середовища Python.
pip config set global.index-url https://pypi.example.com/root/dev/+simple/
Якщо використовується автентифікація, додайте облікові дані у спосіб, який відповідає вашій політиці доступу. Після цього спробуйте встановити власний пакет або перевірити список доступних індексів.
Типові помилки та як їх уникнути
- Запуск devpi від root замість окремого користувача.
- Відкритий доступ до локального порту 3141 без reverse proxy.
- Відсутність HTTPS для робочого доступу через мережу.
- Неправильний шлях до devpi-server у systemd unit.
- Невідповідність прав на каталог /var/lib/devpi.
Також варто уникати встановлення випадкових або застарілих версій компонентів без перевірки сумісності. Якщо ви оновлюєте devpi або Python, спершу протестуйте зміни в окремому середовищі, щоб не перервати роботу існуючих проєктів.
Висновок
Налаштування приватного PyPI на Linux з devpi, systemd та Nginx дає вам контрольований спосіб зберігати пакети, централізувати залежності та обмежувати доступ до внутрішніх бібліотек. Якщо дотриматися структури з окремим користувачем, автоматичним запуском через systemd і HTTPS через Nginx, ви отримаєте зручний сервіс, який легко підтримувати в повсякденній роботі.