TRACIT Platform
เอกสารอ่านจากระบบที่รันอยู่จริง · ตรวจล่าสุด 23 ก.ค. 2569

สถาปัตยกรรม และ Tech Stack

ทุกอย่างในหน้านี้มาจากการอ่านคอนเทนเนอร์ ไฟล์ config ของ Traefik และ schema ในฐานข้อมูลจริง ไม่ใช่จากเอกสารที่เขียนทิ้งไว้ — ใช้ตอนรับคนใหม่เข้าทีม ตอนวางแผนระบบใหม่ หรือตอนต้องอธิบายภาพรวมให้ผู้บริหาร

12 แอปที่ผู้ใช้เข้าถึง16 บริการพื้นฐาน2 เซิร์ฟเวอร์

เส้นทางของ request

จากผู้ใช้ลงไปถึงข้อมูล
01
ผู้ใช้ / อุปกรณ์ทางเข้าระบบ
เบราว์เซอร์พนักงานสำนักงาน
LINE LIFFพนักงานภาคสนาม
PowerShell agentเครื่องลูกข่าย
MeshCentral agentremote support
02
Edgeทุก request ผ่านชั้นนี้
Traefik v3.3reverse proxy
Let's EncryptTLS อัตโนมัติ
Security headersmiddleware
IP allow-listเครื่องมือ admin
03
แอปพลิเคชันคอนเทนเนอร์แยกกันต่อแอป
Next.js 157 แอป
Next.js 163 แอป
Flaskfleet-api
Nginx / Pythonstatic + photos
04
ข้อมูลใช้ร่วมกันเกือบทั้งหมด
Supabase Postgres 15.8public 105 + hr 15 ตาราง
PostgREST 14.8REST API อัตโนมัติ
PostgreSQL 16แยกให้ CarPro Helper
Redis 7cache / คิว
05
ระบบภายนอกเชื่อมออกนอกแพลตฟอร์ม
Zoho AnalyticsCAR_STATUS ราย ชม.
SAP B1MS SQL อ่านอย่างเดียว
LINE Messagingแจ้งเตือน + LIFF
Zimbra SMTPอีเมลขาออก
Microsoft 365ดึงบิลเข้าระบบ
Zabbix · Sangforป้อน KPI

การไหลของข้อมูล

10 เส้นทางที่ทำงานอยู่จริง
Resync CAR_STATUS จาก Zohoทุกชั่วโมง 06:00–22:00
  1. Zoho Analytics
  2. n8n
  3. Databridge sync
  4. Export CSV
  5. อีเมล 2 ปลายทาง

สั่ง sync เฉพาะ interval ที่มีตาราง CAR_STATUS ตัวเดียว มี guard กันไม่ให้ลากทั้ง 110 ตารางลง CarPro DB · รอจนสถานะเปลี่ยนจาก In Progress เป็น Success แล้วค่อยแนบไฟล์ ~10,000 แถว

บิล True เข้าเป็นค่าใช้จ่ายโปรเจกต์วันละครั้ง 08:30
  1. Microsoft 365
  2. n8n
  3. IT Project Board API
  4. Supabase pb_*

เปลี่ยนจาก Outlook Trigger มาเป็น schedule + lookback 48 ชม. เพราะ trigger เดิมมี race ทำให้บิลที่มีไฟล์แนบใหญ่หลุด

ตั๋วใหม่แจ้งเข้ากลุ่ม LINEทันทีที่มีตั๋ว
  1. TRAC Helpdesk
  2. webhook n8n
  3. กลุ่ม LINE ทีม IT

push เข้ากลุ่มคิดโควตาตามจำนวนสมาชิก จึงส่งเฉพาะเหตุการณ์ที่จำเป็น

แจ้งสถานะรถจากภาคสนามตามที่พนักงานกรอก
  1. LINE LIFF
  2. webhook n8n
  3. Supabase
  4. จอ TV ที่สาขา

ฟอร์มเป็นไฟล์ static เสิร์ฟด้วย Nginx ตัว logic อยู่ใน n8n ทั้งหมด

KPI ผู้บริหารpush เมื่อมีข้อมูลใหม่
  1. Zabbix · Sangfor
  2. POST /api/kpi/ingest
  3. Supabase
  4. หน้า /kpi

เป็น push model ฝั่ง portal ไม่ได้ยิงเข้าไปดึงเอง

เช็คคุณภาพเน็ตรายเครื่องกดจากหน้า asset
  1. TRAC Helpdesk
  2. MeshCentral
  3. PowerShell บนเครื่อง
  4. บันทึกกลับที่ asset

จับคู่เครื่องด้วย BIOS serial ก่อน ถ้าไม่เจอค่อยใช้ชื่อเครื่อง

