자체 서버 구축기 with Termux (대학생, 취준생이 EC2 프리티어를 쓰면 안되는 이유) [#01]

전반숙·2024년 2월 28일
123

자체 서버 구축

목록 보기
1/2

상당히 구린 EC2 프리티어 이젠 돈까지 들어??

그동안 Heroku로 개인 프로젝트를 운영하고 있다가 무료플랜을 초과하게 되어서 AWS EC2 프리티어로 바꾸게 되었다.

공짜로 리눅스 컴퓨터 한대를 빌릴 수 있다니 처음엔 굉장히 신기했다. 그런데 막상 프로젝트를 배포하고 보니 내 Spring WAS조차 실행이 안됐다. (실행한 프로세스는 MySQL, Spring WAS 단 두가지)

그래프를 보니까 CPU 사용량이 갑자기 팍 튀어서 죽어버렸는데, 찾아보니 메모리 사용량이 초과해서 발생한 문제였다. (프리티어가 제공하는 메모리는 무려 1GB)

https://sundries-in-myidea.tistory.com/102

위 블로그 도움을 받아 메모리 swap을 통해 해결하긴 했지만, 이 인스턴스에는 앞으로 어떤 것도 설치하기 힘들겠다는 생각이 들었다.

또한 1년후에 프리티어가 끝나고 나서의 대책도 없었다.

하지만 뭐 지금 당장 이만큼이라도 과금없이 돌아가니 별 상관은 없었는데,,,

https://aws.amazon.com/ko/blogs/korea/new-aws-public-ipv4-address-charge-public-ip-insights/

앞으로 프리티어 정책이 바뀌어서 사용하는 ipv4 주소 1개마다 시간당 0.005 USD 만큼 요금이 부과된다는 사실을 알았다.

과금 이유는 ipv4 주소가 점점 부족해져서 ipv6 를 쓰도록 권장하려는 목적이라고 한다.

계산해보면 월 5,000원 수준인데, 달랑 EC2 인스턴스 하나밖에 안쓰는데 돈을 내는건 굉장히 억울했다.

이럴려고 Heroku에서 EC2로 넘어왔나? 자괴감이 들었다.

또 앞으로 RDS나 테스트 서버 용도로 추가적인 인스턴스를 사용한다면 추가 비용을 부담해야 하는데, 트래픽도 거의 없는 내 작고 귀여운 서비스에 이렇게 돈을 많이 쓸 수는 없었다.

그래서 아래 조건을 만족하는 대안을 찾아야 했다.

  1. 과금 없이
  2. 24시간 돌아가고
  3. CPU / 메모리 / 디스크 용량, 성능이 나쁘지 않은 리눅스 서버 컴퓨터

제목에 이미 스포했지만 이 3가지 조건을 만족하는 대안은 바로 이 녀석이다.

2019년에 샀었던 갤럭시 노트 10이다. 중고로 판다는걸 까먹고 있다가 아주 유용하게 써먹게 되었다.

램도 12GB로 아주 충분하고 디스크는 512GB로 아주 넘쳐흐른다. CPU는 삼성 엑시노스 9시리즈인데, 무려 8코어 프로세서다.

이정도면 성능은 EC2 프리티어 대비 아주 빵빵하고, 있던 기기를 재활용한것이라 추가 비용도 들지 않기 때문에 아주 적절한 대안이라고 볼 수 있다.

다들 집에 팔기 귀찮아서 놔둔 안드로이드 폰 하나쯤은 있을텐데, 이 기회에 안쓰는 안드로이드 폰으로 On-premise 환경을 구축해서 개인 프로젝트를 운영해보면 좋을 것 같다.

또 직접 해보면서 이게 되네? 하는 신기함도 느낄 수 있다.

제목에 어그로를 좀 끌었지만 이제부터는 EC2 프리티어의 대안으로 Termux 를 이용하여 안드로이드 폰을 웹서버 컴퓨터로 활용하는 방법을 소개한다.


[정정] EC2 프리티어 ipv4 사용 과금 없음

https://aws.amazon.com/ko/about-aws/whats-new/2024/02/aws-free-tier-750-hours-free-public-ipv4-addresses/

2월 1일에 다시 공지가 되었는데, EC2 프리티어에 대해서 ipv4 750시간 무료 사용을 제공한다고 한다.
즉, 1개의 인스턴스만을 사용한다면 여전히 무료로 사용할 수 있다.

하지만 인스턴스 1개로는 턱없이 부족하고 앞으로의 추가적인 과금은 피할 수 없기 때문에 마이그레이션의 필요성에 대해서는 변함이 없다.



안드로이드 폰에 Ubuntu 설치하기 with Termux

https://m.blog.naver.com/wonjinho81/222597996987
바로 다음부터 소개할 안드로이드 Termux Ubuntu 세팅 관련한 내용의 80% 정도는 위 블로그 글을 참고했다.

나는 이에 더해서 Spring WAS과 MySQL, 그리고 APM 인 Scouter 까지 설치해서 실시간 모니터링 환경까지 구축했는데, 리눅스를 잘 모르다 보니 뻘짓을 정말 많이 했다.

이 글을 보시는 분들은 적어도 내가 낭비한 시간은 세이브할 수 있기를 바란다.

Termux 설치

안드로이드에서 우분투를 설치해서 사용하려면 원래 기기를 루팅해야하지만, 요즘에는 Termux 같은 터미널 에뮬레이터를 통해 루팅없이 간단하게 설치할 수 있다.

UserLAnd 같은 것도 있는데, 둘 다 사용해보니 UserLAnd에서는 안되는 기능들을 Termux에서는 제공하는 경우가 많았다.

안드로이드 10부터는 Google Play Store에서 Termux를 다운받을 수 없다. 그래서 직접 아래 홈페이지에서 apk를 다운받아야 한다.
https://github.com/termux/termux-app/releases

여기서 ~~universal.apk 을 다운받아 안드로이드 폰에 설치해주자.




Ubuntu 설치

  • apt 패키지 update, upgrade
apt update

apt upgrade

apt upgrade 를 할 때 처음에 y 를 눌러주고 나면 마지막 이미지처럼 입력창이 7번정도 뜨는데 Default 값인 n 을 계속 입력하고 엔터를 치면 된다.



  • proot, proot-distro 설치
apt install proot

apt install proot-distro

루팅없이 리눅스 배포판을 실행할 수 있게 도와주는 proot, proot-distro 를 설치한다.



  • 리눅스 배포판 목록 확인 / Ubuntu 설치
proot-distro list

proot-distro install ubuntu

첫번째 명령어로 설치 가능한 우분투 배포판 목록을 볼 수 있다.
하지만 우분투 버전을 지정해서 설치하는 방법은 찾지 못했다. 현재는 이렇게 하면 23.10 버전이 설치된다.



  • Ubuntu 로그인, 버전 확인
proot-distro login ubuntu

cat /etc/issue

root 계정으로 ubuntu 에 로그인된다. 설치된 ubuntu 버전도 살펴보자.



Ubuntu 계정, ssh 세팅

  • 다시 apt 패키지 update, upgrade

우분투 내에서 apt 패키지를 update 하고 upgrade 한다.

참고로 update 는 apt 패키지에 있는 패키지들의 설치 버전 링크를 최신화하는 것이고,
upgrade는 설치된 패키지들을 실제로 업그레이드하는 것이다.

apt update

apt upgrade


  • vi / vim 에디터 설치

최초에는 vim 에디터가 없기 때문에 설치해줘야한다. 만약 설치가 잘 안되면 nano 에디터를 설치해서 사용해도 된다.

apt install vim

2번째 화면은 타임존 설정인데 5.Asia 를 선택해준다. (5 입력)

3번째 화면에서는 68.Seoul 을 선택해준다. (68 입력 -> 두번 입력해야 한다.)

앞으로 이 vim 에디터를 이용해서 파일을 자주 수정할텐데, vim 에디터에 대한 간단한 사용법은 알고 있어야 한다.



  • 우분투 계정(유저) 추가

보다시피 현재는 root 계정으로 로그인 된 상태다. 유저를 추가한다.

adduser <계정이름>
adduser jjp

비밀번호만 잘 입력하고 나서는 아무것도 입력하지 않고 모두 엔터를 눌러도 무방하다.



  • sudo 설치 / 설정
apt install sudo

vim /etc/sudoers

sudoers 설정에서 "root ALL=(ALL:ALL) ALL" 라인를 찾아서 바로 밑에 아래와 같이 라인을 추가한다.

이렇게 하면 내가 설정한 해당 유저에 sudo 권한이 부여되는데 root 계정과 거의 같은 권한을 가지게 된다.

만약 해당 설정을 안하고 바로 유저로 로그인하면 해당 계정에서 sudo 명령어를 사용할 수 없다.

root         ALL=(ALL:ALL) ALL
jjp          ALL=(ALL:ALL) ALL



  • ssh 설치 / 계정 전환

ssh 접속을 위해 ssh 를 설치해주고나서 생성한 우분투 유저로 전환해주자.

apt install openssh-server

su <계정이름>
su jjp

jjp 로 로그인하는데에 성공했다. 익숙한 화면이다.



  • ssh 설정

원격으로 해당 CLI에 접속하기 위해 관련한 ssh 설정을 해야한다.

sudo vi /etc/ssh/sshd_config

먼저 #Port 22 부분을 찾아 주석을 제거하고 1~1023를 제외한 포트번호를 지정한다. (termux 에서 1~1023 포트는 사용할 수 없다.)

나의 경우에는 17번째 라인에 있었다.


그리고 #PasswordAuthenticatoin yes 라인의 주석을 제거한다. 나의 경우에는 60번째 라인에 있었다.

이 설정은 비밀번호 입력을 통해 ssh 접속 사용자를 인증한다는 것이다.

이렇게 설정하고나서 :wq 로 저장해준다.

참고로 3번째 이미지의 #PubkeyAuthentication yes 라인은 보면 알겠지만 공개키 인증 설정인데, EC2는 기본적으로 이 인증방법을 사용한다.
원한다면 해당 옵션 사용 방법을 찾아서 설정해도 된다.


  • ssh 서비스 실행
sudo service ssh start

이제 ssh 서비스를 실행하자.

이렇게 OK가 뜨면 정상이다.



  • Acquire wakelock 설정

마지막으로 앱이 절전모드로 진입하는 것을 막기 위해 화면 상태바에서 Acquire wakelock을 설정해주자.

Acquire wakelock -> 허용



  • ssh 접속

이렇게 하면 이제 기기에 연결된 ip를 통해 원격으로 접속할 수 있다.

ssh 접속을 하려면 ip 주소가 필요한데, ifconfig, ip addr, hostname -I 같은 명령어들은 권한 문제로 인해 사용할 수 없었다.

그래서 직접 핸드폰에 연결된 와이파이 설정에 들어가서 ip 주소를 확인했다.

해당 ip를 통해 아래와 같이 ssh 접속을 할 수 있다.

ssh <계정이름>@<ip 주소> -p <포트번호>

ssh jjp@172.30.1.87 -p 2024

이렇게 노트북에서 ssh 접속에 성공했다. 이제 핸드폰이 아닌 컴퓨터로 편리하게 CLI 를 사용할 수 있게 되었다.

하지만 이 ip 주소는 Wi-Fi 공유기에서 할당해준 내부 ip 주소이다. 그래서 이 와이파이에 연결된 노트북에서는 접근이 가능하지만 (같은 내부 네트워크이므로) 외부에서는 이 ip 주소로 직접 접근할 수가 없다.

그래서 공유기에서 포트포워딩 설정을 통해 외부에서 해당 기기에 접근할 수 있도록 해줘야 한다.



포트포워딩 설정하기

포트포워딩은 말그대로 공유기에 들어온 요청을 설정된 내부 ip 주소와 포트 번호로 포워딩해주는 기술이다.

우선 Wi-Fi 공유기 설정 페이지로 접속해준다. 접속 방법은 아래 링크를 참고하자.
https://6iiiiii.net/73-2/

나는 kt GiGA 인터넷을 쓰고 있는데, 제조사 별로 기본 계정의 id와 비밀번호가 각각 다르니 따로 찾아봐야한다.

kt GiGA 인터넷의 경우
접속 URL - 172.30.1.254:8899
기본 계정 - 아이디: ktuser / 비밀번호: homehub 이다.


장치설정 -> 트래픽 관리 -> 포트 포워딩 설정 에 들어오면 아래와 같은 화면이 뜨는데,

여기에 아래와 같이 외부에서 접속할 포트 번호, 내부 IP주소, 내부 포트, 설명을 입력하고 추가를 누른다.


아래처럼 추가가 되면 성공이다.


쓰고있는 공유기의 외부 ip는 구글에 "what is my ip" 를 쳐서 볼 수 있다. (검은색 박스 영역)

이를 가지고 ssh 접속을 시도해보자.

ssh <계정이름>@<외부 ip 주소> -p <포트번호>

ssh jjp@123.123.123.123 -p 2024

외부 ip로 접속하는데에 성공했다.

이제 이 외부 ip를 통해서 아무곳에서나 내 안드로이드 우분투 서버에 접속할 수 있다.



내부 ip 고정하기

하지만 여기서 끝이 아니다. 와이파이에 물려있는 기기들의 내부 ip 주소는 일정 시간이 지나거나 재연결 하게되면 바뀔 수 있다.

이는 DHCP 서버가 해주는 일인데, 매번 와이파이에 연결할 때마다 사용자가 일일히 비어있는 내부 ip 주소를 찾아 할당할 필요가 없게 하기 위함이다.

우리 상황에서는 이렇게 내부 ip 주소가 바뀌면 이전 ip 로는 접속이 안되므로, 매번 포트포워딩을 다시 설정해주어야한다.

그래서 이 안드로이드 기기는 고정된 내부 ip 주소를 받도록 설정해주자.


공유기 페이지에서 장치설정 -> 네트워크 관리 -> LAN 연결 설정 - IP 할당 설정 에서 설정할 수 있다.

여기서 타겟 MAC 주소에 우리가 쓰는 안드로이드 폰의 MAC 주소와 ip 주소를 입력하고 추가를 누르면 된다.


핸드폰의 MAC 주소는 따로 설정을 해주고 나서 확인해야한다.

기본적으로는 랜덤 MAC 주소를 쓰고 있는데 이걸 휴대전화 MAC 으로 변경해주자.

Wi-Fi 설정 -> 연결중인 Wi-fi 설정 -> MAC 주소 유형 휴대전화 MAC으로 변경 -> 와이파이가 재연결됨 -> 바뀐 MAC 주소 확인


이렇게 얻은 MAC 주소로 아까와는 다른 ip 주소를 할당해보자. (처음 자동으로 할당 받은 172.30.1.87에서 172.30.1.10 로 바꿨음)

그 뒤 핸드폰에서 와이파이를 껐다가 다시 연결했더니

172.30.1.10 로 ip 주소가 잘 바뀐 것을 확인할 수 있다.

다시 처음에 자동으로 할당받아 포트포워딩을 설정했던 172.30.1.87 로 바꿔서 고정해줬다.

여기까지 하면 적어도 집안에서는 불편함 없이 계속 접속할 수 있다.


하지만 내부 ip 뿐만 아니라 공유기의 외부 ip 주소 또한 시간이 지나거나 공유기 자체를 재부팅하면 자동으로 ip 주소를 재할당 받는다.

가정집에서는 보통 동적 ip를 사용하는데, 따로 고정 ip를 사용하려면 인터넷 회사에 추가 비용을 내서 새로 고정 ip 주소를 할당받아야 한다.

이걸 하지않고 그냥 넘어가면 어느순간 밖에서 접속이 안되는 상황을 겪을 것이다. (내가 그랬다ㅠ)

하지만 이제와서 고정 ip 할당을 위해 돈을 낼 수는 없다. 다른 방법이 없나 찾아보던중 DDNS(Dynamic DNS) 라는 것을 알게 되었다.

말 그대로 DDNS는 동적으로 바뀌는 ip 주소를 알아서 갱신해준다.

무료 DDNS 서비스를 이용하여 이 문제를 해결해보자.



DDNS 설정하기

https://www.noip.com/sign-up

무료 DDNS 서비스인 no-ip 를 사용했다. 위 링크로 들어가서 회원가입을 해준다.

해보니까 naver 이메일로는 가입이 안되는 것 같다. 그래서 google 이메일로 회원가입을 했다.


회원가입을 하고 메일 인증까지 완료하면 아래 화면이 뜨는데, 그냥 skip 해주자.


FREE Dynamic DNS 를 선택해준다. 무료 플랜은 30일 마다 들어와서 갱신을 해줘야하는데 월 3,000원 정도만 지불하면 이 귀찮음을 피할 수 있다.

하지만 여기까지 와서 컨셉을 깨고 돈을 쓸 수는 없기 때문에 무료 플랜을 사용했다.


로그인을 하게되면 대쉬보드가 보이는데, 왼쪽 목록에서 Dynamic DNS -> No-IP Hostnames 로 들어가자.


나는 이미 DDNS 를 쓰고 있어서 Dynamic DNS 에 이미 하나가 있는데, 처음엔 아무것도 없을 것이다.

Create Hostname을 누르자.


원하는 Hostname 을 입력하고 Domain 을 설정한다. 이건 공짜로 주어지는 도메인 주소다.

IPv4 Address 에 공유기의 외부 ip 주소를 입력하고 Create Hostname 을 누른다.


설정이 완료된 모습이다.


마지막으로 공유기 관리 페이지에서 장치 설정 -> 부가 기능 -> DDNS 설정 에 들어간다.

여기서 DDNS 사용을 활성으로 바꿔주고

DDNS 서버는 no-ip.com 로 no-ip 계정의 아이디와 비밀번호와 아까 설정한 Hostname을 모두 입력한 뒤 적용을 누르면 끝난다.


이처럼 DDNS 를 통해서 ssh 접속까지 성공했다.



소감

여기까지 하면 웹서버를 돌리기 위한 기본적인 세팅은 모두 끝났다.

이제 우리 서버는 반영구적으로 24시간 서비스를 제공할 수 있는 상태가 되었다.

이게 진짜 되다니 너무 신기하다. 돈 한푼 안들이고 꽤 좋은 성능의 서버를 구축하다니 참 좋은 세상에 사는듯하다.

또 집에 남는 안드로이드 공기계로 추가적인 서버 세팅도 가능하다. 만약 부족해지면 친구한테 안쓰는 폰 있냐고 물어봐야겠다.

아슬아슬했던 EC2 프리티어와는 달리 이 안드로이드 서버는 현재까지 문제없이 잘 돌아가고 있다.

돈이 없는 대학생, 취준생이라면 EC2 프리티어 대신 Termux 로 폰서버를 구축해서 사용하는 것이 더 합리적이라고 생각이 든다.



진짜 돈이 안들까??

전기세는?

핸드폰을 24시간동안 충전한다고 해서 전기세가 얼마나 나올까 싶지만, 정확하게는 잘 몰라서 직접 2월 한달동안 서버를 돌리면서 측정해봤다.

TP-link 스마트 플러그 Tapo P101 를 이용해서 소비한 전력량을 확인해봤다.

2월 한달동안 약 0.3kWh 정도 사용했는데 아래 표에서 가장 비싼 금액인 1kWh 당 736원으로 계산해보면 무려 220원이다. 공짜 맞다!
(이달의 결제내역란은 무시하자)

https://somipapa.com/entry/가정용-1kw당-전기요금과-사용량별-전기요금-리스트-feat-전기요금-구조와-계산법


네트워크 비용은?

사실 이부분은 아직 자세하게는 알아보지는 못했다. 대부분의 가정집에서는 인터넷 정액제를 사용하기 때문에 서버에 요청이 많이 들어와도 요금 폭탄을 맞을 일은 없을 것 같지만 정확한 건 더 알아봐야한다.

하지만 내 서비스의 경우에는 트래픽이 아주 귀여운 수준이기 때문에 지금 걱정할건 아니다.



다음 포스팅은

다음 포스팅에서는 이 서버에 Java, MySQL, Scouter를 설치해서 간단하게 서버를 돌려보고 실시간 모니터링 환경을 구축하는 과정을 담아볼 것이다.

profile
과정 기록

31개의 댓글

comment-user-thumbnail
2024년 2월 29일

호돌맨님이 라이브 방송에서 언급하셨던 분 같으시네요!
어떻게 설정하셨는지 궁금했었는데 글로 작성해 주셔서 감사합니다 :)

1개의 답글
comment-user-thumbnail
2024년 3월 1일

와 너무 재밌어보이네요!

1개의 답글
comment-user-thumbnail
2024년 3월 1일

생각만 했던 작업들이라 재미있게 봤습니다 👍

1개의 답글
comment-user-thumbnail
2024년 3월 2일

와 신박하네요 ㅋㅋㅋ :) OS 공사만 잘 하면 아주 요긴할 것 같네요!!

1개의 답글
comment-user-thumbnail
2024년 3월 4일

퍼스널 서버 가지고 싶다는 생각은 해봤어도, 소음이나 비용문제 때문에 생각 접었었는데 이런 방법이 있네요...!

1개의 답글
comment-user-thumbnail
2024년 3월 5일

AWS 프리티어 끝나도 또 쓰는 방법이 있습니다!
탈퇴하고, 카드 재발급을 하고, 새로 계정을 파면 됩니다
정말 꽤 귀찮긴 합니다만, 요즘같이 AWS라는 이름이 날리는 시대에 돈나간다고 안써볼 수도 없으니까요
(그렇게 무려 3개의 계정을 프리티어로 연달아 써왔습니다)

또, 오라클 클라우드라는 훌륭한 대안도 있으니까요

물론, 이제 점점 공부할 수록 무거운 것들을 많이 시도하게 된다는 점과 제한적 환경 때문에 굳이 이렇게 타이트하게 써야하나 싶죠

termux도 정말 좋은 대안이죠!
이것저것 다 써보면서 가격적으로도 그렇고 부담없이 즐기고,연습하기에는 이만한게 없죠
아주 훌륭한 대안을 찾으셨네요

축하드립니다!

1개의 답글
comment-user-thumbnail
2024년 3월 6일

와.. 진짜 감탄밖에 안나오네요 좋은 경험 공유해주셔서 감사합니다~!! 후기도 기대할께욥

2개의 답글
comment-user-thumbnail
2024년 3월 6일

😲

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

재밌는 글 잘 봤습니다. 혹시 휴대폰 발열은 어떤가요?

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

집에 안쓰는 노트북으로 블로그 서버 운영한다는 이야기는 들었어도 핸드폰으로 서버 운영하는건 진짜 처음인듯 ㄷㄷ 진짜 기발하다

1개의 답글
comment-user-thumbnail
2024년 3월 10일

노트9에서 기변했는 데, 노트9도 가능할까요? 반숙님 대단하시네요. Spring Boot 배워 보려고 하는 데 오라클 클라우드도 있다고요? 어떤 서버가 좋을 지 추천 좀 해주세요.

1개의 답글
comment-user-thumbnail
2024년 3월 11일

termux에서 우분투가 되는지는 처음 알았네요 멋집니다!!

1개의 답글
comment-user-thumbnail
2024년 3월 12일

와 반숙님 정확히 이거를 했어야 했는데,, 감사합니다!!!

1개의 답글
comment-user-thumbnail
2024년 6월 9일

no-kill 옵션까지 켜두고 이제 안 꺼지게 세팅 완료했다 생각했는데, 삼성 업데이트가 자동으로 되는 바람에 폰이 재부팅 되는 건 생각도 못 했네요
만약 서버가 꺼지면 안 되시는 분들은 자동 업데이트를 막아두고 사용하시면 좋을 것 같습니다!

1개의 답글
comment-user-thumbnail
2024년 6월 15일

안녕하세요, 해당 게시글 보고 서버를 구축 하는 데는 성공했습니다! 감사합니다.
그런데 혹시 인증서 발급 받아보셨나요? 보통 사용하는 systemctl 같은 명령어는 먹지도 않고 도커도 termux에서는 작동하지 않는다고 하더라구요. 인증서를 발급 받으셨다면 발급 받으신 방법이 궁금해서 여쭤봅니다ㅠㅠ!

1개의 답글