라즈베리파이에 Spring Boot 프로젝트를 띄우고, 무료 도메인(DuckDNS)과 Let's Encrypt 인증서를 사용해 HTTPS 접속이 가능한 서버로 구축한 과정을 정리합니다.
https://www.duckdns.org에 접속해서 다음을 진행합니다:
myproject)예:
myproject.duckdns.org
DuckDNS는 유동 IP를 사용하므로 주기적으로 IP를 갱신해줘야 합니다.
crontab -e
아래 내용 추가 (5분마다 IP 갱신):
*/5 * * * * curl -s "https://www.duckdns.org/update?domains=myproject&token=YOUR_TOKEN&ip="
공유기 관리자 페이지에 접속하여 다음 포트를 열어줍니다:
| 외부 포트 | 내부 IP (라즈베리파이 IP) | 내부 포트 | 프로토콜 |
|---|---|---|---|
| 80 | 192.168.x.x | 80 | TCP |
| 443 | 192.168.x.x | 443 | TCP |
Nginx용 Certbot 설치:
sudo apt update
sudo apt install certbot python3-certbot-nginx
인증서 발급:
sudo certbot --nginx -d myproject.duckdns.org
성공 시
/etc/letsencrypt/live/myproject.duckdns.org/경로에 인증서가 저장됩니다.
Nginx 설정 파일 수정:
sudo nano /etc/nginx/sites-available/default
내용 예시:
server {
listen 443 ssl;
server_name myproject.duckdns.org;
ssl_certificate /etc/letsencrypt/live/myproject.duckdns.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/myproject.duckdns.org/privkey.pem;
location / {
proxy_pass http://localhost:20080; # Spring Boot 포트
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 10M;
}
}
server {
listen 80;
server_name myproject.duckdns.org;
return 301 https://$host$request_uri;
}
적용 및 테스트:
sudo nginx -t
sudo systemctl restart nginx
Nginx와 겹치지 않게 Spring Boot 포트를 20080 등으로 변경합니다.
application.properties 또는 application.yml:
server.port=20080
Let's Encrypt 인증서는 90일짜리입니다. 자동 갱신을 위해 crontab에 추가:
sudo crontab -e
0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
브라우저에서 다음 주소로 접속:
https://myproject.duckdns.org
SSL 잠금 표시 🔒 가 뜨면 성공!
라즈베리파이에서도 충분히 HTTPS 서버를 구축할 수 있고, DuckDNS와 Let's Encrypt를 이용하면 완전 무료로 가능해요.
이 과정을 통해:
작은 프로젝트나 개인 서비스 운영에 딱입니다.