Moving from Synology Reverse Proxy to Nginx Proxy Manager
๐ ๊ฐ์
๊ธฐ์กด์ ์๋๋ก์ง NAS์ ๋ด์ฅ ์ญ๋ฐฉํฅ ํ๋ก์์ Let's Encrypt ์ธ์ฆ์๋ก ์ด์ํ๋ ์๋น์ค๋ค์ ๋ณ๋์ NPM(Nginx Proxy Manager)์ผ๋ก ํตํฉ ๊ด๋ฆฌํ๋ ๊ณผ์ ์ ๊ธฐ๋กํ์ต๋๋ค.
๐๏ธ ๊ธฐ์กด ํ๊ฒฝ
- NAS1 (192.168.1.13): ์๋๋ก์ง ๋ฉ์ธ ์๋ฒ
- Let's Encrypt SSL ์ธ์ฆ์ ๊ด๋ฆฌ
- ์๋๋ก์ง ๋ด์ฅ ์ญ๋ฐฉํฅ ํ๋ก์๋ก ์๋ธ๋๋ฉ์ธ ๊ด๋ฆฌ
- ๊ณต์ ๊ธฐ ํฌํธํฌ์๋ฉ: 80/443 โ NAS1
- NAS2 (192.168.1.158): ์๋ก์ด NPM ์ ์ฉ ์๋ฒ
๐ฏ ๋ชฉํ ํ๊ฒฝ
- NAS1: ๋ด๋ถ ์๋น์ค๋ง ๋ด๋น
- NAS2: NPM์ผ๋ก ๋ชจ๋ ์ธ๋ถ ํธ๋ํฝ ์ฒ๋ฆฌ ๋ฐ SSL ๊ด๋ฆฌ
์์ผ๋์นด๋ * ์ฌ์ฉํ์ ๋ค๋ฉด ๊ผญ ์๋ ํ์ ์ค์ ์ ํ์ธ์.
๐ ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์
1๋จ๊ณ: ๊ธฐ์กด ์ค์ ๋ฐฑ์
NAS1์์ ๋ฐฑ์ ํ ์ ๋ณด:
- ๊ธฐ์กด ์ญ๋ฐฉํฅ ํ๋ก์ ๊ท์น ์ ์ฒด ๋ชฉ๋ก
- ๊ฐ ์๋ธ๋๋ฉ์ธ๋ณ ์ฐ๊ฒฐ ์ ๋ณด (ํฌํธ, ์๋น์ค)
- Let's Encrypt ์ธ์ฆ์ ๋ชฉ๋ก
2๋จ๊ณ: NPM ์ค์น ๋ฐ ์ค์
Portainer Stack์ ์ด์ฉํ NPM ์ค์น:
version: "3.8"
services:
npm:
container_name: npm
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '380:80' # HTTP (๊ธฐ๋ณธ 80์์ ๋ณ๊ฒฝ)
- '3443:443' # HTTPS (๊ธฐ๋ณธ 443์์ ๋ณ๊ฒฝ)
- '381:81' # ๊ด๋ฆฌ ํ์ด์ง
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "npm"
DISABLE_IPV6: 'true'
volumes:
- /volume1/docker/npm/data:/data
- /volume1/docker/npm/letsencrypt:/etc/letsencrypt
depends_on:
- db
networks:
- npm-network
db:
container_name: npm-db
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
TZ: 'Asia/Seoul'
volumes:
- /volume1/docker/npm/db:/var/lib/mysql
networks:
- npm-network
networks:
npm-network:
driver: bridge
ํฌํธ ๋ณ๊ฒฝ ์ด์ :
- ์๋๋ก์ง ์น ์๋ฒ์ ํฌํธ ์ถฉ๋ ๋ฐฉ์ง
- 380/3443 ํฌํธ๋ก ๋ณ๊ฒฝํ์ฌ ์์ ์ฑ ํ๋ณด
3๋จ๊ณ: Cloudflare API๋ฅผ ์ด์ฉํ ์์ผ๋์นด๋ SSL ์ธ์ฆ์ ๋ฐ๊ธ
Cloudflare API ํ ํฐ ์์ฑ:
- Zone:Zone:Read + Zone:DNS:Edit ๊ถํ
- ํด๋น ๋๋ฉ์ธ์๋ง ์ ํ
DNS์ ์ฌ์ฉํ์ง ์๋ cname๋ ์ฝ๋๋ ์ ๋ถ ์ง์ด๋ค.
NPM์์ ์์ผ๋์นด๋ ์ธ์ฆ์ ๋ฐ๊ธ:
- Domain:
*.abc.com, abc.com - DNS Challenge: Cloudflare
- API ํ ํฐ ์ ๋ ฅ์ผ๋ก ์๋ ์ธ์ฆ
4๋จ๊ณ: ๊ณต์ ๊ธฐ ํฌํธํฌ์๋ฉ ๋ณ๊ฒฝ
๊ธฐ์กด: ์ธ๋ถ 80 โ 192.168.1.13:80 ์ธ๋ถ 443 โ 192.168.1.13:443
๋ณ๊ฒฝ ํ: ์ธ๋ถ 80 โ 192.168.1.158:380 ์ธ๋ถ 443 โ 192.168.1.158:3443
5๋จ๊ณ: SSL ๋ฆฌ๋ค์ด๋ ์ ๋ฃจํ ๋ฌธ์ ํด๊ฒฐ
๋ฌธ์ ์ :
- Cloudflare ํ๋ก์(๐ )์ NPM Force SSL์ด ๋์์ ์๋ํ๋ฉด ๋ฌดํ ๋ฆฌ๋ค์ด๋ ์ ๋ฐ์
ํด๊ฒฐ๋ฐฉ๋ฒ:
- Cloudflare DNS ๋ ์ฝ๋๋ฅผ ๋ชจ๋ DNS๋ง(๐) ์ค์ ์ผ๋ก ๋ณ๊ฒฝ
- NPM์์ Force SSL ํ์ฑํํ์ฌ SSL ๋ฆฌ๋ค์ด๋ ์ ์ฒ๋ฆฌ
6๋จ๊ณ: ๊ธฐ์กด ํ๊ฒฝ ์ ๋ฆฌ
NAS1์์ ์ ๊ฑฐํ ํญ๋ชฉ:
- Let's Encrypt ์ธ์ฆ์ ์ญ์
- ๋ชจ๋ ์ญ๋ฐฉํฅ ํ๋ก์ ๊ท์น ์ญ์
- ์๋๋ก์ง ๊ธฐ๋ณธ ์ธ์ฆ์๋ก ์ฌ๋ฐ๊ธ (๋ด๋ถ ์ ์์ฉ)
โ๏ธ ์๋น์ค๋ณ NPM ์ค์ ๊ถ์ฅ์ฌํญ
NAS1 (192.168.1.13) ์๋น์ค
| ์๋น์ค | Cache Assets | Block Common Exploits | WebSocket Support | ๋น๊ณ |
|---|---|---|---|---|
| Nextcloud | โ | โ | โ | ํ์ผ ๋๊ธฐํ + ์ค์๊ฐ ์๋ฆผ |
| Memos | โ | โ | โ | ๋ ธํธ ์ฑ, ์ค์๊ฐ ๋๊ธฐํ |
| Transmission | โ | โ | โ | ํ ๋ ํธ ์นUI, API ํธ์ถ ๋ง์ |
| Vaultwarden | โ | โ | โ | ๋ณด์ ์ค์, ์บ์ฑ ์ํ |
| Watchtower | โ | โ | โ | ์ปจํ ์ด๋ ์๋ ์ ๋ฐ์ดํธ ๋๊ตฌ |
์๋๋ก์ง ๋ด์ฅ ์๋น์ค
| ์๋น์ค | Cache Assets | Block Common Exploits | WebSocket Support | ๋น๊ณ |
|---|---|---|---|---|
| Synology Drive | โ | โ | โ | ํ์ผ ๋๊ธฐํ, API ํธ์ถ ๋ง์ |
| Synology Chat | โ | โ | โ | ์ค์๊ฐ ๋ฉ์์ง, ์บ์ฑ ์ํ |
| Synology Mail | โ | โ | โ | ์ด๋ฉ์ผ ๋ณด์ ์ค์ |
| Synology Photos | โ | โ | โ | ์ด๋ฏธ์ง ์ธ๋ค์ผ ์บ์ฑ ํจ๊ณผ์ |
| WebDAV | โ | โ | โ | ํ์ผ ๋ฌด๊ฒฐ์ฑ ์ฐ์ |
| ์๋๋ก์ง DSM | โ | โ | โ | ๊ด๋ฆฌ ์ธํฐํ์ด์ค |
NAS2 (192.168.1.158) ์๋น์ค
| ์๋น์ค | Cache Assets | Block Common Exploits | WebSocket Support | ๋น๊ณ |
|---|---|---|---|---|
| ์๋๋ก์ง DSM | โ | โ | โ | ๊ด๋ฆฌ ์ธํฐํ์ด์ค |
| Jellyfin | โ | โ | โ | ๋ฏธ๋์ด ์คํธ๋ฆฌ๋ฐ |
| Kavita | โ | โ | โ | ๋งํ/์ฑ ๋ฆฌ๋ |
| MinIO | โ | โ | โ | S3 ํธํ ์คํ ๋ฆฌ์ง |
| PicoShare | โ | โ | โ | ํ์ผ ๊ณต์ ์๋น์ค |
| Calibre-web | โ | โ | โ | ์ ์์ฑ ๊ด๋ฆฌ |
| Uptime Kuma | โ | โ | โ | ์๋น์ค ๋ชจ๋ํฐ๋ง |
| Outline | โ | โ | โ | ํ ์ํค/๋ฌธ์ |
| Mazanoke | โ | โ | โ | ๋งํ ๊ด๋ฆฌ ๋๊ตฌ |
๐ ๋ง์ด๊ทธ๋ ์ด์ ์๋ฃ ํ ์ฅ์
ํตํฉ ๊ด๋ฆฌ
- ๋ชจ๋ SSL ์ธ์ฆ์๋ฅผ NPM์์ ์ค์ ๊ด๋ฆฌ
- ์์ผ๋์นด๋ ์ธ์ฆ์๋ก ์ ์๋ธ๋๋ฉ์ธ ์ถ๊ฐ ์ ์ธ์ฆ์ ์ฌ๋ฐ๊ธ ๋ถํ์
๊ณ ๊ธ ๊ธฐ๋ฅ
- ๋ ๋ง์ ํ๋ก์ ์ค์ ์ต์
- ์ค์๊ฐ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง
- ๋ ๋์ ์น ์ธํฐํ์ด์ค
์์ ์ฑ
- ์๋๋ก์ง ์ ๋ฐ์ดํธ์ ๋ฌด๊ดํ๊ฒ ๋ ๋ฆฝ์ ์ด์
- ํฌํธ ์ถฉ๋ ์๋ ์์ ์ ์ธ ์๋น์ค
๐ง ๋ฌธ์ ํด๊ฒฐ
NPM ์ปจํ ์ด๋ ์ํ๊ฐ "inactive"๋ก ํ์๋๋ ๊ฒฝ์ฐ
# ์ค์ ์ํ ํ์ธ
docker ps -a
# ๋ก๊ทธ ํ์ธ
docker-compose logs -f npm
# ์ฌ์์
docker-compose restart npm
SSL ์ธ์ฆ์ ์๋ ๊ฐฑ์ ํ์ธ
- NPM ๊ด๋ฆฌ ํ์ด์ง์์ ์ธ์ฆ์ ๋ง๋ฃ์ผ ํ์ธ
- 90์ผ๋ง๋ค ์๋ ๊ฐฑ์ ๋๋ฏ๋ก ๋ณ๋ ๊ด๋ฆฌ ๋ถํ์
๐ ๊ฒฐ๋ก
๊ธฐ์กด ์๋๋ก์ง ๋ด์ฅ ๊ธฐ๋ฅ์์ NPM์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํจ์ผ๋ก์จ ๋ ์ ๋ฌธ์ ์ด๊ณ ์์ ์ ์ธ ๋ฆฌ๋ฒ์ค ํ๋ก์ ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์์์ต๋๋ค. ํนํ ์์ผ๋์นด๋ SSL ์ธ์ฆ์๋ฅผ ํตํ ํตํฉ ๊ด๋ฆฌ์ Cloudflare์์ ์ํํ ์ฐ๋์ด ํฐ ์ฅ์ ์ผ๋ก ์์ฉํ์ต๋๋ค.
์ฐธ๊ณ : ์ด ๊ฐ์ด๋๋ ์ค์ ๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์์ฑ๋์์ผ๋ฉฐ, ํ๊ฒฝ์ ๋ฐ๋ผ ์ธ๋ถ ์ค์ ์ด ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
์ถ๊ฐ ํ์ ์ค์
๋ง์ผ!! ์์ผ๋์นด๋๊ฐ cloudflare dns์ ๋ฑ๋ก ๋์ด์๋ค๋ฉด,
๊ผญ ์๋ ์ค์ ํ์ธ์. ์๋ ์ค์ ์ํ๋ฉด,
๋๋ค์๋ธ๋๋ฉ์ธ.๋๋ฉ์ธ ์ผ๋ก ์ ์ํ๋ฉด npm ํ์ํ์ด์ง๋ก ๊ฐ๋ฒ๋ฆฝ๋๋ค
์กฐ์ฌํ์ธ์!!

