- หน้าแรก
- เซิร์ฟเวอร์ต้นทาง
- ตรวจสอบ
ตรวจสอบ
การทดสอบเบื้องต้น (Smoke Tests)
หัวข้อที่มีชื่อว่า “การทดสอบเบื้องต้น (Smoke Tests)”รันการตรวจสอบเหล่านี้หลังจากรอ 5—10 นาที เพื่อให้ cloud-init ทำงานเสร็จสมบูรณ์
Health Endpoint
หัวข้อที่มีชื่อว่า “Health Endpoint”ORIGIN_IP=$(terraform output -raw public_ip)
curl -sf "http://${ORIGIN_IP}/health" | jq .ผลลัพธ์ที่คาดหวัง:
{ "status": "healthy", "component": "origin-server", "applications": ["juice-shop", "dvwa", "vampi", "httpbin", "whoami", "csd-demo", "dvga", "restaurant", "crapi"]}Endpoints ของแอปพลิเคชัน
หัวข้อที่มีชื่อว่า “Endpoints ของแอปพลิเคชัน”# Default landing pagecurl -sf "http://${ORIGIN_IP}/" -o /dev/null -w "Landing: %{http_code}\n"
# Juice Shopcurl -sf "http://${ORIGIN_IP}/juice-shop/" -o /dev/null -w "Juice Shop: %{http_code}\n"
# DVWAcurl -sf "http://${ORIGIN_IP}/dvwa/" -o /dev/null -w "DVWA: %{http_code}\n"
# VAmPIcurl -sf "http://${ORIGIN_IP}/vampi/" -o /dev/null -w "VAmPI: %{http_code}\n"
# httpbincurl -sf "http://${ORIGIN_IP}/httpbin/get" -o /dev/null -w "httpbin: %{http_code}\n"
# whoamicurl -sf "http://${ORIGIN_IP}/whoami/" -o /dev/null -w "whoami: %{http_code}\n"
# DVGAcurl -sf "http://${ORIGIN_IP}/dvga/" -o /dev/null -w "DVGA: %{http_code}\n"
# RESTaurantcurl -sf "http://${ORIGIN_IP}/restaurant/docs" -o /dev/null -w "RESTaurant: %{http_code}\n"
# crAPI (port 8888)curl -sf "http://${ORIGIN_IP}:8888" -o /dev/null -w "crAPI: %{http_code}\n"ทั้งหมดควรคืนค่า 200 (DVWA จะคืนค่า 302 redirect ไปยังหน้า login)
การทดสอบเบื้องต้นแบบอัตโนมัติ
หัวข้อที่มีชื่อว่า “การทดสอบเบื้องต้นแบบอัตโนมัติ”Repository นี้มีชุดทดสอบ smoke test จำนวน 39 รายการ:
./tests/smoke-test.sh ${ORIGIN_IP}ชุดทดสอบนี้จะตรวจสอบแอปพลิเคชันทั้ง 9 รายการ, health endpoints, การลงทะเบียน/เข้าสู่ระบบของ VAmPI, การทดสอบ exfil round-trip ของ CSD Demo, GraphQL ของ DVGA, Swagger ของ RESTaurant, crAPI บนพอร์ต 8888, nginx gzip และการซ่อนเวอร์ชัน
สถานะ Docker Container
หัวข้อที่มีชื่อว่า “สถานะ Docker Container”SSH เข้าสู่ VM และตรวจสอบว่า container ทั้ง 41 รายการกำลังทำงาน:
ssh azureuser@${ORIGIN_IP} "sudo docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" | sortผลลัพธ์ที่คาดหวัง (41 containers):
NAMES STATUS PORTScrapi-community Up X minutescrapi-identity Up X minutescrapi-mailhog Up X minutes 0.0.0.0:18025->8025/tcpcrapi-mongo Up X minutes 27017/tcpcrapi-postgres Up X minutes 5432/tcpcrapi-web Up X minutes 0.0.0.0:8888->80/tcpcrapi-workshop Up X minutescsd-demo-1 Up X minutes 127.0.0.1:5001->5001/tcpcsd-demo-2 Up X minutes 127.0.0.1:5002->5001/tcpcsd-demo-3 Up X minutes 127.0.0.1:5003->5001/tcpcsd-demo-4 Up X minutes 127.0.0.1:5004->5001/tcpdvga-1 Up X minutes 127.0.0.1:5201->5013/tcpdvga-2 Up X minutes 127.0.0.1:5202->5013/tcpdvga-3 Up X minutes 127.0.0.1:5203->5013/tcpdvga-4 Up X minutes 127.0.0.1:5204->5013/tcpdvwa-1 Up X minutes 127.0.0.1:8101->80/tcpdvwa-2 Up X minutes 127.0.0.1:8102->80/tcpdvwa-3 Up X minutes 127.0.0.1:8103->80/tcpdvwa-4 Up X minutes 127.0.0.1:8104->80/tcpdvwa-db Up X minutes 3306/tcphttpbin-1 Up X minutes 127.0.0.1:8201->80/tcphttpbin-2 Up X minutes 127.0.0.1:8202->80/tcphttpbin-3 Up X minutes 127.0.0.1:8203->80/tcphttpbin-4 Up X minutes 127.0.0.1:8204->80/tcpjuice-shop-1 Up X minutes 127.0.0.1:3001->3000/tcpjuice-shop-2 Up X minutes 127.0.0.1:3002->3000/tcpjuice-shop-3 Up X minutes 127.0.0.1:3003->3000/tcpjuice-shop-4 Up X minutes 127.0.0.1:3004->3000/tcprestaurant-1 Up X minutes 127.0.0.1:8301->8080/tcprestaurant-2 Up X minutes 127.0.0.1:8302->8080/tcprestaurant-3 Up X minutes 127.0.0.1:8303->8080/tcprestaurant-4 Up X minutes 127.0.0.1:8304->8080/tcprestaurant-db Up X minutes 5432/tcpvampi-1 Up X minutes 127.0.0.1:5101->5000/tcpvampi-2 Up X minutes 127.0.0.1:5102->5000/tcpvampi-3 Up X minutes 127.0.0.1:5103->5000/tcpvampi-4 Up X minutes 127.0.0.1:5104->5000/tcpwhoami-1 Up X minutes 127.0.0.1:8082->80/tcpwhoami-2 Up X minutes 127.0.0.1:8083->80/tcpwhoami-3 Up X minutes 127.0.0.1:8084->80/tcpwhoami-4 Up X minutes 127.0.0.1:8085->80/tcpสถานะ nginx
หัวข้อที่มีชื่อว่า “สถานะ nginx”ssh azureuser@${ORIGIN_IP} "sudo nginx -t && sudo systemctl status nginx --no-pager"การแก้ไขปัญหา
หัวข้อที่มีชื่อว่า “การแก้ไขปัญหา”cloud-init ยังทำงานอยู่
หัวข้อที่มีชื่อว่า “cloud-init ยังทำงานอยู่”หาก endpoints คืนค่า 502 หรือปฏิเสธการเชื่อมต่อ อาจเป็นเพราะ cloud-init ยังอยู่ในขั้นตอนการจัดเตรียม:
ssh azureuser@${ORIGIN_IP} "cloud-init status"status: running— ยังอยู่ในขั้นตอนการจัดเตรียม รอสักครู่status: done— การจัดเตรียมเสร็จสมบูรณ์ ให้ตรวจสอบ Docker containersstatus: error— ตรวจสอบ logs ด้านล่าง
Logs ของ cloud-init
หัวข้อที่มีชื่อว่า “Logs ของ cloud-init”ssh azureuser@${ORIGIN_IP} "sudo tail -100 /var/log/cloud-init-output.log"Container ไม่สามารถเริ่มต้นได้
หัวข้อที่มีชื่อว่า “Container ไม่สามารถเริ่มต้นได้”# Check container logs (each app has 4 instances: -1 through -4)ssh azureuser@${ORIGIN_IP} "sudo docker logs juice-shop-1 2>&1 | tail -20"ssh azureuser@${ORIGIN_IP} "sudo docker logs dvwa-1 2>&1 | tail -20"ssh azureuser@${ORIGIN_IP} "sudo docker logs vampi-1 2>&1 | tail -20"ssh azureuser@${ORIGIN_IP} "sudo docker logs httpbin-1 2>&1 | tail -20"ssh azureuser@${ORIGIN_IP} "sudo docker logs csd-demo-1 2>&1 | tail -20"ssh azureuser@${ORIGIN_IP} "sudo docker logs dvga-1 2>&1 | tail -20"ssh azureuser@${ORIGIN_IP} "sudo docker logs restaurant-1 2>&1 | tail -20"ssh azureuser@${ORIGIN_IP} "sudo docker logs crapi-web 2>&1 | tail -20"nginx คืนค่า 502
หัวข้อที่มีชื่อว่า “nginx คืนค่า 502”upstream container ยังไม่พร้อมหรือเกิดข้อผิดพลาด:
# Check nginx error logssh azureuser@${ORIGIN_IP} "sudo tail -20 /var/log/nginx/error.log"
# Restart all instances of a specific appssh azureuser@${ORIGIN_IP} "for i in 1 2 3 4; do sudo docker restart juice-shop-\$i; done"
# Rebuild and restart all containersssh azureuser@${ORIGIN_IP} "cd /opt/origin-server && sudo docker compose build && sudo docker compose up -d"พื้นที่ดิสก์
หัวข้อที่มีชื่อว่า “พื้นที่ดิสก์”Docker images ใช้พื้นที่ประมาณ 4.7 GiB การบันทึก access log ถูกปิดใช้งานเพื่อป้องกันดิสก์เต็มจากการทดสอบโหลด CDN Logrotate ถูกกำหนดค่าเป็นการป้องกันเชิงลึก (จำกัดที่ 500 MiB) ตรวจสอบการใช้งานดิสก์:
ssh azureuser@${ORIGIN_IP} "df -h / && sudo docker system df"หน่วยความจำของ Container
หัวข้อที่มีชื่อว่า “หน่วยความจำของ Container”ตรวจสอบ containers ที่ใกล้ถึงขีดจำกัดหน่วยความจำ (ความเสี่ยง OOM):
ssh azureuser@${ORIGIN_IP} "sudo docker stats --no-stream --format 'table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}' | sort"รีสตาร์ททุกอย่าง
หัวข้อที่มีชื่อว่า “รีสตาร์ททุกอย่าง”หากจำเป็น ให้ rebuild และรีสตาร์ทบริการทั้งหมด:
ssh azureuser@${ORIGIN_IP} "cd /opt/origin-server && sudo docker compose down && sudo docker compose build && sudo docker compose up -d && sudo systemctl restart nginx"