روی سرورهای داخلی، 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 داخلی، سرور مجازی تراست هاست را ببینید. اگر به پیادهسازی نیاز دارید، خدمات پشتیبانی سرور در کنار شماست.