Nexus 3 OSS là trình quản lý kho lưu trữ cấu phần nguồn mở có thể xử lý nhiều định dạng như hình ảnh vùng chứa, Python PIP, Java jar và nhiều định dạng khác.
Tại sao phải có người quản lý hiện vật tại chỗ? Có rất nhiều lý do cho việc đó:
-
Sử dụng cơ sở hạ tầng riêng tư của bạn:Bạn có thể có mã độc quyền cần được bảo vệ.
-
Tốc độ tải xuống cấu phần phần mềm nhanh hơn:Nếu bạn liên tục tải xuống cùng một cấu phần phần mềm qua Internet, bạn có thể lưu chúng vào bộ nhớ đệm ở một vị trí trung tâm, vì lợi ích của nhiều người dùng trên nhiều máy chủ bằng cách lưu chúng vào bộ nhớ đệm.
-
Kiểm soát những thành phần lạ nào được đưa vào chuỗi xây dựng của bạn:Tập trung vị trí của các thành phần lạ, đảm bảo chúng được phê duyệt để sử dụng và cũng xác nhận rằng chúng không chứa mã độc.
-
Tách biệt những người có thể có quyền truy cập vào các tạo phẩm của bạn:Bạn có thể có những yêu cầu nghiêm ngặt hơn về những người có thể truy cập vào một số tạo phẩm trong tổ chức của bạn.
Trong bài viết này, tôi sẽ chỉ cho bạn cách tải xuống, cài đặt và định cấu hình phiên bản OSS của Nexus 3 bằng Playbook Ansible.
Nexus 3 sẽ chạy trên máy tính Orange PI 5 có 8 GB hoặc RAM, nhưng việc cung cấp này có thể được thực hiện trên bất kỳ máy nào có yêu cầu tối thiểu. Một phần của quá trình thiết lập sẽ bao gồm việc đặt proxy cho PyPI.org cho các máy được liệt kê trong tệp kho của tôi.
Bạn cần những gì để chạy mã từ hướng dẫn này
-
Kết nối Internet để tải xuống mã nguồn cho Playbook Ansible, Nexus và mô-đun PIP
-
Hai hoặc nhiều máy Linux (tôi đã sử dụng Debian, Armbian và Fedora IOT), có ít nhất 8 GB RAM. Cụm của tôi có sự kết hợp giữa Raspberry PI 4 và OrangePI 5.
-
Bộ điều khiển Ansible sẽ chạy trên máy Fedora, nhưng bất kỳ máy chủ nào cũng có thể là bộ điều khiển. Hướng dẫn cài đặt Ansible rất dễ thực hiện.
Tổ chức Playbook
Tôi chia nhiệm vụ theo nhóm và kết quả là playbook trông như thế này:
[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
Bây giờ giải thích một chút nhé:
-
Có hai vai trò:'nexus' và 'khách hàng'. Vai trò Nexus được sử dụng để thiết lập phần mềm quản lý thành phần, trong khi vai trò khách hàng thiết lập cài đặt pip trên mọi máy.
-
Vars chứa các biến được sử dụng trên mỗi vai trò, được phân tách bằng các tệp để cách sử dụng chúng rõ ràng hơn
-
Chúng tôi có mật khẩu và quản lý chúng bằng tính năng Ansible vault.
-
Tệp ‘site.yaml’ Điều phối việc thực thi vai trò:
- 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
Bây giờ chúng ta hãy chuyển sang xem vũ trụ nơi playbook sẽ được thực thi.
Kho lưu trữ máy chủ
Trong trường hợp của tôi, nó khá đơn giản – tôi có hai nhóm chính:‘khách hàng’ và máy nơi máy chủ Nexus 3 sẽ chạy:
all:
children:
nexus_server:
hosts:
orangepi5.home:
home_lab:
hosts:
dmaf5.home:
raspberrypi.home:
orangepi5.home:
Nhiệm vụ quan trọng tiếp theo là tải xuống và định cấu hình Nexus 3.
Cách cài đặt Nexus 3
Tệp main.yaml mô tả thứ tự và mục đích của từng tác vụ cài đặt cho Nexus role:
# 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
Trước tiên hãy xem tôi gọi “nhiệm vụ cốt lõi” là gì:
-
Third_party.yaml:Tại đây, chúng tôi cài đặt OpenJDK8 (Nexus 3 được viết bằng Java) và logrotate để xử lý các nhật ký cũ.
-
pre_install.yaml:Rất nhiều điều xảy ra ở đây, chẳng hạn như tạo các thư mục cần thiết cho Nexus, người dùng không có đặc quyền chuyên dụng sẽ chạy quy trình.
-
download.yaml:Đúng như tên gọi, chúng tôi nhận được phiên bản mới của phần mềm Nexus 3 OSS và đảm bảo rằng nó có tổng kiểm tra phù hợp. Chúng tôi không muốn cài đặt phần mềm độc hại từ Internet.
Sau đó đến các nhiệm vụ thuộc “nhóm cài đặt tùy chỉnh”:
-
install.yaml:Giải nén phần mềm, chuẩn bị đơn vị systemd để tự động khởi động phần mềm, thiết lập cài đặt JVM cho Nexus và triển khai cấu hình logrotate.
-
post_install.yaml:Điều thú vị xảy ra ở đây – phần mềm đã được cài đặt và chúng tôi chạy nó lần đầu tiên. Chúng tôi cũng thay đổi mật khẩu mặc định bằng API REST để có thể chuyển sang giai đoạn tùy chỉnh.
-
user.yaml:Tại đây, chúng tôi chuẩn bị cung cấp cho người dùng cuối quyền truy cập thích hợp vào các dịch vụ do Nexus cung cấp. Chúng tôi thực hiện việc này bằng cách sử dụng kết hợp mã máy khách REST-API và Ansible:
# 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
Logic rất dễ thực hiện bằng cách sử dụng phương thức http 'PUT' mà bạn có thể biết đó là một thao tác sửa đổi (có nghĩa là các vai trò và người dùng hiện tại đã tồn tại). Việc phát hiện lỗi được thực hiện bằng cách lấy mã HTTP được Nexus trả về.
Bước tiếp theo là chuẩn bị proxy PyPi cục bộ của chúng tôi. Đây là một nhiệm vụ gồm nhiều bước và sẽ được mô tả chi tiết ở phần tiếp theo.
Cách thiết lập Proxy PyPI trên Nexus 3
Tệp cuối cùng về vai trò của Nexus 3 là ‘repositories.yaml’. Ở đây chúng ta thực hiện các bước sau:
-
Kiểm tra xem proxy đã được thiết lập chưa (thao tác GET hoặc chỉ đọc)
-
Nếu nó không tồn tại, hãy tạo một kho lưu trữ mới (phương thức POST với tải trọng JSON kèm theo các chi tiết để tạo toàn bộ kho lưu trữ mới)
Lưu ý rằng playbook này không cung cấp tùy chọn cập nhật cài đặt kho lưu trữ. Có thể thực hiện được với API REST, nhưng tôi sẽ để nó như một bài tập cho người đọc.
Các tác vụ chuẩn bị proxy PyPi được hiển thị bên dưới:
# 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
Chúng tôi gần như ở đó. Bây giờ, chúng tôi cần nói với khách hàng PyPi rằng chúng tôi nên sử dụng Nexus cục bộ chứ không phải trang PyPi trực tiếp để tải thư viện Python.
Cách thiết lập khách hàng
Vai trò của khách hàng đơn giản hơn nhiều và chỉ yêu cầu triển khai một mẫu cho pip.conf với đủ thông tin để buộc tìm kiếm trên kho lưu trữ mới của chúng tôi:
# 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
Tệp kết quả được triển khai trên ‘~/.config/pip/pip.conf ’ của mọi máy:
# 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
Tệp ở trên hiển thị ví dụ về phiên bản cuối cùng của tệp sẽ trông như thế nào sau khi được triển khai trên cụm của tôi (phiên bản của bạn sẽ khác với URL đã được giải quyết).
Bây giờ là lúc chạy toàn bộ cẩm nang và xem nó trông như thế nào.
Cách chạy Playbook
Để chạy playbook, chúng tôi chuyển một vài đối số:
-
Vị trí kho lưu trữ máy chủ của chúng tôi
-
Vị trí của tệp mật khẩu được mã hóa và tệp chính chứa mật khẩu chính để mở khóa nội dung của tệp được bảo vệ
-
Và cuối cùng là vị trí của tệp playbook chính của chúng tôi
cd ansible
ansible-playbook --inventory inventories --extra-vars @vault/nexus_password.enc --vault-password-file $HOME/vault/ansible_vault_pass site.yaml

Cách kiểm tra proxy PyPI mới
Để kiểm tra proxy mới, chúng tôi sẽ cài đặt Python Rich bằng pip và môi trường ảo.
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
Và sau đó chúng tôi có thể xác nhận rằng bộ đệm thực sự đã được sử dụng bằng cách xem các tạo phẩm mới trên kho lưu trữ mới:

Xem các tạo phẩm PyPi
Hãy xem bản demo hoạt động của ứng dụng khách, cài đặt thứ khác:

Tùy chỉnh thêm bằng cách sử dụng REST-API
Mỗi lần cài đặt Nexus đều cho phép bạn tải xuống tệp JSON mô tả API được máy chủ hỗ trợ. Ví dụ:trong máy chủ của tôi, bạn có thể lấy một bản sao như thế này từ máy chủ orangepi5.home của tôi:
curl --fail --remote-name http://orangepi5.home:8081/service/rest/swagger.json
Ngoài ra, giao diện người dùng cho phép bạn thử các điểm cuối API REST khác để tùy chỉnh cài đặt của bạn.

Thử nghiệm API REST
Kết luận
Tôi khuyên bạn nên dành chút thời gian đọc sách Nexus 3 để làm quen với các tính năng mà công cụ này có thể cung cấp.
Cộng đồng đã chuẩn bị sẵn các trình cài đặt Debian và RPM nếu bạn cần loại thiết lập này thay vì sử dụng Ansible.
Nexus 3 có rất nhiều của các cài đặt có thể cấu hình. Chúng tôi chỉ bao gồm bề mặt ở đây. Trong khi chuẩn bị bài viết này, tôi đã tìm thấy 'kho lưu trữ ThoTeam Nexus3-oss' với một cẩm nang rất đầy đủ và cập nhật, nhưng nó phức tạp hơn nhiều so với bất kỳ thứ gì tôi yêu cầu cho phòng thí nghiệm tại nhà của mình.
Archiva là một trình quản lý tạo phẩm Nguồn mở khác, nó bị hạn chế hơn về chức năng nhưng cũng dễ thiết lập hơn.
Có một danh sách kiểm tra sau khi cài đặt với một số nhiệm vụ mà tôi không cần phải hoàn thành cho phòng thí nghiệm tại nhà của mình. Vui lòng kiểm tra để đảm bảo quá trình thiết lập của bạn đã hoàn tất.
Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu