Local repository 구현

Sbae·2023년 7월 20일
0

Local repository

쿠버네티스 폐쇄망 설치를 위해서 필요한 데비안 계열과 레드햇 계열의 패키지 파일들을 따로 띄워야하는 불편함을 없애기 위하여 하나의 서버에 띄우는 과정

일반적으로 공중망에 연결되어있다면 필요한 파일마다 인터넷에서 다운로드 받아오면 되지만 폐쇄망으로 설치하게 된다면 필요한 파일들은 전부 다 local repositry로 구성해 놔야 설치가 가능하다.

패키지 파일

  • 데비안 계열
    • ubuntu
    • .deb 파일
  • 레드햇 계열
    • centos, rocky, rhel
    • .rpm 파일

구성 전 필요한 패키지 파일

미리 다운로드를 받거나 준비하는 패키지 파일안에 있어야한다. 해당 글에서는 미리 다운로드 받고 구성하는 과정을 작성했다.

  • dpkg, dpkg-dev(데비안 계열 패키지 관리)
  • createrepo_c(레드햇 계열 패키지 관리)
  • nginx(외부 레포지토리 추가 필요)
  • zstd(zst 파일 변환)
  • xz(xz 파일 변환)
  • tar(압축 파일 관리)

사전 준비

각각의 설치에 필요한 테스트용 패키지 파일들은 작성중을 참고한다.

Ubuntu22.04

ubuntu20.04에서는 createrepo-c가 없기 때문에 불가능하거나 방법을 더 찾아봐야한다.

Nginx 외부 저장소 추가

curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu/ $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list 2>/dev/null
echo "deb-src [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu/ $(lsb_release -cs) nginx" | sudo tee -a /etc/apt/sources.list.d/nginx.list 2>/dev/null

필요 패키지 다운로드

apt-get -y install dpkg dpkg-dev zstd createrepo-c nginx

Local repository 디렉토리 생성

mkdir -p /data/localrepo/ubuntu22
mkdir -p /data/localrepo/centos8 

파일 이동 및 압축해제

mv [ 압축한 ubuntu 패키지 파일 ] /data/localrepo/ubuntu22
mv [ 압축한 centos8 패키지 파일 ] /data/localrepo/centos8

cd /data/localrepo/ubuntu22
tar -zxvf [ ubuntu 패키지 파일 ].tgz

cd /data/localrepo/centos8
tar -zxvf [ centos8 패키지 파일].tgz

기존 repository 설정 변경

cp -r /etc/apt/sources.list.d/ /etc/apt/sources.list.d.back
cp /etc/apt/sources.list /etc/apt/sources.list.back

sed -i 's/^deb/#deb/' /etc/apt/sources.list

rm -rf /etc/apt/sources.list.d
mkdir /etc/apt/sources.list.d

echo "deb [trusted=yes] http://자신의 ip/ubuntu22 ./" | sudo tee /etc/apt/sources.list.d/local-to-file.list

Nginx 설정 변경

vi /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf -> include /etc/nginx/conf.d/local-repo.conf

vi /etc/nginx/conf.d/local-repo.conf
systemctl restart nginx
local-repo.conf

