홈서버가 있는데 블로그는 AWS에 올린 이유

집 공유기 443 포트를 열고 서브도메인마다 서비스를 붙이던 홈서버에 블로그까지 올리려다 그만뒀다. 집 IP 노출, 회선과 서버가 같이 멈추는 문제를 따져 보고 글은 집에서 쓰되 공개는 S3·CloudFront에 맡긴 과정과 그 뒤에 생긴 일.
블로그는 집 서버가 아니라 AWS에서 돈다. 글은 집에서 쓰고 빌드도 집 Gitea가 하지만, 방문자가 받는 페이지는 S3에 올려 둔 정적 파일을 CloudFront가 내준다. 처음부터 이렇게 할 생각은 아니었다. 집 Proxmox 한 대에 Gitea도, 개발 환경도 다 돌고 있으니 블로그도 그 옆에 하나 더 붙이면 끝일 줄 알았다.
처음 그림: 집 서버에 서브도메인 하나 더
그때 집 구성은 공유기 443 포트를 리버스 프록시(Nginx Proxy Manager)로 열어 두고, 서비스마다 서브도메인을 공개 DNS에 집 공인 IP로 등록해 쓰는 식이었다. 사진 앱, 코드 서버, 파일 공유, 로컬 LLM 화면까지 전부 그렇게 밖에서 들어갔다. 블로그용 서브도메인도 이미 그 목록에 있었다. 그러니 Jekyll 결과물을 프록시 뒤에 하나 더 두면 되는 일이었다.
막상 공개 글을 올릴 자리라고 생각하니 그동안 신경 쓰지 않던 것들이 보이기 시작했다.
따져 보니 걸린 것 세 가지
| 걸린 것 | 뜻 |
|---|---|
| 공개 도메인이 집 IP를 가리킨다 | 블로그 주소를 조회하면 누구나 집 공인 IP를 안다. 블로그는 익명으로 운영하려는 곳인데 출발점부터 집을 가리킨다 |
| 집이 멈추면 블로그도 멈춘다 | 공유기 재부팅, 서버 업데이트, 회선 장애가 전부 블로그 장애가 된다. 글 하나 올리자고 집 전원을 지켜야 한다 |
| 열린 포트가 곧 관리 대상 | 프록시 설정과 인증서, 업데이트를 계속 손봐야 하고, 인터넷에 열린 관리 화면이 하나씩 늘어난다 |
속도도 있었다. 집 회선은 업로드가 느리고, 누가 글 하나 보는 동안 다른 서비스가 회선을 쓰면 같이 느려진다. 홈서버 취미와 공개 사이트 운영은 다른 일이었다.
그래서 거꾸로 갔다. 블로그를 집에 더하는 대신, 2026-09-25에 공유기 80·443 포트포워딩을 지우고 다음 날 공개 DNS에서 집 IP가 들어간 레코드를 전부 뺐다. 집 서비스는 Tailscale로만 들어간다. 그 구성은 홈 네트워크 지도에 있다. 블로그만 밖으로 꺼내 AWS에 두었다.
집: VS Code → Gitea → Gitea Actions Runner
검사·Jekyll 빌드·배포
↓
AWS: 비공개 S3 버킷 ← CloudFront ← 방문자
집에서 AWS로 나가는 것은 Runner가 보내는 배포뿐이다. 방문자는 CloudFront에만 닿고 집 쪽으로는 아무것도 들어오지 않는다.
CloudFront를 고른 기준과 첫날 403
정적 사이트에 필요한 것은 넷이었다. 비공개 원본, HTTPS, 캐시, 한국 방문자에게 빠른 응답. S3를 비공개로 두고 CloudFront가 Origin Access Control로 읽게 하면 넷 다 된다. 요금은 2026-09 기준 정액제 Free 플랜(월 100만 요청, 100GB 전송)이라 블로그 규모에서는 0원이다.
설정은 하루 만에 끝났는데 첫날 /about/이 403으로 떴다. Jekyll은 /about/을 about/index.html로 만드는데, CloudFront의 기본 루트 객체는 맨 앞 /에만 적용된다. 뷰어 요청 함수로 주소를 고쳐 해결했다. 그 과정과 Free 플랜에 포함되는 것·안 되는 것은 CloudFront Free 플랜 글에 있다. 플랜이 0원이어도 도메인 등록비와 플랜 밖 S3 요청은 따로 든다.
나누고 나서 생긴 일
얻은 것은 분명하다. 집 서버를 재부팅해도 블로그는 그대로 열리고, 집은 원본과 빌드만, AWS는 방문자 응답만 맡는다. 집의 Git 원본은 따로 암호화해 S3에 보관한다(암호화 백업 글).
대신 챙길 것이 생겼다.
- AWS 계정 보안. 루트 계정에 2단계 인증을 걸고 쓰지 않는다. 배포·백업·사진 업로드는 각각 권한을 좁힌 IAM 사용자로 나눴다.
- 비용 알림. 월 1달러를 넘으면 메일이 오게 예산을 걸어 두었다. 0원이 당연한 구조라 0원이 아니면 바로 알아야 한다.
- 집이 꺼지면 배포가 멈춘다. 이미 올라간 페이지는 열리지만 예약 발행, 주간 백업, 30분마다 도는 사이트 점검이 함께 선다. 그래서 점검이 끝날 때마다 외부 감시 서비스에 신호를 보내고, 신호가 끊기면 그쪽에서 알려 주게 했다. 각 작업은 Gitea Actions 배포 글에 있다.
이 구조는 홈서버를 포기한 것이 아니라 홈서버가 잘하는 일과 공개 인프라가 잘하는 일을 나눈 것이다. 집에 서버가 있다고 공개 사이트까지 집에서 할 이유는 없었다. 다음은 AWS 쪽 설정을 하나씩 적는 CloudFront 글이다.