배포 연대기 (상)

garaming·2022년 9월 28일
1

deployment

목록 보기
1/2
post-thumbnail

도커로 배포 하면서 겪었던 에러들의 향연과 길고 긴 항해의 여정을 기록으로 남기려고 한다..

먼저, Elice Wiki 서비스 구조도는 이러하다.

Front-end는 Nginx 서버를, Back-end는 Node 서버를 Docker Container로 빌드하여 배포하였다.

그럼 여기서, 도커란?

우리의 고래 친구 Docker

도커는 쉽게 말해 애플리케이션을 패키지 할 수 있는 툴이다. 컨테이너 안에 애플리케이션이 필요한 툴, 환경설정, dependency 등을 묶어 담기 때문에 다른 서버, PC 어떤 곳에서든 배포하고 안정적으로 구동할 수 있게 해준다. 따라서 도커를 사용하면 다른 환경에서 이것저것 설정하는 번거로움을 해결 할 수 있다!


도커 짱......!

우리 친구잖아..


그러나 우리 고래... 친구라고 했지 친하다고는 안했다.. 실제로 도커로 배포하면서 내가 제일 많이 했던 말은 "제발 비나이다..." 이다. 그만큼 생각지도 못한 에러 때문에 도커 컨테이너를 올릴 때 마다 마치 기우제 올리는 심정으로 빌고 또 빌었다.

그래서 오늘은 도커와 함께 하며 만났던 많은 오류와 역경에 대해서 회고 하고자 한다..!

1. VM 생성기

오라클 클라우드 프리티어를 이용하면 무료로 VM을 만들수 있다. 우분투 암페어 A1 컴퓨트 인스턴스를 사용했고, 현재 (22.09.28) 서울 resion 기준으로는 6GB까지 지원해주고 있다. 참고로 춘천은 최근에 확인해봤을 때 A1은 안됐다 ㅠ

서울로 가자!

아마 지역마다 할당량 및 사용량이 한정되어 있기 때문인거 같은데 서울로 가는 것을 추천한다.. 나는 춘천이 널널할거라 생각하고 입주했으나... 현실은 1기가 짜리 단칸방에서 있는 살림 없는 메모리 끌어모아 배포했었다. 그리고 한번 정한 리전은 변경이 불가능하다ㅠㅠ

2. 우당탕탕 도커 컴포즈 설치

타칭 도커 선생님이신 동료 개발자 분이 그러셨다...
🐻 : 도커만 깔면 반은 온거야!

그렇다.. 나는 그 말에 희망을 얻고 OCI에서 만든 작고 귀엽고 소중한 VM에 도커를 설치하기로 했다.

근데 시작이 반이지만 반도 어려워요 ㅠㅠ

눈 돌리는 문어...

도커는 도커 공식문서를 참고해서 설치 했지만 이상하게 도커 컴포즈가 설치되지 않는 것..!

// 컴포즈 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
// 권한 설정
sudo chmod +x /usr/local/bin/docker-compose
// 버전확인
docker-compose --version

버전 앞에 v를 붙여주니까 정상적으로 설치 완료!

3. 눈물 젖은 1기가.. (feat. Chuncheon)

앞써 말했다싶이 춘천 리전을 선택한 나는 1기가 남짓한 곳에서 열심히 빌드를 시도했다.. 그러나 계속 위의 명령어에서 멈추는 것이었다. 구글링을 해보니 메모리가 부족하면 일어나는 현상이라고 했다. 해결 방법은 두가지.

(1) 빌드시 소스맵을 제거해주기


package.json에서 빌드 부분 GENERATE_SOURCEMAP 옵션을 false로 해줌으로써 메모리를 아낄 수 있다.
그러나 나는 옵션을 꺼줬는데도 여전히 해결되지 않았다ㅠㅠ 그렇담 다음 방법으로!

(2) 메모리 스왑을 통한 메모리 부족 현상 해결

GENERATE_SOURCEMAP 옵션을 끄더라도 리액트 빌드 경우 메모리를 많이 차지했기 때문에 메모리 스왑 방법을 써봤다. 메모리 스왑은 쉽게 말하면 디스크의 일부를 사용하여 대신 메모리로 사용하는 기능이라고 한다..!

단, 스왑 사용시 속도가 느려진다는 단점은 있다고 한다. 그러나 1기가 입주자는 가릴 처지가 아니다.

 sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=2048
 sudo mkswap /mnt/swapfile
 sudo swapon /mnt/swapfile

위 명령어를 통해 스왑 메모리를 생성할 수 있다! 그리고 정상적으로 빌드를 마칠 수 있었다..!
출처: https://progdev.tistory.com/26

훗, 빌드를 성공했다니 벌써 막 끝난거 같구 이제 접속을 해보는데..

...
이게 모다냐.. 그렇다 배포는 이제부터 시작이었던 것이다.

4. 가보자고 포트 연결!

(1) 고정 IP 생성하기

고정 IP는 왜 만들어야 하는가..!

서버에 접속하려면 서버 주소가 있어야 하는데 고정 IP를 설정하지 않으면 IP가 임의로 변경될 가능성이 있다. 따라서 추후 도메인을 연결하기 위해 고정 IP를 설정해준다!

(2) OC 포트 열어주기

오라클 클라우드에서 개방하는 포트는 현관문을 열어주는 것이라고 생각하면 된다. 서버에서 포트를 열어주기 전에 먼저 오라클 클라우드에서 열어줌으로써 서버까지 짜잔! 도달할 수 있게 해준다.

  • 해당 인스턴스 > Subnet > Security Lists > Add Ingress Rules을 추가해준다.

  • SOURCE CIDR0.0.0.0/0으로 입력하여 어디에서든 접속할 수 있도록 해주고, TCP를 선택하여 해당하는 포트를 입력해 준다. 나의 경우는 프론트&백이 5000번80번 포트를 사용하기 때문에 두개를 추가해줬다.

이렇게 하면 오라클 클라우드 포트는 열기 완료!

(3) 끝이 아니다.. 우분투 포트 열기 (feat. iptables)

  • 먼저 현재 인스턴스에 접속해서 iptables를 기본 출력해본다.
$ sudo iptables -L
  • 그런 다음 아래 명령어를 통해서 특정 포트 접근을 허용해준다.
$ sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT

다시 리스트를 확인해보면 정상적으로 포트가 추가되었음을 알 수 있다.

5. 해치웠나..?

"고정 IP도 도메인이랑 연결해줬고 포트도 다 열어줬으니까, 이제 진짜 진짜 접속할 수 있겠지???"



아니? 아직 끝나지 않았다. Nginx 500 에러 핸들링은 다음편에서......

profile
Connecting the dots

0개의 댓글