외부 도메인 요청을 내부 컨테이너로 넘기고 Let's Encrypt 인증서를 자동 갱신한다.
http://192.168.0.240:81818080 · HTTPS 8443nginx-proxy-manager-db (MariaDB)Domain: <서브도메인>.jjang.synology.me
Scheme: http ← https 로 두면 502
Forward Hostname / IP: 192.168.0.240 ← localhost 금지
Forward Port: <서비스 포트>
Websockets Support: ON
Block Common Exploits: ON
SSL: Let's Encrypt + Force SSL
⚠️ Forward Hostname 에 localhost 를 넣으면 안 된다.
NPM 컨테이너 자기 자신을 가리켜 무조건 502 가 난다.
업로드 크기 제한 (Paperless 스캔 PDF, Immich 동영상 등)
client_max_body_size 100M;
특정 경로 차단 (Vaultwarden 관리 페이지 등)
location /admin {
return 404;
}
실제 접속자 IP 전달 — 없으면 백엔드가 모든 요청을 NPM IP 로 인식한다
proxy_set_header X-Real-IP $remote_addr;
NPM 은 기본 설정에 이미 넣어주므로 보통 불필요하다.
백엔드 로그에 172.x.x.x 만 찍힐 때만 추가한다.
정적 파일(css/js/이미지)을 NPM 이 30분, 브라우저가 30일 캐싱한다.
이 홈랩에서는 끄는 것을 권한다.
백엔드가 DB 주소를 172.19.0.2 로 고정해 두었는데, DB 컨테이너 재시작으로 IP 가 바뀌어
5일간 관리 화면이 죽어 있었다. 프록시는 정상 동작해서 며칠 몰랐다.
DB_MYSQL_HOST: nginx-proxy-manager-db ← 컨테이너 이름
전말 → 트러블슈팅 기록
백엔드가 DB 연결에 실패하면 재시도를 포기하고 그대로 죽어 있는다.
sudo /usr/local/bin/docker restart nginx-proxy-manager-db
sudo /usr/local/bin/docker logs --tail 30 nginx-proxy-manager-db # ready for connections 확인
sudo /usr/local/bin/docker restart nginx-proxy-manager
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8181/api/ # 200 이면 복구
NPM 재시작 중 15초 정도 모든 도메인 접속이 끊긴다. 가족이 Jellyfin 보는 중이 아닐 때 한다.
Uptime Kuma → http://192.168.0.240:8181/api/
/ 는 백엔드가 죽어도 200 을 돌려주므로 장애를 놓친다.
nginx-proxy-manager 와 nginx-proxy-manager-db 를 모두 Watchtower 제외 목록에 넣는다.