NPM SSL ๋ชจ๋ํฐ๋ง ์คํฌ๋ฆฝํธ ์ค์ ๊ฐ์ด๋
ํ ๋ ๊ทธ๋จ์ผ๋ก NPM์ ์ํฉ์ ์ ๋ฌ๋ฐ์ ์ ์์ต๋๋ค.
์์ถํ์ผ์ ํ๊ณ , sh ํ์ผ์ ์ด๋ฉด ์๋์ ์ฌ์ฉ์ ์์ ํ์ ํญ๋ชฉ์ ์์ ํด์ผํฉ๋๋ค.
๐ง ์ฌ์ฉ์ ์์ ํ์ ํญ๋ชฉ
1. ํ ๋ ๊ทธ๋จ ์ค์ (ํ์ โญโญโญ)
# ๋ผ์ธ 7-8: ๋ณธ์ธ์ ํ
๋ ๊ทธ๋จ ์ ๋ณด๋ก ๋ณ๊ฒฝ
TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN_HERE" # โ ์ค์ ๋ด ํ ํฐ์ผ๋ก ๋ณ๊ฒฝ
TELEGRAM_CHAT_ID="YOUR_CHAT_ID_HERE" # โ ์ค์ ์ฑ ID๋ก ๋ณ๊ฒฝ
2. NPM ์ปจํ ์ด๋ ์ด๋ฆ (ํ๊ฒฝ์ ๋ฐ๋ผ)
# ๋ผ์ธ 11: NPM ์ปจํ
์ด๋ ์ด๋ฆ ํ์ธ/๋ณ๊ฒฝ
NPM_CONTAINER="npm" # โ docker ps๋ก ํ์ธ ํ ๋ณ๊ฒฝ
3. ํธ์คํธ ๊ฒฝ๋ก (ํ์ โญโญโญ)
# ๋ผ์ธ 46: Let's Encrypt ๋ง์ดํธ ๊ฒฝ๋ก ํ์ธ/๋ณ๊ฒฝ
local host_letsencrypt_path="/volume1/docker/npm/letsencrypt" # โ ์ค์ ๊ฒฝ๋ก๋ก ๋ณ๊ฒฝ
4. ์๋ฒ ์ ๋ณด (์ ํ์ฌํญ)
# ๋ผ์ธ 102, 147, 195, 233: IP ์ฃผ์ ๋ณ๊ฒฝ
message+="๐ <b>์๋ฒ</b>: NPM (192.168.1.158)" # โ ์ค์ NPM ์๋ฒ IP๋ก ๋ณ๊ฒฝ
๐ ํ์ธ ๋ฐฉ๋ฒ
ํ ๋ ๊ทธ๋จ ์ ๋ณด ํ์ธ
1. ํ ๋ ๊ทธ๋จ ๋ด ์์ฑ ๋ฐ Chat ID ํ์ธ
์ฌ๋ฌ ๋ธ๋ก๊ทธ์์ ์๊ฐ ๋๊ฒ์ด ๋ง์ด ์์ต๋๋ค. ์๋๋ฉด ๊ธฐ์กด ์์ ํ๊ฒ์ ํ์ฉํด๋๋ฉ๋๋ค.
Docker ์ ๋ณด ํ์ธ
# NPM ์ปจํ
์ด๋ ์ด๋ฆ ํ์ธ
docker ps | grep nginx-proxy-manager
# ๋ง์ดํธ ๊ฒฝ๋ก ํ์ธ
docker inspect npm | grep -A5 -B5 letsencrypt
๊ฒฝ๋ก ํ์ธ
# Let's Encrypt ์ธ์ฆ์ ํ์ผ ์กด์ฌ ํ์ธ
ls -la /volume1/docker/npm/letsencrypt/archive/npm-*/
# ์ค์ ๊ฒฝ๋ก ๊ตฌ์กฐ ํ์ธ
find /volume1/docker/npm/letsencrypt -name "*.pem" -type f
โ ๏ธ ์ฃผ์์ฌํญ
- ํ์ ํญ๋ชฉ์ ์์ ํ์ง ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์๋ํ์ง ์์ต๋๋ค
- ๊ฒฝ๋ก๊ฐ ํ๋ฆฌ๋ฉด "์ธ์ฆ์ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค" ์๋ฌ ๋ฐ์
- ์ปจํ ์ด๋ ์ด๋ฆ์ด ํ๋ฆฌ๋ฉด ์๋ ๊ฐฑ์ ๊ธฐ๋ฅ์ด ์๋ํ์ง ์์ต๋๋ค
- ํ ๋ ๊ทธ๋จ ์ ๋ณด๊ฐ ํ๋ฆฌ๋ฉด ๋ฉ์์ง ์ ์ก ์คํจ
๐งช ์ค์ ์๋ฃ ํ ํ ์คํธ
1. ๊ถํ ์ค์
chmod 700 npm_ssl_telegram_monitor.sh
755๋ฅผ ๊ถํ์ ํ์ฌ๋ ์๊ด์์ต๋๋ค.
2. ํ ์คํธ ์คํ
# ์ธ์ฆ์ ์ํ ํ์ธ ๋ฐ ์ ์ก
./npm_ssl_telegram_monitor.sh -s
# ์๋ ๊ฐฑ์ ์๋ (์ฃผ์: ์ค์ ๊ฐฑ์ ์คํ๋จ)
./npm_ssl_telegram_monitor.sh -r
# ์ฌ์ฉ๋ฒ ํ์ธ
./npm_ssl_telegram_monitor.sh -h
๐ฑ ์ ์ ์๋ ์ ํ ๋ ๊ทธ๋จ ๋ฉ์์ง ์์
๐ NPM SSL ์ธ์ฆ์ ์ํ ๋ณด๊ณ
๐
ํ์ธ ์๊ฐ: 2025-06-17 15:30:00
๐ ์๋ฒ: NPM (192.168.1.158)
๐ ์ธ์ฆ์: npm-1 (v2)
๐ ๋๋ฉ์ธ: *.example.com
โ ์์ผ๋์นด๋ ํฌํจ 2๊ฐ ๋๋ฉ์ธ
๐
๋ง๋ฃ์ผ: 2025-09-14 23:54
โฐ ๋จ์ ์ผ์: โ
89์ผ (์์ )
๐ ๊ฐฑ์ ์๊ธฐ: 59์ผ ํ
๐ ํ์ผ: fullchain2.pem
๐ก ์ฐธ๊ณ : ๋ง๋ฃ 30์ผ ์ ๋ถํฐ ์๋ ๊ฐฑ์ ๋ฉ๋๋ค.
๐ ์๋ ์คํ ์ค์ (์ ํ์ฌํญ)
Cron ์ค์ ๋ณด๋ค๋ ์๋๋ก์ง ์์ ์ค์ผ์ค์์ root ์์ ์ ๋ง๋์ธ์



๐จ ๋ฌธ์ ํด๊ฒฐ
์ผ๋ฐ์ ์ธ ์ค๋ฅ์ ํด๊ฒฐ์ฑ
- "์ธ์ฆ์ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค"
- ๊ฒฝ๋ก ํ์ธ:
ls -la /volume1/docker/npm/letsencrypt/ - Docker ๋ง์ดํธ ํ์ธ:
docker inspect npm - ํ ๋ ๊ทธ๋จ ์ ์ก ์คํจ
- ๋ด ํ ํฐ ์ฌํ์ธ
- Chat ID ์ฌํ์ธ
- ๋คํธ์ํฌ ์ฐ๊ฒฐ ํ์ธ
- ๊ถํ ์ค๋ฅ
- ์คํฌ๋ฆฝํธ ๊ถํ:
chmod 700 npm_ssl_telegram_monitor.sh - ํ์ผ ์์ ๊ถ ํ์ธ
์ด 4๊ฐ์ง ํญ๋ชฉ๋ง ์ฌ๋ฐ๋ฅด๊ฒ ์์ ํ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์ ์ ์๋ํฉ๋๋ค! ๐ฏ