🏥 Synology Reverse Proxy Setup — PT Medical System
SYNOLOGY DSM + UNIFI · v5.6

Synology Reverse Proxy
(Port-split approach)

ตั้งค่า NAS Synology + UniFi ให้เป็น HTTPS proxy สำหรับ CMSV6 GPS API

0ภาพรวม + เหตุผลที่ใช้ Port-split

ปัญหา: PT Medical System ทำงานบน HTTPS (GitHub Pages) แต่ CMSV6 API เป็น HTTP → ต้องมี HTTPS proxy คั่น

ข้อจำกัดของ infrastructure:

ทางออก: แยกโดย Port — ใช้ port อื่น (เช่น 8443) สำหรับ CMSV6 proxy

📱
Web App
(HTTPS)
🌐
UniFi
WAN :8443 Port Forward
🏠
Synology NAS
LAN :8443 Reverse Proxy
🚗
CMSV6 API
203.170.193.90:80

Port Assignment

URLเข้าที่ไหนส่งต่อไปไหน
https://staff.supwilai.com NAS :443 (Web Station) Portal (คงเดิม)
https://staff.supwilai.com:8443 NAS :8443 (Reverse Proxy ใหม่) http://203.170.193.90:80
ข้อดี:

1สรุปสิ่งที่ต้องทำ (5 ขั้น)

  1. UniFi — เพิ่ม Port Forward: WAN 8443<NAS LAN IP>:8443
  2. Synology DSM — สร้าง Reverse Proxy rule (source :8443 → dest CMSV6 HTTP :80)
  3. Assign cert staff.supwilai.com ให้ rule ใหม่
  4. เพิ่ม CORS headers ใน Custom Header tab
  5. ตั้งค่า webapp: Admin > Settings > GPS > Synology URL = https://staff.supwilai.com:8443

2UniFi — Port Forward

Step 2.1 — เปิด Port Forward rule
  1. เข้า UniFi Network Application
  2. SettingsFirewall & Security → tab Port Forwarding
  3. กด Create New Forward
Step 2.2 — กรอกค่า
ช่องค่า
NameCMSV6 Proxy (8443)
Forward RuleEnabled
InterfaceWAN (หรือชื่อ WAN ของคุณ)
FromAnywhere (หรือจำกัด IP source ก็ได้)
Port8443
Forward IP<LAN IP ของ Synology> — เช่น 192.168.1.10
Forward Port8443
ProtocolTCP
Logging☑️ Enable (แนะนำ — ดู log ได้ว่ามี traffic มั้ย)

Save + Apply → UniFi จะ provision firewall rule อัตโนมัติ

⚠️ LAN IP ของ NAS ต้อง fix! ถ้า NAS ใช้ DHCP แล้ว IP เปลี่ยน rule จะพัง — ให้ไปตั้ง UniFi → Clients → Synology → Fixed IP ก่อน

3Synology DSM — Reverse Proxy Rule

Step 3.1 — เปิด Reverse Proxy GUI
  1. DSM → Control Panel
  2. Login Portal → tab Advanced
  3. กด Reverse ProxyCreate
Step 3.2 — ตั้ง Source + Destination
ช่องค่า
▸ Source (ที่รับ request จาก browser)
DescriptionCMSV6 GPS Proxy
ProtocolHTTPS
Hostnamestaff.supwilai.com
Port8443สำคัญ
Enable HSTS☑️ ติ๊ก
Enable HTTP/2☑️ ติ๊ก
Access control profileNot configured
▸ Destination (ส่งต่อไปที่ CMSV6)
ProtocolHTTP
Hostname203.170.193.90
Port80

กด Save

4Assign SSL Certificate

Step 4.1 — แปะ cert staff.supwilai.com ให้ port 8443

DSM จะใช้ cert default ถ้าไม่ได้ assign explicit — ซึ่งปกติก็ใช้ได้ถ้า cert ของคุณคือ staff.supwilai.com (single domain) แต่ถ้าต้องการแน่ใจ:

  1. Control Panel → Security → tab Certificate
  2. เลือก cert staff.supwilai.com (ที่มีอยู่แล้ว)
  3. กด Settings (ปุ่มมุมขวาบน)
  4. หา service staff.supwilai.com:8443 (DSM จะเพิ่มเข้าให้อัตโนมัติหลังสร้าง Reverse Proxy)
  5. เลือก cert นี้ → OK
💡 ถ้า cert เป็น Let's Encrypt DSM จะ auto-renew ให้ — ไม่ต้องทำอะไรเพิ่ม

5Custom Headers (CORS)

Step 5.1 — เพิ่ม CORS headers
  1. เลือก Reverse Proxy rule ที่เพิ่งสร้าง → Edit
  2. ไป tab Custom Header
  3. กด CreateCORS
  4. DSM จะเพิ่ม CORS headers อัตโนมัติ — ติ๊ก ☑️ ทุกข้อ

หรือถ้าต้องการตั้งละเอียดเอง ให้ CreateCustom Header แล้วเพิ่มทีละรายการ:

Header NameValue
Access-Control-Allow-Origin*
Access-Control-Allow-MethodsGET, POST, OPTIONS
Access-Control-Allow-HeadersContent-Type, Accept, Authorization
Access-Control-Max-Age86400
ทำไม *? — รองรับ 2 โดเมน (supwilaimedical + officethegood) และ dev/preview environments ในอนาคต
ปลอดภัยไหม? CMSV6 ใช้ session token ใน URL อยู่แล้ว ไม่ใช่ cookie จาก origin → CORS ไม่ใช่เกราะป้องกันหลัก — Rate limit + IP allowlist ใน UniFi คือเกราะจริง

6ทดสอบ

Step 6.1 — ทดสอบจาก browser console

เปิด https://supwilaimedical.github.io/pt-medical-system/ → กด F12 → tab Console → รัน:

fetch('https://staff.supwilai.com:8443/StandardApiAction_login.action?account=supwilai&password=1234')
  .then(r => r.json())
  .then(d => console.log('✅ Synology proxy OK:', d))
  .catch(e => console.error('❌ Fail:', e));
Responseแก้ยังไง
{ result: 0, jsession: "..." }ใช้งานได้เลย — ไป Step 7
❌ CORS errorCustom Header ยังไม่ได้ตั้ง — ดู Step 5
net::ERR_CONNECTION_REFUSEDPort forward ไม่ทำงาน → เช็ค UniFi Step 2
net::ERR_CERT_*Cert ไม่ตรง → ดู Step 4
❌ 502 Bad GatewayNAS ไม่ถึง CMSV6 → SSH เข้า NAS แล้ว curl -v http://203.170.193.90/
net::ERR_TIMED_OUTFirewall WAN ปิด port 8443 → เช็ค ISP / router

7ตั้งค่าใน PT Medical System

  1. Login เป็น Admin
  2. ไป Admin Settings → tab ตั้งค่า
  3. เลื่อนลงมาที่ GPS Tracking → เปิดสวิตช์ เปิดใช้งาน GPS Tracking
  4. หัวข้อ Synology Reverse Proxy → กรอก:
    https://staff.supwilai.com:8443
  5. ระบบจะ auto-save → probe สถานะทันที → แถบ Synology (1°) เปลี่ยนเป็น ✓ ทำงานปกติ
  6. ลองเปิด GPS page → ดู Network tab (F12) ว่า request ไปที่ staff.supwilai.com:8443 (ไม่ใช่ Render)
✅ Fallback อัตโนมัติ ถ้า Synology down/timeout ระบบจะใช้ RenderGAS ต่ออัตโนมัติ (ผู้ใช้ไม่รู้สึก)
ดูสถานะแบบ real-time ได้ที่ Admin > ตั้งค่า > GPS Tracking > Proxy Status

8How it works (ภายใน)

ดู shared/gps-providers.js → function gpsFetch()

Request transformation

// URL ที่ app สร้าง (จาก provider.base_url ในฐานข้อมูล):
http://203.170.193.90/StandardApiAction_login.action?account=xxx&password=xxx

// gpsFetch() ทำการ:
// 1. Strip scheme+host: http://203.170.193.90
// 2. Prepend Synology URL: https://staff.supwilai.com:8443
// 3. Final:
https://staff.supwilai.com:8443/StandardApiAction_login.action?account=xxx&password=xxx

// DSM Reverse Proxy รับแล้วส่งต่อ:
// http://203.170.193.90:80/StandardApiAction_login.action?account=xxx&password=xxx
// → CMSV6 ตอบ JSON → Synology ส่งกลับ → app อ่าน

Fallback chain

Tier 1 (Primary):  Synology (path-rewrite, 5s timeout)
       ↓ timeout/error/non-OK HTTP
Tier 2 (Secondary): Render (?url=... query-param, 5s timeout)
       ↓ timeout/error
Tier 3 (Last):      GAS (?url=... query-param, no timeout)

9Security แนะนำ

10Monitoring + Troubleshooting

ตรวจสถานะ Synology Proxy ได้ 2 ที่:

Common issues

อาการสาเหตุ + แก้
Synology (1°) ขึ้น ✗ Unreachable UniFi port forward ไม่ทำงาน หรือ NAS :8443 ปิด → SSH เข้า NAS แล้ว netstat -tln | grep 8443
Synology (1°) ขึ้น ✗ HTTP 502 NAS ออก internet ไปหา CMSV6 ไม่ได้ → เช็ค WAN firewall ของ NAS
Synology (1°) ขึ้น ✗ HTTP 400 Request ไปถึง CMSV6 แต่ response ไม่ใช่ 200 (อาจ account/password ผิด) — ปกติทดสอบใช้ supwilai / 1234
Network tab ยังยิงไป Render อยู่ ยังไม่ได้ save Synology URL หรือยังไม่ refresh page → F5 GPS page 1 รอบ
ทำงานเฉพาะ PC แต่ไม่ได้บนมือถือ มือถือเชื่อม WiFi ในบ้านที่ block CMSV6 → ทดสอบ 4G/5G แทน
📞 ต้องการความช่วยเหลือเพิ่ม?
ดู architecture overview ใน README-ITSupport.html หรือตรวจ proxy chain code ใน shared/gps-providers.js (function gpsFetch)