본문 바로가기

웹 운영/운영 구축

RaspberryPi + Cloudflare 서비스로 LAN 내에서 서버 구축하기

728x90

개발 서버로 AWS Ec2 를 운영하고 있었는데 너무 비싸서 Raspberry Pi 로 내가 사용하는 LAN 내에서 서버를 구축을 해봤다. AWS EC2 로 프리티어를 사용해봤는데 앱 하나랑 DB 만 띄우고 좀만 운영해도 다운되길래, 하나 살짝 더 높은걸로 했는데 그거 마저도 너무 비쌌다 ㅠㅠ (개발 안하는 시간에 껐는데도 달에 3,4만원..) 

 

 

1) 스펙

 

Raspberry Pi 4B 로 준비

- 4 CPU

- 4GB 메모리

- 16GB SD 카드

- 이정도만 해도 아주 기본적인 운영에는 충분한 것으로 판단된다. 

 

 

 

2) Ubuntu 20.04 OS SU

 

- 하단 영상을 참고해서 SU 을 진행했다

- https://www.youtube.com/watch?v=zasvSKaobVI

 

 

- 참고로 내 컴퓨터에서 SSH 는 같은 LAN 내이므로 쉽게 가능했다

 

 

 

4) 설계

 

- 방화벽으로 막혀있는 외부 요청에 Raspberry Pi 가 통신을 수신할 수 있는 포트를 열어야겠다고 생각

- Router 를 통해 포트포워딩을 해야 할텐데, 사용하고 있는 Domain 을 사용해 외부에 프록시 업체를 하나 두는게 좋을 것 같다고 생각

- 처음엔 AWS ALB 를 생각했으나, 과금이 좀 심해서.. 무료 티어가 있는 업체를 찾다가 Cloudflare 를 알게됨

- DNS 쿼리를 수행해줄 때 프록시 모드를 설정하면 기본적인 보안을 제공해준다고 해서 선택

 

 

Router 의 IP 도 Cloudflare 가 숨겨주므로, (그나마) 조금 더 안전한 모델로 SU 된 것 같다

 

 

 

5) Rasp Node 에 Docker 설치 및 사용하던 Hub 에서 이미지 다운로드 및 DB 이전

 

- https://docs.docker.com/engine/install/ubuntu/ 를 참조해서 docker 를 모두 설치

- 설계한 포트대로 매핑해서 App 과 DB 를 모두 컨테이너로 기동시켰다 (DB 는 개발 DB 라 컨테이너로 그냥 띄움)

- Router 가 포트포워딩을 App Container 로 해준다

 

 

 

6) 포트포워딩 설정

 

 

Router Gateway 에 들어가면 관리자 페이지를 볼 수 있다

 

 

- 이거 들어가느라 라우터 초기화했다 ㅎㅎ

- 아무튼 들어가서 [관리 도구 > 고급 설정 > NAT/라우터 관리 > 포트포워드 설정] 으로 이동한다

 

 

설계한대로 규칙 지정

 

 

- 규칙을 지정하고 외부에서 IP 를 직접 치고 접근시 접근이 되는 것을 확인할 수 있다

 

 

 

7) Cloudflare 사용

 

- Domain 을 구입했다면 Domain Registrar 에서 네임서버를 Cloudflare 쪽으로 바꿔야 한다. 그래야 Cloudflare 의 DNS 기능을 사용할 수 있다 

 

 

A 레코드를 라우터의 Public IP 로 추가해주고, 프록시 모드를 켜줬다

 

 

- 참고로 프록싱 상태에는 두가지가 있는데, 프록시 모드랑 only DNS 모드가 있다

- only DNS 모드는 Domain Registrar 에서 하는 것과 똑같은 것으로, 단순히 DNS 쿼리만 실행해주는 역할만 하므로, 굳이 Cloudflare 를 사용할 필요 없다

- 프록시 모드는 SSL/TLS 섹션에서 다음과 같은 사진을 볼 수 있는데, 전체 암호화 모드를 설정해야 가능하다 (적어도 내가 알아본 바로는 그랬다)

 

 

Client 측 SSL 모드만 적용해주면 프록시 모드가 어렵다

 

 

- 따라서 결국 Cloudflare 측에서 원본 서버측으로의 요청도 암호화를 해줘야 하는데, Cloudflare 에서 인증서 생성 역시 도와준다. 해당 인증서를 활용해 .pem 을 만들어 Raspberry Pi 에 복사해주었다 (단, 가장 Basic 한 인증서로, 사실 open ssl 을 통해서도 할 수 있음)

 

 

기본 인증서 생성을 할 수 있다

 

 

- Spring 단에서는 SSL Terminate 된 채로 수신되게 해주기 위해 Nginx Proxy 컨테이너를 하나 더 기동하였다.

- 다음과 같이 설정을 conf.d 폴더에 마운트 하여 nginx 컨테이너에 물렸고, 다음 그림과 같이 설계를 변경하였다

 

# 같은 docker network 안에서는 container 이름으로 통신한다

server {
  listen		{ROUTER_FORWARDED_PORT} ssl;
  ssl_certificate	/etc/ssl/cf-ssl/{CERTI_NAME}.pem;
  ssl_certificate_key	/etc/ssl/cf-ssl/{CERTI_KEY_NAME}.pem;

  location / {
	proxy_pass		http://{APP_CONTAINER_NAME}:{CONTAINER_PORT};
	proxy_set_header	HOST		$host;
	proxy_set_header	X-Real-IP	$remote_addr;
  }
}

 

 

Rev Proxy Container 가 추가된 설계안

 

 

- 이와 같이 설정해주니 Client 측에서 https 통신으로 도메인 접속시 Raspberry Pi 가 정상적으로 응답해주는 모습을 확인하였다

- Cloudflare 에서 Overview 로 전체적인 현황까지 확인해주고, 일부 쿼리에 대해서 캐싱까지 지원해준다

- Cloudflare 는 프리티어만 사용했는데도 보안까지 어느정도 신경써주고.. 정말 좋은 서비스 같다... 감사합니다

 

 

Cloudflare 의 Overview 페이지 모습

 

 

- 계산해보니까 Raspberry Pi 4 의 한달 24/7 운영해도... 전기료가 1000원도 채 안나온다고 한다 ㅋㅋㅋㅋㅋ

- 진작에 할걸~!~!~!~! 온프레미스가 짱이구나~!~!~!~!

728x90

'웹 운영 > 운영 구축' 카테고리의 다른 글

[PV, VG, LV] LV 분할하여 Ubuntu /var 용량 확장하기  (1) 2024.11.25
[Jenkins] 강의  (0) 2023.02.20