3단계
3단계 — Caddy 로 자동 HTTPS
25 분
3단계 — Caddy 로 자동 HTTPS
Nginx 와 비슷하지만 자동 HTTPS 가 기본이에요. Let's Encrypt 인증서 발급·갱신을 Caddy 가 알아서 합니다.
Caddyfile — 한 도메인 = 세 줄
example.com {
reverse_proxy app:3000
}
이게 끝. Caddy 가 자동으로 HTTPS 인증서를 받아 80→443 리다이렉트 + 압축까지 해 줘요.
여러 서비스를 한 Caddy 로
api.example.com {
reverse_proxy backend:8080
}
example.com {
reverse_proxy frontend:3000
}
admin.example.com {
reverse_proxy admin:3000
}
서브도메인 별로 다른 컨테이너 라우팅 — 단일 80/443 포트 공유.
docker-compose 통합
services:
caddy:
image: caddy:2-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
restart: unless-stopped
app:
build: .
expose:
- "3000" # ← Caddy 만 접근 가능, 외부 노출 X
# ports: 명시 X — Caddy 가 reverse_proxy 로 도달
volumes:
caddy-data:
caddy-config:
caddy-data 는 인증서 캐시 — 반드시 named volume 으로 (재시작 시 사라지면 갱신 한도 초과 위험).
헤더 통과
reverse_proxy 는 기본으로 X-Forwarded-* 를 자동 추가. 그런데 원본 호스트 가 필요한 앱 (예: i18n redirect 가 host 기반) 은 명시:
example.com {
reverse_proxy app:3000 {
header_up Host {host}
header_up X-Forwarded-Host {host}
header_up X-Forwarded-Proto {scheme}
header_up X-Forwarded-Port "443"
}
}
운영 팁 5
- Caddy data volume 은 절대 삭제 X — Let's Encrypt rate limit (주 5회) 위반 위험
- 로컬 개발용 자체 서명 인증서 —
tls internal한 줄로 - Caddyfile 변경 시 —
docker exec caddy caddy reload또는 컨테이너 재시작 - 단일 컨테이너 1대 운영 — Caddy 1대로 도메인 수십 개 처리 OK
- 로깅 —
log { output file /var/log/access.log }로 접근 로그
직접 해 보기
DuckDNS 로 무료 도메인 (yourname.duckdns.org) 을 받고, 위 docker-compose 를 띄운 뒤 https://yourname.duckdns.org 에 접근. 자물쇠 아이콘이 보이면 성공.
더 깊이
다음 단계
4단계에서는 외부 노출을 최소화 하는 SSH 터널 + 루프백 바인딩 패턴을 배워요.