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
