본문 바로가기
DevOps

[EC2+S3] NPM 서버 Verdaccio 컨테이너로 호스팅하기

by 문찬웅 2024. 2. 26.

들어가며

이 게시물에서는 Verdaccio 라는 오픈 소스 NPM 저장소를 AWS 에서 사설 서버로 호스팅하는 방법을 다룹니다.

EC2의 Free Tier 는 12개월 간 월 750시간의 인스턴스 시간과, 월 30GB의 EBS 용량이 있습니다.

필자는 여기에서 EC2로 Verdaccio 컨테이너를 호스팅하고, S3를 이용해 데이터를 저장하기로 했습니다. (S3의 데이터 저장 비용이 더 저렴하기 때문입니다!)

EC2 인스턴스 구성 방법

인스턴스 시작

EC2 홈페이지에 접속합니다.

주황색으로 강조되어있는 인스턴스 시작 버튼을 클릭합니다.

이후 이동한 페이지에서 다음과 같이 설정합니다.

이름 및 태그

  • 이름 : 인스턴스의 이름

애플리케이션 및 OS 이미지


Amazon Linux 선택

  • Amazon Machine Image(AMI) : Amazon Linux 2023 AMI
  • 아키텍처 : 64비트(x86)

인스턴스 유형

  • 인스턴스 유형 : t2.micro

* 키 페어


SSH 등을 통해 인스턴스에 로그인하기 위한 키 페어.
없는 경우 새 키 페어 생성 버튼을 눌러 키 페어 인증서를 생성합니다.

생성한 인증서는 PC에 다운로드 됩니다.

네트워크 설정

편집을 통해 SSH 이외에 Verdaccio 접속을 위한 설정 필요.

  1. 우측 상단의 편집 클릭
  2. 보안 그룹 규칙 추가 클릭
  3. 보안 그룹 규칙 설정
    • 유형 : 사용자 지정 TCP
    • 포트 범위 : 4873
    • 소스 유형 : 내 IP (현재 내가 속한 외부 아이피)

스토리지 구성

  • 8 Gib gp3 루트 볼륨

고급 세부 정보 > IAM 인스턴스 프로파일 지정


새 IAM 프로파일 생성 클릭

역할 생성 클릭

신뢰할 수 있는 엔터티 유형 : AWS 서비스
서비스 또는 사용 사례 : EC2 > EC2 > 다음 클릭

AmazonS3FullAccess 선택 > 다음 클릭

역할 이름 지정(역할 이름에는 영숫자 또는 _+=,.@-만 포함할 수 있습니다.) > 역할 생성 클릭

EC2 인스턴스 설정으로 돌아와서 > IAM 인스턴스 프로파일 새로고침 > 생성한 IAM 프로파일 선택

인스턴스 생성 및 시작


다음과 같이 설정되었을 때, 인스턴스 시작 버튼을 클릭해 인스턴스를 생성하고 시작합니다.

S3 버킷 생성

AWS S3 홈페이지에 접속합니다.

버킷 만들기 클릭

S3 버킷 구성

일반 구성


AWS 리전 : 아시아 태평양(서울) ap-northeast-2
버킷 이름 : verdaccio-bucket-yw-1 (임의로 지정, 전 세계적으로 고유한 이름이어야 함)

객체 소유권

ACL 비활성화됨(권장)

이 버킷의 퍼블릭 액세스 차단 설정

모든 퍼블릭 액세스 차단

버킷 버전 관리

비활성화 (활성화 시 버전 각각에 대한 스토리지 비용 추가 청구됨)

기본 암호화

암호화 유형 : Amazon S3 관리형 키(SSE-S3)를 사용한 서버 측 암호화
버킷 키 : 활성화

버킷 만들기

버킷 만들기 클릭

Access Key 발급

EC2 인스턴스에서 S3 버킷을 마운트하기 위한 Access Key를 발급합니다.

우측 상단 사용자 이름 클릭 > 보안 자격 증명 클릭

Access Key 만들기

액세스 키 > 액세스 키 만들기 클릭

  1. 루트 액세스 키를 생성하는 것이 모범 사례는 아니지만 여전히 생성하려고 합니다. 체크
  2. 액세스 키 만들기 클릭

액세스 키, 비밀 액세스 키를 보관하고 완료 클릭

EC2 - S3 마운트 (s3fs)

인스턴스 접속

퍼블릭 IPv4 DNS로 SSH 접속 시도(기본 사용자 ec2-user)

sudo ssh -i {키 페어 파일} ec2-user@{퍼블릭 IPv4 DNS}

S3FS-FUSE 설치

무료 오픈소스 FUSE 플러그인이며 주요 Linux 배포판 및 MacOS를 지원하는 유틸리티입니다.
이 플러그인은 Amazon S3 버킷을 시스템 드라이브로 표시합니다.