server {
    listen       "80";
    server_name  localhost;

    location /ubuntu22 {
        alias   "/data/localrepo/ubuntu22";
		autoindex on;
  		# 혹시 안된다면 위의 2개의 설정을 주석처리하고 아래 구문을 주석 해제
  		#root   "/data/localrepo/ubuntu22";
    }
    location /centos8 {
        alias   "/data/localrepo/centos8";
        autoindex on;
      	# 혹시 안된다면 위의 2개의 설정을 주석처리하고 아래 구문을 주석 해제
  		#root   "/data/localrepo/centos8";
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Ubuntu local repository 구성

cd /data/localrepo/ubuntu22 && dpkg-scanpackages -m . | gzip -9c > Packages.gz

createrepo_c /data/localrepo/centos8

apt update
apt list | grep [테스트용 deb 파일]

Centos stream

Epel 외부 repositroy에 의존하고 있다.

Nginx 외부 저장소 추가

cat <<EOF > /etc/yum.repos.d/nginx-stable.repo
[nginx-stable]
name=nginx-stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch
enabled=1
gpgcheck=1
module_hotfixes=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF

cat <<EOF > /etc/yum.repos.d/nginx-mainline.repo
[nginx-mainline]
name=nginx-mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch
enabled=0
gpgcheck=1
module_hotfixes=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF

dnf clean metadata

필요 패키지 다운로드

  • Epel을 필수로 실행한다.
dnf config-manager --set-enabled powertools
dnf install -y epel-release epel-next-release

dnf install -y nginx zstd tar xz createrepo dpkg*

Local repository 디렉토리 생성, 파일 이동 및 압축해제

  • 위와 동일하여 생략

기존 repository 설정 변경

cp -r /etc/yum.repos.d /etc/apt/yum.repos.d.back

rm -rf /etc/yum.repos.d
mkdir /etc/yum.repos.d

tee /etc/yum.repos.d/local-repo.repo <<EOF
[local-repo]
name=Local Repo configure
baseurl=http://자신의 ip/centos8
gpgcheck=0
enabled=1
EOF

Nginx 설정 변경

  • 위와 동일하여 생략

Centos local repository 구성

cd /data/localrepo/ubuntu22 && dpkg-scanpackages -m . | gzip -9c > Packages.gz

createrepo /data/localrepo/centos8

dnf clean metadata
dnf list | grep [테스트용 deb 파일]

다른 노드에서는 어떻게 연결하나요?

  • OS별로 기존 repository를 변경하는 과정을 반복해주면 가능하다.

Error

Centos에서 cd /data/localrepo/ubuntu22 && dpkg-scanpackages -m . | gzip -9c > Packages.gz 실행 시 혹시나 uses unknown compression for member 'control.tar.zst', giving up를 볼 수 있다

이럴 땐 /data/localhost/centos8로 이동 후 아래 스크립트를 한 번 실행해 준 후 다시 명령어를 시도한다.

#!/bin/bash

FILE_PATH_DEB=./*.deb

for ITEM in $FILE_PATH_DEB; do
  ar x $ITEM

  if [ -e control.tar.zst ]; then
    zstd -d < control.tar.zst | xz > control.tar.xz
  fi

  if [ -e data.tar.zst ]; then
    zstd -d < data.tar.zst | xz > data.tar.xz
  fi

  rm -f $ITEM

  if [ -e control.tar.xz ]; then
    ar -m -c -a sdsd $ITEM debian-binary control.tar.xz data.tar.xz
  fi

  if [ -e control.tar.zst ]; then
    rm debian-binary control.tar.xz data.tar.xz control.tar.zst data.tar.zst
  elif [ -e control.tar.xz ]; then
    rm debian-binary control.tar.xz data.tar.xz
  else
    rm debian-binary
  fi
done

Centos에서 nginx 설정을 바꾸고나면 다 맞게되어있어도 재시작이 안되는 경우가 있는데
왜 그런지를 모르겠다 그냥 reboot 한 번 하면 제대로 작동은 한다.

추가 작성

저렇게 nginx 설정으로 proxy를 나눠주는 방식이 싫다면 그냥 모든 파일을 /data/localrepo에 몰아 넣어두고 local-repo.conf를 변경해주면 된다.

이러한 방식으로 했다면 위에서 따라하는 과정들 중 경로 부분들에 대해서는 전부 맞춰서 변경해야한다.

local-repo.conf

server {
    listen       "80";
    server_name  localhost;

    location / {
        root   "/data/localrepo";
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Nginx 프록시로 나누는 방식으로 했다면 브라우저 화면에서도 모든 파일이 보이지만
한 곳에 몰아넣고 하는거라면 브라우저 화면에 403이 떠도 그러려니하자 이 부분은 추후에 nginx에 대해서 더 알아보고 변경할 예정이다.

profile
끄적이는 일반인

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

좋은 글 잘 읽었습니다, 감사합니다.

답글 달기