อนุมัติเอกสารที่อ้างข้อมูล SAPตอนสร้าง/อนุมัติเอกสาร
  1. Doc Approval
  2. MS SQL TRAC_PRD
  3. Supabase doc_*
  4. อีเมลผู้อนุมัติ

ต่อ SAP B1 แบบอ่านอย่างเดียว ผ่านขาเครือข่ายที่ล็อก egress ไว้เฉพาะโฮสต์ SAP

ข้อมูลพนักงานกลางเรียกตอนใช้งาน
  1. HR Admin
  2. API พนักงาน
  3. Project Board · Approval · Training · Fleet

HR เป็นแหล่งความจริงเรื่องคน แอปอื่นไม่เก็บทะเบียนพนักงานซ้ำ

สำรองข้อมูลรายชั่วโมง + วันละ 2 ครั้ง
  1. คอนเทนเนอร์ทั้งหมด
  2. /data (ดิสก์แยก)
  3. Duplicati
  4. Google Drive

ขึ้น Google Drive เฉพาะโฟลเดอร์ offsite ที่คัดไว้ ไม่ใช่ทั้งก้อน เพราะพื้นที่ฟรีมีจำกัด

โน้ตงานเข้า Gitทุก 10 นาที
  1. Obsidian vault
  2. obsidian-sync
  3. Gitea

commit อัตโนมัติเมื่อมีไฟล์เปลี่ยน

ระบบภายนอกแอปของเราอัตโนมัติที่เก็บข้อมูลปลายทาง

แต่ละแอปใช้อะไร

12 แอป
TRAC Helpdeskตั๋วงาน IT, ทะเบียนทรัพย์สิน, คลังอะไหล่, KB
ithelpdesk.thairentacar.com
Runtime
Next.js 15 · React 19
ข้อมูล
Supabase · public (ticket_*, asset_*, kb_*)
คอนเทนเนอร์
trac-helpdesk
nodemailerbcryptjsPowerShell agentMeshCentral net-check
HR Adminข้อมูลพนักงาน, สรรหา, org chart
hr.thairentacar.com
Runtime
Next.js 15 · React 19
ข้อมูล
Supabase · schema hr (15 ตาราง)
คอนเทนเนอร์
hr-admin
rechartsxlsxnodemailerbcryptjs
IT Project Boardโปรเจกต์และงานของทีม IT
itproject.thairentacar.com
Runtime
Next.js 15 · React 19
ข้อมูล
Supabase · public (pb_* 19 ตาราง)
คอนเทนเนอร์
it-project-board
nodemailerbcryptjscron escalation ทุก 30 นาที
Doc Approvalอนุมัติเอกสารทั้งออฟฟิศ ตาม org chart
approval.thairentacar.com
Runtime
Next.js 15 · React 19
ข้อมูล
Supabase · public (doc_* 17 ตาราง)
คอนเทนเนอร์
doc-approval
mssql → SAP B1exceljsnodemailerbcryptjs
Training Portalคอร์สอบรม, quiz, ใบประกาศ
training.thairentacar.com
Runtime
Next.js 15 · React 19
ข้อมูล
Supabase · public (tr_* 9 ตาราง)
คอนเทนเนอร์
training-portal
bcryptjs
Cashcardเงินสดย่อยหลายแผนก (IT, OP)
cashcard.thairentacar.com
Runtime
Next.js 15 · React 19
ข้อมูล
Supabase · public (cc_* 8 ตาราง)
คอนเทนเนอร์
cashcard
bcryptjsRBAC ต่อแผนก
IT Portal + KPIหน้ารวมระบบ + KPI ผู้บริหาร
portal.thairentacar.com
Runtime
Next.js 15 · React 19
ข้อมูล
Supabase (KPI ingest)
คอนเทนเนอร์
portal
ไม่มี dependency นอกจาก next/reactรับ push จาก Zabbix + Sangfor
Car Lease Dashboardยอดขายและวิเคราะห์ทีม car lease
cb.thairentacar.com
Runtime
Next.js 16.2.6 · React 19.2.4
ข้อมูล
Supabase (ผ่าน /api/sb ของตัวเอง)
คอนเทนเนอร์
car-lease
rechartszoddate-fns
Fleet Opscall center, จัดการเคส, master data
fleet.thairentacar.com
Runtime
Next.js 16.2.7 · React 19.2.4
ข้อมูล
Supabase · public (fleet_*)
คอนเทนเนอร์
fleet-ops
zodbcryptjsdate-fns
CarPro Helperแปล incident ไทย↔อังกฤษ, ร่างอีเมล
carpro.103.246.189.85.nip.io
Runtime
Next.js 16.2.7 · React 19.2.4
ข้อมูล
PostgreSQL 16 แยกต่างหาก (db: platform)
คอนเทนเนอร์
carpro-helper
pg (ต่อ DB ตรง ไม่ผ่าน Supabase)ไม่ใช้ LLM
Fleet Formฟอร์มแจ้งสถานะรถ UB ⇄ AV ผ่าน LINE
fleetform.103.246.189.85.nip.io
Runtime
Nginx (static LIFF)
ข้อมูล
ส่งเข้า n8n webhook
คอนเทนเนอร์
fleet-form
LINE LIFF
Vaultwardenpassword manager กลางของทีม (Bitwarden self-host)
vault.thairentacar.com
Runtime
Rust (vaultwarden/server)
ข้อมูล
SQLite ใน ./data (เข้ารหัสฝั่ง client)
คอนเทนเนอร์
vaultwarden
ใช้แอป/extension Bitwarden ของแท้สมัครได้เฉพาะอีเมล @thairentacar.com

