เอกสารโครงสร้างระบบ FindDoctor สำหรับทีม IT Support
สำหรับ: IT Support Staff (ทุกระดับ)
วันที่อัปเดต: 24 พฤษภาคม 2026
เวอร์ชัน: 2.0
รูปแบบ: เอกสารฉบับเดียวครบจบ (แบ่งเป็น 4 ระดับ)
สารบัญ
- ส่วนที่ 1: พื้นฐาน (สำหรับ IT Support ทั่วไป)
- ส่วนที่ 2: ระดับกลาง (สำหรับ IT Support ที่มีประสบการณ์)
- ส่วนที่ 3: ระดับสูง (สำหรับ Senior IT Support / DevOps)
- ส่วนที่ 4: ภาคผนวก (Reference)
ส่วนที่ 1: พื้นฐาน (สำหรับ IT Support ทั่วไป)
1.1 ภาพรวมระบบง่ายๆ
FindDoctor คือแพลตฟอร์มจองนัดหมายทางการแพทย์ (Healthcare Booking Platform) ที่ให้บริการทั้งบน เว็บ, iOS และ Android จากฐานโค้ดเดียวกัน ผู้ป่วยสามารถค้นหาแพทย์ จองนัดหมาย จ่ายเงิน แชทกับแพทย์ และรับการแจ้งเตือนได้
ส่วนประกอบหลักของระบบ
┌─────────────────────────────────────────────────────────┐
│ ผู้ใช้งาน (Users) │
└────────────────────────┬────────────────────────────────┘
│
┌────────────┴────────────┐
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Mobile App │ │ Web App │
│ (iOS/Android)│ │ (Browser) │
└──────┬───────┘ └──────┬───────┘
│ │
└────────────┬────────────┘
│
▼
┌─────────────────────┐
│ Load Balancer │
│ (Cloudflare CDN) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Nginx Reverse │
│ Proxy + SSL │
│ (Let's Encrypt) │
└──────────┬──────────┘
│
┌────────────┴────────────┐
▼ ▼
┌────────────────┐ ┌────────────────┐
│ Frontend │ │ Backend │
│ (React/Expo) │ │ (Koa.js) │
└────────────────┘ └───────┬────────┘
│
┌────────────────┼────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ MariaDB │ │ Redis │ │ AWS │
│ (Database)│ │ (Cache) │ │ (Cognito,│
└──────────┘ └──────────┘ │ SNS, S3)│
└──────────┘
บทบาทของผู้ใช้ (User Roles)
| บทบาท |
คำอธิบาย |
สิทธิ์หลัก |
| Patient (ผู้ป่วย) |
ผู้ใช้ทั่วไป |
จองนัดหมาย, แชท, เขียนรีวิว |
| Clinic Staff (เจ้าหน้าที่คลินิก) |
แพทย์, พยาบาล, เภสัชกร, ฯลฯ |
จัดการนัดหมายภายในคลินิก |
| Clinic Admin (ผู้ดูแลคลินิก) |
แอดมินของคลินิก |
จัดการคลินิก สาขา แพทย์ รายการสินค้า |
| System Admin (ผู้ดูแลระบบ) |
แอดมินระดับแพลตฟอร์ม |
จัดการระบบทั้งหมด |
1.2 วิธีเช็คสถานะระบบ
วิธีตรวจสอบว่าระบบทำงานปกติหรือไม่
- เช็ค Backend
- เปิดเบราว์เซอร์ เข้า
https://api.finddoctor.cloud/health
- ถ้าขึ้น
{"status":"ok"} แสดงว่า Backend ทำงานปกติ
- เช็ค Frontend
- เปิด
https://finddoctor.cloud
- ถ้าหน้าเว็บโหลดได้ แสดงว่า Frontend ทำงานปกติ
- เช็ค Container
docker ps
ควรเห็นสถานะ Up ทุก container
- เช็ค Logs แบบ real-time
docker compose logs -f
กด Ctrl+C เพื่อหยุดดู
- เช็คผ่าน Dozzle (Log Viewer)
- เข้า
http://207.148.69.12:9999
- ดู logs ของทุก container แบบ real-time ผ่านเว็บ
1.3 คำสั่งพื้นฐานที่ใช้บ่อย
คำสั่ง Docker Compose (รันที่ /var/www/html/finddoctor.cloud/backend หรือ /var/www/html/finddoctor.cloud/frontend)
# ดูสถานะ container ทั้งหมด
docker compose ps
# ดู logs แบบ real-time (ทุก container)
docker compose logs -f
# ดู logs เฉพาะ backend
docker compose logs -f clinic-app
# ดู logs เฉพาะ frontend
docker compose logs -f web-prod
# Restart ทั้งหมด
docker compose restart
# Restart เฉพาะ backend
docker compose restart clinic-app
# Start container ที่หยุดไว้
docker compose up -d
# Stop ทั้งหมด
docker compose stop
# Deploy ใหม่ (ใช้ Makefile)
make deploy
คำสั่งเชื่อมต่อ Database และ Redis
# เชื่อมต่อ MariaDB (backend)
docker compose exec mariadb mariadb -u clinic_user -p clinic_appointment
# เชื่อมต่อ Redis (backend)
docker compose exec redis redis-cli -a redispassword
# ตรวจสอบพื้นที่ disk
df -h
# ตรวจสอบ CPU/Memory
htop
1.4 ปัญหาที่พบบ่อยและวิธีแก้ไขเบื้องต้น
| อาการ |
สาเหตุที่เป็นไปได้ |
วิธีแก้ไขเบื้องต้น |
| 502 Bad Gateway |
Container ล่ม / ยังไม่ start |
docker compose up -d |
| ระบบช้า |
Redis เต็ม / DB connection pool เต็ม |
ตรวจสอบ docker stats |
| ไม่สามารถ login |
AWS Cognito ล่ม / Token หมดอายุ |
ลอง logout แล้ว login ใหม่ |
| ไม่ได้รับการแจ้งเตือน |
Notification queue ค้าง |
ตรวจสอบ logs ของ notification |
| SSL Error |
ใบรับรองหมดอายุ |
ตรวจสอบ Let's Encrypt |
| เว็บไม่โหลด |
Nginx-proxy ล่ม |
docker restart nginx-proxy |
| ฐานข้อมูลไม่ตอบสนอง |
MariaDB ล่ม |
docker compose restart mariadb |
1.5 จุดติดต่อสำคัญ
ช่องทางแจ้งเตือนและติดต่อ
| กรณี |
ช่องทาง |
รายละเอียด |
| ระบบล่มฉุกเฉิน |
Slack/Line Group |
แจ้งทีม DevOps ทันที |
| ปัญหาทั่วไป |
Email |
ส่งมาที่ทีมพัฒนา |
| ตรวจสอบสถานะ |
Dozzle |
http://207.148.69.12:9999 |
| API Docs |
Swagger |
https://api.finddoctor.cloud/api-docs |
ส่วนที่ 2: ระดับกลาง (สำหรับ IT Support ที่มีประสบการณ์)
2.1 สถาปัตยกรรมระบบโดยละเอียด
Frontend (React Native / Expo)
- Universal App: เขียนโค้ดครั้งเดียว ทำงานได้ทั้ง iOS, Android และ Web
- Expo Router: ใช้ file-based routing (
app/ directory)
- TanStack React Query: จัดการ state จาก server (caching, refetching)
- Role-Based HTTP Clients: มี HTTP client 3 ตัวแยกตามบทบาท (Patient, Clinic Admin, System Admin)
- Offline Support: ใช้ AsyncStorage เก็บ query cache เพื่อให้ใช้งานได้แม้ offline
Backend (Koa.js / Node.js)
- REST API: อยู่ภายใต้ path
/api/v1/
- Middleware Pipeline: มี 14 ขั้นตอนจาก request เข้าสู่ response
- Clean Architecture: แบ่งเป็น Entry Points → Domain Layer → Data Access
- ES Modules: ใช้
import/export (ไม่ใช่ require)
Database (MariaDB)
- เวอร์ชัน: 10.11
- ชื่อฐานข้อมูล:
clinic_appointment
- Charset:
utf8mb4 (รองรับภาษาไทย + emoji)
- จำนวนตาราง: ~65 ตาราง
- Connection Pool: สูงสุด 20 connections
- Column-Level AES Encryption: ข้อมูลส่วนตัวและทางการแพทย์ถูกเข้ารหัส
Cache (Redis)
- เวอร์ชัน: 7.2
- การใช้งาน: Translation cache, ABAC policy cache, Rate limiting, BullMQ queue, Socket.IO session
Authentication (AWS Cognito)
- JWT Tokens: Access Token (สั้น) + Refresh Token (ยาว)
- Social Login: Google, Facebook, Apple
- MFA: TOTP ผ่าน Google Authenticator
2.2 Infrastructure & Docker
Docker Compose Environments
| ไฟล์ |
กรณีใช้ |
ส่วนประกอบ |
docker-compose.dev.yml |
Development |
App + MariaDB + Redis + phpMyAdmin (hot-reload) |
docker-compose.local.yml |
Local testing |
เหมือน dev แต่รันในเครื่อง |
docker-compose.staging.yml |
Staging/Production |
App + Redis + Dozzle (ใช้ MariaDB ภายนอก) |
docker-compose.yml |
Production |
App + MariaDB + Redis + phpMyAdmin |
โครงสร้าง Container
Vultr VPS (207.148.69.12)
│
├─ nginx-proxy (reverse proxy, Let's Encrypt SSL)
│
├─ Backend Container (clinic-app)
│ ├─ Node.js 20 (Koa.js)
│ ├─ Port 3000
│ ├─ เชื่อมต่อ MariaDB, Redis
│ └─ Volume: uploads, logs, secret
│
├─ Frontend Container (web-prod)
│ ├─ Nginx Alpine
│ ├─ Port 80
│ └─ Serve static files (dist/)
│
├─ MariaDB Container (clinic-mariadb)
│ ├─ Port 3306
│ └─ Volume: mariadb_data
│
├─ Redis Container (clinic-redis)
│ ├─ Port 6379
│ └─ Volume: redis_data
│
├─ phpMyAdmin Container (clinic-phpmyadmin)
│ └─ Port 8081
│
└─ Dozzle Container (log viewer)
└─ Port 9999
Network
clinic-network (bridge): สำหรับ container ภายในโปรเจกต์
proxy (external): สำหรับ nginx-proxy reverse proxy
2.3 การอ่านและวิเคราะห์ Logs
ตำแหน่ง Logs
| Logs |
ตำแหน่ง |
วิธีดู |
| Backend |
logs/ folder (ใน container) |
docker compose logs -f clinic-app |
| Nginx |
/var/log/nginx/access.log, error.log |
docker compose exec web-prod cat /var/log/nginx/error.log |
| MariaDB |
ใน container |
docker compose logs -f mariadb |
| Redis |
ใน container |
docker compose logs -f redis |
Log Levels (Pino)
| Level |
ความหมาย |
ตัวอย่าง |
fatal |
ระบบล่ม |
ไม่สามารถ start server ได้ |
error |
ข้อผิดพลาดรุนแรง |
Database connection failed |
warn |
คำเตือน |
Rate limit ใกล้ถึง |
info |
ข้อมูลทั่วไป |
Request received, response sent |
debug |
Debug |
Query details, parameters |
trace |
Trace |
Function entry/exit |
การ Filter Logs
# ดู logs เฉพาะ error
docker compose logs clinic-app | grep "error"
# ดู logs ย้อนหลัง 100 บรรทัด
docker compose logs --tail=100 clinic-app
# ดู logs ตั้งแต่เวลาที่กำหนด
docker compose logs --since=2026-05-24T10:00:00 clinic-app
2.4 Health Check & Monitoring
Health Check Endpoints
| Endpoint |
URL |
วิธีใช้ |
| Backend Health |
https://api.finddoctor.cloud/health |
curl https://api.finddoctor.cloud/health |
| Frontend Health |
http://localhost/ (ใน container) |
wget --spider http://localhost/ |
| Container Status |
docker ps |
ดู STATUS column |
Resource Monitoring
# ดู CPU/Memory/Disk ของแต่ละ container
docker stats
# ดูพื้นที่ disk ทั้งหมด
df -h
# ดู memory ทั้งหมด
free -h
# ดู process ที่ใช้ CPU/Memory มาก
htop
2.5 CI/CD Pipeline
กระบวนการ Deploy (GitLab CI/CD)
Developer push code → branch "develop"
│
▼
GitLab CI/CD trigger
│
▼
SSH เข้า VPS (207.148.69.12)
│
▼
make deploy (Backend หรือ Frontend)
1. git pull
2. docker build
3. docker compose up -d
4. preflight-db
5. db migrate
6. restart nginx-proxy
7. health check
Makefile Commands
# Deploy ทั้ง backend และ frontend
make deploy
# Deploy เฉพาะ backend
make deploy-backend
# Deploy เฉพาะ frontend
make deploy-frontend
# Rollback ไปเวอร์ชันก่อนหน้า
make rollback
# ตรวจสอบสถานะระบบ
make status
# Restart nginx-proxy
make restart-proxy
2.6 การสำรองข้อมูลและกู้คืน
Database Backup
# สำรองฐานข้อมูลทั้งหมด
docker compose exec mariadb mysqldump -u clinic_user -p clinic_appointment > backup_$(date +%Y%m%d_%H%M%S).sql
# สำรองเฉพาะโครงสร้าง (schema)
docker compose exec mariadb mysqldump -u clinic_user -p --no-data clinic_appointment > schema_backup.sql
# ผ่าน phpMyAdmin
# เข้า http://207.148.69.12:8081 → Export → Custom → กด Go
Restore Database
# กู้คืนจาก backup file
docker compose exec -T mariadb mariadb -u clinic_user -p clinic_appointment < backup_20260524_120000.sql
File Backup
# สำรอง uploads folder
tar -czvf uploads_backup_$(date +%Y%m%d).tar.gz /var/www/html/finddoctor.cloud/backend/uploads
# สำรอง logs folder
tar -czvf logs_backup_$(date +%Y%m%d).tar.gz /var/www/html/finddoctor.cloud/backend/logs
Redis Backup
- Redis ใช้ AOF (Append Only File) เปิดใช้งานอยู่ (
appendonly yes)
- ข้อมูลจะ persist ไปที่
/data/appendonly.aof
- หาก container restart ข้อมูลจะกู้คืนโดยอัตโนมัติ
ส่วนที่ 3: ระดับสูง (สำหรับ Senior IT Support / DevOps)
3.1 โครงสร้างโค้ดและโมดูล
Clean Architecture
ระบบแบ่งเลเยอร์โค้ดเป็น 3 ชั้นหลักในแต่ละโมดูล:
┌─────────────────────────────────┐
│ Entry Points (API Routes) │ ← รับ request, validate input
├─────────────────────────────────┤
│ Domain Layer (Business Logic) │ ← ประมวลผลธุรกิจ, validate กฎ
├─────────────────────────────────┤
│ Data Access (Repositories) │ ← อ่าน/เขียนฐานข้อมูล
└─────────────────────────────────┘
โมดูลธุรกิจ (18 โมดูลหลัก)
| โมดูล |
หน้าที่ |
Path |
auth |
การเข้าสู่ระบบ / สมัครสมาชิก |
apps/auth/ |
users |
จัดการโปรไฟล์ผู้ใช้ |
apps/users/ |
bookings |
การจองนัดหมาย |
apps/bookings/ |
clinics |
จัดการคลินิก, สาขา, แพทย์, ห้อง |
apps/clinics/ |
payments |
การชำระเงิน / ใบเสร็จ |
apps/payments/ |
chat |
ระบบแชท (E2E encryption) |
apps/chat/ |
notifications |
การแจ้งเตือน |
apps/notifications/ |
search |
ค้นหาแพทย์ / คลินิก |
apps/search/ |
reviews |
การเขียนรีวิว |
apps/reviews/ |
insurance |
ประกันสุขภาพ |
apps/insurance/ |
medical-categories |
ประเภทการรักษาแพทย์ |
apps/medical-categories/ |
data-consent |
การยินยอมข้อมูล (PDPA) |
apps/data-consent/ |
translation |
แปลภาษา (Google Cloud) |
apps/translation/ |
policies |
นโยบายสิทธิ์การใช้งาน |
apps/policies/ |
settings |
ตั้งค่าระบบ |
apps/settings/ |
admins |
จัดการระบบ admin |
apps/admins/ |
Shared Libraries (11 Libraries)
| Package |
หน้าที่ |
Path |
@clinic/config |
Config กลาง + Joi validation + enums |
libraries/config/ |
@clinic/database |
Sequelize manager, Redis manager, ~65 models |
libraries/database/ |
@clinic/logger |
Pino structured logging |
libraries/logger/ |
@clinic/response |
Error handler, response formatter |
libraries/response/ |
@clinic/middleware |
Auth guards, audit, security |
libraries/middleware/ |
@clinic/abac |
Attribute-Based Access Control |
libraries/abac/ |
@clinic/cognito-auth |
AWS Cognito authentication |
libraries/cognito-auth/ |
@clinic/notification |
Multi-channel notification engine |
libraries/notification/ |
@clinic/translation |
Google Cloud Translation |
libraries/translation/ |
@clinic/csv-import |
CSV file import utilities |
libraries/csv-import/ |
Middleware Pipeline (14 ขั้นตอน)
เมื่อมี request เข้ามาสู่ Koa.js จะผ่าน middleware ตามลำดับ:
Request
│
├─ 1. koa-helmet → Security headers
├─ 2. Security middleware → ป้องกัน path traversal, IP blocklist
├─ 3. CORS → อนุญาต cross-origin requests
├─ 4. S3 image streaming → ดึงรูปจาก S3
├─ 5. Static files → ให้ไฟล์ static (fallback)
├─ 6. Rate limiting → จำกัด request ต่อเวลา (ป้องกัน DDoS)
├─ 7. Request logging → บันทึก log ด้วย Pino
├─ 8. Body parser → แปลง JSON/form body (limit 10MB)
├─ 9. Audit logging → บันทึก audit trail
├─ 10. Response time → เพิ่ม header X-Response-Time
├─ 11. Language extraction→ ดึงภาษาจาก query param ?lang=
├─ 12. Translation → แปลภาษา (Google Cloud Translation)
├─ 13. Translation invalidation → จัดการ cache translation
└─ 14. Routes → ส่งต่อไปยัง router ที่ตรงกัน
3.2 การ Debug ปัญหาซับซ้อน
Trace Request
# ทดสอบ API endpoint ด้วย curl
curl -v https://api.finddoctor.cloud/health
# ทดสอบด้วย headers แบบเต็ม
curl -H "Authorization: Bearer <token>" https://api.finddoctor.cloud/api/v1/users/me
# ตรวจสอบ response time
curl -w "@curl-format.txt" -o /dev/null -s https://api.finddoctor.cloud/health
ตรวจสอบ Performance
# ดู response time จาก logs
docker compose logs clinic-app | grep "responseTime"
# ดู DB query time
docker compose logs clinic-app | grep "query"
# ดู Redis latency
docker compose exec redis redis-cli --latency
# ดู connection pool ของ DB
# (ผ่าน MariaDB client)
docker compose exec mariadb mariadb -u clinic_user -p -e "SHOW PROCESSLIST;"
Debug ใน Container
# เข้าไปใน backend container
docker compose exec clinic-app sh
# ดู environment variables
env | grep NODE
# ดู process ที่รันอยู่
ps aux
# ดู network connections
netstat -tlnp
# ดู disk usage ใน container
df -h
3.3 การจัดการ Incident รุนแรง
ขั้นตอนรับมือ Incident
1. Identify (ระบุปัญหา)
→ ตรวจสอบสถานะระบบ
→ ดู logs หาสาเหตุ
→ ประเมินความรุนแรง
2. Contain (ควบคุม)
→ แยกปัญหาไม่ให้กระจาย
→ ปิดบริการที่มีปัญหาชั่วคราว (ถ้าจำเป็น)
3. Mitigate (บรรเทา)
→ ทำให้ระบบกลับมาทำงานได้
→ Restart service, rollback, ฯลฯ
4. Resolve (แก้ไข)
→ แก้ไข root cause
→ Deploy fix
5. Post-mortem (สรุปบทเรียน)
→ เขียน incident report
→ ปรับปรุงกระบวนการ
Escalation Path
| ระดับ |
ผู้รับผิดชอบ |
กรณี |
| L1 |
IT Support |
ปัญหาทั่วไป, ผู้ใช้แจ้ง |
| L2 |
Senior IT Support |
ปัญหาซับซ้อน, ระบบช้า |
| L3 |
DevOps / Developer |
ระบบล่ม, ข้อมูลรั่วไหล, security |
Rollback ฉุกเฉิน
# Rollback ไปเวอร์ชันก่อนหน้า (ใช้ Makefile)
make rollback
# หรือ rollback Docker image ด้วย tag ก่อนหน้า
docker compose pull
docker compose up -d
# ถ้าต้องการ rollback database migration
# (ระวัง! อาจสูญเสียข้อมูล)
npx sequelize-cli db:migrate:undo
3.4 การปรับแต่งและ Optimize
Database Tuning
# ดู slow queries (ใน MariaDB)
docker compose exec mariadb mariadb -u clinic_user -p -e "SHOW FULL PROCESSLIST;"
# ดู table status
docker compose exec mariadb mariadb -u clinic_user -p -e "SHOW TABLE STATUS;"
# ตรวจสอบ index
docker compose exec mariadb mariadb -u clinic_user -p -e "SHOW INDEX FROM users;"
Redis Tuning
# ดู memory usage
docker compose exec redis redis-cli INFO memory
# ดู maxmemory policy
docker compose exec redis redis-cli CONFIG GET maxmemory-policy
# ล้าง cache ทั้งหมด (ระวัง!)
docker compose exec redis redis-cli FLUSHALL
Nginx Tuning
# ดู config ปัจจุบัน
docker compose exec nginx-proxy cat /etc/nginx/nginx.conf
# Reload nginx (ไม่ต้อง restart)
docker compose exec nginx-proxy nginx -s reload
Node.js Tuning
# เพิ่ม heap size (ถ้าหน่วยความจำไม่พอ)
NODE_OPTIONS="--max-old-space-size=4096" node index.js
# ดู Event Loop lag (ต้องเพิ่ม monitoring ในโค้ด)
3.5 การเพิ่มบริการใหม่
ขั้นตอนเพิ่ม Container ใหม่
- เพิ่ม service ใน
docker-compose.yml หรือ docker-compose.staging.yml
- ตั้งค่า environment variables ใน
.env
- ปรับ nginx config ถ้าจำเป็น
- รัน
docker compose up -d
- ตรวจสอบ health check
ขั้นตอนเพิ่ม API Endpoint ใหม่
- สร้างโมดูลใหม่ใน
apps/<module-name>/
- แบ่งเป็น entry-points, domain, data-access
- เพิ่ม route ใน
index.js
- เพิ่ม Swagger documentation
- รัน tests
- Deploy ผ่าน GitLab CI/CD
ส่วนที่ 4: ภาคผนวก (Reference)
4.1 รายการเทคโนโลยีและเวอร์ชัน
Frontend Stack
| เทคโนโลยี |
เวอร์ชัน |
หมายเหตุ |
| React |
19.1.0 |
UI library หลัก |
| React Native |
0.81.4 (New Architecture) |
รองรับ iOS/Android + Web |
| Expo |
54.0.8 |
เครื่องมือ build/deploy |
| Expo Router |
6.0.6 |
File-based routing |
| TypeScript |
5.9.2 |
Type safety |
| TanStack React Query |
5.90.5 |
Server state management |
| Socket.IO Client |
4.8.3 |
Real-time communication |
| Axios |
- |
HTTP client |
| i18next |
- |
รองไทย/อังกฤษ |
| ฟอนต์หลัก |
Kanit (Thai + English) |
|
Backend Stack
| เทคโนโลยี |
เวอร์ชัน |
หมายเหตุ |
| Node.js |
20+ |
Runtime |
| Koa.js |
2.15.3 |
Web framework |
| Sequelize |
6.37.7 |
ORM สำหรับฐานข้อมูล |
| MariaDB |
10.11 |
ฐานข้อมูลหลัก |
| Redis |
7.2 |
Cache & Queue |
| BullMQ |
5.58.5 |
Job queue (แจ้งเตือน) |
| Socket.IO |
4.8.1 |
Real-time server |
| Pino (Logger) |
9.7 |
Structured logging |
| Joi (Validation) |
17.13.3 |
Input validation |
| Swagger/OpenAPI |
3.0 |
API documentation |
| ES Modules |
(native) |
import/export |
Infrastructure Stack
| ส่วน |
เทคโนโลยี |
| Hosting |
Vultr VPS |
| Container |
Docker + Docker Compose |
| Reverse Proxy |
nginx-proxy |
| SSL |
Let's Encrypt |
| CDN/DDoS |
Cloudflare |
| CI/CD |
GitLab CI |
| Source Control |
GitLab (gitlab.com) |
| Node Runtime |
node:20-alpine |
4.2 รายการโดเมนและพอร์ต
โดเมน
| โดเมน |
ชี้ไปที่ |
หมายเหตุ |
finddoctor.cloud |
Frontend |
ฐาน URL หลัก |
staging.finddoctor.cloud |
Frontend (staging) |
สภาพแวดล้อม staging |
api.finddoctor.cloud |
Backend API |
API endpoint |
finddoctor.co.th |
Frontend |
โดเมนสำรอง |
staging.finddoctor.co.th |
Frontend (staging) |
staging สำรอง |
api.finddoctor.co.th |
Backend API |
API สำรอง |
พอร์ต
| พอร์ต |
บริการ |
หมายเหตุ |
| 80 |
Frontend (Nginx) |
HTTP |
| 3000 |
Backend (Koa.js) |
API |
| 3306 |
MariaDB |
Database |
| 6379 |
Redis |
Cache |
| 8081 |
phpMyAdmin |
DB Admin |
| 9999 |
Dozzle |
Log Viewer |
4.3 รายการ Environment Variables สำคัญ
หมายเหตุ: ไม่รวม secret/password ควรดูในไฟล์ .env บน server
| ตัวแปร |
คำอธิบาย |
ตัวอย่าง |
NODE_ENV |
สภาพแวดล้อม |
development, production |
ALLOWED_ORIGINS |
โดเมนที่อนุญาต CORS |
https://finddoctor.cloud |
VIRTUAL_HOST |
โดเมนสำหรับ nginx-proxy |
api.finddoctor.cloud |
DATABASE_URL |
URL ฐานข้อมูล |
mariadb://user:pass@host:3306/db |
REDIS_URL |
URL Redis |
redis://host:6379 |
AWS_REGION |
AWS Region |
ap-southeast-1 |
COGNITO_USER_POOL_ID |
Cognito User Pool ID |
ap-southeast-1_xxxxxxxxx |
MAILGUN_DOMAIN |
Mailgun Domain |
mg.finddoctor.cloud |
4.4 แผนภาพเครือข่าย
Internet
│
▼
┌─────────────────────┐
│ Cloudflare CDN │
│ (Flexible SSL/DDoS)│
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Vultr VPS │
│ 207.148.69.12 │
│ │
│ ┌───────────────┐ │
│ │ nginx-proxy │ │
│ │ (Let's Encrypt)│ │
│ └──────┬────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ │ │
│ ▼ ▼ │
│ ┌────┐ ┌────┐ │
│ │ BE │ │ FE │ │
│ │:3000│ │:80 │ │
│ └──┬─┘ └────┘ │
│ │ │
│ ├─▶ MariaDB :3306 │
│ ├─▶ Redis :6379 │
│ ├─▶ AWS Cognito │
│ ├─▶ AWS SNS │
│ ├─▶ AWS S3 │
│ ├─▶ Google Cloud │
│ │ (Translation) │
│ ├─▶ Mailgun (Email)│
│ ├─▶ LINE API │
│ ├─▶ Meta WhatsApp │
│ └─▶ Firebase (Push)│
└───────────────────────┘
บริการภายนอกที่เชื่อมต่อ
| บริการ |
ใช้สำหรับ |
| AWS Cognito |
Authentication, User Pool |
| AWS S3 |
เก็บรูปภาพไฟล์ upload |
| AWS SNS |
ส่ง SMS |
| Google Cloud Translation |
แปลภาษาอัตโนมัติ |
| Mailgun |
ส่งอีเมล |
| LINE Messaging API |
แจ้งเตือนผ่าน LINE |
| Meta WhatsApp Cloud API |
แจ้งเตือนผ่าน WhatsApp |
| WeChat Official Account |
แจ้งเตือนผ่าน WeChat |
| Firebase Cloud Messaging |
Push notification (Android) |
| Apple Push Notification (APNs) |
Push notification (iOS) |
| Cloudflare |
CDN, DDoS protection, SSL |
หมายเหตุสำคัญ
- เอกสารนี้จัดทำเมื่อวันที่ 24 พฤษภาคม 2026 — หากมีการเปลี่ยนแปลงโครงสร้างระบบ กรุณาอัปเดตเอกสารนี้ให้ตรงตามจริง
- อย่าแชร์ secret/password ในเอกสารนี้ — เก็บไว้ในไฟล์
.env บน server เท่านั้น
- ทดสอบคำสั่งใน staging ก่อน production — เพื่อป้องกันความเสียหาย
- บันทึกทุกการแก้ไขปัญหา — เพื่อใช้เป็นข้อมูลอ้างอิงในอนาคต
เอกสารฉบับนี้จัดทำสำหรับทีม IT Support ทุกระดับ — ตั้งแต่พื้นฐานจนถึงระดับสูง