مقدمه
PyPI (Python Package Index) مخزن اصلی بستههای پایتون است و pip بهطور پیشفرض بستهها را از آن دریافت میکند. در محیطهای Airgap (بدون دسترسی به اینترنت)، دیگر نمیتوان مستقیماً به PyPI وصل شد. راهحل، راهاندازی یک mirror یا cache در شبکه داخلی است تا تیم توسعه بتواند بستههای مورد نیاز را نصب کند. در این مقاله سه روش رایج را بررسی میکنیم.
روش اول: devpi
devpi یک سرور قدرتمند PyPI است که هم قابلیت proxy/cache و هم انتشار بستههای خصوصی را دارد. اگر تیم شما علاوه بر mirror کردن PyPI نیاز به انتشار پکیجهای داخلی نیز دارد، devpi بهترین گزینه است.
ابتدا devpi را نصب کنید:
pip install devpi-server devpi-webسپس آن را مقداردهی اولیه کنید:
devpi-initو در نهایت سرور را اجرا کنید:
devpi-server --host 0.0.0.0 --port 3141وباینترفیس devpi روی پورت ۳۱۴۱ در دسترس است. بهطور پیشفرض، devpi درخواستها را به pypi.org پراکسی کرده و بستههای دریافتشده را کش میکند. استفاده از آن ساده است: کافی است کلاینتها را به آدرس mirror داخلی اشاره دهید:
pip install --index-url http://192.168.1.100:3141/root/pypi/+simple/ requestsمزایا: نصب و راهاندازی سریع، داشبورد مدیریتی، قابلیت انتشار پکیج خصوصی، کش هوشمند.
معایب: برای دانلود کامل PyPI (آفلاین کامل) طراحی نشده؛ بستهها تنها زمانی کش میشوند که کسی آنها را درخواست کند.
روش دوم: Bandersnatch
اگر نیاز به یک mirror کامل و آفلاین از کل PyPI دارید (مثلاً برای محیطهایی که هیچ دسترسی به خارج ندارند)، bandersnatch انتخاب مناسبی است. این ابزار کل مخزن PyPI را همگامسازی کرده و یک کپی کامل روی دیسک ایجاد میکند.
نصب:
pip install bandersnatchفایل تنظیمات را ایجاد کنید:
# /etc/bandersnatch.conf
[mirror]
directory = /srv/pypi
master = https://pypi.org
workers = 5و mirror را اجرا کنید:
bandersnatch mirrorاولین بار دانلود کامل PyPI زمانبر است و به فضای زیادی (چند صد گیگابایت) نیاز دارد. پس از آن میتوانید با cron این دستور را بهطور دورهای اجرا کنید تا mirror بهروز بماند:
0 */6 * * * /usr/local/bin/bandersnatch mirrorسپس یک وبسرور (مثل nginx) روی دایرکتوری mirror تنظیم کرده و کلاینتها را به آن هدایت کنید.
مزایا: دسترسی کامل آفلاین به تمام بستههای PyPI، مستقل از اینترنت پس از همگامسازی اولیه.
معایب: مصرف بالای دیسک، زمانبر بودن sync اولیه، عدم امکان انتشار پکیج خصوصی.
روش سوم: PyPI Simple Index با Nginx Proxy Cache
اگر به دنبال یک راهحل سریع و سبک هستید، میتوانید از nginx بهعنوان reverse proxy با کش استفاده کنید. این روش نیاز به نصب هیچ ابزار خاصی ندارد و بهسرعت قابل راهاندازی است:
# /etc/nginx/sites-available/pypi-cache
server {
listen 8080;
location / {
proxy_pass https://pypi.org;
proxy_cache pypi-cache;
proxy_cache_valid 200 302 1d;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating;
proxy_ssl_verify off;
}
}با این تنظیمات، اولین درخواست هر بسته از PyPI اصلی دریافت شده و در حافظه کش ذخیره میشود. درخواستهای بعدی از همان کش سرو میشوند. سپس کلاینتها را به این آدرس دهید:
pip install --index-url http://192.168.1.100:8080/simple/ requestsمزایا: نصب صفر (فقط nginx کافیست)، سبک و سریع، بدون وابستگی اضافه.
معایب: فقط cache است نه mirror کامل، با پاک شدن cache دوباره باید از اینترنت دانلود کند، عدم امکان انتشار پکیج خصوصی.
جدول سرویسهای عمومی PyPI Mirror در ایران
اگر صرفاً به یک mirror سریعتر نیاز دارید و نمیخواهید زیرساخت داخلی راهاندازی کنید، میتوانید از سرویسهای عمومی داخل ایران استفاده کنید:
- دانشگاه صنعتی شریف:
https://pypi.sharif.edu - دانشگاه علوم پزشکی شیراز (SUMS):
https://pypi.sums.ac.ir - آروانکلاد:
https://pypi.iranserver.com
برای استفاده کافیست index-url پیشفرض pip را تغییر دهید:
pip install --index-url https://pypi.sharif.edu/simple/ requestsیا بهصورت دائمی در فایل تنظیمات pip:
# ~/.config/pip/pip.conf
[global]
index-url = https://pypi.sharif.edu/simple/جمعبندی
انتخاب روش مناسب به نیاز شما بستگی دارد: اگر به mirror کامل آفلاین نیاز دارید، Bandersnatch بهترین گزینه است. اگر علاوه بر cache نیاز به انتشار پکیج خصوصی دارید، devpi را انتخاب کنید. و اگر یک راهحل سریع و موقت میخواهید، nginx proxy cache کافی است. همچنین میتوانید از سرویسهای عمومی داخل ایران برای سرعت بالاتر استفاده کنید.