14.2 Daily operations — start/stop/restart
บทนี้รวบรวมคำสั่งที่ทีมปฏิบัติการใช้บ่อยในชีวิตประจำวัน — start service, stop, restart, การตรวจสอบหลัง restart
หลักการสำคัญก่อนเริ่ม
- ลำดับการ start สำคัญ — Redis และ database ต้อง start ก่อน Node service เพราะ Node จะเชื่อมต่อทันทีตอน boot
- ไม่มี health check — ต้องตรวจสอบสถานะ service ด้วยตนเองผ่าน log และ URL
- restart ทีละ replica — เพื่อรักษา uptime ของระบบโดยรวม
- 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
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 จะประมาณดังนี้:
vtrc-redis-db— Redisvtrc-web-proxy— nginxvtrc-pma— phpMyAdminvtrc-api,vtrc-api-2,vtrc-api-3,vtrc-api-5— Node replica
cu-central-api host
cd /home/dev/cu-central-api/
docker-compose up -d
docker-compose pscentralize-api host
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
cd /home/dev/vtrc-rc-backoffice/
docker-compose up -d
docker-compose psการ stop service ทั้งหมด
ใช้ตอนที่ต้อง maintenance หรือย้าย host
vtrc-api host
cd /home/dev/vtrc-api/
docker-compose downคำสั่งนี้จะหยุดและลบ container ทั้งหมด (แต่ volume ยังอยู่ — api-storage, api-logs จะไม่หาย)
ถ้าต้องการหยุดแบบไม่ลบ container:
docker-compose stopหยุด service อื่น ๆ
ใช้คำสั่งเดียวกันใน directory ของแต่ละ service
การ restart service เดียว
กรณี service ค้าง (hang) หรือต้อง reload configuration
restart replica เดียวของ vtrc-api
# 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
docker restart vtrc-web-serverหรือ reload nginx โดยไม่ restart container:
docker exec vtrc-web-server nginx -s reloadใช้ reload หลังจากแก้ config ใน ./nginx/default.conf
restart Redis
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
docker restart cu-central-apiการ restart ทีละ replica เพื่อรักษา uptime
เมื่อต้อง deploy หรือ restart ทุก replica ของ vtrc-api ให้ทำทีละตัวเพื่อให้ nginx ส่ง traffic ไป replica อื่นที่ยังรันอยู่
# 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 รันอยู่หรือไม่
docker ps --filter "name=vtrc-api"คอลัมน์ STATUS ควรเป็น Up X minutes (healthy) — แต่ "healthy" จะไม่ปรากฏเพราะ Dockerfile ไม่ได้กำหนด HEALTHCHECK
2. Port ฟังอยู่หรือไม่
docker exec vtrc-api-nodejs netstat -tln | grep 8081หรือจาก host:
curl -I http://localhost:8081/api/graphqlควรได้ HTTP/1.1 200 หรือ redirect
3. Log แสดงความสำเร็จ
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 ยังรัน
docker exec vtrc-api-nodejs ls /usr/src/app/logs/ไฟล์ log ที่มีวันที่ปัจจุบันบ่งชี้ว่า cron รัน
การอัปเดต nginx config โดยไม่ restart
เมื่อแก้ ./nginx/default.conf แล้วต้องการ apply:
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
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) ...
สาเหตุที่เป็นไปได้:
- Environment variable ขาด — เช่น
DB_HOSTว่าง ทำให้ Node crash ตอน connect - Volume mount ไม่ได้ — path บน host ไม่มีอยู่จริง
- Image tag ผิด — pull image ไม่ได้
การตรวจสอบ:
docker logs vtrc-api-nodejs | tail -30Service รัน แต่ไม่ตอบ request
อาการ: Container Up แต่ curl http://localhost:8081/api/graphql timeout
สาเหตุที่เป็นไปได้:
- APP_PORT ผิด — ตรวจสอบ env ใน docker-compose
- database connection ค้าง — Node ฟัง port แต่ไม่ตอบเพราะรอ db
- CORS หรือ middleware block
การตรวจสอบ:
docker exec vtrc-api-nodejs netstat -tln
docker logs vtrc-api-nodejs | tail -100nginx ส่ง 502 Bad Gateway
อาการ: เว็บแสดง 502
สาเหตุ: nginx upstream ไม่ตอบ (ทุก replica ของ vtrc-api ล้มเหลว)
การตรวจสอบ:
docker ps --filter "name=vtrc-api"
docker logs vtrc-web-server | tail -30ดู error log ของ nginx:
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 เวอร์ชันใหม่