میرور داخلی Docker، apt، pip و npm؛ نصب پکیج در محدودیت اینترنت

میرور داخلی Docker، apt، pip و npm؛ نصب پکیج در محدودیت اینترنت

جدول محتوا 👇

روی سرورهای داخلی، docker pull، apt update، pip install و npm install اولین چیزهایی هستند که با کندی یا قطعی اینترنت بین‌الملل متوقف می‌شوند. نتیجه این است که نه می‌توانید سرور جدید راه بیندازید، نه وصله امنیتی نصب کنید و نه یک کانتینر را دوباره بسازید. در این آموزش تنظیم میرور داخلی داکر، مخازن Ubuntu و Debian، pip و npm را توضیح می‌دهیم و نشان می‌دهیم چطور یک کش اختصاصی روی سرور خودتان بسازید که به میرورهای عمومی هم وابسته نباشد.

میرور چیست و چرا لازم است؟

میرور (Mirror) نسخه‌ای از یک مخزن نرم‌افزار است که روی سروری دیگر نگهداری می‌شود. میرورهای داخلی روی شبکه داخل کشور هستند؛ بنابراین سرعت دانلود از آن‌ها بیشتر است، ترافیک بین‌الملل مصرف نمی‌کنند و معمولاً در زمان محدودیت هم در دسترس می‌مانند. چند ارائه‌دهنده زیرساخت و دانشگاه در ایران میرورهای عمومی ارائه می‌کنند.

دو نکته مهم: میرورهای عمومی ممکن است تغییر آدرس دهند، از دسترس خارج شوند یا در زمان قطعی کامل به‌روز نشوند. آدرس‌های این مقاله در زمان نگارش بررسی شده‌اند؛ پیش از استفاده آن‌ها را دوباره آزمایش کنید. برای سرویس‌های حیاتی، کش اختصاصی که در ادامه توضیح می‌دهیم مطمئن‌ترین راه است.

پیش از شروع: امنیت میرورها

وقتی پکیج را از سرور شخص ثالث دریافت می‌کنید، باید بدانید چه چیزی محتوا را تضمین می‌کند:

  • apt: فایل‌های مخزن با کلید GPG توزیع امضا شده‌اند و apt امضا را بررسی می‌کند؛ میرور نمی‌تواند بدون شناسایی، پکیج را تغییر دهد. هرگز [trusted=yes] یا غیرفعال کردن بررسی امضا را برای رفع خطا به‌کار نبرید.
  • Docker: اگر Image را با Digest (image@sha256:...) مشخص کنید، محتوای دریافتی دقیقاً همان است. با Tag، به درستی میرور اعتماد کرده‌اید.
  • pip و npm: به‌طور پیش‌فرض امضای پکیج بررسی نمی‌شود. از فایل قفل (package-lock.json با فیلد integrity) و برای pip از --require-hashes استفاده کنید تا هش هر پکیج با نسخه ثبت‌شده مقایسه شود.

اصول کلی امنیت کانتینرها در امن‌سازی Docker.

میرور داخلی Docker

قابلیت registry-mirrors در Docker درخواست‌های Imageهای Docker Hub را ابتدا به میرور می‌فرستد و اگر پاسخ نگرفت، سراغ Docker Hub می‌رود. فایل /etc/docker/daemon.json را ویرایش کنید (اگر از قبل محتوا دارد، فقط این کلید را اضافه کنید):

{
  "registry-mirrors": [
    "https://docker.arvancloud.ir",
    "https://focker.ir"
  ]
}
sudo systemctl restart docker
docker info | grep -A3 "Registry Mirrors"
docker pull nginx:stable

نکته‌ها:

  • registry-mirrors فقط برای Imageهای Docker Hub کار می‌کند. Imageهای ghcr.io، quay.io یا gcr.io از آن عبور نمی‌کنند و باید آن‌ها را روی Registry خصوصی خودتان نگه دارید.
  • برخی میرورها آدرس Image را با پیشوند خودشان هم می‌پذیرند؛ مثلاً docker pull focker.ir/library/nginx:stable.
  • بعد از restart، کانتینرهایی که restart policy ندارند خاموش می‌مانند؛ این کار را در زمان مناسب انجام دهید.

