Raspberry Pi는 저전력·저비용의 소형 컴퓨터로, 개인 웹 서버나 테스트 환경을 구성하기에 적합합니다. 이번 글에서는 Hugo로 정적 사이트를 구성하고, Raspberry Pi에서 HTTPS 환경으로 서비스하는 방법을 단계별로 알아보겠습니다.
1. 웹사이트 구축환경 준비
HTTPS 기반의 Hugo 웹사이트를 Raspberry Pi에서 운영하기 위해 다음과 같은 환경을 준비합니다.
- Raspberry Pi 5: 웹서버 실행용 (Docker 설치 필요)
- ipTIME 공유기: 외부 접속 및 포트포워딩 설정 가능
- 가비아 도메인: cnapcloud.com 같은 개인 도메인
- Docker + Docker Compose: Raspberry Pi에서 컨테이너 운영
- Hugo: 정적 웹사이트 빌드 도구 (설치됨 가정)
2. ipTIME에서 DDNS 설정
ipTIME http://192.168.0.1 관리자애 접속합니다.
메뉴 탐색이에서 “고급 설정 > 특수기능 > DDNS 설정” 이동하여 다음과 같이 설정합니다.
- 서비스 제공자: ipTIME DDNS
- 사용자 계정: ipTIME 계정
- 등록할 도메인:
myhome.iptime.org(원하는 서브도메인 입력) 등록 후, 외부에서myhome.iptime.org접속 가능
3. 가비아(Gabia) 도메인에 CNAME 등록
가비아 접속하여 “DNS 관리> DNS 관리툴"로 이동하여 DNS 관리 페이지에 접속합니다. 도메인 목록에서 설정버튼을 클릭하고 “레코드 수정"에서 다음과 같이 CNAME 레코드 추가합니다.
| 타입 | 호스트명 | 값 |
|---|---|---|
| CNAME | @ | myhome.iptime.org. |
※ @는 루트 도메인(cnapcloud.com)을 의미
4. ipTIME 공유기 포트포워딩 설정
ipTIME 관리자 접속하여 메뉴 탐색이에서 “고급 설정 > NAT/라우터 관리 > 포트포워드 설정"로 이동한다. 다음과 같이 라이즈베리파이 서버로 포트포워드 설정을 합니다.
| 서비스 | 외부 포트 | 내부 IP (Raspberry Pi) | 내부 포트 | 프로토콜 |
|---|---|---|---|---|
| HTTP | 80 | 192.168.0.50 | 80 | TCP |
| HTTPS | 443 | 192.168.0.50 | 443 | TCP |
5. 프로젝트 구조
Hugo로 빌드된 정적 사이트를 서비스하기 위한 프로젝트 구조를 다음과 같이 구성합니다.
project-root/
├── docker/
│ ├── compose.yaml # Docker Compose 설정
│ ├── default.conf # Nginx 설정
│ ├── certbot/
│ │ ├── conf/ # Let's Encrypt 인증서 저장소
│ │ └── webroot/ # 인증서 발급용 파일 저장소
├── site/
│ └── public/ # Hugo로 빌드된 정적 사이트
6. Nginx 설정
HTTPS 기반으로 웹사이트를 서비스하기 위해 default.conf 파일에 도메인과 인증서를 설정합니다. 인증서는 Let’s Encrypt를 통해 발급하며, HTTP 요청은 HTTPS로 리디렉션됩니다.
# HTTP → HTTPS 리디렉션 + 인증용 경로 열기
server {
listen 80;
server_name cnapcloud.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS 서버 설정
server {
listen 443 ssl;
server_name cnapcloud.com;
ssl_certificate /etc/letsencrypt/live/cnapcloud.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cnapcloud.com/privkey.pem;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
7. Docker Compose 설정
Hugo로 빌드한 정적 사이트를 Nginx를 통해 HTTPS로 서비스하도록 docker-compose.yml를 구성합니다. 또한 Certbot 컨테이너를 이용해 Let’s Encrypt 인증서를 자동 갱신하도록 설정합니다.
services:
nginx:
image: nginx:latest
container_name: hugo-cnap
volumes:
- ../site/public:/usr/share/nginx/html:ro
- ./default.conf:/etc/nginx/conf.d/default.conf:ro
- ./certbot/webroot:/var/www/certbot
- ./certbot/conf:/etc/letsencrypt
ports:
- "80:80"
- "443:443"
entrypoint: >
/bin/sh -c '
nginx -g "daemon off;" &
while :; do
if [ -f "/var/www/certbot/renewed" ]; then
echo "Detected renewed certificate file. Reloading Nginx..."
nginx -s reload
rm -f "/var/www/certbot/renewed"
fi
sleep 6h
done'
depends_on:
- certbot
restart: unless-stopped
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./certbot/webroot:/var/www/certbot
- ./certbot/conf:/etc/letsencrypt
entrypoint: >
/bin/sh -c '
while :; do
sleep 6h
certbot renew --webroot -w /var/www/certbot --quiet --deploy-hook "touch /var/www/certbot/renewed"
done'
restart: unless-stopped
8. 초기 인증서 발급 절차
먼저 Nginx 설정 파일(default.conf)에서 HTTPS 서버 설정 부분을 주석 처리한 후, docker-compose up -d 명령을 실행하여 웹서버를 구동합니다.
cd docker
docker-compose up -d
이제 Certbot 수동 실행하여 Let’s Encrypt에서 최초로 인증서를 발급받습니다.
docker run --rm \
-v $(pwd)/certbot/conf:/etc/letsencrypt \
-v $(pwd)/certbot/webroot:/var/www/certbot \
certbot/certbot certonly \
--webroot -w /var/www/certbot \
-d cnapcloud.com \
--email your-email@example.com \
--agree-tos \
--no-eff-email
인증서 발급에 성공하면, 발급된 파일은 certbot/conf/live/cnapcloud.com/ 경로에서 확인할 수 있습니다.
9. Nginx 재시작
이제 Nginx 설정 파일(default.conf)에서 주석 처리힌 HTTPS 설정 부분을 복구한 후, nginx를 재시작합니다.
docker-compose restart
- Certbot 컨테이너는 6시간마다 자동으로 인증서 갱신
- Nginx 컨테이너는 인증서가 갱신되면 reload 명령 실행
브라우저에서 https://cnapcloud.com으로 접속하여 Let’s Encrypt 인증서가 적용되었는지(주소창의 🔒 아이콘) 확인합니다.
또한, 터미널에서 curl -I https://cnapcloud.com 명령어를 실행해 HTTPS 응답 헤더를 통해 인증서 적용 상태를 확인할 수도 있습니다.
10. 마무리
이로써 Raspberry Pi에서 Hugo로 제작한 정적 웹사이트를 HTTPS 기반으로 안전하게 서비스할 수 있게 되었습니다. 이번 과정에서는 공유기 DDNS 설정부터 가비아 도메인 연결, Docker 기반 웹서버 구성, 그리고 Let’s Encrypt를 활용한 SSL 인증서 발급 및 자동 갱신 설정까지 순차적으로 진행했습니다. 이 구성을 통해 개인 서버 환경에서도 안정적이고 보안이 강화된 웹 서비스를 운영할 수 있으며, 향후 Nginx 리버스 프록시나 CI/CD 파이프라인을 추가하여 더 확장된 형태로 발전시킬 수도 있습니다.