Auto Deploy ด้วย SSH และ rsync จาก CI/CD ไปยัง Cloud VPS

Auto Deploy ด้วย SSH และ rsync เป็นวิธีที่มีประสิทธิภาพในการปรับปรุงกระบวนการ CI/CD Pipeline โดยทำให้การนำส่งโค้ดไปยัง Cloud VPS เป็นอัตโนมัติ ลดเวลารอ และลดข้อผิดพลาดที่อาจเกิดจากการทำงานด้วยมือ

rsync คืออะไร?

rsync (remote synchronization) เป็นเครื่องมือสำหรับการคัดลอกและซิงโครไนซ์ไฟล์ระหว่างเซิร์ฟเวอร์ จุดเด่นคือช่วยส่งเฉพาะไฟล์ที่เปลี่ยนแปลงสามารถลดเวลาและทรัพยากรที่ใช้ในการ Deploy ได้เป็นอย่างมาก

ข้อดีของ rsync:

  • ส่งเฉพาะไฟล์ที่เปลี่ยนแปลง ประหยัดแบนด์วิดธ์
  • ทำงานได้เร็ว อัฟโหลดเฉพาะส่วนที่เปลี่ยน
  • สามารถตั้งค่าเพื่อลบไฟล์เก่าอัตโนมัติ
  • รองรับ Exclude Patterns เพื่อข้ามไฟล์ต่างๆ
  • ส่งผ่าน SSH ได้อย่างปลอดภัย

ตั้งค่า SSH Key สำหรับ CI/CD

ssh-keygen -t ed25519 -f deploy_key -N ""
cat deploy_key.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

นำ Private Key ไปเพิ่มใน GitHub/GitLab Secrets และนำ Public Key ไปเพิ่มใน ~/.ssh/authorized_keys บน VPS

ตัวอย่าง rsync Command พื้นฐาน

rsync -avz --delete \
  -e "ssh -i /tmp/deploy_key -o StrictHostKeyChecking=no" \
  ./build/ [email protected]:/home/deploy_user/app/

คำอธิบาย Flags:

  • -a (archive): คัดลอกแบบเก็บสิทธิ์และเวลา
  • -v (verbose): แสดงรายละเอียดการทำงาน
  • -z (compress): บีบอัดข้อมูลระหว่างส่ง
  • --delete: ลบไฟล์บน Server ที่ไม่มีในต้นทาง
  • -e "ssh -i ...": ระบุ SSH Key และ Options

GitHub Actions Workflow ด้วย rsync

name: Deploy with rsync

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Build application
        run: npm run build

      - name: Setup SSH
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan -H ${{ secrets.VPS_HOST }} >> ~/.ssh/known_hosts

      - name: Deploy with rsync
        run: |
          rsync -avz --delete \
            -e "ssh -i ~/.ssh/id_ed25519" \
            ./build/ ${{ secrets.DEPLOY_USER }}@${{ secrets.VPS_HOST }}:/var/www/app/

      - name: Restart services
        run: |
          ssh -i ~/.ssh/id_ed25519 ${{ secrets.DEPLOY_USER }}@${{ secrets.VPS_HOST }} \
            "cd /var/www/app && pm2 restart app"

GitLab CI Pipeline ด้วย rsync

stages:
  - build
  - deploy

build:
  stage: build
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - build/

deploy:
  stage: deploy
  image: alpine:latest
  before_script:
    - apk add --no-cache openssh-client rsync
    - mkdir -p ~/.ssh
    - echo "$DEPLOY_KEY" > ~/.ssh/id_ed25519
    - chmod 600 ~/.ssh/id_ed25519
    - ssh-keyscan -H $VPS_HOST >> ~/.ssh/known_hosts
  script:
    - rsync -avz --delete -e "ssh -i ~/.ssh/id_ed25519" build/ $DEPLOY_USER@$VPS_HOST:/var/www/app/
    - ssh -i ~/.ssh/id_ed25519 $DEPLOY_USER@$VPS_HOST "pm2 restart app"
  only:
    - main

เทคนิค rsync ที่ควรรู้

ใช้ –exclude เพื่อข้ามไฟล์ที่ไม่จำเป็น

rsync -avz --delete \
  --exclude='.env' \
  --exclude='node_modules' \
  --exclude='.git' \
  --exclude='*.log' \
  -e "ssh -i ~/.ssh/deploy_key" \
  ./app/ [email protected]:/var/www/app/

Atomic Deploy เพื่อหลีกเลี่ยง Downtime

# ส่งไฟล์ไปยังโฟล์เดอร์ชั่วคราวก่อน
rsync -avz --delete \
  -e "ssh -i ~/.ssh/deploy_key" \
  ./build/ [email protected]:/var/www/app_new/

# สลับชื่อ Directory อย่าง Atomic
ssh [email protected] << 'EOF'
  mv /var/www/app /var/www/app_old
  mv /var/www/app_new /var/www/app
  rm -rf /var/www/app_old
EOF

ทดสอบก่อนด้วย –dry-run

rsync -avz --delete --dry-run \
  -e "ssh -i ~/.ssh/deploy_key" \
  ./build/ [email protected]:/var/www/app/

ใช้ --dry-run เพื่อจำลองการส่งไฟล์โดยไม่ส่งจริง ช่วยตรวจสอบว่าจะเกิดอะไรขึ้นก่อนทำจริง

ความปลอดภัยในการ Deploy

  • เก็บ Private Key ใน Secrets ของ CI/CD ไม่ใส่ใน Repository
  • สร้าง Deploy User เฉพาะที่มีสิทธิ์จำกัด ไม่ใช้ root
  • ปิดการ Authenticate ด้วยรหัส SSH ใช้แต่ SSH Key
  • Monitor Deploy Logs สม่ำเสมอ

rsync Deploy บน ผู้ให้บริการโฮสติ้ง Cloud VPS

เมื่อต้องการตั้งค่า Auto Deploy สำหรับแอปพลิเคชันบน ผู้ให้บริการโฮสติ้ง Cloud VPS ที่ de.co.th/cloud-vps คุณจะได้พื้นที่เซิร์ฟเวอร์ที่มีประสิทธิภาพสูง ความเสถียร และรองรับเครื่องมือ DevOps ที่ทันสมัย ช่วยให้คุณ Deploy ได้อย่างรวดเร็วและมั่นคง

สนใจใช้บริการ Cloud VPS สอบถามได้ที่ de.co.th