돈이 없는 취준생은 노트북에 배포를 했다.

·2023년 7월 3일
78

개요

서비스 배포 및 운영에 매우 큰 관심을 가지고 있다. 이전 팀 프로젝트를 진행했을 때, 배포를 매우 잘하시는 분이 계셨는데, 언젠가 그분께서 하셨던 과정을 공부하여 직접 구현해보고 싶었다.

프로젝트를 전체적으로 뜯어보면서, 필요한 배포이론들을 구글링하였고, 이제 제대로 배포환경 구현을 하려는 순간, 큰 문제가 봉착하였다.

돈이 없다.

프리티어는?

유명 CSP 는 배포 경험을 위해 무료로 제공하는 서비스들이 있다는 건 알고 있다. 헌데 그걸 사용하지는 못한다. 왜냐면 당시 만든 서비스는 MSA 환경이 적용되어 기본적인 서버와 DB 에 대한 인스턴스가 많으며, 그만큼 메모리가 많이 필요하다. 통상 2GB 정도의 메모리를 제공하는 무료 서비스 환경으로는 매우 부족하다.

그리고 이미 프리티어는 다른 프로젝트에서 써먹었다. 🤪

서버를 다시 모놀리식으로 바꾸기엔 서버지식이 부족하여 쉽지 않을 거 같았고, 또 돈문제만 해결된다면 MSA 배포도 진행해보고 싶었다.

고민을 하던 와중에 이전에 linux 좀 공부해본다고 ubuntu 로 포맷한 노트북이 있어서 이를 활용해보기로 했다. 본래 dexx 회사의 유명 게이밍 노트북으로,시간이 좀 지났지만 메모리는 16GB 정도 되었기 때문에, 충분히 MSA 배포를 진행할 수 있다고 판단했다.

EC2 배포와 내 노트북 배포의 차이

최소 포트포워딩, 방화벽, ddns에 대한 설정을 해줘야 한다. 뭐 그 외에도 도메인 적용방식이라던지, https 설정이라던지 여러가지가 있겠지만 내가 경험해보았을 때 꼭 알아야하는 기본 지식은 위의 3가지였다.

위의 3가지에 대해 알고 있다면, 직접적으로 시행착오를 경혐해보는게 좋을 거 같고, 아니라면 아래에 작성한 배포과정을 참고해보시길 권고한다.

부족한 지식으로 무작정 맨땅에 헤딩한 배포과정이므로, 보안상 문제가 되거나, 비효율적인 방법들이 나올 수 있습니다.

1. 노트북 포맷

우선 노트북을 서버화하려면 그에 맞는 환경으로 바꿀 필요가 있다. 사실 어떤 운영체제든 설정만 잘하면 다 배포가 되겠지만, 배포사례는 아무래도 linux 관련이 많기 때문에, linux 환경으로 포맷하는 것이 좋지 않을까 싶다.

나의 경우 xubuntu 를 사용했다.

xubuntu 는 보다 가벼운 환경의 ubuntu 라고 생각하면 된다. 배포과정을 진행하는데 있어서는 기본 ubuntuxubuntu 나 설정방식이나 터미널 언어는 동일하였다.

성공적으로 설치가 완료되었다면, 한번 접속을 시도해보자.
맥을 기준으로 외부 노트북 환경에 접속하는 방법은 다음과 같다.

ssh [사용자이름]@[private ip주소]

우분투 환경에서 priavate IP를 확인하는 커맨드는 다음과 같다. 커맨드 입력 후 inet- 으로 시작하는 숫자가 해당 IP가 된다.

ifconfig

제대로 설정을 했다면 외부 접속을 진행했을 때 마치 EC2 접속과 같이 이런식으로 터미널 바가 변경되어야 한다.

2. 포트포워딩 설정

서버로 내 노트북을 사용한다는 것은, 우리집 공유기를 통해 요청이 온다는 말이 된다. 당연히 일반 가정의 네트워크 환경은 EC2처럼 인바운드, 아웃바운드를 통해 포트포워딩을 처리하는 기능은 없으므로, 직접적으로 공유기에 대한 포트포워딩 처리를 해주어야 한다.

다음은 KT 공유기를 기준으로 작성된 사례이다. (다른 통신사의 공유기도 설정사항이 크게 다르지는 않을 것이다.)

KT 홈허브 접속하기

http://homehub.olleh.com

홈허브의 경우, 기본적으로 아이디는 ktuser, 비밀번호는 homehub로 설정이 되어있다. 물론 설정에 들어가 아이디와 비밀번호를 바꾸는 것도 가능하다. 특정 시간동안 동작이 없다면 다시 로그인을 해줘야 한다.

