Nexus 3 OSS হল একটি ওপেন সোর্স আর্টিফ্যাক্ট রিপোজিটরি ম্যানেজার যা একাধিক ফরম্যাট যেমন কন্টেইনার ইমেজ, পাইথন পিআইপি, জাভা জার এবং আরও অনেক কিছু পরিচালনা করতে পারে৷
কেন একটি অন-প্রিমিস আর্টিফ্যাক্ট ম্যানেজার আছে? এর অনেক কারণ রয়েছে:
-
আপনার ব্যক্তিগত অবকাঠামো ব্যবহার করুন:আপনার মালিকানা কোড থাকতে পারে যা রক্ষা করা প্রয়োজন।
-
দ্রুত আর্টিফ্যাক্ট ডাউনলোডের গতি:আপনি যদি ইন্টারনেটে ক্রমাগত একই আর্টিফ্যাক্টগুলি ডাউনলোড করেন, আপনি সেগুলিকে একটি কেন্দ্রীয় অবস্থানে ক্যাশে করতে পারেন, একাধিক সার্ভার জুড়ে আপনার একাধিক ব্যবহারকারীর সুবিধার জন্য সেগুলিকে ক্যাশে করে৷
-
আপনার বিল্ড চেইনে কোন আর্টিফ্যাক্টগুলি এটি তৈরি করে তা নিয়ন্ত্রণ করুন:আর্টিফ্যাক্টগুলির অবস্থানকে কেন্দ্রীভূত করুন, নিশ্চিত করুন যে সেগুলি ব্যবহারের জন্য অনুমোদিত, এবং নিশ্চিত করুন যে এতে ক্ষতিকারক কোড নেই৷
-
কে আপনার শিল্পকর্মগুলিতে অ্যাক্সেস পেতে পারে তা আলাদা করুন:আপনার নিজের সংস্থার মধ্যে কারা কিছু নিদর্শন অ্যাক্সেস করতে পারে সে সম্পর্কে আপনার আরও কঠোর প্রয়োজনীয়তা থাকতে পারে৷
এই নিবন্ধে আমি আপনাকে দেখাব কিভাবে আপনি একটি উত্তরযোগ্য প্লেবুক ব্যবহার করে Nexus 3 এর OSS সংস্করণ ডাউনলোড, ইনস্টল এবং কনফিগার করতে পারেন৷
Nexus 3 একটি Orange PI 5 কম্পিউটারে 8 GB বা RAM সহ চলবে, তবে এই বিধানটি ন্যূনতম প্রয়োজনীয়তার সাথে যেকোনো মেশিনে করা যেতে পারে। সেটআপের অংশে আমার ইনভেন্টরি ফাইলে তালিকাভুক্ত মেশিনগুলির জন্য PyPI.org-এর জন্য একটি প্রক্সি সেট করা থাকবে৷
এই টিউটোরিয়াল থেকে কোড চালাতে আপনার যা দরকার
-
উত্তরযোগ্য প্লেবুক, নেক্সাস এবং পিআইপি মডিউলগুলির জন্য সোর্স কোড ডাউনলোড করার জন্য একটি ইন্টারনেট সংযোগ
-
দুই বা ততোধিক লিনাক্স মেশিন (আমি ডেবিয়ান, আর্ম্বিয়ান এবং ফেডোরা আইওটি ব্যবহার করেছি), কমপক্ষে 8 জিবি র্যাম সহ। আমার ক্লাস্টারে রাস্পবেরি PI 4 এবং একটি OrangePI 5 এর মিশ্রণ রয়েছে৷
-
Fedora মেশিনে Ansible কন্ট্রোলার চালানো হবে, কিন্তু যেকোনো সার্ভার নিয়ামক হতে পারে। Ansible-এর জন্য ইনস্টলেশন নির্দেশাবলী অনুসরণ করা সহজ।
প্লেবুক সংস্থা
আমি কাজগুলিকে দলে ভাগ করেছি এবং ফলস্বরূপ প্লেবুকটি এইরকম দেখাচ্ছে:
[josevnz@dmaf5 Nexus3OnOrangePI]$ tree -N ansible/
ansible/
├── inventories
│ └── home
│ └── hosts.yaml
├── roles
│ ├── clients
│ │ ├── tasks
│ │ │ └── main.yaml
│ │ └── templates
│ │ └── pip.conf.j2
│ └── nexus
│ ├── files
│ │ └── swagger.json
│ ├── tasks
│ │ ├── download.yaml
│ │ ├── install.yaml
│ │ ├── main.yaml
│ │ ├── post_install.yaml
│ │ ├── pre_install.yaml
│ │ ├── repositories.yaml
│ │ ├── third_party.yaml
│ │ └── user.yaml
│ └── templates
│ ├── logrotate.nexus3.j2
│ ├── nexus3.service.j2
│ ├── nexus.rc.j2
│ └── nexus.vmoptions.j2
├── site.yaml
├── vars
│ ├── clients.yaml
│ └── nexus.yaml
└── vault
├── nexus_password.enc
└── README.md
13 directories, 21 files
এখন একটু ব্যাখ্যা:
-
দুটি ভূমিকা আছে:'নেক্সাস' এবং 'ক্লায়েন্ট'। নেক্সাস ভূমিকাটি আর্টিফ্যাক্ট ম্যানেজমেন্ট সফ্টওয়্যার সেটআপ করতে ব্যবহৃত হয়, যখন ক্লায়েন্ট ভূমিকা প্রতিটি মেশিনে পিপ সেটিংস সেট আপ করে৷
-
Vars-এ প্রতিটি ভূমিকায় ব্যবহৃত ভেরিয়েবল রয়েছে, তাদের ব্যবহারকে আরও স্পষ্ট করার জন্য ফাইল দ্বারা আলাদা করা হয়েছে
-
আমাদের পাসওয়ার্ড আছে, এবং আমরা উত্তরযোগ্য ভল্ট বৈশিষ্ট্য ব্যবহার করে সেগুলি পরিচালনা করেছি।
-
'site.yaml' ফাইলটি ভূমিকা সম্পাদনের অর্কেস্ট্রেট করে:
- hosts: all
tags: clients
vars_files:
- vars/clients.yaml
roles:
- clients
- hosts: nexus_server
tags: nexus
become_user: root
become: true
vars_files:
- vars/nexus.yaml
roles:
- nexus
এখন চলুন মহাবিশ্ব দেখার জন্য এগিয়ে যাই যেখানে প্লেবুকটি কার্যকর করা হবে।
হোস্ট ইনভেন্টরি
আমার ক্ষেত্রে এটি বেশ সহজ – আমার দুটি প্রধান গ্রুপ রয়েছে:'ক্লায়েন্ট' এবং মেশিন যেখানে নেক্সাস 3 সার্ভার নিজেই চলবে:
all:
children:
nexus_server:
hosts:
orangepi5.home:
home_lab:
hosts:
dmaf5.home:
raspberrypi.home:
orangepi5.home:
পরবর্তী গুরুত্বপূর্ণ কাজটি হল Nexus 3 ডাউনলোড এবং কনফিগার করা।
কিভাবে Nexus 3 ইনস্টল করবেন
main.yaml ফাইলটি Nexus ভূমিকার জন্য প্রতিটি ইনস্টলেশন টাস্কের ক্রম এবং উদ্দেশ্য বর্ণনা করে:
# Tasks listed here are related to the remote Nexus 3 server
# Included tasks are called in order
---
- include_tasks: third_party.yaml
- include_tasks: pre_install.yaml
- include_tasks: download.yaml
- include_tasks: install.yaml
- include_tasks: post_install.yaml
- include_tasks: user.yaml
- include_tasks: repositories.yaml
আসুন প্রথমে দেখি আমি কি "মূল কাজ" বলতে চাই:
-
third_party.yaml:এখানে আমরা OpenJDK8 ইন্সটল করি (Nexus 3 জাভাতে লেখা আছে) এবং পুরানো লগগুলির যত্ন নেওয়ার জন্য logrotate করি৷
-
pre_install.yaml:এখানে অনেক কিছু ঘটে, যেমন নেক্সাসের জন্য প্রয়োজনীয় ডিরেক্টরি তৈরি করা, ডেডিকেটেড নন-প্রিভিলেজড ব্যবহারকারী যা প্রক্রিয়া চালাবে।
-
download.yaml:নাম অনুসারে, আমরা Nexus 3 OSS সফ্টওয়্যারের একটি নতুন সংস্করণ পাই এবং নিশ্চিত করি যে এটির সঠিক চেকসাম আছে। আমরা ইন্টারনেট থেকে ম্যালওয়্যার ইনস্টল করতে চাই না।
তারপরে "কাস্টমাইজড ইনস্টলেশন গ্রুপ"-এর মধ্যে পড়ে এমন কাজগুলি আসে:
-
install.yaml:সফ্টওয়্যারটি আনপ্যাক করুন, এটি স্বয়ংক্রিয়ভাবে শুরু করার জন্য সিস্টেমড ইউনিট প্রস্তুত করুন, নেক্সাসের জন্য JVM সেটিংস সেটআপ করুন এবং লগরোটেট কনফিগারেশন স্থাপন করুন৷
-
post_install.yaml:উত্তেজনাপূর্ণ জিনিস এখানে ঘটে – সফ্টওয়্যারটি ইনস্টল করা হয়েছে, এবং আমরা এটি প্রথমবারের মতো চালাই। আমরা REST API ব্যবহার করে ডিফল্ট পাসওয়ার্ডও পরিবর্তন করি, যাতে আমরা কাস্টমাইজেশন পর্যায়ে যেতে পারি।
-
user.yaml:এখানে আমরা আমাদের শেষ ব্যবহারকারীদের Nexus দ্বারা প্রদত্ত পরিষেবাগুলিতে যথাযথ অ্যাক্সেস দেওয়ার জন্য প্রস্তুত। আমরা REST-API এবং উত্তরযোগ্য ক্লায়েন্ট কোডের সংমিশ্রণ ব্যবহার করে এটি করি:
# https://help.sonatype.com/repomanager3/installation-and-upgrades/post-install-checklist
# https://help.sonatype.com/repomanager3/integrations/rest-and-integration-api
---
- name: Enable anonymous user
tags: anonymous
ansible.builtin.uri:
user: ""
password: ""
url: "/v1/security/anonymous"
method: PUT
body_format: raw
status_code: [ 200, 202, 204 ]
headers:
Content-Type: application/json
body: |-
{ "enabled" : true, "userId" : "anonymous", "realmName" : "NexusAuthorizingRealm" }
force_basic_auth: true
return_content: true
any_errors_fatal: true
- name: Enable Docker security realm
tags: docker_realm
ansible.builtin.uri:
user: ""
password: ""
url: "/v1/security/realms/active"
method: PUT
body_format: raw
status_code: [ 200, 202, 204 ]
headers:
Content-Type: application/json
body: |-
[ "NexusAuthenticatingRealm", "NexusAuthorizingRealm", "DockerToken" ]
force_basic_auth: true
return_content: true
any_errors_fatal: true
যুক্তিটি অনুসরণ করা সহজ, 'PUT' HTTP পদ্ধতি ব্যবহার করে আপনি বলতে পারেন একটি পরিবর্তন অপারেশন (অর্থাৎ বিদ্যমান ভূমিকা এবং ব্যবহারকারীরা ইতিমধ্যেই বিদ্যমান)। নেক্সাস দ্বারা HTTP কোডগুলি ফেরত পাওয়ার মাধ্যমে ত্রুটি সনাক্তকরণ করা হয়৷
৷পরবর্তী ধাপ হল আমাদের স্থানীয় PyPi প্রক্সি প্রস্তুত করা। এটি একটি বহুমুখী কাজ এবং পরবর্তীতে বিস্তারিত বর্ণনা করা হবে৷
৷নেক্সাস 3 এ PyPI প্রক্সি কিভাবে সেট আপ করবেন
নেক্সাস 3 রোলের শেষ ফাইলটি হল 'repositories.yaml'। এখানে আমরা নিম্নলিখিত ধাপগুলি অতিক্রম করি:
-
প্রক্সিটি ইতিমধ্যে সেটআপ করা হয়েছে কিনা তা পরীক্ষা করুন (GET or read only operation)
-
যদি এটি বিদ্যমান না থাকে তবে একটি নতুন তৈরি করুন (সম্পূর্ণ নতুন সংগ্রহস্থল তৈরি করতে বিশদ সহ JSON পেলোড সহ পোস্ট পদ্ধতি)
লক্ষ্য করুন এই প্লেবুক রিপোজিটরি সেটিংস আপডেট করার বিকল্প অফার করে না। এটি REST API দিয়ে করা সম্ভব, তবে আমি এটি পাঠকের জন্য একটি অনুশীলন হিসাবে ছেড়ে দেব।
PyPi প্রক্সি প্রস্তুত করার কাজগুলি নীচে দেখানো হয়েছে:
# Create proxy for repositories
# https://help.sonatype.com/repomanager3/integrations/rest-and-integration-api
# PyPi: https://pip.pypa.io/en/stable/user_guide/
---
- name: Check if the PyPi proxy exists
tags: pypi_proxy_exists
ansible.builtin.uri:
user: ""
password: ""
url: "/v1/repositories/pypi/proxy/python_proxy"
method: GET
body_format: raw
status_code: [ 200, 202, 204, 404 ]
headers:
Content-Type: application/json
force_basic_auth: true
return_content: true
any_errors_fatal: true
register: python_local
- name: Create PyPI proxy
tags: pypi_proxy_create
ansible.builtin.uri:
user: ""
password: ""
url: "/v1/repositories/pypi/proxy"
method: POST
body_format: raw
status_code: [ 201 ]
headers:
Content-Type: application/json
body: |-
{
"name": "python_proxy",
"online": true,
"storage": {
"blobStoreName": "default",
"strictContentTypeValidation": true
},
"proxy": {
"remoteUrl": "https://pypi.org/",
"contentMaxAge": -1,
"metadataMaxAge": 1440
},
"negativeCache": {
"enabled": true,
"timeToLive": 1440
},
"httpClient": {
"blocked": false,
"autoBlock": true,
"connection": {
"retries": 0,
"timeout": 60,
"enableCircularRedirects": false,
"enableCookies": true,
"useTrustStore": false
}
}
}
force_basic_auth: true
return_content: true
any_errors_fatal: true
when: python_local.status == 404
আমরা প্রায় সেখানে. এখন আমাদের PyPi ক্লায়েন্টদের বলতে হবে আমাদের Python লাইব্রেরি পেতে সরাসরি PyPi সাইট নয় বরং আমাদের স্থানীয় নেক্সাস ব্যবহার করা উচিত।
ক্লায়েন্টদের কিভাবে সেট করবেন
ক্লায়েন্টদের ভূমিকা অনেক সহজ এবং শুধুমাত্র আমাদের নতুন সংগ্রহস্থলে অনুসন্ধান জোরদার করার জন্য যথেষ্ট তথ্য সহ pip.conf-এর জন্য একটি টেমপ্লেট স্থাপন করা প্রয়োজন:
# Tasks here are meant to be used on our clients user
---
- name: Create installation directory for pip.conf
tags: pip_basedir
ansible.builtin.file:
state: directory
path: ""
owner: ""
group: ""
mode: "u+rwx,go-rwx"
- name: Copy pip.conf file
tags: pip_copy
ansible.builtin.template:
src: pip.conf.j2
dest: "/pip.conf"
owner: ""
group: ""
mode: u=rxw,g=r,o=r
ফলস্বরূপ ফাইলটি '~/.config/pip/pip.conf-এ স্থাপন করা হয় প্রতিটি মেশিনের:
# https://pip.pypa.io/en/stable/topics/configuration/
[global]
timeout = 60
[install]
index = http://orangepi5.home:8081/repository/python_proxy/pypi
index-url = http://orangepi5.home:8081/repository/python_proxy/simple/
trusted-host = orangepi5.home
উপরের ফাইলটি আমার ক্লাস্টারে স্থাপন করার পরে ফাইলের চূড়ান্ত সংস্করণটি কেমন দেখাবে তার একটি উদাহরণ দেখায় (আপনারটি সমাধান করা URL এর সাথে আলাদা হবে)।
এখন পুরো প্লেবুকটি চালানোর এবং এটি দেখতে কেমন তা দেখার সময় এসেছে৷
প্লেবুকটি কিভাবে চালাবেন
প্লেবুক চালানোর জন্য, আমরা কয়েকটি আর্গুমেন্ট পাস করি:
-
আমাদের হোস্ট ইনভেন্টরির অবস্থান
-
এনক্রিপ্ট করা পাসওয়ার্ড ফাইলের অবস্থান এবং সুরক্ষিত ফাইলের বিষয়বস্তু আনলক করার জন্য মাস্টার পাসওয়ার্ড ধারণকারী একটি মাস্টার ফাইল
-
এবং অবশেষে আমাদের প্রধান প্লেবুক ফাইলের অবস্থান
cd ansible
ansible-playbook --inventory inventories --extra-vars @vault/nexus_password.enc --vault-password-file $HOME/vault/ansible_vault_pass site.yaml

