Skip to content

14.2 Daily operations — start/stop/restart

บทนี้รวบรวมคำสั่งที่ทีมปฏิบัติการใช้บ่อยในชีวิตประจำวัน — start service, stop, restart, การตรวจสอบหลัง restart

หลักการสำคัญก่อนเริ่ม

  1. ลำดับการ start สำคัญ — Redis และ database ต้อง start ก่อน Node service เพราะ Node จะเชื่อมต่อทันทีตอน boot
  2. ไม่มี health check — ต้องตรวจสอบสถานะ service ด้วยตนเองผ่าน log และ URL
  3. restart ทีละ replica — เพื่อรักษา uptime ของระบบโดยรวม
  4. cron ที่ถูก APP_NO gate — เฉพาะ updateSuccessFundChangeRateByJob บน vtrc (และ cron ทั้งชุดของ cu-central) ขึ้นกับ APP_NO=1; updateDelegatesExpire / statLog รันทุก replica — restart APP_NO=1 ไม่ได้หยุด cron ทั้งหมด

การ start service ทั้งหมด (cold start)

ใช้ตอนที่ host reboot หรือหลังจากที่ stack ทั้งหมดถูกหยุด

vtrc-api host

bash
cd /home/dev/vtrc-api/

# start ทุก service ใน compose (vtrc-redis-db, vtrc-web-proxy, vtrc-api, vtrc-api-2, vtrc-api-3, vtrc-api-5)
docker-compose up -d

# ตรวจสอบว่า container รันครบ
docker-compose ps

ลำดับการ start ของ docker-compose จะประมาณดังนี้:

  1. vtrc-redis-db — Redis
  2. vtrc-web-proxy — nginx
  3. vtrc-pma — phpMyAdmin
  4. vtrc-api, vtrc-api-2, vtrc-api-3, vtrc-api-5 — Node replica

cu-central-api host

bash
cd /home/dev/cu-central-api/

docker-compose up -d

docker-compose ps

centralize-api host

bash
cd /home/dev/centralize-api/

docker-compose up -d prod

docker-compose ps

หมายเหตุ: centralize-api ระบุ prod เพราะ docker-compose มีทั้ง service dev และ prod

vtrc-rc-backoffice host

bash
cd /home/dev/vtrc-rc-backoffice/

docker-compose up -d

docker-compose ps

การ stop service ทั้งหมด

ใช้ตอนที่ต้อง maintenance หรือย้าย host

vtrc-api host

bash
cd /home/dev/vtrc-api/
docker-compose down

คำสั่งนี้จะหยุดและลบ container ทั้งหมด (แต่ volume ยังอยู่ — api-storage, api-logs จะไม่หาย)

ถ้าต้องการหยุดแบบไม่ลบ container:

bash
docker-compose stop

หยุด service อื่น ๆ

ใช้คำสั่งเดียวกันใน directory ของแต่ละ service

การ restart service เดียว

กรณี service ค้าง (hang) หรือต้อง reload configuration

restart replica เดียวของ vtrc-api

bash
# restart เฉพาะ replica APP_NO=2 (container: vtrc-api-nodejs-2)
docker restart vtrc-api-nodejs-2

# ดู log หลัง restart เพื่อยืนยันว่า boot สำเร็จ
docker logs --tail 30 vtrc-api-nodejs-2

ข้อความที่บ่งชี้ boot สำเร็จ (จาก vtrc-api/api/src/index.js:99):

🚀 Server ready at -> http://localhost:8081/api/graphql
Connection has been established successfully.
Connection #2 has been established successfully.

restart nginx

bash
docker restart vtrc-web-server

หรือ reload nginx โดยไม่ restart container:

bash
docker exec vtrc-web-server nginx -s reload

ใช้ reload หลังจากแก้ config ใน ./nginx/default.conf

restart Redis

bash
docker restart vtrc-redis

ระวัง — restart vtrc-redis ทำให้ cache ของ vtrc หาย; restart cu-centralize-redis ทำให้ session key sess:* หาย (force logout ฝั่ง cu-central) — OTP ไม่ได้อยู่ใน Redis (อยู่ตาราง OTP ของ cu-central MariaDB, TTL 3 นาที)

restart cu-central-api replica

bash
docker restart cu-central-api

การ restart ทีละ replica เพื่อรักษา uptime

เมื่อต้อง deploy หรือ restart ทุก replica ของ vtrc-api ให้ทำทีละตัวเพื่อให้ nginx ส่ง traffic ไป replica อื่นที่ยังรันอยู่

bash
# 1. ตรวจสอบสถานะก่อน
docker-compose ps
curl -I https://vtrcapi.redcross.or.th/api/graphql

# 2. restart replica 1
docker restart vtrc-api-nodejs
sleep 10
docker logs --tail 30 vtrc-api-nodejs
# รอจนกว่าจะเห็น "Server ready at"

# 3. ตรวจสอบว่า traffic ยังไหลผ่าน
curl -I https://vtrcapi.redcross.or.th/api/graphql

# 4. ถ้าปกติ ทำซ้ำกับ replica 2, 3, 5
docker restart vtrc-api-nodejs-2
sleep 10
docker logs --tail 30 vtrc-api-nodejs-2

