ปัญหา: PT Medical System ทำงานบน HTTPS (GitHub Pages) แต่ CMSV6 API เป็น HTTP → ต้องมี HTTPS proxy คั่น
ข้อจำกัดของ infrastructure:
/cmsv6/ ไม่ได้staff.supwilai.com เท่านั้น)staff.supwilai.com:443 ใช้กับ Web Station portal อยู่แล้ว ย้ายไม่ได้ทางออก: แยกโดย Port — ใช้ port อื่น (เช่น 8443) สำหรับ CMSV6 proxy
| 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 |
staff.supwilai.com เดิมได้ทันที)WAN 8443 → <NAS LAN IP>:8443staff.supwilai.com ให้ rule ใหม่https://staff.supwilai.com:8443| ช่อง | ค่า |
|---|---|
| Name | CMSV6 Proxy (8443) |
| Forward Rule | Enabled |
| Interface | WAN (หรือชื่อ WAN ของคุณ) |
| From | Anywhere (หรือจำกัด IP source ก็ได้) |
| Port | 8443 |
| Forward IP | <LAN IP ของ Synology> — เช่น 192.168.1.10 |
| Forward Port | 8443 |
| Protocol | TCP |
| Logging | ☑️ Enable (แนะนำ — ดู log ได้ว่ามี traffic มั้ย) |
Save + Apply → UniFi จะ provision firewall rule อัตโนมัติ
| ช่อง | ค่า |
|---|---|
| ▸ Source (ที่รับ request จาก browser) | |
| Description | CMSV6 GPS Proxy |
| Protocol | HTTPS |
| Hostname | staff.supwilai.com |
| Port | 8443 ← สำคัญ |
| Enable HSTS | ☑️ ติ๊ก |
| Enable HTTP/2 | ☑️ ติ๊ก |
| Access control profile | Not configured |
| ▸ Destination (ส่งต่อไปที่ CMSV6) | |
| Protocol | HTTP |
| Hostname | 203.170.193.90 |
| Port | 80 |
กด Save
DSM จะใช้ cert default ถ้าไม่ได้ assign explicit — ซึ่งปกติก็ใช้ได้ถ้า cert ของคุณคือ
staff.supwilai.com (single domain) แต่ถ้าต้องการแน่ใจ:
staff.supwilai.com (ที่มีอยู่แล้ว)staff.supwilai.com:8443 (DSM จะเพิ่มเข้าให้อัตโนมัติหลังสร้าง Reverse Proxy)หรือถ้าต้องการตั้งละเอียดเอง ให้ Create → Custom Header แล้วเพิ่มทีละรายการ:
| Header Name | Value |
|---|---|
Access-Control-Allow-Origin | * |
Access-Control-Allow-Methods | GET, POST, OPTIONS |
Access-Control-Allow-Headers | Content-Type, Accept, Authorization |
Access-Control-Max-Age | 86400 |
*? — รองรับ 2 โดเมน (supwilaimedical + officethegood)
และ dev/preview environments ในอนาคต
เปิด 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 error | Custom Header ยังไม่ได้ตั้ง — ดู Step 5 |
❌ net::ERR_CONNECTION_REFUSED | Port forward ไม่ทำงาน → เช็ค UniFi Step 2 |
❌ net::ERR_CERT_* | Cert ไม่ตรง → ดู Step 4 |
| ❌ 502 Bad Gateway | NAS ไม่ถึง CMSV6 → SSH เข้า NAS แล้ว curl -v http://203.170.193.90/ |
❌ net::ERR_TIMED_OUT | Firewall WAN ปิด port 8443 → เช็ค ISP / router |
https://staff.supwilai.com:8443
staff.supwilai.com:8443 (ไม่ใช่ Render)ดู shared/gps-providers.js → function gpsFetch()
// 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 อ่าน
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)
ตรวจสถานะ Synology Proxy ได้ 2 ที่:
| อาการ | สาเหตุ + แก้ |
|---|---|
| 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 แทน |
shared/gps-providers.js (function gpsFetch)