다음 블로그 게시물을 참조했습니다.

https://junghyeonsu.tistory.com/69

Yum 업데이트

sudo yum -y update --all

필요 패키지 설치

sudo yum install -y automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel

S3FS-FUSE Install

권한이 있는 디렉터리에서 다음 코드 블럭을 실행시켜 s3fs를 설치합니다.

git clone https://github.com/s3fs-fuse/s3fs-fuse.git

cd s3fs-fuse
./autogen.sh
./configure
make
sudo make install

설치 여부 확인

which s3fs

S3FS 계정 설정 파일 생성 및 권한 부여

sudo vi /etc/passwd-s3fs
sudo chmod 600 /etc/passwd-s3fs

파일 내용은 {액세스 키}:{비밀 액세스 키} 형태로 작성

예시 : awdfawfgwafawfwaf:awdwaawfawfwaf1223wad23

마운트 할 폴더 생성

필자는 루트 아래에 verdaccio-data 라는 이름으로 폴더를 생성하겠습니다.

sudo mkdir /verdaccio-data

S3FS 마운트

sudo s3fs {생성한 s3 버킷 이름} {마운트할 경로} -o use_cache=/tmp -o allow_other

예시)

sudo s3fs verdaccio-bucket-yw-1 /verdaccio-data -o use_cache=/tmp -o allow_other

테스트

아래 명령으로 파일을 생성하고, 버킷에 제대로 업로드 되었는지 확인

파일 생성 :

sudo touch /verdaccio-data/a

업로드 결과 확인 :

 

마운트가 되지 않는 경우

연결이 정상적으로 되지 않은 경우

  • 마운트 대상 디렉터리가 비어있는지 확인

파일이 정상적으로 업로드 되지 않은 경우

  • /etc/passwd-s3fs 파일 내용이 올바른지 확인
  • EC2 인스턴스에 IAM 프로파일이 제대로 부여되어 있는지 확인

Verdaccio 컨테이너 구성

이제 본격적으로 EC2 인스턴스에서 Verdaccio 컨테이너를 구성해보도록 합니다.

docker, docker-compose 설치

docker-compose 설치를 위해 다음 블로그 게시물을 참고하였습니다.

https://narup.tistory.com/223

Docker 설치

sudo yum install -y docker

// 도커 시작
sudo service docker start

// 권한 부여
sudo usermod -a -G docker ec2-user

// 부팅 시 자동 시작 서비스로 docker 등록
sudo chkconfig docker on

// 인스턴스 재시작
sudo reboot

Docker-compose 설치

sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose 

sudo chmod +x /usr/local/bin/docker-compose 

docker-compose version

docker-compose 구성

디렉터리/파일 구성

flowchart verdaccio-data --> config verdaccio-data --> storage verdaccio-data --> plugins verdaccio-data --> docker_compose_yaml([docker-compose.yaml]) config --> config_yaml([config.yaml])
  • docker-compose.yaml
version: '3.1'
services:
verdaccio:
image: verdaccio/verdaccio
container_name: 'verdaccio'
user: 'root'
networks:
- node-network
environment:
- VERDACCIO_PORT=4873
ports:
- '4873:4873'
volumes:
- './storage:/verdaccio/storage'
- './config:/verdaccio/conf'
- './plugins:/verdaccio/plugins'
networks:
node-network:
driver: bridge
  • config.yaml
storage: /verdaccio/storage/data
plugins: /verdaccio/plugins

web:
  title: Verdaccio
auth:
  htpasswd:
    file: ./htpasswd
uplinks:
  npmjs:
    url: https://registry.npmjs.org/
packages:
  '@*/*':
    # scoped packages
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs
  '**':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs

server:
  keepAliveTimeout: 60
listen:
# - localhost:4873            # default value
# - http://localhost:4873     # same thing
 - 0.0.0.0:4873              # listen on all addresses (INADDR_ANY)
# - https://example.org:4873  # if you want to use https
# - "[::1]:4873"                # ipv6
# - unix:/tmp/verdaccio.sock    # unix socket

middlewares:
  audit:
    enabled: true
log: { type: stdout, format: pretty, level: http }

docker-compose 실행

sudo docker-compose -f /verdaccio-data/docker-compose.yaml start

Verdaccio 접속 테스트

퍼블릭 IPv4 DNS을 이용해서 Verdaccio 서버 접속

http://{퍼블릭 IPv4 DNS}:4873

 

+ 만약 퍼블릭 IPv4 주소 또는 DNS를 고정하고 싶은 경우 EC2에서 탄력적 IP 라는 것을 이용하면 된다.