บริการภายใน

ไม่มีหน้าจอให้ผู้ใช้
Fleet APIAPI สนับสนุนงาน fleet
ภายใน · พอร์ต 8000
Runtime
Python · Flask + Gunicorn (2 workers × 2 threads)
ข้อมูล
Supabase
คอนเทนเนอร์
fleet-api
ตัวเดียวในระบบที่ไม่ใช่ Node.js
Fleet Photosเสิร์ฟรูปจากงานภาคสนาม
fleetphotos.103.246.189.85.nip.io
Runtime
Python 3 (http server)
ข้อมูล
ไฟล์บนดิสก์
คอนเทนเนอร์
fleet-photos
Uptime Kumaเฝ้าทุกเว็บแอป + cert หมดอายุ + ดิสก์ (แจ้งเมล)
status.thairentacar.com
Runtime
Node.js (louislam/uptime-kuma:1)
ข้อมูล
SQLite ใน ./uptime-kuma-data
คอนเทนเนอร์
uptime-kuma
monitor 21 ตัว ทุก 2 นาทีpush heartbeat ดิสก์จาก cron
GlitchTiperror tracking รวมทุกแอป (Sentry-compatible)
glitch.thairentacar.com
Runtime
Python · Django + Celery
ข้อมูล
PostgreSQL 16 (db: glitchtip) + Redis db1
คอนเทนเนอร์
glitchtip-web + worker
รับ event ผ่าน Sentry SDKpilot: fleet-api

บริการพื้นฐานและเวอร์ชัน

16 รายการ
บริการเวอร์ชันหน้าที่
Traefikv3.3reverse proxy + TLS ทุกโดเมน
Supabase Postgres15.8ฐานข้อมูลหลักที่ทุกแอปใช้ร่วมกัน
Kong3.9.1API gateway หน้า Supabase
PostgREST14.8สร้าง REST API จาก schema
GoTrue2.186.0auth / JWT
Storage API1.48.26ไฟล์แนบ
Realtime2.76.5subscribe ความเปลี่ยนแปลง
Supavisor2.7.4connection pooler
PostgreSQL16อินสแตนซ์แยกของ CarPro Helper
Redis7cache
n8n2.23.2automation · 19 workflow (เปิดใช้ 15)
Gitea1.22git repository ภายใน
MeshCentral1.2.1remote desktop / สั่งงานเครื่อง
Duplicatilatestส่งแบ็คอัพขึ้น Google Drive
PortainerCEจัดการคอนเทนเนอร์
OllamalatestLLM ในเครื่อง (สำรองไว้)

สำรองข้อมูล

เก็บที่ดิสก์คนละลูกกับระบบ
สำรองอะไรถี่แค่ไหนเก็บนานปลายทาง
PostgreSQL ทุกอินสแตนซ์ (pg_dumpall)ทุกชั่วโมง นาทีที่ 307 วัน/data/backups/postgres
ซอร์สโค้ด + config ทุกแอปวันละ 2 ครั้ง (12:00, 00:00)14 วัน/data/backups/platform
n8n SQLite (workflow + credential)วันละครั้ง3 วัน/data/backups/sqlite
ชุด offsite ผ่าน Duplicatiตามรอบ fullตาม versionsGoogle Drive

งานอัตโนมัติ

7 ชุด

เซิร์ฟเวอร์

2 เครื่อง
TRAC-PLATFORM-01103.246.189.85

แอปทั้งหมด, Supabase, n8n, Traefik

tracsupabase01103.246.189.77

ระบบ Driver แยกเซิร์ฟเวอร์ + Supabase ของตัวเอง