::: IT인터넷 :::

Nexus3를 이용한 PyPi 사설 저장소 구축

정보보안썰문가 곰탱이푸우 2021. 6. 18. 08:20
반응형

Nexus3를 이용한 PyPi 사설 저장소 구축은 3개의 저장소가 필요하다.

  • hosted (Local) - 내부에서 작성한 Python 패키지인 Wheel (Whl) 파일을 배포한다.
  • proxy (Remote) - 외부의 PyPi 저장소의 패키지를 저장하고 내부 사용자에게 전달한다. 캐시 (Cache) 역할이다.
  • group (Repos) - 다수의 hosted, proxy 저장소를 묶어 단일 경로를 제공한다.

 

그림으로 표현하면 다음과 같다.

 

 

Local, Remote, Repos는 사내에서 운영중인 jFrog Artifactory에서 사용하는 용어이다.

Nexus3의 용어보다 더 직관적이어서, Local, Remote, Repos 용어를 사용한다.

 

 

blob store 생성

PyPi를 통해 공유되는 패키지 파일들을 저장할 공간을 설정한다.

Create blob store 버튼을 클릭한다.

 

 

사용할 저장 공간을 생성한다. 생성 순서는 상관없다. repos, local, remote 또는 local, remote, repos 순으로 진행한다.

아래는 repos 저장 공간을 생성을 위해 입력한 예시이다.

  • Type - File을 선택한다.
  • Name - pypi는 파이썬 패키지 저장소를 의미하는 prefix, 뒤에 repos는 어떤 용도인지 나타내는 postfix이다.
  • Enable Soft Quota는 저장 공간의 용량을 제한할 때 사용한다.
  • Path - 파일이 저장되는 실제 경로이다. Name에 입력한 내용으로 자동 생성된다.

 

 

Name은 헷갈리지 않는 선에서 자유롭게 작성 가능하다.

 

 

PyPi Repository 생성

blob store 생성이 완료되면 저장소 (Repository)를 생성한다.

Create repository 버튼을 클릭한다.

 

 

생성할 저장소 타입을 선택한다.

pypi는 group (repos), hosted (local), proxy (remote) 등 3개의 타입 생성이 가능하다.

hosted와 proxy를 먼저 생성하고 group을 생성하면서 hosted와 proxy를 구성 요소로 묶어준다.

 

 

hosted (Local)

먼저 pypi (hosted)를 선택하여 hosted 저장소를 생성한다. 신규 작성한 Python 패키지를 배포할 때 내부에서만 사용하고 외부 배포를 제한할때 유용하다.

  • Name - 저장소 이름을 설정한다. Blob store와 이름이 동일해도 상관없다. 오히려 동일하면 헷갈리지 않는다.
  • Blob store - 기존에 생성한 저장소를 선택한다. hosted (Local) 저장소이므로 pypi-local을 선택한다.

 

 

 

proxy (Remote)

pypi (proxy)를 선택하여 proxy 저장소를 생성한다. 외부 저장소를 연결할 때 사용한다.

  • Name - 저장소 이름을 설정한다. Blob store와 동일한 이름을 사용한다.
  • Remote storage - 외부 저장소 경로 (URL)를 입력한다. 공식 pypi 저장소인 https://pypi.org를 지정한다.
  • Use the Nexus truststore - 외부 저장소 경로가 HTTPS인 경우 해당 인증서를 신뢰할지 설정한다. View certificate를 클릭하고 Accept도 적용한다.
  • Blob store - 기존에 생성한 저장소를 선택한다. proxy (Remote) 저장소이므로 pypi-remote를 선택한다.

 

 

Repos (group)

pypi (group)을 선택하여 proxy 저장소를 생성한다. hosted와 proxy 저장소를 묶어 하나의 저장소로 설정할 때 사용한다.

  • Name - 저장소 이름을 설정한다. Blob store와 동일한 이름을 사용한다.
  • Blob store - 기존에 생성한 저장소를 선택한다. proxy (group) 저장소이므로 pypi-repos를 선택한다.
  • Member repositories - 기존에 생성한 pypi-local, pypi-remote 저장소를 Members로 옮긴다. (> 화살표 또는 더블클릭)

 

 

모든 저장소 설정이 완료되었다. 생각보다 간단하다.

 

 

pip 클라이언트 설정

설정한 저장소가 잘 동작하는지 확인하기 위해 pip 명령으로 Nexus3 저장소를 사용한다.

 

리눅스

리눅스에서는 먼저 pip.conf 설정을 수정해야 한다.

 

/etc/pip.conf 파일을 수정한다. /etc 경로이기 때문에 관리자 권한이 필요하여 sudo를 사용한다.

 

 

pip.conf 파일의 내용을 작성 (또는 수정)한다. pypi-repos (group) 저장소를 사용하며, 경로 마지막에 /simple이 추가되는 것에 주의한다.

 

 

pip.conf

[global]
# 포트는 Sonatype Nexus3 설정 당시 리버스프록시로 설정한 포트
index-url=https://도메인주소:포트/repository/pypi-repos/simple
trusted-host=도메인주소

 

pip.conf 파일 생성 후 임의의 python 패키지를 설치하면 해당 저장소를 통해 다운로드 하는 것을 확인할 수 있다. (eml_parser 설치)

 

 

eml_parser는 1.14.7 버전이 설치되었고, 실제 pypi-repos 경로에 해당 버전이 존재하는 것을 확인할 수 있다.

물론 의존성 있는 패키지도 다운로드 된 것을 확인할 수 있다. (cchardet, python-dateutil)

 

 

 

윈도우

윈도우는 pip.ini 파일을 생성 (수정)해야 한다. 경로가 리눅스와 다르다. (%APPDATA%\pip\pip.ini)

%APPDATA%\pip 경로가 없으면 먼저 생성해야 한다.

 

 

pip.ini 파일 내용을 작성한다. 내용은 리눅스의 pip.conf와 동일하다.

 

 

pip.ini 파일 생성 후 임의의 python 패키지를 설치하면 해당 저장소를 통해 다운로드 하는 것을 확인할 수 있다. (eml_parser 설치)

 

 

pypi 사설 저장소 설정이 완료되었다.

클릭 몇 번으로 사설 저장소를 설정 할 수 있어 매우 매력적이다.

반응형