آموزش راه‌اندازی Sonatype Nexus: مخزن مرکزی npm، PyPI، Maven و Docker برای تیم‌های ایرانی

هر تیم توسعه‌ای در ایران این تجربه را داشته است: npm install نصفه می‌ماند، pip خطای اتصال می‌دهد، Docker Hub پیغام 403 می‌دهد و Build در CI بی‌دلیل شکست می‌خورد. Sonatype Nexus Repository این مشکل را از ریشه حل می‌کند: یک سرور مرکزی که بین تیم شما و مخازن عمومی قرار می‌گیرد، پکیج‌ها را یک بار دریافت و کش می‌کند و از آن به بعد با سرعت شبکه‌ی داخلی تحویل می‌دهد.

Nexus چه کاری انجام می‌دهد؟

Nexus سه نوع مخزن دارد:

  • Proxy: واسطه و کش برای یک مخزن عمومی، مثل npmjs، PyPI، Maven Central یا Docker Hub.
  • Hosted: مخزن خصوصی برای پکیج‌ها و ایمیج‌هایی که خود تیم شما می‌سازد.
  • Group: ترکیب چند مخزن زیر یک آدرس واحد، مثلاً پکیج‌های خصوصی و عمومی با هم.

نتیجه اینکه همه‌ی توسعه‌دهندگان و سرورهای CI فقط با یک آدرس داخلی کار می‌کنند و فقط سرور Nexus به دسترسی به مخازن خارجی نیاز دارد.

پیش‌نیازها

  • یک سرور لینوکس با حداقل ۴ هسته CPU و ۸ گیگابایت RAM برای یک تیم کوچک تا متوسط.
  • فضای دیسک کافی برای کش پکیج‌ها، معمولاً از ۱۰۰ گیگابایت به بالا، بسته به تعداد پروژه‌ها.
  • Docker و Docker Compose.
  • دسترسی پایدار سرور Nexus به مخازن خارجی. این مهم‌ترین پیش‌نیاز است. یک راه رایج، قرار دادن Nexus روی یک سرور مجازی خارج از ایران است، یا روی سرور داخلی با یک مسیر دسترسی پایدار.
  • یک دامنه یا زیردامنه، مثلاً nexus.example.com، و گواهی SSL.

قدم ۱: نصب Nexus با Docker Compose

فایل docker-compose.yml:

services:
  nexus:
    image: sonatype/nexus3
    container_name: nexus
    restart: unless-stopped
    ports:
      - "127.0.0.1:8081:8081"   # رابط وب و مخازن npm/pypi/maven
      - "127.0.0.1:8082:8082"   # مخزن Docker (در ادامه می‌سازیم)
    environment:
      INSTALL4J_ADD_VM_PARAMS: "-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m"
    volumes:
      - nexus-data:/nexus-data

volumes:
  nexus-data:
docker compose up -d
docker logs -f nexus

اولین راه‌اندازی چند دقیقه طول می‌کشد. وقتی در لاگ عبارت Started Sonatype Nexus را دیدید، آماده است. مقدار حافظه‌ی Java را با RAM سرور خود تنظیم کنید.

رمز اولیه‌ی کاربر admin:

docker exec nexus cat /nexus-data/admin.password

اگر ایمیج sonatype/nexus3 روی سرور داخل ایران دانلود نمی‌شود، راه‌حل‌ها را در مقاله‌ی دسترسی به Docker Hub از ایران ببینید.

قدم ۲: Nginx و SSL

Nexus را مستقیم روی اینترنت باز نکنید. یک Reverse Proxy با SSL جلوی آن قرار دهید:

server {
    listen 443 ssl http2;
    server_name nexus.example.com;
    ssl_certificate     /etc/letsencrypt/live/nexus.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/nexus.example.com/privkey.pem;

    client_max_body_size 2G;

    location / {
        proxy_pass http://127.0.0.1:8081;
        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;
    }
}

