본문 바로가기

개발이야기/셀프호스팅

도메인 구매부터 Cloudflare 셀프 호스팅까지

이 글은 <내 도메인>을 실제로 운영하면서 쓴 Cloudflare 설정을 화면 그대로 정리한 기록이다.

  • 도메인은 Cloudflare Registrar에서 샀고, 등록과 DNS가 같은 대시보드에 있어 네임서버를 따로 옮길 일이 없었다.
  • 정적 사이트는 Workers에 올리고 <내 도메인>를 커스텀 도메인으로 연결했다.
  • 집 Mac에서 도는 서비스는 포트를 열지 않고 Cloudflare Tunnel로 서브도메인에 붙였다.

1. 도메인 구매

Domains 메뉴의 Registrations에서 Buy domain을 눌러 검색하고 결제한다. 도메인은 원가에 가깝게 파는 구조라 갱신 때 가격이 튀지 않는다는 점이 Cloudflare를 고른 이유였다. Registrations 목록에서 만료일과 자동 갱신 여부를 볼 수 있고, 내 도메인은 자동 갱신이 켜져 있으며 2027년 8월 13일에 만료된다.

Cloudflare Registrars 화면, 등록한 도메인의 만료일과 자동 갱신 설정
Cloudflare 대시보드 캡처 · Cloudflare Registrars 화면

상단 안내문처럼 2026년 11월 1일부터 Verisign이 .com 도매가를 10.46달러에서 11.17달러로 올린다. 신규 등록, 갱신, 이전에 모두 적용되므로 .com을 살 계획이면 이 점을 알아 두면 좋다.

등록이 끝나면 Domains > Overview에 도메인이 Active 상태로 나타난다. 같은 계정에서 구매했기 때문에 사이트 추가나 네임서버 변경 같은 절차가 필요 없다.

Cloudflare Domains Overview에 Active 상태로 나타난 &lt;내 도메인&gt;
Cloudflare 대시보드 캡처 · Cloudflare Domains Overview에 Active 상태로 나타난 <내 도메인>

2. DNS 레코드 확인

도메인 이름을 눌러 DNS > Records로 들어가면 레코드를 관리한다. 무료 플랜 기준으로 한 도메인에 레코드를 200개까지 둘 수 있고, 지금은 15개를 쓰고 있다.

내 도메인의 DNS Records 화면과 Tunnel 타입 레코드 목록
Cloudflare 대시보드 캡처 · 내 도메인의 DNS Records 화면과 Tunnel 타입 레코드 목록

화면 상단에는 Cloudflare의 권장 사항도 뜬다. www 레코드가 없으면 www.<내 도메인>으로는 접속이 되지 않고, MX 레코드가 없으면 메일을 받을 수 없으며 SPF, DKIM, DMARC가 없으면 발신 위장에 취약하다는 내용이다. 이 도메인은 아직 www와 메일을 쓰지 않아서 두 안내를 그대로 두었다.

표의 Type이 Tunnel인 줄은 직접 입력한 레코드가 아니다. 다음 단계의 터널에 공개 호스트 이름을 추가하면 Cloudflare가 자동으로 만든 CNAME이고, Proxy status가 Proxied라서 방문자는 서버 IP가 아니라 Cloudflare 주소로 접속한다.

3. Workers로 메인 사이트 올리기

메인 사이트(<내 도메인>)는 Vite로 빌드한 정적 파일이라 서버가 필요 없다. 저장소의 wrangler.jsonc에 빌드 폴더와 커스텀 도메인만 적어 두었다.

{
  "name": "katsudio",
  "compatibility_date": "2026-10-01",
  "assets": { "directory": "./dist" },
  "routes": [{ "pattern": "<내 도메인>", "custom_domain": true }]
}

npm run build 뒤에 npx wrangler deploy를 실행하면 dist 폴더가 올라간다. custom_domain: true가 있으면 배포할 때 DNS 레코드와 인증서를 Cloudflare가 알아서 만든다.

Workers & Pages > katsudio > Domains 탭에서 결과를 확인할 수 있다. Custom Domains and Routes에 <내 도메인>이 Production으로 등록되어 있고, 기본 주소인 workers.dev는 꺼 두었다. 도메인 하나로만 접근하게 하려는 선택이다.

Workers katsudio의 Domains 탭에서 &lt;내 도메인&gt;이 Production 커스텀 도메인으로 등록된 모습
Cloudflare 대시보드 캡처 · Workers katsudio의 Domains 탭에서 <내 도메인>이 Production 커스텀 도메인으로 등록된 모습

4. 집에서 돌리는 서비스는 Tunnel로

나머지 서브도메인은 정적 파일이 아니라 집 Mac에서 실행하는 앱이다. 공유기에서 포트를 열면 공인 IP가 노출되고 관리 부담이 커지므로 Cloudflare Tunnel을 썼다. 내 쪽에서 Cloudflare로 나가는 연결만 만들기 때문에 들어오는 포트를 열지 않아도 된다.

Networking > Tunnels에서 터널 목록과 상태를 본다. 내 계정에는 터널 4개가 있고, 그중 katsulabs 터널 하나에 앱 13개의 공개 호스트 이름을 묶어 두었다. Health 상태는 cloudflared가 Mac에서 살아 있는지를 보여 준다. 화면의 katsucade 터널은 Down인데, 해당 프로세스가 꺼져 있다는 뜻이다.

Cloudflare Tunnels 목록, katsulabs 터널에 앱 13개가 연결된 상태
Cloudflare 대시보드 캡처 · Cloudflare Tunnels 목록

순서는 이렇다.

  1. Create Tunnel을 눌러 이름을 정하고 안내된 명령으로 Mac에 cloudflared를 설치해 연결한다.
  2. Public Hostname에서 서브도메인과 로컬 주소(예: http://localhost:3000)를 짝지어 추가한다.
  3. 저장하면 DNS에 Tunnel 타입 레코드가 생기고 바로 접속된다.

5. SSL/TLS 모드 확인

SSL/TLS > Overview에서 암호화 모드를 확인한다. 내 도메인은 Full이다. 방문자와 Cloudflare 사이, Cloudflare와 원본 서버 사이를 모두 암호화하는 구성이다. Flexible로 두면 원본 구간이 평문이 되므로, 원본이 HTTPS를 받을 수 있다면 Full 이상을 권한다.

도메인 구매부터 Cloudflare 셀프 호스팅까지
Cloudflare 대시보드 캡처 · SSL/TLS Overview

아래 Traffic Served Over TLS는 최근 24시간 요청을 TLS 버전별로 나눠 보여 준다. 내 도메인은 TLS 1.3이 약 1,500건으로 대부분이고 TLS 1.2가 2건, 보안 연결이 아닌 요청이 67건이었다.

정리

  • 구매부터 DNS, 인증서까지 한 대시보드에서 끝난다.
  • 정적 사이트는 wrangler.jsonc 한 파일과 wrangler deploy로 올라간다.
  • 집 서버는 포트 개방 없이 Tunnel로 서브도메인에 연결한다.
  • 새 서비스를 붙일 때는 터널에 호스트 이름만 하나 추가하면 된다.