LabHub
시작하기
배우기 러닝패스 코스

폐쇄망 미러와 사설 CA

휠하우스로 사내 파이썬 인덱스 세우기

LabHub 에서 이어서 보기

목표

연결된 쪽에서 파이썬 패키지와 의존성을 휠로 모으고 해시로 고정한 뒤, 폐쇄망 쪽에 PEP 503 사내 인덱스를 세워 pip.conf 로 가리키고, 바깥이 막혀도 설치가 되는 것을 확인한다.

왜 중요한가

폐쇄망 반입에서 가장 비싼 실수는 "받아 갔는데 모자라서 다시 나오는 것" 과 "받아 갔는데 서버에서 안 맞는 것" 이다. 앞의 것은 의존성을 바깥에서 통째로 풀어 가면 막히고, 뒤의 것은 대상 서버의 파이썬 버전과 플랫폼을 적어 받으면 막힌다. 그리고 매체를 지나며 바뀐 파일은 해시 검사 모드가 잡는다. 이 파드는 처음부터 인터넷(80/443)에 닿으므로 받는 쪽 역할을 하고, 폐쇄망 쪽 확인은 채점기가 바깥으로 가는 HTTP(S)를 닫힌 프록시로 보내 막은 채로 한다.

단계

  1. requests==2.32.3 과 그 의존성을 이 파드의 파이썬(3.12)용 휠로만 받아 /root/pip/wheelhouse/ 에 모은다.
  2. 폐쇄망 서버는 파이썬 3.11(x86_64, manylinux2014)이다. 같은 요구사항을 그 대상용 휠로 받아 /root/pip/wheelhouse-py311/ 에 모은다.
  3. /root/pip/wheelhouse/ 의 휠 전부를 이름==버전 --hash=sha256:<값> 줄로 적은 /root/pip/requirements.txt 를 만든다.
  4. /srv/pypi/simple/<정규화한 이름>/ 디렉터리마다 해당 휠을 넣어 PEP 503 모양의 인덱스를 만든다.
  5. /etc/hosts127.0.0.1 pypi.airgap.internal 을 더하고, /srv/pypi 를 8080 포트로 내주는 python3 -m http.server 를 띄운다. 접근 기록은 /root/pip/index.log 로 남긴다.
  6. /etc/pip.confindex-url = http://pypi.airgap.internal:8080/simple 과 그 주소를 믿는 설정을 적는다. 채점기는 바깥을 막은 채 이 설정만으로 requests 가 받아지는지 본다.
  7. venv /root/pip/venv 를 만들고 requirements.txt해시 검사 모드로 설치한다.
  8. 인덱스가 없는 곳을 가정해 venv /root/pip/venv-usb--no-index --find-links /root/pip/wheelhouse 로 같은 요구사항을 설치한다.

참고

받는 쪽: 의존성까지 휠로 받기

requests==2.32.3 과 그 의존성을 이 파드의 파이썬용 휠로만 받아 /root/pip/wheelhouse/ 에 모은다.

pip 에는 설치하지 않고 파일만 모으는 하위 명령이 있습니다. 소스 배포본(.tar.gz)이 섞이면 폐쇄망 서버에서 빌드 도구를 요구하니, 바이너리만 받게 하는 옵션도 함께 쓰세요.

대상 서버의 파이썬에 맞춰 받기

파이썬 3.11(x86_64, manylinux2014) 서버용으로 같은 요구사항을 받아 /root/pip/wheelhouse-py311/ 에 모은다.

pip download 는 대상의 플랫폼과 파이썬 버전을 따로 받을 수 있습니다. 문서가 그 옵션들과 함께 반드시 써야 한다고 적은 옵션이 하나 있습니다. 받은 뒤 파일 이름의 태그(cp311 등)를 보세요.

버전과 해시로 고정하기

/root/pip/wheelhouse/ 의 휠 전부를 이름==버전 --hash=sha256:<값> 줄로 적은 /root/pip/requirements.txt 를 만든다.

휠 파일 이름의 첫 두 칸이 이름과 버전입니다. 해시는 pip 가 직접 계산해 주는 하위 명령이 있고, sha256sum 과 같은 값입니다. 한 줄에 요구사항과 --hash 를 함께 적습니다.

PEP 503 모양의 사내 인덱스 만들기

/srv/pypi/simple/<정규화한 이름>/ 디렉터리마다 해당 휠을 넣는다.

디렉터리 이름은 패키지 이름을 규격대로 정규화한 것이어야 pip 가 찾습니다. 소문자, 그리고 점·하이픈·밑줄 묶음은 하이픈 하나. 휠 파일 이름 안의 밑줄과 헷갈리지 마세요.

사내 이름으로 인덱스 띄우기

/etc/hosts127.0.0.1 pypi.airgap.internal 을 더하고 /srv/pypi 를 8080 으로 내주는 서버를 띄운다. 접근 기록은 /root/pip/index.log 로 남긴다.

파이썬 표준 라이브러리의 http.server 는 디렉터리 목록을 파일 이름 링크로 내줍니다. 내줄 디렉터리와 포트를 인자로 주고, 터미널을 닫아도 살아 있게 백그라운드로 띄우세요. 이 서버는 접근 기록을 표준 오류로 냅니다.

pip.conf 로 사내 인덱스 가리키기

/etc/pip.confindex-url = http://pypi.airgap.internal:8080/simple 과 그 주소를 믿는 설정을 적는다.

https 가 아닌 인덱스는 pip 가 기본으로 믿지 않습니다(localhost 만 예외). 호스트 이름을 믿게 하는 설정 키가 있습니다. pip config debug 로 파일이 실제로 읽히는지 확인하세요.

해시 검사 모드로 venv 에 설치

venv /root/pip/venv 를 만들고 /root/pip/requirements.txt 를 해시 검사 모드로 설치한다.

우분투 24.04 의 시스템 파이썬에는 바로 설치할 수 없습니다. venv 를 만든 뒤 그 안의 pip 로 requirements 파일을 설치하세요. 파일에 --hash 가 있으면 해시 검사 모드가 켜지지만, 명시하는 옵션도 있습니다.

인덱스 없이 휠하우스만으로 설치

venv /root/pip/venv-usb 를 만들고 --no-index --find-links /root/pip/wheelhouse/root/pip/requirements.txt 를 설치한다.

인덱스를 아예 보지 않게 하는 옵션과, 파일을 찾을 디렉터리를 주는 옵션을 함께 씁니다. 이 설치가 되면 휠하우스가 스스로 완결되어 있다는 뜻입니다.