server {
    listen 443 ssl http2;
    server_name docker.example.com;
    ssl_certificate     /etc/letsencrypt/live/docker.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/docker.example.com/privkey.pem;

    client_max_body_size 0;

    location / {
        proxy_pass http://127.0.0.1:8082;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

حالا با https://nexus.example.com وارد پنل شوید، رمز admin را عوض کنید و در ویزارد اولیه، دسترسی ناشناس (Anonymous Access) را بر اساس سیاست امنیتی تیم خود تعیین کنید.

قدم ۳: ساخت مخازن Proxy

از مسیر Settings ← Repositories ← Create repository این مخازن را بسازید:

نوع نام پیشنهادی Remote URL
npm (proxy) npm-proxy https://registry.npmjs.org
pypi (proxy) pypi-proxy https://pypi.org
maven2 (proxy) maven-central به‌صورت پیش‌فرض ساخته شده است
docker (proxy) dockerhub-proxy https://registry-1.docker.io

برای مخزن Docker:

  • در بخش Repository Connectors، گزینه‌ی HTTP را فعال کنید و پورت 8082 را وارد کنید.
  • در بخش Docker Index، گزینه‌ی Use Docker Hub را انتخاب کنید.
  • اگر دسترسی ناشناس می‌خواهید، از Settings ← Security ← Realms، گزینه‌ی Docker Bearer Token Realm را فعال کنید.
  • برای کاهش محدودیت Pull داکرهاب، در بخش Authentication مخزن، نام کاربری و توکن یک حساب Docker Hub را وارد کنید.

در نهایت برای npm و PyPI یک مخزن Group بسازید که مخزن proxy و مخزن hosted خصوصی‌تان را با هم داشته باشد. به این ترتیب پکیج‌های خصوصی و عمومی از یک آدرس در دسترس‌اند.

قدم ۴: تنظیم کلاینت‌ها

npm / yarn / pnpm

npm config set registry https://nexus.example.com/repository/npm-group/

pip

pip config set global.index-url https://nexus.example.com/repository/pypi-proxy/simple

Maven

در فایل ~/.m2/settings.xml:

<settings>
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>https://nexus.example.com/repository/maven-public/</url>
    </mirror>
  </mirrors>
</settings>

Docker

در فایل /etc/docker/daemon.json سرورها و سیستم‌های توسعه:

{
  "registry-mirrors": ["https://docker.example.com"]
}
sudo systemctl restart docker
docker pull nginx:alpine

اگر docker pull بدون خطا انجام شد و ایمیج در پنل Nexus زیر مخزن dockerhub-proxy دیده شد، همه‌چیز درست کار می‌کند.

نگه‌داری

  • Cleanup Policy: برای مخازن proxy سیاست پاک‌سازی تعریف کنید، مثلاً حذف پکیج‌هایی که ۹۰ روز استفاده نشده‌اند. بدون آن، دیسک به‌مرور پر می‌شود.
  • بکاپ: از volume nexus-data بکاپ منظم بگیرید، به‌خصوص اگر مخزن hosted خصوصی دارید. پکیج‌های proxy را می‌شود دوباره دانلود کرد، ولی پکیج‌های خصوصی شما را نه.
  • ارتقا: قبل از ارتقای نسخه، یادداشت‌های انتشار را بخوانید و بکاپ بگیرید.
  • مجوز: نسخه‌ی رایگان (Community Edition) محدودیت‌هایی در مقیاس استفاده دارد. قبل از استفاده‌ی سازمانی، شرایط فعلی را در سایت Sonatype بررسی کنید.

جمع‌بندی

یک سرور Nexus، دردسر هر روزه‌ی دانلود پکیج‌ها را برای کل تیم حل می‌کند، Buildها را سریع‌تر و قابل‌اتکاتر می‌کند و جای امنی برای پکیج‌ها و ایمیج‌های خصوصی شما فراهم می‌کند.

می‌خواهید این کار را به ما بسپارید؟ تیم مروانت Nexus یا Harbor را روی زیرساخت شما یا سرورهای مروانت راه‌اندازی و نگه‌داری می‌کند. صفحه‌های دسترسی پایدار به ابزارهای توسعه و برون‌سپاری پروژه‌های Docker را ببینید.

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

جستجو

فهرست مطالب