نحوه راه اندازی nexus repository manager

وقتی روی یک سرور چند تا پروژه داریم یا یک تیم چند نفره روی یک محصول کار می‌کنه، هر بار دانلود شدن پکیج‌ها و ایمیج‌ها از اینترنت هم وقت می‌گیره هم پهنای باند مصرف می‌کنه؛ بعضی وقت‌ها هم به خاطر محدودیت‌های شبکه یا تحریم‌ها اصلاً به رجیستری‌های اصلی مثل Docker Hub دسترسی نداریم. برای حل این مشکل، بهترین گزینه راه‌اندازی یک ریپازیتوری منیجر داخلیه؛ سیستمی که هم می‌تونه واسط بین ما و رجیستری‌های عمومی باشه (پروکسی و کش) و هم ریپوی خصوصی خودمون برای ایمیج‌ها و پکیج‌هایی باشه که خودمون ساختیم.

در این مقاله قدم به قدم Nexus Repository Manager رو روی یک سرور اوبونتو راه‌اندازی می‌کنیم؛ از استخراج فایل نصب و ساخت کاربر اختصاصی و سرویس systemd گرفته تا اولین ورود به رابط وب، گرفتن پسورد ادمین و آشنایی با محیط نکوس رو باهم پیش میبریم

نیازمندی‌ها

قبل از شروع چیزهایی که لازم داریم:

Requirementتوضیح
سرور لینوکسی (اوبونتو)سرور ما در این مقاله یک اوبونتو با دسترسی root هست
RAM حداقل 4 گیگهیپ پیش‌فرض نکسوس حدود 2.7 گیگ رم میگیره (بستگی به رم سرور خودکار تنظیم میشه)؛ اگر رم کم دارید توی فایل bin/nexus.vmoptions قابل کم کردن است
فایل نصب nexusفایل tarball از سایت sonatype به اسمی شبیه nexus-3.70.1-02-unix.tar.gz
Javaنیازی به نصب جداگانه نیست؛ از نسخه‌های جدید نکسوس JDK داخلی (temurin) همراه خودش هست
پورت آزاد 8081برای رابط وب نکسوس
دامنه (اختیاری)فقط اگر بخوایم HTTPS واقعی با گواهی معتبر راه بندازیم

نصب نکسوس

فایل tarball رو از صفحه‌ی دانلود سوناتایپ می‌گیریم؛ نسخه مطابق با سیستم عامل خودتون رو انتخاب کنید در اینجا ما روی لینوکس میخوایم نکوس رو نصب کنیم. بعد در مسیر استاندارد /opt بازش می‌کنیم:

sudo tar -xzf nexus-3.70.1-02-unix.tar.gz -C /opt

بعد از extract دو تا دایرکتوری خواهیم داشت:

/opt/nexus-3.70.1-02   # خود برنامه؛ اسم پوشه به نسخه‌ی نصبی بستگی داره
/opt/sonatype-work     # دیتا، لاگ‌ها و blob های نکسوس (اینجا همه چیز ذخیره میشه)

اسم پوشه‌ی اول به نسخه‌ای که دانلود کردید بستگی داره (مثلاً nexus-3.70.1-02). برای اینکه دستورهای بعدی مقاله مستقل از نسخه باشن و با هیچ آپگریدی نشکنن، یک symlink می‌سازیم و از این به بعد با همون کار می‌کنیم:

sudo ln -s /opt/nexus-3.70.1-02 /opt/nexus

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

جدا بودن برنامه و دیتا

دایرکتوری sonatype-work همه داده‌های نکسوس رو نگه می‌داره. این یعنی موقع آپگرید نسخه، فقط پوشه برنامه رو عوض می‌کنیم و دیتا سر جاش می‌مونه. بکاپ‌گیری هم یعنی بکاپ گرفتن از همین پوشه.

ساخت user جداگانه برای اجرای نکسوس

برای مدیریت سطح دسترسی و امنیت سرور نگه دارنده nexus نیاز داریم که یک کاربر جدا برای این سرویس درست کنیم

sudo useradd -r -U -s /usr/sbin/nologin nexus
FlagMeaning
-rساخت system user (بدون پسورد، برای سرویس‌ها)
-Uساخت گروه با همون اسم کاربر
-s /usr/sbin/nologinکاربر نمی‌تونه login کنه (با ssh یا کنسول)

این کاربر یک کاربر سرویسیه و قرار نیست تعاملی لاگین کنه، به همین دلیل هم home directory براش نمی‌سازیم.

حالا مالکیت این دو پوشه رو به کاربر nexus می‌دیم:

sudo chown -R nexus:nexus /opt/nexus /opt/sonatype-work

ساخت سرویس systemd

برای اینکه نکسوس با روشن شدن سرور بالا بیاد و توسط systemd مدیریت بشه، فایل سرویس رو در مسیر /etc/systemd/system/nexus.service میسازیم:

[Unit]
Description=Nexus Repository Manager
After=network.target

[Service]
Type=forking
User=nexus
Group=nexus
LimitNOFILE=65536
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

چند خط مهم این فایل:

  • User=nexus و Group=nexus یعنی سرویس با کاربر اختصاصی که ساختیم اجرا میشه
  • Type=forking چون اسکریپت بعد از اجرا پروسه رو به پس‌زمینه می‌فرسته و برمی‌گرده
  • LimitNOFILE=65536 تعداد فایل‌های باز قابل قبول رو بالا میبره که برای نکسوس ضروریه
  • Restart=on-failure اگر سرویس با هر خطایی از پایه بیفته دوباره بالا میاد؛ پوششش از on-abort بیشتره

