อัปเดต WordPress Container โดยไม่ Downtime

การอัปเดต WordPress Container บน Docker โดยไม่มี Downtime เป็นสิ่งสำคัญสำหรับเว็บไซต์ที่ต้องให้บริการตลอด 24 ชั่วโมง บทความนี้จะแนะนำเทคนิกการอัปเดต WordPress Docker Container แบบ Zero Downtime บน Cloud VPS ของ de.co.th

ทำไม Zero Downtime ถึงสำคัญ?

ทุกนาที่เว็บไซต์ไม่สามารถเข้าตทุงได้ หมายถึงว่าช่วงซำเหระผู้เข้า รายได้ คำขอ โดยเฉพาะเมื่อ Patch Security, อัปเงิน WordPress Version หรือเปลี่ยน PHP Version ได้โดยไม่กระทบผู้ใช้งาน การอัปเดตแบบ Zero Downtime ช่วยให้คุณ Patch Security, อัปเงิน WordPress Version หรือเปลี่ยน PHP Version ได้โดยไม่กระทบผู้ใช้งาน

วิธีที่ 1: Blue-Green Deployment

Blue-Green Deployment คือการรัน WordPress สอง Container พร้อมกัน โดย Container เดิม (Blue) ยังรับ Traffic อยู่ ขณะที่ Container ใหม่ (Green) เตรียมพร้อม เมื่อ Green พร้อมแล้วจึงสลิบ Traffic ไป:

# Pull WordPress image ใหม่
docker pull wordpress:6-php8.2-fpm

# สร้าง Container ใหม่ (Green) โดยยังไม่เชื่อมต่อ Nginx
docker-compose up -d --no-deps --scale wordpress=2 wordpress

# รอให้ Container ใหม่พร้อม
sleep 10

# ตรวจสอบว่า Container ใหม่ทำงานปกติ
docker exec wp_app_2 php -r "echo 'PHP OK';"

วิธีที่ 2: Rolling Update ด้วย Docker Compose

สำหรับ Setup ที่ไม่ซับซ้อน คุณสามารถใช้ Rolling Update ด้วย Docker Compose โดยตรง วิธีนี้จะหยุด Container เดิมและสร้างใหม่อย่างรวดเร็ว ทำให้ Downtime น้อยมาก (เพียงไม่กีวินาที):

# ดึง Image ใหม่ก่อน (ไม่กระทบ Container ที่รันอยู่)
docker-compose pull wordpress

# Recreate เฉพาะ WordPress Container
docker-compose up -d --no-deps --force-recreate wordpress

# ตรวจสอบสถานะ
docker-compose ps

วิธีที่ 3: ใช้ Nginx Health Check + Upstream

ตั้งค่า Nginx ให้ตรวจสอบ Health ของ WordPress Container และส่ง Traffic เฉพาะไปยัง Container ที่พร้อม:

upstream wordpress_backend {
    server wordpress_1:9000;
    server wordpress_2:9000 backup;
}

server {
    listen 80;
    server_name yourdomain.com;

    location ~ \.php$ {
        fastcgi_pass wordpress_backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

สร้าง Update Script อัตโนมัติ

สร้าง Shell Script สำหรับอัปเดตอัตโนมัติที่รวมขั้นตอนทั้งหมด:

#!/bin/bash
# update-wordpress.sh
set -e

echo "[$(date)] Starting WordPress update..."

# Backup ก่อนอัปเดต
docker exec wp_mariadb mysqldump -u root -p$DB_ROOT_PASSWORD wordpress > backup_$(date +%Y%m%d).sql

# Pull image ใหม่
docker-compose pull wordpress

# Recreate Container
docker-compose up -d --no-deps --force-recreate wordpress

# รอให้พร้อม
sleep 5

# ตรวจสอบ Health
if curl -sf http://localhost > /dev/null; then
    echo "[$(date)] Update successful!"
else
    echo "[$(date)] Update failed! Rolling back..."
    docker-compose down
    docker-compose up -d
fi

ข้อควรระวังเมื่ออัปเดต

ก่อนอัปเดตทุกครั้ง ควรปฏิบัติตามขั้นตอนเหล่านี้เพื่อลดความเสียเงิน: เติม Backup Database และ Volume ทุกครั้ง, ทดสอบ Image ใหม่ใน Staging Environment ก่อน, ตรวจสอบ Compatibility ของ Plugin กับ WordPress Version ใหม่, เตรียม Rollback Plan ไว้เสมอ และ Monitor Logs หลังอัปเดตอย่างน้อย 30 นาที

ตั้งค่า Auto-Update ด้วย Watchtower

Watchtower เป็น Container ที่คอย Monitor และอัปเดต Docker Container อัตโนมัติเมื่อมี Image ใหม่:

# เพิ่ม Watchtower ใน docker-compose.yml
watchtower:
  image: containrrr/watchtower
  container_name: watchtower
  restart: always
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  environment:
    - WATCHTOWER_CLEANUP=true
    - WATCHTOWER_SCHEDULE=0 0 3 * * *
  command: wp_app

สรุป

การอัปเดต WordPress Container แบบ Zero Downtime บน Cloud VPS ของ de.co.th สามารถทำได้หลายวิธี ตั้งแต่ Blue-Green Deployment, Rolling Update ไปจนถึงการใช้ Watchtower สำหรับ Auto-Update สิ่งสำคัญคือต้อง Backup ก่อนทุกครั้ง และมี Rollback Plan เตรียมไว้เสมอ เพื่อให้เว็บไซต์ของคุณพร้อมให้บริการตลอดเวลา