Mirror محلی packageها برای قطعی اینترنت، بخش ۴: packageهای زبان‌ها؛ PyPI و npm

تا اینجا packageهای سیستم‌عامل و ایمیج‌های کانتینر را آفلاین کردیم. اما توسعه‌دهنده‌ها به چیز دیگری هم نیاز دارند: کتابخانه‌های زبان‌ها. در این بخش دو Mirror محلی می‌سازیم، یکی برای PyPI (پایتون) و یکی برای npm (Node)، تا نصب وابستگی‌ها هم بدون اینترنت کار کند.

نکته‌ی خوب

خود ابزارها هم آفلاین می‌آیند: در این بخش pip و node/npm را روی کلاینت از همان Mirror اپت بخش دوم نصب می‌کنیم. یعنی حتی برای راه‌اندازی محیط توسعه هم به اینترنت نیاز نیست.

Mirror برای PyPI

ساده‌ترین و کنترل‌شده‌ترین راه این است که در حالت آنلاین، package موردنیاز و همه‌ی وابستگی‌هایش را به‌شکل wheel دانلود کنیم و در Mirror نگه داریم. دستور pip download خودش وابستگی‌ها را هم می‌آورد:

pip3 download requests cowsay tqdm -d /srv/mirror/pypi/packages
دانلود wheelها برای Mirror محلی PyPI
دانلود packageها و وابستگی‌هایشان به‌شکل wheel در پوشه‌ی Mirror. همین پوشه با nginx سرو می‌شود.

در سمت کلاینت، pip را طوری اجرا می‌کنیم که به‌جای اینترنت، از همین پوشه‌ی محلی نصب کند:

pip3 install --no-index \
  --find-links http://10.10.0.1/pypi/packages/ \
  --trusted-host 10.10.0.1 cowsay
نصب package پایتون روی کلاینت بدون اینترنت از Mirror محلی
کلاینت بدون اینترنت: package از Mirror محلی PyPI نصب و با موفقیت import می‌شود. خود pip هم پیش‌تر از Mirror اپت نصب شده بود.

برای Mirror کامل PyPI

برای Mirror کامل یا انتخابی PyPI، ابزارهایی مانند bandersnatch یا devpi یک ایندکس استاندارد (PEP 503) می‌سازند و کلاینت‌ها با --index-url از آن استفاده می‌کنند. اینجا برای سادگی از --find-links استفاده کردیم.

Mirror برای npm

برای npm از verdaccio استفاده می‌کنیم؛ یک رجیستری سبک npm که هم نقش Mirror و هم نقش کش را دارد. آن را با یک کانتینر اجرا می‌کنیم و در حالت آنلاین، packageهای موردنیاز را از طریق آن نصب می‌کنیم تا در کش verdaccio ذخیره شوند:

sudo docker run -d --restart=always --name verdaccio \
  -p 4873:4873 verdaccio/verdaccio

npm install --registry http://localhost:4873 lodash
راه‌اندازی verdaccio و کش‌کردن package روی سرور Mirror
اجرای verdaccio روی سرور Mirror و پرکردن کش آن با نصب یک package در حالت آنلاین. حالا verdaccio همان package را به کلاینت‌ها می‌دهد.

در سمت کلاینت، کافی است npm را به رجیستری محلی وصل کنیم. package از verdaccio می‌آید، بدون هیچ ارتباطی با اینترنت:

npm install --registry http://10.10.0.1:4873 lodash
نصب package npm روی کلاینت بدون اینترنت از verdaccio
کلاینت بدون اینترنت: ابتدا node و npm از Mirror اپت نصب می‌شوند، سپس package از verdaccio محلی گرفته و در کد استفاده می‌شود.

جمع‌بندی و بخش بعد

در این بخش وابستگی‌های زبان‌ها را هم آفلاین کردیم: PyPI با wheelهای محلی و npm با verdaccio. حالا توسعه‌دهنده‌ها می‌توانند بدون اینترنت هم محیط را بسازند و هم کتابخانه‌ها را نصب کنند.

در بخش بعد سراغ Kubernetes می‌رویم: چارت‌های Helm و ایمیج‌های سیستم را هم در Mirror محلی نگه می‌داریم تا استقرارهای کامل بدون اینترنت ممکن شوند.

← بازگشت به وبلاگ