Backup และ Restore WordPress Docker Volumes

Backup และ Restore WordPress Docker Volumes เป็นสิ่งจำเป็นสุดสำหรับทุกเว็บไซต์ที่รันบน Docker บน Cloud VPS ของ de.co.th หาก Container หรือ Server มีปัญหา คุณต้องสามารถกู้คืนข้อมูลได้อย่างรวดเร็ว บทความนี้จะแนะนำวิธี Backup ทั้ง Database และ WordPress Files รวมถึงการ Restore อย่างถูกต้อง

ทำความเข้าใจ Docker Volumes สำหรับ WordPress

WordPress ที่รันบน Docker มี Volume หลักส่วนที่ต้อง Backup คือ WordPress Files Volume ที่เก็บไฟล์ wp-content ทั้งหมด ได้แก่ Themes, Plugins, Uploads และ Configuration กับ Database Volume ที่เก็บข้อมูล MySQL/MariaDB ทั้งหมด ได้แก่ Posts, Pages, Users และ Settings

Backup Database ด้วย mysqldump

วิธีที่น่าเชื่อถือในการ Backup Database คือการใช้ mysqldump ผ่าน Docker exec:

# Backup Database
docker exec wp_mariadb mysqldump -u root -p"$DB_ROOT_PASSWORD" \
  --single-transaction \
  --quick \
  --lock-tables=false \
  wordpress > backup/db_$(date +%Y%m%d_%H%M%S).sql

# ตรวจสอบขนาดไฟล์ Backup
ls -lh backup/db_*.sql

Option –single-transaction ทำให้ Backup เป็น Consistent Snapshot โดยไม่ต้อง Lock Tables ซึ่งสำคัญมากเรื่อง Production ที่มีผู้ใช้งานอยู่

Backup WordPress Files Volume

ใช้ Docker Container ชั่วครั้วเพื่อ Backup WordPress Volume เป็นไฟล์ tar.gz:

# Backup WordPress Files
docker run --rm \
  -v wordpress_wp_data:/source:ro \
  -v $(pwd)/backup:/backup \
  alpine tar czf /backup/wp_files_$(date +%Y%m%d_%H%M%S).tar.gz -C /source .

# หรือถ้าใช้ Bind Mount
tar czf backup/wp_files_$(date +%Y%m%d_%H%M%S).tar.gz -C ./wp_data .

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

รวมทุกขั้นตอนเป็น Script เดียวที่รันอัตโนมัติ:

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

BACKUP_DIR="/opt/wordpress-production/backup"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30

mkdir -p $BACKUP_DIR

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

# Backup Database
echo "Backing up database..."
docker exec wp_mariadb mysqldump -u root -p"$DB_ROOT_PASSWORD" \
  --single-transaction --quick wordpress > "$BACKUP_DIR/db_$DATE.sql"

# Backup WordPress Files
echo "Backing up WordPress files..."
tar czf "$BACKUP_DIR/wp_files_$DATE.tar.gz" -C ./wp_data .

# Backup docker-compose.yml และ config
tar czf "$BACKUP_DIR/config_$DATE.tar.gz" docker-compose.yml .env nginx/

# ลบ Backup เก่ากว่า 30 วัน
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -delete

echo "[$(date)] Backup completed!"
echo "Database: $BACKUP_DIR/db_$DATE.sql"
echo "Files: $BACKUP_DIR/wp_files_$DATE.tar.gz"

ตั้งค่า Cron Job สำหรับ Backup อัตโนมัติ

เพิ่ม Cron Job ให้ Backup ทุกวันตอนตี 3:

# เปิด Crontab
crontab -e

# เพิ่มบรรทัดนี้
0 3 * * * /opt/wordpress-production/backup-wordpress.sh >> /var/log/wp-backup.log 2>&1

Restore Database

เมื่อต้องการ Restore Database จากไฟล์ Backup:

# Restore Database
cat backup/db_20250327_030000.sql | docker exec -i wp_mariadb \
  mysql -u root -p"$DB_ROOT_PASSWORD" wordpress

# ตรวจสอบว่า Restore สำเร็จ
Docker exec wp_mariadb mysql -u root -p"$DB_ROOT_PASSWORD" \
  -e "SELECT COUNT(*) FROM wordpress.wp_posts;"

Restore WordPress Files Volume

Restore ไฟล์ WordPress จาก Backup:

# หยุด WordPress Container ก่อน
Docker-compose stop wordpress

# Restore Files
tar xzf backup/wp_files_20250327_030000.tar.gz -C ./wp_data/

# แก้ไข Permission
Docker-compose run --rm wordpress chown -R www-data:www-data /var/www/html

# เริ่ม WordPress Container ใหม่
Docker-compose start wordpress

Backup ไปยัง Remote Storage

เพื่อความปลอดภัยเพิ่มเขา คุณควร Copy Backup ไปยัง Remote Storage ด้วย:

# ส่งไปยัง Remote Server ด้วย rsync
rsync -avz backup/ user@backup-server:/backups/wordpress/

# หรือใช้ rclone ส่งไป Cloud Storage
rclone copy backup/ remote:wordpress-backups/ --transfers=4

สรุป

การ Backup และ Restore WordPress Docker Volumes บน Cloud VPS ของ de.co.th เป็นสิ่งที่ต้องทำอย่างสม่ำเสมอ ควรตั้ง Cron Job ให้ Backup อัตโนมัติทุกวัน เก็บ Backup ไว้ทั้ง Local และ Remote Storage และทดสอบ Restore เป็นระยะเพื่อให้มั่นใจว่า Backup ใช้งานได้จริง การมี Backup ที่ดีจะช่วยให้คุณกู้คืนเว็บไซต์ได้อย่างรวดเร็วเมื่อเกิดปัญหา