[TOC]
[ ←전편보기 ]
1. 전편요약.
전편에서는 폐쇄망에서 사용할 Nexus 저장소 를 작성하기 위해
인터넷 망에서 Nexus 설치, 저장소 생성 및 설정 그리고 npm
및 maven central
저장소를 저장(캐싱) 하는 방법까지 살펴 보았다.
주의사항은 Nexus 3.70.x
버젼을 기점으로 구버젼은 Orient-DB
를 사용하고 신버젼은 H2-DB
를 사용하며, 상호 호환성은 없으므로, 양쪽 Nexus 의 버젼을 맞추어 주어야 한다.
그리고 Blob
은 프로젝트명으로 따로 설정 (예제에서는 test-proj
) 해서 캐싱 했었다.
이번편에서는 인터넷 망에서 작성된 Nexus 저장소를 백업 하고 폐쇄망에 설치된 타 저장소에서 복원하는 방법, 그리고 저장소 체이닝 방법까지 다루어 보도록 하겠다.
2. 인터넷 망에서 기존 저장소의 백업
저장소의 백업은 다음과 같이 수행한다.
Configuration
→System
→ 최하단Tasks
클릭 →Create Task
버튼 클릭
Admin - Backup H2 Database
(H2-DB) 또는Admin - Export database for backup
(Orient-DB) 를 클릭한다.
Task name
항목에 'Backup task',Backup location
항목에 백업받을 폴더 위치,Task frequency
에 'Manual' 을 각각 선택하고 하단의Create task
버튼을 클릭한다.
- 새로 생성된
Backup location
항목을 클릭후Run
버튼을 클릭한다.
이후 백업위치로 지정해 둔 폴더의 목록을 살펴보면 (예제에서는 /home/lupfeliz/backup
) nexus-xxxx-xx-xx-xx-xx-xx.zip
형태의 이름으로 백업파일이 생성된 걸 확인할 수 있다.
$ ls /home/lupfeliz/backup/
nexus-2024-10-18-20-08-46.zip
DB 백업은 된 상태고, 다시 Nexus 설치 위치에서 Blob 폴더도 압축해서 백업 받아두자 (역시나 설명은 리눅스 기준으로 설명하겠다.)
기본 위치는 Nexus 설치 위치에서 /sonatype-work/nexus3/blobs
이다
"1편 #3-1. Repository 생성하기" 에서와 같이 별도의 Blob 을 설정했다면 해당 Blob 폴더만 압축하면 된다.
$ cd ${Nexus설치 위치}
$ cd sonatype-work/nexus3
## blob 전체를 압축하는 경우
$ tar -pzcvf blobs.tgz blobs/*
... 중략 ...
## 특정 blob 만 선택하여 압축하는 경우 (예제는 test-proj)
$ tar -pzcvf blobs.tgz blobs/test-proj
... 중략 ...
이 파일들만 있다면 (nexus-***.zip
, blobs.tgz
) 이제 인터넷 망에서 할 일은 다 마쳤다고 할수 있다.
3. 폐쇄망 신규 저장소에서의 복원 (데이터 삭제후 복원)
이제 생성된 백업 및 Blob 파일을 폐쇄망에 설치된 Nexus 에서 복원해 보자
주의할점은 신규저장소에 저장되어 있던 데이터들은 모두 삭제된다는 점이다
sonatype-work/nexus3/blobs
폴더를 생성하고 blob 파일(예제에서는blobz.tgz
) 파일을 압축 해제한다.
## 이미 만들어져 있다면 mkdir은 생략가능
$ mkdir ${Nexus설치 위치}/sonatype-work/blobs
$ tar -pzxvf blobs.tgz -C ./sonatype-work/nexus3/blobs/
... 중략 ...
blobs/test-proj/reconciliation/2024-10-08
blobs/test-proj/reconciliation/2024-10-09
blobs/test-proj/reconciliation/2024-10-10
blobs/test-proj/metadata.properties
blobs/test-proj/06F6C282-6ABACFC6-96A4EB73-5D08F3AA-1B5407FC-metrics.properties
sonatype-work/nexus3/db
폴더를 삭제해 준다 (기존데이터가 삭제되므로 주의)
$ rm -rf ${Nexus설치 위치}/sonatype-work/nexus3/db
sonatype-work/nexus3/restore-from-backup
폴더를 생성하고nexus-***.zip
파일을 복사한다 (Nexus 재시작 시 import process가 자동으로 실행됨)
## 이미 만들어져 있다면 mkdir은 생략가능
$ mkdir ${Nexus설치 위치}/sonatype-work/nexus3/restore-from-backup
$ mv nexus-2024-10-18-20-08-46.zip ${Nexus설치 위치}/sonatype-work/nexus3/restore-from-backup
- Nexus 를 구동한다.
$ cd ${Nexus설치 위치}
$ ./nexus*/bin/nexus start
Starting nexus
## 구동로그 조회. 8081 번 포트로 실행된걸 확인할 수 있다.
$ tail -n8 ./sonatype-work/nexus3/log/nexus.log
2024-10-18 15:12:16,430+0900 INFO [jetty-main-1] *SYSTEM org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@261ffc0c{HTTP/1.1, (http/1.1)}{0.0.0.0:8081}
2024-10-18 15:12:16,430+0900 INFO [jetty-main-1] *SYSTEM org.eclipse.jetty.server.Server - Started @41146ms
2024-10-18 15:12:16,430+0900 INFO [jetty-main-1] *SYSTEM org.sonatype.nexus.bootstrap.jetty.JettyServer -
-------------------------------------------------
Started Sonatype Nexus OSS 3.70.2-01
-------------------------------------------------
복원된 데이터를 확인할 수 있다
4. 다중 저장소 체인 및 설정방법 (데이터 삭제하지 않음)
여러개의 Nexus instance 를 proxy 로 중첩 연결하는 방식이다. (직.병렬형 둘다 가능)
기존의 저장소를 그대로 두고 다른 저장소의 패키지를 같이 사용할 수 있는 방법이다.
예컨데 폐쇄망에 8081번 포트로 메인 넥서스가 떠 있다면. 이걸 그대로 두고 8082번 포트로 서브 넥서스를 띄워서 프록시로 연결 시킬수 있다 는 것이다.
또한 독립적으로 실행되는 서버라 구버젼, 신버젼 상관 없이 연결 가능하다
stateDiagram-V2
direction TB
PROJECT --> Nexus_1:request
Nexus_1 --> Nexus_2:proxy
Nexus_1 --> Nexus_3:proxy
Nexus_1 --> Nexus_N:proxy
Nexus_3 --> Nexus_3_2:proxy
note right of PROJECT maven, gradle, npm 등 end note
note left of Nexus_1 8081번 포트로 실행 end note
note right of Nexus_2 8082번 포트로 실행 end note
note right of Nexus_3 8083번 포트로 실행 end note
note right of Nexus_N 808N번 포트로 실행 end note
note right of Nexus_3_2 직렬연결도 가능 end note
4-1. 저장소 체이닝(연결)
단순하게 인터넷 망에서 작성된 넥서스 사본을 통째로 들고와서 포트번호만 다르게 띄우고 나머지는 메인 넥서스에서 설정하면 된다.
서브 넥서스의 포트 변경은 nexus-3.**.*-**/etc/nexus-default.properties
파일에서 application-port
항목(기본:8081)을 변경시켜서 구동하면 된다.
$ cd ${서브Nexus설치 위치}
$ vim nexus-*/etc/nexus-default.properties
... 중략 ...
application-port=8081
application-host=0.0.0.0
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
nexus-context-path=/
... 중략 ...
메인 넥서스와 원본(서브) 넥서스가 준비되었으니 이제 이 둘을 연결해 보자 (예제상으로는 메인이 192.168.0.2:8081
서브가 192.168.0.2:8082
)
설정 방법은 전편에서 다룬것과 거의 비슷하니 자세한 설명은 생략 하겠다.
- 메인 넥서스 에서
Configuration
→Repositories
→Create repository
버튼 클릭
npm (proxy)
선택
-
Name
항목에test-proj-npm-proxy
기재 (복사할 repository 이름) -
Remote storage
항목에http://192.168.0.2:8082/repository/test-proj-npm-proxy/
기재 -
하단의
Create repository
버튼을 클릭한다.
- Remote storage 는 서브 넥서스 에서
Browse
→Browse
→ 원하는 Repository 오른쪽Copy
버튼을 클릭하면 표시된다.
여기까지 진행하면 메인넥서스 의 test-proj-npm-proxy
저장소가 서브넥서스 의 test-proj-npm-proxy
를 프록시 하도록 연결이 완료된다.
stateDiagram-V2
direction LR
메인Nexus --> 서브Nexus:proxy
note left of 메인Nexus 8081 포트 end note
note right of 서브Nexus 8082 포트 end note
마찬가지로 maven 저장소(Repository)
도 생성하여 연결할 수 있다.
4-2. 연결된 저장소의 데이터 가져오기(캐싱)
두대의 넥서스를 연결하기는 했지만 아직 패키지를 가져오지는 않았다.
프로젝트에서 메인 넥서스에 npm 또는 maven 읽어오기를 시도하면 현재 프로젝트에 필요한 것만 서브 넥서스에서 캐싱하여 저장한다.
따라서 원본(서브) 넥서스의 모든 요소들을 메인 넥서스에서 한번씩 읽어와 줄 필요가 있다.
한번 읽어와 준 후에는 원본(서브) 넥서스를 종료/ 삭제해도 된다.
이를 실행해 줄 간단한 어플리케이션을 하나 만들었다.
바이너리 다운로드 : https://github.com/lupfeliz/nexus-proxy-attach/releases/tag/v0.0.2
GITHUB 주소 : https://github.com/lupfeliz/nexus-proxy-attach
stateDiagram-V2
direction TB
메인넥서스 --> 서브넥서스:proxy 복제
note left of 서브넥서스 원본 = 192.168.0.2:8082 end note
note left of 메인넥서스 사본 = 192.168.0.2:8081 end note
Nexus_Proxy_Attach --> 메인넥서스:목록의 원본 파일들을 요청
Nexus_Proxy_Attach --> 서브넥서스:원본 파일목록 요청
바이너리를 다운받아 다음과 같이 실행해 주자
## java -jar nexus-proxy-attach {서브 Nexus주소} {서브 NexusRepository명} {메인 Nexus주소} {메인 NexusRepository명}
$ java -jar nexus-proxy-attach.jar http://192.168.0.2:8082 test-proj-npm-proxy http://192.168.0.2:8081 test-proj-npm-proxy
... 중략 ...
08:34:51.029 [main] DEBUG com.ntiple.nexus.NexusProxyAttach - URL:http://192.168.0.2:8081/repository/test-proj-npm-proxy/@next/env/-/env-14.2.7.tgz
08:34:51.808 [main] DEBUG com.ntiple.nexus.NexusProxyAttach - URL:http://192.168.0.2:8081/repository/test-proj-npm-proxy/@material/feature-targeting/-/feature-targeting-14.0.0.tgz
08:34:53.555 [main] DEBUG com.ntiple.nexus.NexusProxyAttach - URL:http://192.168.0.2:8081/repository/test-proj-npm-proxy/@material/theme/-/theme-14.0.0.tgz
이제 메인넥서스 에 접근하여 새로 생성한 proxy 저장소를 확인해 보면 서브넥서스 에 있던 파일들이 그대로 저장된 걸 확인할 수 있다.
5. 그리고...
npm 패키지 중 es-build
, swc
등 일부 네이티브 바이너리 패키지 들은 개발환경과 구동환경이 다른경우 두 환경 모두 캐싱 해 주어야 한다.
(윈도우용과 리눅스용 프로젝트 모두 구동시켜서 캐싱)
만약에 nexus 를 docker 로 실행시켰다면 권한문제 가 발생할 수있다.
문제가 발생했다면 파일 소유자를 사용자번호 200 으로 맞추어 보자 (sudo chown -R 200 ~/dockerVolume/nexus
)
전편부터 뭔가 빼먹은 내용이 있는것 같은건 단순한 착시현상일 뿐이다. 구버젼 DB변환 (Orient-DB → H2-DB).. 읍!읍!
[ ←전편보기 ]