docker restart vtrc-api-nodejs-3
sleep 10
docker logs --tail 30 vtrc-api-nodejs-3

docker restart vtrc-api-nodejs-5
sleep 10
docker logs --tail 30 vtrc-api-nodejs-5

หมายเหตุ:

  • sleep 10 เป็นเวลาประมาณการ — จริง ๆ ต้องรอจนกว่า log จะแสดง "Server ready"
  • ถ้า restart APP_NO=1, เฉพาะ job ที่ถูก gate (updateSuccessFundChangeRateByJob และ cron ของ cu-central) จะหยุดชั่วคราวจนกว่า schedule ถัดไป; updateDelegatesExpire / statLog ยังรันบน replica อื่น

การตรวจสอบสถานะหลัง restart

ไม่มี /health endpoint ให้ใช้ — ต้องตรวจสอบหลายอย่าง:

1. Container รันอยู่หรือไม่

bash
docker ps --filter "name=vtrc-api"

คอลัมน์ STATUS ควรเป็น Up X minutes (healthy) — แต่ "healthy" จะไม่ปรากฏเพราะ Dockerfile ไม่ได้กำหนด HEALTHCHECK

2. Port ฟังอยู่หรือไม่

bash
docker exec vtrc-api-nodejs netstat -tln | grep 8081

หรือจาก host:

bash
curl -I http://localhost:8081/api/graphql

ควรได้ HTTP/1.1 200 หรือ redirect

3. Log แสดงความสำเร็จ

bash
docker logs --tail 50 vtrc-api-nodejs | grep -E "Server ready|established successfully"

4. database connection เชื่อมต่อหรือไม่

ถ้า log แสดง "Unable to connect to the database" (จาก vtrc-api/api/src/index.js:108), แสดงว่ามีปัญหาที่ database ต้องตรวจสอบเพิ่มเติม

5. Redis connection สำเร็จ

ตรวจ log ตอน boot ว่ามีข้อความ Redis connection สำเร็จ (cu-central มักมี [REDIS] ✅) — อย่าใช้การขอ OTP เป็น proxy ของ vtrc Redis เพราะ OTP ถูกเก็บใน MariaDB ของ cu-central

6. cron job ยังรัน

bash
docker exec vtrc-api-nodejs ls /usr/src/app/logs/

ไฟล์ log ที่มีวันที่ปัจจุบันบ่งชี้ว่า cron รัน

การอัปเดต nginx config โดยไม่ restart

เมื่อแก้ ./nginx/default.conf แล้วต้องการ apply:

bash
cd /home/dev/vtrc-api/

# ทดสอบ syntax ก่อน
docker exec vtrc-web-server nginx -t

# ถ้าผ่าน reload
docker exec vtrc-web-server nginx -s reload

ถ้า nginx -t พบ syntax error ห้าม reload เด็ดขาดเพราะ nginx อาจหยุดทำงาน

การดูสถานะของ docker-compose

bash
cd /home/dev/vtrc-api/

# ดูสถานะ container ทั้งหมด
docker-compose ps

# ดู log รวมของทุก container
docker-compose logs --tail 100

# ดู log ของ service เฉพาะ
docker-compose logs --tail 100 vtrc-api

ปัญหาที่พบบ่อยตอน start

Container ตายทันทีหลัง start

อาการ: docker-compose up -d แล้ว docker-compose ps แสดง Exit 1 หรือ Restarting (1) ...

สาเหตุที่เป็นไปได้:

  1. Environment variable ขาด — เช่น DB_HOST ว่าง ทำให้ Node crash ตอน connect
  2. Volume mount ไม่ได้ — path บน host ไม่มีอยู่จริง
  3. Image tag ผิด — pull image ไม่ได้

การตรวจสอบ:

bash
docker logs vtrc-api-nodejs | tail -30

Service รัน แต่ไม่ตอบ request

อาการ: Container Up แต่ curl http://localhost:8081/api/graphql timeout

สาเหตุที่เป็นไปได้:

  1. APP_PORT ผิด — ตรวจสอบ env ใน docker-compose
  2. database connection ค้าง — Node ฟัง port แต่ไม่ตอบเพราะรอ db
  3. CORS หรือ middleware block

การตรวจสอบ:

bash
docker exec vtrc-api-nodejs netstat -tln
docker logs vtrc-api-nodejs | tail -100

nginx ส่ง 502 Bad Gateway

อาการ: เว็บแสดง 502

สาเหตุ: nginx upstream ไม่ตอบ (ทุก replica ของ vtrc-api ล้มเหลว)

การตรวจสอบ:

bash
docker ps --filter "name=vtrc-api"
docker logs vtrc-web-server | tail -30

ดู error log ของ nginx:

bash
tail -100 /home/dev/vtrc-api/nginx-log/error-api-443.log

สรุป

  • start ทั้งหมด: docker-compose up -d
  • stop ทั้งหมด: docker-compose down (ลบ container) หรือ docker-compose stop (หยุดเท่านั้น)
  • restart replica เดียว: docker restart <container-name>
  • reload nginx: docker exec vtrc-web-server nginx -s reload
  • ตรวจสอบสถานะ: docker-compose ps + docker logs --tail 100 <container-name>

บทถัดไปจะลงรายละเอียดการ deploy เวอร์ชันใหม่