نکته: بعضی آموزش‌ها به جای این کار، توی فایل bin/nexus.rc مقدار run_as_user="nexus" رو ست می‌کنن. وقتی systemd خودش سرویس رو با User=nexus اجرا می‌کنه، ست کردن هر دو جا لازم نیست و فقط یعنی دو جا برای یک تنظیم؛ بعداً هم اگر یکی تغییر کنه و دیگری نه، دیگر معلوم نمی‌شه سرویس واقعاً با چه کاربری اجرا شده. یکی‌شون کافیه و ما روش systemd رو انتخاب کردیم.

و در نهایت:

sudo systemctl daemon-reload
sudo systemctl enable --now nexus

با دستور ps -ef | grep nexus باید ببینیم که پروسه java با کاربر nexus در حال اجراست این یعنی همه چیز درسته.

اولین ورود

سرور webui روی پورت 8081 بالا میاد: http://<server-ip>:8081

هشدار امنیتی

این آدرس HTTP ساده‌ست؛ یعنی همه‌چیزی که رد و بدل می‌شه، از جمله پسورد ادمین، بدون رمزنگاریه. اگر سرور IP عمومی داشته باشه، پنل عملاً برای کل اینترنت بازه. این حالت فقط برای تست و شبکه‌ی داخلی قابل قبوله؛ در محیط واقعی نکسوس رو پشت همون ریورس پروکسی که توی مقاله‌ راه اندازی ریورس پروکسی در nginx ساختیم با HTTPS بذارید و پورت 8081 رو مستقیم به اینترنت باز نذارید.

در ورود اول از شما اطلاعات لاگین رو درخواست میکنه اکانت ادمین با یوزرنیم admin و پسورد خودکار تولید شده روی سرور وجود داره
پسورد اولیه کاربر admin در فایل زیر هست:

cat /opt/sonatype-work/nexus3/admin.password

بعد از اولین ورود و تغییر پسورد، نکسوس خودش این فایل رو پاک می‌کنه؛ پس اگر بعداً دنبالش گشتید و پیدا نکردید، یعنی همه‌چیز درست پیش رفته نه اینکه مشکلی اتفاق افتاده باشه.

در نسخه‌های جدید نکسوس یک مرحله جدید وجود داره: قبول کردن EULA. تا وقتی پذیرفته نشه، هیچ درخواستی به API ها (حتی Docker Registry) جواب نمیگیره و این پیام رو میبینیم:

You must accept the End User License Agreement (EULA) through the onboarding wizard or REST API before proceeding.

که در بار اول لود کردن سایت nexus ازتون میخواد که این لایسنس رو بپذیرید و این مشکل حل میشه در صورتی که صفحه wizard رو به هر دلیلی اشتباهی بستید و نتونستید اینکارو بکنید با ctrl + f5 صفحه رو ریفرش کنید تا منوی wizard دوباره اجرا شه براتون

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

چرا سایت از مرورگر باز نمیشه؟

اگر بعد از استارت صفحه بالا نیومد، به ترتیب این دو مورد رو چک کنید:

علت اول: نکسوس هنوز بالا نیومده. بعد از start حدود ۱ تا ۳ دقیقه طول میکشه تا کاملا آماده بشه. CPU بالا نشونه‌ی همین بوت هست. می‌تونیم لاگ رو دنبال کنیم تا پیام‌های آماده شدنش رو ببینیم:

sudo tail -f /opt/sonatype-work/nexus3/log/nexus.log

علت دوم: فایروال. اگر روی سرور ufw فعال باشه (روی خیلی از سرورهای اوبونتو هست)، پورت 8081 بسته‌ست و از بیرون هیچ جوابی نمی‌گیرید؛ در حالی که خود نکسوس کاملاً سالمه و فقط فایروال جلوش رو گرفته. برای اینکه مطمئن بشید مشکل از اینه، از داخل خود سرور curl http://localhost:8081 رو امتحان کنید؛ اگر اونجا جواب داد ولی از بیرون نه، یعنی فایروال:

sudo ufw allow 8081/tcp

جمع‌بندی

الان نکسوس از یک فایل tarball به یک سرویس واقعی رسیده: با کاربر اختصاصی خودش اجرا می‌شه، با سرور بالا میاد، پسورد ادمین عوض شده و EULA هم پذیرفته شده. symlink ای که ساختیم هم یعنی آپگرید نسخه‌های بعدی فقط extract کردن نسخه‌ی جدید و عوض کردن یک لینکه؛ بدون دست زدن به سرویس systemd و بدون کوچک‌ترین آسیبی به دیتا، چون دیتا از اول سر جای خودش توی sonatype-work بود.

اما راستش رو بخواهید فعلاً فقط یک پنل خالی داریم. قدم بعدی ساختن ریپوهاست: توی مقاله‌ نحوه راه اندازی مخزن داکر با nexus سه ریپوی داکر (proxy و hosted و group) می‌سازیم، کلاینت داکر رو بهش وصل می‌کنیم و در نهایت با certbot که توی مقاله نحوه فعال کردن https روی nginx صحبت کردیم همه‌چیز رو می‌بریم روی HTTPS واقعی تا پنل و رجیستری دیگه روی HTTP باز نباشن.