9.0 KiB
9.0 KiB
Nginx Proxy Manager - Setup Guide
คู่มือการตั้งค่า Nginx Proxy Manager สำหรับ Sriphat Data Platform
📋 ข้อมูล Services
| Service | Subpath | Container Name | Port | Status |
|---|---|---|---|---|
| API Service | /apiservice |
apiservice | 8000 | ✅ Active |
| Supabase Studio | /supabase |
sdp-studio | 3000 | ✅ Active |
| Supabase API | /supabase-api |
sdp-kong | 8000 | ✅ Active |
| Keycloak | /keycloak |
keycloak | 8080 | ✅ Active |
| Superset | /superset |
superset | 8088 | ✅ Active |
| Airflow | /airflow |
airflow-webserver | 8080 | ⚠️ Optional |
| DBT Docs | /dbt |
dbt-docs | 8080 | ⚠️ Optional |
🚀 Quick Start
1. เข้า Nginx Proxy Manager
URL: http://192.168.100.9:8021
Default Login:
Email: admin@example.com
Password: changeme
⚠️ เปลี่ยน password ทันทีหลัง login ครั้งแรก!
2. สร้าง Proxy Host
- คลิก Proxy Hosts → Add Proxy Host
- กรอกข้อมูล:
Tab: Details
Domain Names: ai.sriphat.com
Scheme: http
Forward Hostname/IP: localhost
Forward Port: 80
Tab: Advanced
- Copy config จาก
complete-example.confทั้งหมด - Paste ลงใน Custom Nginx Configuration
- กด Save
3. ตั้งค่า SSL (Production)
Tab: SSL
☑ Request a new SSL Certificate with Let's Encrypt
☑ Force SSL
☑ HTTP/2 Support
☑ HSTS Enabled
Email: your-email@example.com
กด Save
📝 การใช้งานแบบละเอียด
วิธีที่ 1: ใช้ Complete Config (แนะนำ)
ข้อดี:
- ตั้งค่าครั้งเดียว ได้ทุก service
- ง่ายต่อการจัดการ
- Consistent configuration
ขั้นตอน:
- สร้าง Proxy Host ตาม Quick Start
- Copy
complete-example.confไปวางใน Advanced tab - Save
วิธีที่ 2: แยก Config แต่ละ Service
ข้อดี:
- ควบคุมแต่ละ service ได้อิสระ
- ง่ายต่อการ debug
- สามารถตั้งค่า SSL แยกกันได้
ขั้นตอน:
API Service
Domain: api.sriphat.com
Forward: apiservice:8000
Advanced: ใช้ config จาก apiservice.conf
Supabase Studio
Domain: supabase.sriphat.com
Forward: sdp-studio:3000
Advanced: ใช้ config จาก supabase-studio.conf
Keycloak
Domain: auth.sriphat.com
Forward: keycloak:8080
Advanced: ใช้ config จาก keycloak.conf
Superset
Domain: bi.sriphat.com
Forward: superset:8088
Advanced: ใช้ config จาก superset.conf
🔧 Configuration Details
API Service (/apiservice)
สิ่งสำคัญ:
proxy_set_header X-Script-Name /apiservice;
proxy_cookie_path / /apiservice/;
ทำไม:
- FastAPI ต้องรู้ว่าทำงานภายใต้ subpath
- Session cookies ต้อง scope ถูกต้อง
Keycloak (/keycloak)
สิ่งสำคัญ:
proxy_set_header X-Forwarded-Prefix /keycloak;
proxy_cookie_path / /keycloak/;
ทำไม:
- Keycloak ใช้ X-Forwarded-Prefix สำหรับ redirect URLs
- Authentication flow ต้องการ cookie path ที่ถูกต้อง
Supabase Studio (/supabase)
สิ่งสำคัญ:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
ทำไม:
- Supabase Studio ใช้ WebSocket สำหรับ real-time features
- ต้อง support HTTP/1.1 upgrade
Superset (/superset)
สิ่งสำคัญ:
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
ทำไม:
- Dashboard queries อาจใช้เวลานาน
- ต้องการ timeout ที่สูงกว่าปกติ
🐛 Troubleshooting
502 Bad Gateway
สาเหตุ:
- Backend service ไม่ทำงาน
- Network configuration ผิด
วิธีแก้:
# ตรวจสอบ service
docker ps | grep <service-name>
# ตรวจสอบ network
docker network inspect shared_data_network
# ดู logs
docker logs <service-name>
docker logs nginx-proxy-manager
404 Not Found
สาเหตุ:
- Path rewriting ไม่ถูกต้อง
- Backend ไม่ support subpath
วิธีแก้:
# ตรวจสอบ rewrite rule
rewrite ^/apiservice(/.*)$ $1 break;
# ดู nginx logs
docker exec nginx-proxy-manager tail -f /data/logs/proxy-host-*.log
Redirect Loop
สาเหตุ:
- Cookie path ไม่ถูกต้อง
- X-Forwarded-* headers ขาดหาย
วิธีแก้:
# เพิ่ม headers
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
# ตั้งค่า cookie path
proxy_cookie_path / /apiservice/;
WebSocket Connection Failed
สาเหตุ:
- ไม่มี WebSocket headers
- HTTP version ไม่ถูกต้อง
วิธีแก้:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Session Lost After Refresh
สาเหตุ:
- Cookie path ไม่ match กับ URL path
- SameSite cookie policy
วิธีแก้:
proxy_cookie_path / /apiservice/;
proxy_cookie_flags ~ secure samesite=lax;
🔐 Security Best Practices
1. เปลี่ยน Default Password
Settings → Users → Edit admin user
2. ใช้ HTTPS ใน Production
SSL Tab → Request a new SSL Certificate
☑ Force SSL
☑ HSTS Enabled
3. ตั้งค่า Access Lists
Access Lists → Add Access List
- Whitelist IP addresses
- Basic authentication
- Apply to sensitive services (Keycloak Admin, Superset)
4. Enable Rate Limiting
# ใน Custom Nginx Configuration
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_req zone=api_limit burst=20 nodelay;
5. Hide Nginx Version
# ใน Custom Nginx Configuration
server_tokens off;
📊 Monitoring
ดู Logs
ใน Nginx Proxy Manager UI:
Proxy Hosts → Click on host → Logs tab
ใน Docker:
# Nginx Proxy Manager logs
docker logs nginx-proxy-manager -f
# Access logs
docker exec nginx-proxy-manager tail -f /data/logs/proxy-host-*.log
# Error logs
docker exec nginx-proxy-manager tail -f /data/logs/error.log
Health Checks
# ตรวจสอบ Nginx Proxy Manager
curl http://192.168.100.9:8021
# ตรวจสอบ services ผ่าน proxy
curl http://ai.sriphat.com/apiservice/docs
curl http://ai.sriphat.com/supabase
curl http://ai.sriphat.com/keycloak
🔄 Backup & Restore
Backup Configuration
# Backup Nginx Proxy Manager data
cd /path/to/01-infra
tar -czf npm-backup-$(date +%Y%m%d).tar.gz data/
# Backup specific configs
docker exec nginx-proxy-manager tar -czf /tmp/configs.tar.gz /data/nginx
docker cp nginx-proxy-manager:/tmp/configs.tar.gz ./npm-configs-backup.tar.gz
Restore Configuration
# Stop Nginx Proxy Manager
docker compose down
# Restore data
tar -xzf npm-backup-YYYYMMDD.tar.gz
# Start Nginx Proxy Manager
docker compose up -d
📚 Additional Resources
💡 Tips & Tricks
1. Test Config Before Applying
# Test nginx config
docker exec nginx-proxy-manager nginx -t
2. Reload Without Restart
# Reload nginx (no downtime)
docker exec nginx-proxy-manager nginx -s reload
3. View Current Config
# View active nginx config
docker exec nginx-proxy-manager cat /etc/nginx/nginx.conf
4. Debug Mode
# เพิ่มใน Custom Nginx Configuration
error_log /data/logs/error.log debug;
5. Custom Error Pages
# เพิ่มใน Custom Nginx Configuration
error_page 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
🎯 Production Checklist
- เปลี่ยน default admin password
- ตั้งค่า SSL certificate (Let's Encrypt)
- Enable Force SSL
- Enable HSTS
- ตั้งค่า Access Lists สำหรับ admin panels
- Enable rate limiting
- Hide server tokens
- ตั้งค่า backup schedule
- Test all services ผ่าน proxy
- Monitor logs สำหรับ errors
- Document custom configurations