첫 화면에는 시스템 정보가 제공된다. 인터넷 연결정보의 IP 주소가 공유기의 public IP 주소가 되며, LAN 연결의 IP 주소는 서버의 private IP와 동일할 것이다.

public IP는 도메인 설정에 사용되며, private IP는 포트포워딩에 사용된다.

도메인까지 구매하여 연결하기를 원한다면 아래 가비아를 통해 도메인을 구매하여 설정하는 방법에 대해 작성해두었으니 한번 참고해보시길 바란다.

도메인 구매하기 (가비아)

포트포워딩

장치 설정 - 트래픽관리 - 포트포워딩 설정란에 현재 KT 공유기의 포트포워딩 설정이 가능하다. 아래의 칸이 있는데, 다음과 같은 형식으로 작성하여 필요한 포트를 하나씩 추가하자.

소스 IP 주소 : 작성안함
소스 포트 : 작성안함
외부 포트 : 오픈할 포트 (포트에 잘 모르겠다면 외부 내부 똑같이 하자.)
내부 IP 주소 : 서버 private IP 주소
내부 포트 : 내부 IP가 요청을 받을 포트
설명 : 어떠한 용도로 사용되는지 적어주자.

성공적으로 추가가 되었다면 이런 형식으로 나와야 한다.
이제 공유기를 통해 요청이 오면, 공유기에서 자동으로 서버 노트북으로 요청이 전달되도록 할 것이다.

참고로 나의 경우 오픈된 포트가 많은데, MSA 환경 구성 당시, zipkin 이나 prometheus 와 같이 다양한 모니터링 툴들도 함께 사용하고자, 추가한 포트가 많다. 사이드 프로젝트 정도의 배포라면 굳이 이렇게 많은 포트를 열 필요가 없다. 보안상에도 좋지 않다.

3. 서버 방화벽 설정

서버로 활용할 노트북도 원래는 그냥 노트북이고 당연히 기본 방화벽 설정으로 어떠한 포트도 열려있지 않은 상황이다. 아마 공유기에서 보내는 포트들을 꼭 모두 열 필요는 없을 거 같은데, 지식이 부족해서 이 과정에서 꽤나 긴 시간동안 골머리를 앓아서, 결국 공유기에서 설정했던 모든 포트들을 그대로 서버에서도 모두 오픈하도록 했다.

우분투의 경우 ufw를 통해 방화벽 설정을 진행할 수 있다.

# 방화벽 상태 확인
(sudo) ufw status

# 방화벽 상태 활성화
(sudo) ufw enabled
# 방화벽 상태 비활성화
(sudo) ufw disable

# 방화벽 허가
(sudo) ufw allow (허가할 port)
# 방화벽 거부
(sudo) ufw deny (허가할 port)

# 방화벽 기본 정책 허용
(sudo) ufw default allow
# 방화벽 기본 정책 거부
(sudo) ufw default deny

ufw status 를 입력한 경우, 허가된 포트들이 다음과 같이 나와야 한다.

4. DDNS 설정

먼저 DDNS 에 대해 알 필요가 있다. 실제 가정에서 사용하는 통신사 공유기의 IP는 고정 IP가 아닌 유동 IP에 해당한다. 즉 공유기를 바꾸거나, 리셋하는 경우 IP는 언제든 다시 바뀔 수 있다.

유동 IP인 이유는 고정 IP는 비용이 매우 크기 때문이다. IP 갯수는 유한하며 고정 IP를 사용하면 당연히 그에 따르는 비용을 청구해야 한다. 공공기관이나 유명 포털 사이트의 경우, 이러한 비용을 감수하면서도 고정 IP를 사용하지만, 일반 가정 환경에서 보통 서비스를 제공하지는 않으므로 고정 IP를 사용할 이유가 없다.

문제는 나와 같이 가정 환경에서 서비스를 배포하려는 경우이다. IP가 변경되는 경우, 당연히 기존의 IP 주소로는 페이지에 접근할 수 없기 때문에 다시 설정을 해줘야 하는 번거로움이 있다.

이를 개선하는 기술이 바로 DDNS Dynamic Domain Name System 이다. 요약하여 설명하자면 현재의 IP가 변경되더라도 DDNS 로 설정한 도메인으로 연결하도록 도와준다.

DDNS 를 제공하는 서비스는 대체적으로 유료이지만, no-ip와 같이 무료로 DDNS 를 제공받을 수도 있다. 당연히 돈 없는 나는 no-ip를 통해 DDNS 설정을 하였다.

no-ip 홈페이지

no-ip 가입

no-ip의 경우, 외국사이트라 그런지 naver 이메일은 가입인증이 진행이 안되었다. 또한 비밀번호의 경우 꼭 영어와 숫자로만 만들도록 하자. 왜냐하면 이후 공유기 ddns 설정을 위해 아이디와 비밀번호를 입력해줘야 하는데, kt 공유기의 경우 특수문자 입력이 안되기 때문이다.