اگر تازه با Docker کار می‌کنید، آموزش Docker برای مبتدی‌ها را ببینید.

میرور apt برای Ubuntu و Debian

در Ubuntu ۲۴.۰۴ مخازن در فایل /etc/apt/sources.list.d/ubuntu.sources با قالب deb822 تعریف شده‌اند. ابتدا نسخه پشتیبان بگیرید و سپس آدرس را تغییر دهید:

sudo cp /etc/apt/sources.list.d/ubuntu.sources /root/ubuntu.sources.bak
sudo sed -i 's|http://archive.ubuntu.com/ubuntu|https://mirror.arvancloud.ir/ubuntu|g; s|http://security.ubuntu.com/ubuntu|https://mirror.arvancloud.ir/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources
sudo apt update

در نسخه‌های قدیمی‌تر Ubuntu و در Debian، همین تغییر را در /etc/apt/sources.list انجام دهید. نمونه میرورهای داخلی که در زمان نگارش در دسترس بوده‌اند:

ارائه‌دهنده آدرس Ubuntu توضیح
ArvanCloud https://mirror.arvancloud.ir/ubuntu توزیع‌های رایج لینوکس
IranServer https://mirror.iranserver.com/ubuntu Ubuntu و Debian
دانشگاه صنعتی اصفهان https://repo.iut.ac.ir/repo/ubuntu میرور دانشگاهی
میرور رسمی ایران Ubuntu http://ir.archive.ubuntu.com/ubuntu جزو شبکه میرورهای رسمی Ubuntu

اگر apt update خطای امضا داد، احتمالاً میرور به‌روز نیست؛ میرور دیگری را امتحان کنید. نکته امنیتی: به‌روزرسانی‌های امنیتی ممکن است با تاخیر به میرورها برسند؛ پس از رفع محدودیت، یک بار از مخزن اصلی هم به‌روزرسانی کنید. دستورهای پایه در دستورات پایه لینوکس.

میرور pip

برای تنظیم دائمی میرور pip برای کاربر جاری:

pip config set global.index-url https://mirror-pypi.runflare.com/simple
pip config list
pip install requests

یا فقط برای یک دستور:

pip install -i https://package-mirror.liara.ir/repository/pypi/simple requests

برای پروژه‌های عملیاتی، نسخه و هش پکیج‌ها را در requirements.txt ثابت کنید (مثلاً با pip-compile --generate-hashes) و نصب را با pip install --require-hashes -r requirements.txt انجام دهید.

میرور npm

npm config set registry https://mirror-npm.runflare.com
npm config get registry
npm ci

میرور جایگزین: https://package-mirror.liara.ir/repository/npm/. برای بازگشت به مخزن اصلی: npm config set registry https://registry.npmjs.org. در CI و سرور، npm ci را به‌جای npm install به‌کار ببرید تا دقیقاً نسخه‌های فایل قفل نصب شوند. اگر فایل .npmrc در پروژه دارید، تنظیم registry را آنجا قرار دهید تا برای همه اعضای تیم یکسان باشد. برای Yarn و pnpm هم همین آدرس در تنظیم registry قرار می‌گیرد.

ساخت کش اختصاصی پکیج

کش اختصاصی روی یک سرور داخلی شما، هر پکیج یا Image را یک بار از مبدأ دریافت و ذخیره می‌کند و دفعه‌های بعد از همان نسخه ذخیره‌شده تحویل می‌دهد. مزیت اصلی این است که در زمان قطعی، هر چیزی که پیش‌تر استفاده شده در دسترس است، حتی اگر میرورهای عمومی از کار افتاده باشند.

Registry کش‌کننده Docker

Registry رسمی Docker می‌تواند به‌صورت Pull-through Cache کار کند. یک فایل config.yml بسازید:

version: 0.1
storage:
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
proxy:
  remoteurl: https://registry-1.docker.io
docker run -d --name registry-cache --restart=always \
  -p 127.0.0.1:5000:5000 \
  -v /srv/registry:/var/lib/registry \
  -v $PWD/config.yml:/etc/distribution/config.yml \
  registry:3

