이 글은 Hugo + PaperMod 블로그 세팅 시리즈의 마지막 글이다.

  1. Hugo + PaperMod로 기술 블로그 만들기
  2. NCP 서버에 Hugo 블로그 배포하기
  3. 커스텀 도메인 연결과 Let’s Encrypt SSL 설정 ← 현재 글

진행 순서

도메인과 SSL 설정에는 순서가 있다. 순서가 바뀌면 인증서 발급이 실패한다.

도메인 구매 → DNS A 레코드 설정 → Nginx server_name 변경
→ hugo.toml baseURL 변경 → certbot SSL 발급 → 재배포

1. 도메인 구매

도메인 구매처는 여러 곳이 있다:

업체특징
Cloudflare원가 판매, DNS 관리 편리
가비아국내 최대, 한글 지원
NCP서버와 같은 곳에서 관리

나는 Cloudflare를 선택했다. DNS 관리 UI가 깔끔하고 추가 비용이 없다.

.dev 도메인 참고사항

.dev는 Google이 관리하는 TLD로, HSTS preload가 적용되어 있다. 즉:

  • 모든 .dev 도메인은 브라우저에서 HTTPS만 허용
  • HTTP로는 접속 자체가 불가
  • SSL 설정이 필수

기술 블로그에 어울리는 도메인이지만, SSL 없이는 쓸 수 없다는 점을 알고 있어야 한다.

2. DNS 설정

Cloudflare DNS에서 A 레코드를 추가한다:

TypeNameContentProxy
A@서버IPDNS only

중요: Proxy를 반드시 꺼야 한다 (회색 구름). Cloudflare 프록시가 켜져 있으면 서버 IP가 Cloudflare로 대체되어 Let’s Encrypt 인증서 발급이 복잡해진다.

DNS 전파 확인:

dig +short dbalog.dev
# 서버IP가 나오면 성공

보통 Cloudflare는 수 분 내로 전파된다.

3. Hugo 설정 변경

hugo.toml의 baseURL을 변경한다:

# 변경 전
baseURL = "https://example.com/"
# 변경 후
baseURL = "https://dbalog.dev/"

이 값은 sitemap, RSS, 메타 태그 등 블로그 전체에서 사용되므로 반드시 변경해야 한다.

4. Nginx server_name 변경

deploy/nginx/blog.conf:

server_name dbalog.dev;  # IP 또는 example.com에서 변경

서버에 반영:

scp deploy/nginx/blog.conf ncp-blog:/etc/nginx/conf.d/blog.conf
ssh ncp-blog "nginx -t && systemctl reload nginx"

5. Let’s Encrypt SSL 인증서 발급

certbot 설치

Rocky Linux 9 기본 저장소에는 certbot이 없다. EPEL 저장소를 먼저 추가한다.

ssh ncp-blog "dnf install -y epel-release"
ssh ncp-blog "dnf install -y certbot python3-certbot-nginx"

인증서 발급

certbot의 --nginx 플러그인이 인증서 발급과 Nginx 설정 수정을 한번에 처리한다.

ssh ncp-blog "certbot --nginx -d dbalog.dev \
    --non-interactive \
    --agree-tos \
    --email your@email.com \
    --redirect"
  • --nginx: Nginx 설정을 자동으로 수정
  • --redirect: HTTP→HTTPS 301 리다이렉트 자동 추가
  • --non-interactive: 대화형 프롬프트 없이 실행

성공하면 이런 메시지가 나온다:

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/dbalog.dev/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/dbalog.dev/privkey.pem
This certificate expires on 2026-07-09.

certbot이 Nginx에 추가한 설정

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/dbalog.dev/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dbalog.dev/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

그리고 HTTP→HTTPS 리다이렉트를 위한 별도 server 블록:

server {
    if ($host = dbalog.dev) {
        return 301 https://$host$request_uri;
    }
    listen 80;
    server_name dbalog.dev;
    return 404;
}

인증서 자동 갱신

Let’s Encrypt 인증서는 90일마다 만료된다. certbot이 systemd 타이머를 자동 등록하므로 수동 갱신이 필요 없다.

갱신 테스트:

ssh ncp-blog "certbot renew --dry-run"

6. 재배포

baseURL이 변경되었으므로 빌드 후 재배포한다.

./deploy.sh

확인

# HTTPS 접속
curl -s -o /dev/null -w "%{http_code}" https://dbalog.dev/
# 200

# HTTP → HTTPS 리다이렉트
curl -s -o /dev/null -w "%{http_code}" http://dbalog.dev/
# 301

브라우저에서 https://dbalog.dev/에 접속하면 자물쇠 아이콘이 표시된다.


시리즈 마무리

3편에 걸쳐 Hugo 블로그를 처음부터 세팅했다:

  1. Hugo + PaperMod 설치 및 설정
  2. NCP 서버에 Nginx + rsync 배포
  3. 도메인 연결 + SSL 인증서

이제 남은 건 글을 쓰는 것뿐이다. 마크다운 파일을 만들고, ./deploy.sh를 실행하면 끝.