কিভাবে নতুন PyPI প্রক্সি পরীক্ষা করবেন
আমাদের নতুন প্রক্সি পরীক্ষা করার জন্য, আমরা পিপ এবং ভার্চুয়াল পরিবেশ ব্যবহার করে পাইথন রিচ ইনস্টল করব।
josevnz@orangepi5:~$ python3 -m venv ~/virtualenv/rich
(rich) josevnz@orangepi5:~$ . ~/virtualenv/rich/bin/activate
(rich) josevnz@orangepi5:~$ pip install rich
Looking in indexes: http://orangepi5.home:8081/repository/python_proxy/simple/
Collecting rich
Downloading http://orangepi5.home:8081/repository/python_proxy/packages/rich/13.3.4/rich-13.3.4-py3-none-any.whl (238 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 238.7/238.7 KB 14.8 MB/s eta 0:00:00
Collecting pygments<3.0.0,>=2.13.0
Downloading http://orangepi5.home:8081/repository/python_proxy/packages/pygments/2.15.0/Pygments-2.15.0-py3-none-any.whl (1.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 23.8 MB/s eta 0:00:00
Collecting markdown-it-py<3.0.0,>=2.2.0
Downloading http://orangepi5.home:8081/repository/python_proxy/packages/markdown-it-py/2.2.0/markdown_it_py-2.2.0-py3-none-any.whl (84 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 84.5/84.5 KB 6.9 MB/s eta 0:00:00
Collecting mdurl~=0.1
Downloading http://orangepi5.home:8081/repository/python_proxy/packages/mdurl/0.1.2/mdurl-0.1.2-py3-none-any.whl (10.0 kB)
Installing collected packages: pygments, mdurl, markdown-it-py, rich
Successfully installed markdown-it-py-2.2.0 mdurl-0.1.2 pygments-2.15.0 rich-13.3.4
এবং তারপরে আমরা নিশ্চিত করতে পারি যে নতুন সংগ্রহস্থলে নতুন আর্টিফ্যাক্টগুলি দেখে ক্যাশে প্রকৃতপক্ষে ব্যবহৃত হয়েছিল:

PyPi আর্টিফ্যাক্টগুলি দেখুন৷
চলুন ক্লায়েন্টের একটি ডেমো দেখা যাক, অন্য কিছু ইনস্টল করা হচ্ছে:

আরও কাস্টমাইজেশন REST-API ব্যবহার করে
প্রতিটি নেক্সাস ইনস্টলেশন আপনাকে একটি JSON ফাইল ডাউনলোড করতে দেয় যা সার্ভার দ্বারা সমর্থিত API বর্ণনা করে। উদাহরণস্বরূপ, আমার সার্ভারে আপনি আমার orangepi5.home সার্ভার থেকে এরকম একটি অনুলিপি পেতে পারেন:
curl --fail --remote-name http://orangepi5.home:8081/service/rest/swagger.json
এছাড়াও, UI আপনাকে আপনার ইনস্টলেশন কাস্টমাইজ করতে অন্যান্য REST API শেষ পয়েন্টগুলি চেষ্টা করার অনুমতি দেয়৷

REST API পরীক্ষা
উপসংহার
এই টুলটি যে বৈশিষ্ট্যগুলি অফার করতে পারে তার সাথে নিজেকে পরিচিত করতে আমি কিছু সময় ব্যয় করার এবং Nexus 3 বই পড়ার পরামর্শ দিচ্ছি৷
কমিউনিটি ডেবিয়ান এবং RPM ইনস্টলার প্রস্তুত করে, যদি আপনার এই ধরনের সেটআপের প্রয়োজন হয়, যা Ansible ব্যবহার করে।
Nexus 3 অনেক আছে৷ কনফিগারযোগ্য সেটিংসের। আমরা এখানে শুধুমাত্র পৃষ্ঠ আচ্ছাদিত. এই নিবন্ধটি প্রস্তুত করার সময় আমি একটি সম্পূর্ণ এবং আপ-টু-ডেট প্লেবুক সহ 'ThoTeam Nexus3-oss সংগ্রহস্থল' পেয়েছি, কিন্তু এটি আমার বাড়ির ল্যাবের জন্য প্রয়োজনীয় যেকোনো কিছুর চেয়ে অনেক বেশি জটিল ছিল।
আর্কাইভা হল আরেকটি ওপেন সোর্স আর্টিফ্যাক্ট ম্যানেজার, এটি কার্যকারিতার ক্ষেত্রে আরও সীমিত কিন্তু সেটআপ করাও সহজ৷
কিছু কাজ সহ একটি পোস্ট-ইন্সটলেশন চেকলিস্ট রয়েছে যা আমার হোম ল্যাবের জন্য সম্পূর্ণ করার প্রয়োজন ছিল না। আপনার সেটআপ সম্পূর্ণ হয়েছে তা নিশ্চিত করতে দয়া করে এটি পরীক্ষা করে দেখুন৷
বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন