Workshop: Auto Deploy WordPress ด้วย GitHub Actions + Plesk

Auto Deploy WordPress คืออะไร และข้อดีคืออะไร

Auto Deploy WordPress เป็นกระบวนการอัตโนมัติในการปรับใช้ (Deploy) เว็บไซต์ WordPress จากเซิร์ฟเวอร์ Git ไปยัง Server โดยไม่ต้องทำด้วยตนเอง เมื่อผู้พัฒนาทำการ Push โค้ดไปยัง Repository บน GitHub หรือ GitLab ระบบจะทำการอัตโนมัติดึงโค้ดใหม่ และปรับใช้บนเว็บไซต์ของคุณ

ข้อดีของ Auto Deploy WordPress:

  • ประหยัดเวลา: ไม่ต้องเข้า FTP หรือ SSH เพื่ออัปโหลดไฟล์แต่ละครั้ง
  • ลดข้อผิดพลาด: ไม่มีการลืมอัปเดตไฟล์สำคัญ ทุกอย่างเป็นอัตโนมัติและสอดคล้องกัน
  • การทำงานเป็นทีม: หลายคนสามารถ Push ไปยัง Repository ได้ และระบบจะจัดการการปรับใช้อย่างปลอดภัย
  • ประวัติการเปลี่ยนแปลง: ทุกการปรับใช้ถูกบันทึกไว้ใน Git Commit History
  • Rollback ง่าย: หากมีปัญหา สามารถกลับไปเวอร์ชันเก่าได้ด้วยการ Revert Commit
  • ความปลอดภัย: ใช้ SSH Keys เพื่อการเชื่อมต่อที่ปลอดภัย ไม่ต้องแสดง FTP Password

สิ่งที่ต้องเตรียม

ก่อนเริ่มการตั้งค่า Auto Deploy WordPress ต้องเตรียมส่วนประกอบต่อไปนี้:

1. VPS + Plesk

ต้องมี Server VPS ที่ติดตั้ง Plesk แล้ว Plesk จะช่วยอำนวยความสะดวกในการจัดการ Git Deployment ของคุณ บริการ VPS มี Plesk ติดตั้งและพร้อมใช้งานแล้ว

2. GitHub Account

ต้องมี GitHub Account และสร้าง Private Repository สำหรับโปรเจกต์ WordPress ของคุณ ใช้ GitHub เพราะมี GitHub Actions ที่ช่วยในการสร้าง CI/CD Workflow

3. WordPress Site ที่พร้อม

ต้องมีเว็บไซต์ WordPress ที่ติดตั้งแล้ว ต้องเพิ่มโฟลเดอร์ .github/workflows เพื่อเก็บ Workflow Files ของ GitHub Actions

4. SSH Key Pair

ต้องสร้าง SSH Key Pair (Public Key และ Private Key) สำหรับการเชื่อมต่ออย่างปลอดภัยระหว่าง GitHub Actions กับ Server

การตั้งค่า SSH Key สำหรับ GitHub Actions

ทำตามขั้นตอนต่อไปนี้เพื่อตั้งค่า SSH Key:

ขั้นตอนที่ 1: สร้าง SSH Key บน Server

เข้าไปยัง Server ผ่าน SSH และรันคำสั่งต่อไปนี้:

ssh-keygen -t rsa -b 4096 -f ~/.ssh/github_deploy -N ""
cat ~/.ssh/github_deploy.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

ขั้นตอนที่ 2: คัดลอก Private Key

คัดลอกเนื้อหาของ Private Key:

cat ~/.ssh/github_deploy

คัดลอกข้อความทั้งหมด รวม BEGIN และ END PRIVATE KEY

ขั้นตอนที่ 3: เพิ่ม Secret ใน GitHub Repository

  1. ไปที่ Repository ของคุณบน GitHub
  2. คลิก Settings > Secrets and Variables > Actions
  3. คลิก “New repository secret”
  4. ตั้งชื่อ Secret เป็น SSH_PRIVATE_KEY และวาง Private Key ที่คัดลอก
  5. คลิก “Add secret”

การสร้าง GitHub Actions Workflow

สร้าง Workflow File ในโฟลเดอร์ .github/workflows/

สร้างไฟล์ wordpress-deploy.yml:

name: WordPress Auto Deploy

on:
  push:
    branches:
      - main
      - production

jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout Code
      uses: actions/checkout@v3
      with:
        fetch-depth: 0
    
    - name: Deploy to Server via SSH
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.SERVER_HOST }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        port: ${{ secrets.SSH_PORT }}
        script: |
          cd /var/www/html/wordpress-site
          git pull origin ${{ github.ref_name }}
          
          # ลบ wp-config.php บน Git (ถ้ามี)
          if [ -f .gitignore ]; then
            echo 'wp-config.php' >> .gitignore
          fi
          
          # อัปเดต Database (ถ้าจำเป็น)
          wp core update-db --allow-root
          
          # เคลียร์ Cache
          wp cache flush --allow-root
          
          # ตั้งสิทธิ์ไฟล์
          chown -R nobody:nobody /var/www/html/wordpress-site
          find /var/www/html/wordpress-site -type f -exec chmod 644 {} \;
          find /var/www/html/wordpress-site -type d -exec chmod 755 {} \;
          chmod 600 /var/www/html/wordpress-site/wp-config.php
    
    - name: Send Notification
      if: always()
      uses: 8398a7/action-slack@v3
      with:
        status: ${{ job.status }}
        text: 'WordPress Deployment Status: ${{ job.status }}'
        webhook_url: ${{ secrets.SLACK_WEBHOOK }}
        fields: repo,message,commit,author

การตั้งค่า Secrets ใน GitHub Repository

ต้องเพิ่ม Secrets ต่อไปนี้ใน GitHub Repository เพื่อให้ Workflow ทำงานได้:

Secrets ที่จำเป็น:

  1. SERVER_HOST – IP Address หรือ Domain Name ของ Server
  2. SERVER_USER – SSH Username สำหรับเข้า Server
  3. SSH_PRIVATE_KEY – Private SSH Key สำหรับการเชื่อมต่อ
  4. SSH_PORT – SSH Port (โดยปกติคือ 22)

Optional:

  • SLACK_WEBHOOK – สำหรับส่งการแจ้งเตือนไปยัง Slack (ถ้าใช้)

วิธีเพิ่ม Secrets:

  1. ไปที่ Settings > Secrets and Variables > Actions
  2. คลิก “New repository secret” สำหรับแต่ละ Secret
  3. ป้อนชื่อและค่าของ Secret
  4. คลิก “Add secret”

การ Configure Plesk รับ Deployment

ต้องตั้งค่า Plesk เพื่อให้พร้อมรับการ Deploy จาก GitHub Actions:

ขั้นตอนการตั้งค่า:

  1. เข้าไปในแผงควบคุม Plesk
  2. เลือก Domain ที่ต้องการ Deploy
  3. ไปที่ Files > Home Directory
  4. ตัวสร้าง .htaccess ให้อนุญาต Git Pull
  5. หรือเปิดใช้ Git Repository ใน Plesk โดยไปที่ Tools & Settings > Git
  6. ตั้งค่า Repository URL เป็น GitHub URL
  7. ป้อน SSH Deploy Key

การทดสอบ Auto Deploy

เพื่อทดสอบว่า Auto Deploy ทำงานได้หรือไม่ ให้ทำตามขั้นตอนต่อไปนี้:

ขั้นตอนการทดสอบ:

  1. สร้างการเปลี่ยนแปลงเล็กน้อยในโค้ด (เช่น แก้ไขความคิดเห็น)
  2. Commit และ Push ไปยัง Repository
  3. ไปที่ Actions tab ใน GitHub
  4. ดูสถานะของ Workflow
  5. รอจนกว่า Workflow จะเสร็จสิ้น
  6. ตรวจสอบเว็บไซต์ของคุณ เพื่อดูว่าการเปลี่ยนแปลงปรากฏแล้วหรือไม่

การตั้งค่า Rollback เมื่อเกิดปัญหา

หากการ Deploy ทำให้เกิดปัญหา สามารถ Rollback (กลับไปเวอร์ชันเก่า) ได้อย่างรวดเร็ว

ตัวเลือกที่ 1: ผ่าน GitHub

# หาลำดับ Commit เก่า
git log --oneline

# Revert ไปยัง Commit เก่า (สร้าง Commit ใหม่ที่ Undo การเปลี่ยนแปลง)
git revert HEAD

# Push กลับไปยัง Repository
git push origin main

ตัวเลือกที่ 2: ผ่าน Server โดยตรง

cd /var/www/html/wordpress-site

# ดูลำดับ Commit
git log --oneline -n 10

# Reset ไปยัง Commit เก่า
git reset --hard 

# เคลียร์ Cache
wp cache flush --allow-root

ถัดไป ให้พิจารณาการสร้างสคริปต์ Rollback อัตโนมัติ:

name: Manual Rollback WordPress

on:
  workflow_dispatch:
    inputs:
      commit_hash:
        description: 'Commit hash to rollback to'
        required: true

jobs:
  rollback:
    runs-on: ubuntu-latest
    
    steps:
    - uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.SERVER_HOST }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        script: |
          cd /var/www/html/wordpress-site
          git reset --hard ${{ github.event.inputs.commit_hash }}
          wp cache flush --allow-root
          echo "Rollback completed to ${{ github.event.inputs.commit_hash }}"

Best Practices สำหรับ WordPress Auto Deploy

ต่อไปนี้เป็นแนวปฏิบัติที่ดีเมื่อใช้ Auto Deploy WordPress:

  • ใช้ .gitignore อย่างถูกต้อง – ไม่ควร push wp-config.php, wp-content/uploads, .env file
  • ทดสอบบน Staging ก่อน – สร้าง Branch staging และทดสอบก่อน merge ไป main
  • ใช้ WordPress CLI – ใช้ wp cli เพื่อรันคำสั่ง WordPress ผ่าน SSH
  • Backup ก่อน Deploy – สร้างสคริปต์ Backup โดยอัตโนมัติก่อนการ Deploy
  • ตรวจสอบ Plugins – ตรวจสอบให้แน่ใจว่า Plugins และ Themes ใช้งานได้ก่อน Deploy
  • ล็อก Database – หากมีการอัปเดต Database ให้ maintenance mode ขณะทำการอัปเดต
  • Plesk พร้อมใช้งาน: Plesk ติดตั้งและตั้งค่าแล้ว ไม่ต้องติดตั้งเอง
  • SSH Access เต็มที่: ได้รับ Full SSH Access เพื่อจัดการ Git และ Deployment
  • Performance สูง: ใช้ SSD NVMe และ Intel Xeon CPU ให้ WordPress ทำงานเร็ว
  • SSL Certificate ฟรี: Let’s Encrypt SSL ฟรี ติดตั้งและต่ออายุอัตโนมัติ
  • Backup อัตโนมัติ: VPS มีระบบ Backup อัตโนมัติ
  • Support 24/7: ทีมสนับสนุน DE พร้อมช่วยเหลือตลอดเวลา
  • DDoS Protection: มี DDoS Protection เพื่อปกป้องเว็บไซต์ของคุณ