اگر تصویر registry:3 در دسترس نیست، registry:2 هم کار می‌کند؛ در آن نسخه مسیر فایل تنظیمات /etc/docker/registry/config.yml است. پورت را فقط روی شبکه خصوصی یا پشت Reverse Proxy با TLS و احراز هویت در دسترس سرورهای دیگر قرار دهید و آن را عمومی نکنید. سپس آدرس آن را در registry-mirrors سرورهای دیگر اضافه کنید. Imageهای حیاتی را هم از پیش یک بار pull کنید تا در کش باشند.

apt-cacher-ng برای apt

sudo apt install apt-cacher-ng
# روی سرورهای دیگر:
echo 'Acquire::http::Proxy "http://10.0.0.10:3142";' | sudo tee /etc/apt/apt.conf.d/01proxy

apt-cacher-ng پکیج‌ها را پس از اولین دانلود نگه می‌دارد. آدرس 10.0.0.10 نمونه است؛ IP خصوصی سرور کش را وارد کنید و پورت ۳۱۴۲ را فقط برای شبکه خصوصی باز کنید.

Nexus یا ابزارهای مشابه برای چند نوع مخزن

اگر هم‌زمان Docker، npm، PyPI و Maven دارید، یک مخزن مرکزی مثل Sonatype Nexus Repository یا JFrog Artifactory همه را در یک جا کش و مدیریت می‌کند. برای npm به‌تنهایی، Verdaccio گزینه سبک‌تری است. اجرای این سرویس‌ها روی یک سرور مجازی داخلی با دیسک کافی و اتصال شبکه خصوصی به سایر سرورها، ساختار رایج تیم‌های توسعه است.

کد و مخازن Git

اگر Deploy شما از GitHub یا GitLab.com کد می‌گیرد، در زمان قطعی متوقف می‌شود. یک Gitea یا GitLab روی سرور داخلی راه بیندازید و مخزن‌ها را به‌صورت Mirror با آن همگام نگه دارید. در Gitea قابلیت Pull Mirror این کار را به‌طور خودکار و دوره‌ای انجام می‌دهد. سپس آدرس Deploy را به مخزن داخلی تغییر دهید یا آن را به‌عنوان remote جایگزین آماده نگه دارید:

git remote add internal https://git.example.ir/team/app.git
git fetch internal

سایر آمادگی‌های سرور برای این شرایط در چک‌لیست سرور مجازی در قطعی اینترنت آمده است.

سوالات متداول

میرور Docker در زمان قطعی کامل هم کار می‌کند؟

Imageهایی که میرور پیش‌تر کش کرده، معمولاً در دسترس‌اند. Imageها یا نسخه‌های جدیدی که قبلاً کش نشده‌اند، در قطعی کامل از مبدأ قابل دریافت نیستند. به همین دلیل کش اختصاصی و pull کردن پیشاپیش اهمیت دارد.

استفاده از میرور داخلی امن است؟

برای apt، به دلیل امضای GPG، بله. برای Docker با Digest و برای pip و npm با هش‌های فایل قفل، تغییر محتوا شناسایی می‌شود. بدون این‌ها، به میرور اعتماد کرده‌اید.

خطای toomanyrequests در Docker Hub را هم حل می‌کند؟

بله. استفاده از میرور یا کش اختصاصی، تعداد درخواست‌های مستقیم به Docker Hub را کم می‌کند و به محدودیت نرخ آن نمی‌خورید.

پس از رفع محدودیت، تنظیمات را برگردانم؟

لازم نیست. میرور داخلی در شرایط عادی هم سریع‌تر است. فقط یک بار به‌روزرسانی امنیتی را از مخزن اصلی بررسی کنید.

سرور مجازی ایران برای کش پکیج و CI

برای راه‌اندازی Registry خصوصی، کش پکیج یا Git داخلی، سرور مجازی تراست هاست را ببینید. اگر به پیاده‌سازی نیاز دارید، خدمات پشتیبانی سرور در کنار شماست.

سرور مجازی ابری تراست هاست

مشاوره تراست‌هاست​

با متخصصان و کارشناسان به صورت رایگان!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *