본문 바로가기

프로젝트

AWS 대신 Mac mini로 홈서버 구축하기: Minikube로 애플리케이션 이전

DB를 Minikube로 옮긴 이후에 애플리케이션을 이전을 진행하기로 했습니다. 이전하면서 CD 환경도 같이 구성을 하였습니다. 하면서 중요하게 생각했던 부분들에 대해서 작성해보려고 합니다.

이미지 기반 배포 전략

기존에는 애플리케이션을 컨테이너 기반으로 실행하고 있었기 때문에, 이미지를 어디에 저장하고 어떻게 가져다 쓸지가 핵심 이슈였습니다. 가장 먼저 고려한 저장소는 Docker Hub였지만, 무료로 사용할 수 있는 범위가 제한적이라 다른 대안을 찾아야 했습니다.

그래서 선택한 것이 GitHub Container Registry(GHCR)입니다.

 

  ✔ GitHub 프로젝트와의 연동이 용이

  ✔ 퍼블릭 저장소 기준으로는 비용이 무료

  ✔ GitHub Actions와의 통합도 용이


GitHub Actions를 활용한 자동 배포

GitHub Actions를 통해 프로젝트를 빌드하여 도커 이미지로 만들고, GHCR에 푸시한 후 Minikube의 Pod를 재시작하는 방식으로 배포를 진행했습니다. Pod는 새로 배포된 이미지를 받아 컨테이너를 재구동하며, 애플리케이션을 최신 상태로 유지합니다. 이 과정에서 이미지 버저닝 전략에 대한 고민도 필요합니다. 현재는 latest 태그를 사용하고 있으나, 롤백 시점이나 특정 버전 고정이 어려울 수 있어 날짜+시간 기반 버저닝 방식도 고려하고 있습니다.

 


외부 접근 및 HTTPS 설정

Minikube에서 애플리케이션을 띄운 이후에는 외부에서 접근할 수 있도록 라우팅을 구성해야 했습니다. 애플리케이션은 HTTPS 통신만을 허용하고 있기 때문에 HTTPS 설정도 함께 필요했습니다.

HTTPS 인증서 자동 갱신

HTTPS 인증서는 보통 90일 단위로 만료되기 때문에 자동 갱신이 필수입니다. 어플리케이션 레벨에서 인증서를 관리하면, 인증서 갱신 시점에 불필요한 redeploy가 발생할 수 있습니다. 그래서 nginx + certbot 조합으로 HTTPS 인증서를 관리하고, 외부 요청을 처리하도록 구성했습니다.

 

  ✔ api.harmony.itmca.io 요청을 127.0.0.1:8080으로 리다이렉트

  ✔ 80(http) 포트 요청을 443(https)으로 강제 리다이렉트

nginx stream 기능으로 포트 포워딩 통합

추가로 nginx가 지원하는 stream 모듈을 활용하면 HTTP/HTTPS뿐만 아니라 TCP 통신도 프록시할 수 있다는 점을 알게 되었습니다. 기존에는 pf를 통해 DB 외부 접근을 포워딩했지만, 이를 nginx로 통합하면서 다음과 같은 이점이 생겼습니다.

 

  ✔ 한 곳에서 모든 네트워크 라우팅을 관리

  설정 변경 및 추적이 용이

  access logging 등에 관련해서도 한 곳에서 확인 가능

 

물론 pf가 더 로우레벨에서 동작하기 때문에 속도면에서 유리할 수 있지만, 운영 편의성을 고려해 nginx로 통합하는 쪽이 더 나은 선택이라고 판단했습니다.

 


마무리하며

AWS에서 Mac mini 기반의 홈서버로 이전하면서 느낀 점은, 클라우드 환경에서 손쉽게 했던 것들이 실제로 구성을 하면 많은 어려움이 있다는 것이다. 하지만 이런 경험을 통해서 추후에 AWS를 사용하게 된다면 조금 더 잘 사용할 수 있을 것 같습니다.

몰랐던 GHCR, nginx 등의 도구들에서도 공부를 할 수 있는 기회가 되어서 좋았고 완벽하지는 않지만 실제 앱에 도입을 함으로 더 빠르게 익숙해진 것 같습니다.

향후에는 이미지 버전 관리, 모니터링, 무중단 배포, Helm을 활용하여 배포 자동화도 추가로 작업해보려고 합니다.