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κ°μ§ νλͺ©λ§ μ¬λ°λ₯΄κ² μμ νλ©΄ μ€ν¬λ¦½νΈκ° μ μ μλν©λλ€! π―