무료 DDNS 도메인의 경우, 30일마다 확인을 해줘야 하는데 가입한 이메일로 메일이 도착하니 한달마다 갱신을 해줘야 한다. (만약 갱신을 못하게 되는 경우 사용하는 DDNS 도메인 자동 삭제된다.)

security 설정

보안상의 이유로 no-ip를 사용하는 경우, two-authenticator를 설정할 것을 권장한다. 나의 경우 이미 github에서도 동일한 설정을 해둔 상황이어서 사용하고 있는 authenticator 앱이 있어 이를 활용하기로 했다.

유저 네임 설정

향후 no-ip client에서 로그인 시 사용할 유저 네임을 설정해야한다.

no-ip ddns 도메인 생성

위의 설정을 모두 마쳤다면 이제 ddns 설정을 진행할 수 있다.

ip 주소에 대한 입력 창이 등장하는데, 현재 공유기의 public ip 주소를 입력하고, router brand와 software/device는 그냥 etc를 입력해준다.

공유기 ddns 설정

kt 홈허브로 돌아와 장치설정 - 부가기능 - DDNS 설정에 들어오자. DDNS 사용을 활성화로 하고 다음과 같이 형식을 작성하고 적용 버튼을 누르자.

DDNS 서버 : noip.com
사용자 id : noip id (이메일 주소에서 @ 앞 id 만 사용하자)
비밀번호 : noip password (다시 말하지만 noip password는 영문+숫자로만 하자. kt 공유기엔 특수번호가 입력이 안된다.)
URL : 생성한 ddns 호스트 네임

no-ip 클라이언트 설치 및 적용

DDNS 설정을 통해 도착하는 컴퓨터, 즉 현재 서버가 될 노트북에 no-ip 클라이언트를 설치해야한다. window, mac, linux 모두 설치가 가능하니 향후 다른 OS에서도 유용하게 사용할 수 있을 듯 하다. 다음은 우분투 환경에서 터미널을 통해 no-ip 클라이언트를 적용하는 방법이다. 아래의 홈페이지 정보에 따라 그대로 터미널에 작성해주자.

우분투 환경에서 no-ip 클라이언트 적용하기

나는 맥을 통해 외부로 부터 접속하여 no-ip 클라이언트를 적용했지만 직접 해당 노트북에 프로그램을 통해 설치하는 방법도 있다.

배포 완료!

이렇게 설정을 하면 개인 노트북으로, EC2로 진행했던 배포과정을 진행했을 때 정상적으로 배포가 된다는 것을 확인할 수 있다.

확실히 기존 CSP 에서 진행하던 거 대비, 페이지 요청에 대한 응답이 매우 느린 편이다. 그래도 뭐 돈 걱정 없이, 서비스를 언제 어느 장소에서든 접속하도록 구현했다는 것에 매우 기분은 좋다.

기존의 코드를 새로 복구하면서 몇몇 기능이 아직 정상적으로 동작하지 않는 문제들이 있다. 나중에 시간되면 고치러 가봐야겠다.

전국 우리 지역잔치 보러가기

230702 - 카카오 로그인이 에러가 나오고 있습니다. 비회원으로 시작하기로 접속해주세요.

profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

17개의 댓글

comment-user-thumbnail
2023년 7월 3일

좋은 내용이네요 많이 배워갑니다!

1개의 답글
comment-user-thumbnail
2023년 7월 4일

엄청난 과정이네요 많이 배웠습니다

1개의 답글
comment-user-thumbnail
2023년 7월 5일

정성이 대단하시네요! 멋져요

1개의 답글
comment-user-thumbnail
2023년 7월 6일

대단합니다

1개의 답글

안녕하세요 정성이 느껴지는 프로젝트 입니다 너무 잘 봤습니다!
혹시 궁금한게 있는데 축제 정보는 어디서 가져오셨는지 여쭤봐도 될까요?

1개의 답글
comment-user-thumbnail
2023년 7월 7일

msa로 서버 구성을 진행하였다 하셨는데 개인 노트북으로 배포할 때도 한대로 여러 인스턴스를 올려서 사용이 가능한건가요???

2개의 답글
comment-user-thumbnail
2023년 7월 8일

와우 ... 제목이 라노벨 제목 같아서 들어왔는데, 글의 퀄리티가 아주 높네요.

잘 보고 갑니다. :)

1개의 답글
comment-user-thumbnail
2023년 8월 29일

Thanks you for taking your time to write this down. Is a pleasure visiting your platform today and I can say that you nailed the article and you have made my day.
https://xamblog.com

답글 달기