آموزش راهاندازی 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 را ببینید.
