Tr_Code/NPM_SETUP.md

7.8 KiB

NPM (Nginx Proxy Manager) 설정 가이드

M1T 서버의 Tr_Code 애플리케이션을 외부에서 접근할 수 있도록 NPM을 설정하는 방법입니다.

📋 현재 서버 구조

외부 인터넷
    ↓
R3 공유기 1번 포트
    ↓
Proxmox 서버
    ↓
NPM 컨테이너 (:80, :443)
    ↓ 프록시 패스
M1T 서버 (192.168.0.180:80)
    ↓ nginx 리버스 프록시
    ↓ Unix Socket
Gunicorn (Tr_Code.sock)
    ↓
Flask App
    ↓ localhost:8000
Supabase (Docker)

M1T 서버 현재 설정

1. Gunicorn (WSGI 서버)

  • 방식: Unix Socket
  • 위치: /home/ckh08045/Tr_Code/Tr_Code.sock
  • Workers: 3개
  • 상태: 실행 중

2. nginx (리버스 프록시)

  • 포트: 80 (HTTP)
  • 설정: /etc/nginx/sites-enabled/tr_code
  • 소켓 연결: unix:/home/ckh08045/Tr_Code/Tr_Code.sock
  • 상태: 실행 중

3. 내부 IP

  • IP: 192.168.0.180
  • 포트: 80

🔧 NPM (Proxmox) 설정 방법

1. NPM 웹 인터페이스 접속

일반적으로 NPM은 다음 주소로 접속합니다:

http://proxmox-ip:81

기본 로그인:

  • Email: admin@example.com
  • Password: changeme (첫 로그인 후 변경)

2. Proxy Host 추가

DashboardHostsProxy HostsAdd Proxy Host

Details 탭

Domain Names: 
  - trcode.yourdomain.com
  (또는 원하는 도메인/서브도메인)

Scheme: http
Forward Hostname / IP: 192.168.0.180
Forward Port: 80

☐ Cache Assets
☑ Block Common Exploits
☑ Websockets Support (선택사항, 필요시 체크)

SSL 탭

SSL Certificate: 
  - Request a new SSL Certificate (Let's Encrypt)
  또는
  - 기존 인증서 선택

☑ Force SSL (권장)
☑ HTTP/2 Support (권장)
☑ HSTS Enabled (권장)
☑ HSTS Subdomains (선택사항)

이메일 입력:
  - your-email@example.com

☑ I Agree to the Let's Encrypt Terms of Service

Advanced 탭 (선택사항)

추가 nginx 설정이 필요한 경우:

# 클라이언트 업로드 크기 제한
client_max_body_size 10M;

# 타임아웃 설정 (필요시)
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

# 실제 클라이언트 IP 전달 (이미 기본 설정되어 있음)
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

3. 저장 및 확인

Save 버튼 클릭 → SSL 인증서 자동 발급 (Let's Encrypt 사용 시)

🌐 접속 방법

외부 접속 (인터넷에서)

https://trcode.yourdomain.com

내부 네트워크 접속

방법 1: M1T 서버 IP 직접 접근 (같은 네트워크)

http://192.168.0.180
  • 빠름 (라우터 거치지 않음)
  • SSL 없음 (내부망이므로 안전)
  • ⚠️ M1T와 같은 네트워크에서만 가능

방법 2: NPM을 통한 접근 (모든 내부망)

https://trcode.yourdomain.com
또는
http://npm-server-ip
  • 도메인 사용
  • SSL 적용
  • ⚠️ 약간의 오버헤드 (NPM 경유)

방법 3: hosts 파일 수정 (개발용)

내부 네트워크에서 도메인 이름으로 접근하려면:

Windows: C:\Windows\System32\drivers\etc\hosts Linux/Mac: /etc/hosts

192.168.0.180  trcode.yourdomain.com

그 후:

http://trcode.yourdomain.com

🔍 테스트

1. 내부 직접 접근 테스트

# M1T 서버에서
curl http://localhost/health

# 같은 네트워크 다른 컴퓨터에서
curl http://192.168.0.180/health

# 응답 예시
{"status":"ok"}

2. NPM을 통한 접근 테스트

# 외부/내부 어디서든
curl https://trcode.yourdomain.com/health

# 응답 예시
{"status":"ok"}

3. Supabase 연결 테스트

curl http://192.168.0.180/sb/health

# 응답 예시
{"sb":"ok","url":"http://localhost:8000"}

🛡️ 보안 설정 (권장)

1. 방화벽 설정 (M1T 서버)

외부에서 M1T 80 포트 직접 접근을 차단하고, NPM만 허용:

# ufw 방화벽 사용 시
sudo ufw status

# NPM IP만 허용 (예: 192.168.0.100)
sudo ufw allow from 192.168.0.100 to any port 80

# 또는 같은 서브넷 전체 허용
sudo ufw allow from 192.168.0.0/24 to any port 80

2. nginx 추가 보안 설정

/etc/nginx/sites-available/tr_code에 추가:

# 특정 IP만 허용 (선택사항)
# allow 192.168.0.0/24;
# deny all;

# 보안 헤더
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
# 적용
sudo systemctl reload nginx

📱 모바일/PWA 접속

Android/iOS 브라우저

https://trcode.yourdomain.com

PWA 설치 (홈 화면에 추가)

Android (Chrome):

  1. 사이트 접속
  2. 메뉴 (⋮) → "홈 화면에 추가"
  3. 이름 입력 → 추가

iOS (Safari):

  1. 사이트 접속
  2. 공유 버튼 (□↑) → "홈 화면에 추가"
  3. 이름 입력 → 추가

🔧 문제 해결

502 Bad Gateway (NPM에서)

# M1T에서 nginx 확인
sudo systemctl status nginx
curl http://localhost/health

# 방화벽 확인
sudo ufw status

503 Service Unavailable

# M1T에서 Tr_Code 서비스 확인
sudo systemctl status Tr_Code

# 재시작
sudo systemctl restart Tr_Code

SSL 인증서 발급 실패 (NPM)

  1. 도메인이 NPM IP를 가리키는지 확인

    nslookup trcode.yourdomain.com
    
  2. 80 포트가 열려있는지 확인

    • Let's Encrypt는 80 포트로 인증
  3. NPM 로그 확인

    • Dashboard → System → Logs

내부 IP 접근 안됨

# M1T에서 nginx 포트 확인
sudo netstat -tlnp | grep :80

# 방화벽 확인
sudo ufw status

# ping 테스트
ping 192.168.0.180

📊 성능 비교

접속 방법 속도 SSL 외부 접근 추천
내부 직접 (192.168.0.180) 가장 빠름 내부 개발/테스트
NPM 경유 (도메인) 🔥 빠름 운영 환경
localhost (M1T에서) 즉시 서버 직접 작업

🎯 권장 설정

개발/테스트 환경

내부 네트워크: http://192.168.0.180
M1T 서버: http://localhost

운영 환경

모든 접속: https://trcode.yourdomain.com (NPM 경유)

📝 NPM 추가 설정 예시

여러 서브도메인 설정

trcode.yourdomain.com     → 192.168.0.180:80 (Tr_Code)
supabase.yourdomain.com   → 192.168.0.180:8000 (Supabase)
api.yourdomain.com        → 192.168.0.180:3000 (다른 API)

각각 별도의 Proxy Host로 추가하면 됩니다.

로드 밸런싱 (미래 확장)

M1T 서버가 여러 대가 될 경우:

trcode.yourdomain.com → 
  - 192.168.0.180:80 (M1T-1)
  - 192.168.0.181:80 (M1T-2)
  - 192.168.0.182:80 (M1T-3)

NPM에서 자동 로드 밸런싱 지원합니다.

💡

1. 도메인이 없는 경우

무료 도메인 서비스 사용:

예: trcode.duckdns.org

2. 동적 IP 문제

가정용 인터넷은 IP가 변경될 수 있으므로:

  • DDNS (Dynamic DNS) 사용
  • Duck DNS, No-IP 등에서 자동 업데이트 클라이언트 제공

3. 포트 포워딩 (R3 공유기)

외부 접근을 위해 R3 공유기 설정:

외부 포트 80  → Proxmox IP:80
외부 포트 443 → Proxmox IP:443

🔗 관련 문서


작성일: 2025-10-13
M1T 서버 IP: 192.168.0.180
현재 포트: 80 (nginx) → Unix Socket (gunicorn)