각종 후기/우아한테크코스

[우아한 테크코스 3기] LEVEL 2 회고 - 배포 미션 (108일차)

제이온 (Jayon) 2021. 5. 21.

안녕하세요? 제이온입니다.

 

사실 오늘 109일차인데 어제 밀려가지고 어제 회고부터 올리려고 합니다. 

 

 

협업 미션 소개

이번 미션은 특별합니다. 그 전까지는 2명 내지 3명이서 페어 프로그래밍을 진행했는데, 이번에는 프론트엔드 크루 2명을 포함하여 총 6명이서 팀플을 하게 됐습니다. 다만, 6명이서 회의하는 시간은 적고 대부분 원래 하던대로 2명이서 페어 프로그래밍을 할 듯합니다.

 

이번 페어는 조앤이었고, 만나서 아이스 브레이킹 이후 바로 협업 미션 1단계를 진행했습니다.

 

 

 

 

1단계는 배포 미션이었고, 이전 인프라 배포 미션에 이어서 다양한 설정을 추가하는 것이었습니다.

 

 

배포 미션

(1) Reverse Proxy

배포 미션을 어떻게 진행했는지 자세하게 적으려고 합니다. 

 

 

$ sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

 

 

우선 위 명령어를 통해 도커를 설치해야 합니다.

 

 

 

 

이후에는 위와 같이 Docker file과 nginx를 이용하여 리버스 프록시 설정을 합니다. 여기서, Docker file은 컨테이너에 설치해야하는 패키지, 소스코드, 명령어, 환경변수설정 등을 기록한 하나의 파일입니다. 그리고 이를 빌드하면 자동으로 이미지가 생성됩니다. docker run을 할 때 이미 사용중인 포트 번호를 기입하지 않았는지, 혹은 이미 사용중인 이름을 기입하지 않았는지만 확인해 주면 됩니다.

 

이후에는 telnet이나 curl을 통해 통신을 확인해 보았는데, "curl localhost 80"의 경우 Bad Gateway 에러가 발생했습니다. "curl localhost:8080"은 정상적으로 작동하는 것으로 문제가 없어 보이는데, 80 포트를 통해 접근 왜 안 되는지는 아직 이유를 못 찾았습니다. 이 이유에 대해 포츈같은 분이 댓글 달아주시면 좋겠습니다.

 

 

(2) TLS 설정

다음으로, 서버의 보안과 별개로 서버와 클라이언트간 통신상의 암호화하기 위하여 TLS 설정을 해야 합니다. 평문으로 통신할 경우, 패킷을 스니핑당할 수 있기 때문입니다. TLS 설정은 letsencrypt을 활용하는데, 아래와 같은 명령어를 입력하면 됩니다.

 

 

$ docker run -it --rm --name certbot \
  -v '/etc/letsencrypt:/etc/letsencrypt' \
  -v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
  certbot/certbot certonly -d '[내 도메인 주소]' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

 

 

저는 처음에 '[내 도메인 주소']를 입력하지 않아서 에러가 발생하였는데, 이 사이트에서 발급받은 도메인 주소를 꼭 입력해야 합니다.

 

 

 

 

설치를 진행하다보면, 위와 같이 TXT 코드가 뜹니다. 아래와 같이 코드를 TXT 레코드로 등록해 줍니다.

 

 

 

 

TXT 레코드 등록 이후, 1분 정도 기다렸다가 엔터를 치시길 바랍니다.

 

 

 

 

생성한 인증서를 통해 위와 같이 리버스 프록시에 TLS 설정을 하면 됩니다. 위 흐름을 간단하게 정리해 보겠습니다. 'http://jayon-subway.r-e.kr'과 같이 http 형식의 사이트에 접속하면, http의 기본 포트가 80이므로 listen 80에 잡히게 됩니다. 이후 301 상태 코드와 함께 'https' 형식의 url로 리다이렉션됩니다. https의 기본 포트가 443이므로 listen 443에 잡혀서 TLS 설정을 거칩니다.

 

 

 

 

그리고 기존의 만들었던 도커 컨테이너를 중지 및 삭제하고 새로운 설정을 반영한 도커를 띄웁니다.

 

 

(3) 운영 DB 구성하기

 

 

다음으로는 운영용 DB를 설치하는 것입니다. 시키는대로 MySQL을 설치해서 보안 설정을 하면 끝입니다.

 

 

(4) 설정 파일 나누기

 

 

마지막으로 설정 파일을 나눠서 실행하는 방법입니다. 위의 사진과 같이 배포를 하다 보면, 여러 가지 설정이 생기고 각기 다른 설정을 적용하여 실행해야 할 수도 있습니다. 위와 같이 properties 파일을 사용한다면 'application-[원하는 이름].properties' 파일들을 생성한 후, 'java -jar -Dspring.profiles.active=prod [jar파일명]' 명령어를 수행하면 됩니다. yml 파일을 사용한다면, 해당 파일 내에서 '---' 키워드를 사용하여 설정을 분리하고, 똑같은 명령어를 수행하면 됩니다.

 

 

정리

배포 미션을 성공적으로 끝내고 팀원들과 술을 마셨습니다. 미션도 끝냈고 홀가분하게 웃으면서 즐겁게 술을 마셨던 것 같습니다. 그리고 이번 기회로 3명의 크루와 더 친해져서 굉장히 만족스러웠습니다.

 

댓글

추천 글