Quay lại danh sách
Tin tức công nghệ

Tích hợp VPS với GitHub Actions: Hướng dẫn tự động hóa quy trình deploy code khi push

17 tháng 5, 2026

Giới thiệu về CI/CD và lợi ích của tự động hóa deploy

Trong phát triển phần mềm hiện đại, tốc độ và độ tin cậy là hai yếu tố then chốt quyết định thành công của dự án. Continuous Integration và Continuous Deployment (CI/CD) đã trở thành tiêu chuẩn công nghiệp, cho phép các đội phát triển tích hợp thay đổi code thường xuyên và triển khai chúng một cách tự động, an toàn. Khi kết hợp sức mạnh của GitHub Actions với khả năng tùy chỉnh của Virtual Private Server (VPS), bạn có thể xây dựng một pipeline deploy mạnh mẽ, tiết kiệm chi phí mà vẫn đảm bảo hiệu suất cao.

Bài viết này cung cấp một hướng dẫn toàn diện để thiết lập hệ thống tự động deploy code từ GitHub repository lên VPS của bạn mỗi khi có sự kiện push. Chúng tôi sẽ đi qua từng bước: cấu hình VPS, tạo workflow GitHub Actions, thiết lập bảo mật với SSH keys và secrets, cũng như viết script deploy linh hoạt cho các loại ứng dụng khác nhau.

Tại sao nên tích hợp GitHub Actions với VPS?

Trước khi đi vào chi tiết kỹ thuật, hãy cùng phân tích những lợi ích cụ thể của việc tích hợp này:

  • Tiết kiệm thời gian và giảm lỗi thủ công: Loại bỏ hoàn toàn các bước deploy thủ công như SSH vào server, pull code, cài đặt dependencies và restart service. Mỗi thao tác thủ công đều tiềm ẩn nguy cơ sai sót.
  • Đảm bảo tính nhất quán: Môi trường deploy được định nghĩa bằng code (workflow YAML và script), đảm bảo mọi lần chạy đều giống nhau, bất kể ai thực hiện.
  • Phản hồi nhanh: Nhận thông báo ngay lập tức nếu quá trình build hoặc deploy thất bại, cho phép developer sửa lỗi kịp thời trước khi chúng tích tụ.
  • Chi phí hiệu quả: GitHub Actions cung cấp một lượng miễn phí hàng tháng đáng kể. VPS thường có chi phí cố định thấp hơn nhiều so với các dịch vụ PaaS (Platform as a Service) đầy đủ tính năng.
  • Kiểm soát hoàn toàn: Bạn toàn quyền kiểm soát hệ điều hành, phần mềm, cấu hình mạng và bảo mật trên VPS, điều mà các nền tảng managed không thể cung cấp.

Chuẩn bị môi trường VPS

Bước đầu tiên là chuẩn bị VPS của bạn để đón nhận các deployment tự động.

1. Cấu hình User và Quyền

Không nên sử dụng user root cho mục đích deploy. Hãy tạo một user chuyên dụng:

adduser deployer
usermod -aG sudo deployer
su - deployer
mkdir -p ~/.ssh
chmod 700 ~/.ssh

User deployer này sẽ là tài khoản mà GitHub Actions sử dụng để kết nối SSH vào VPS.

2. Tạo SSH Key Pair và Cấu hình Authorized Keys

Tạo một cặp SSH key mới trên VPS (hoặc trên máy local của bạn). Key private sẽ được lưu trữ bí mật trong GitHub Secrets, key public sẽ được thêm vào VPS.

ssh-keygen -t ed25519 -C "github-actions-deploy-key" -f github-actions-deploy
cat github-actions-deploy.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Lệnh trên tạo key với thuật toán Ed25519 an toàn hơn. Đảm bảo file authorized_keys có quyền chính xác.

3. Cấu hình Firewall và Dịch vụ Cần thiết

Mở cổng cần thiết và cài đặt các công cụ cơ bản:

  • Mở port 22 (SSH): Để GitHub Actions có thể kết nối.
  • Cài đặt Git: sudo apt install git (trên Ubuntu/Debian).
  • Cài đặt Runtime: Node.js, Python, Java, hoặc bất kỳ runtime nào ứng dụng của bạn cần.
  • Cài đặt Process Manager: Xem xét sử dụng systemd, PM2 (cho Node.js), hoặc supervisor để quản lý ứng dụng.

Thiết lập GitHub Repository và Secrets

Với VPS đã sẵn sàng, chúng ta chuyển sang cấu hình phía GitHub.

1. Tạo GitHub Secrets

Truy cập Settings > Secrets and variables > Actions trong repository của bạn. Tạo các secrets sau:

  1. VPS_HOST: Địa chỉ IP hoặc domain của VPS.
  2. VPS_USERNAME: Tên user SSH (ví dụ: deployer).
  3. VPS_SSH_KEY: Nội dung toàn bộ của file SSH private key bạn đã tạo (github-actions-deploy). Lưu ý: Copy toàn bộ nội dung, bao gồm dòng -----BEGIN OPENSSH PRIVATE KEY----- và -----END OPENSSH PRIVATE KEY-----.
  4. VPS_DEPLOY_PATH: Đường dẫn tuyệt đối đến thư mục chứa code trên VPS (ví dụ: /home/deployer/app).

GitHub sẽ mã hóa và lưu trữ các giá trị này an toàn. Workflow có thể tham chiếu đến chúng thông qua cú pháp ${{ secrets.SECRET_NAME }}.

2. Tạo Workflow File

Trong repository, tạo file .github/workflows/deploy.yml. Đây là nơi định nghĩa toàn bộ quy trình CI/CD.

Viết GitHub Actions Workflow Chi tiết

Dưới đây là một workflow mẫu đầy đủ, có chú thích cho từng bước.

name: Deploy to VPS

on:
  push:
    branches: [ main ]
  # Có thể thêm trigger cho nhánh develop
  # pull_request:
  #   branches: [ main ]

jobs:
  test-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js (Ví dụ cho ứng dụng Node)
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test

      - name: Deploy to VPS
        if: success()
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.VPS_HOST }}
          username: ${{ secrets.VPS_USERNAME }}
          key: ${{ secrets.VPS_SSH_KEY }}
          script: |
            cd ${{ secrets.VPS_DEPLOY_PATH }}
            git pull origin main
            npm ci --production
            # Nếu dùng PM2
            pm2 restart my-app || pm2 start npm --name "my-app" -- start
            # Hoặc nếu dùng systemd
            # sudo systemctl restart my-app.service
            echo "Deployment completed successfully!"

Giải thích Workflow:

  • Trigger: Workflow chạy mỗi khi có push lên nhánh main. Bạn có thể tùy chỉnh cho các nhánh khác.
  • Job test-and-deploy: Chạy trên runner Ubuntu mới nhất của GitHub.
  • Bước 1-4 (Checkout, Setup, Install, Test): Đây là phần Continuous Integration. Nó đảm bảo code mới tích hợp không phá vỡ build hoặc test hiện có. Nếu bước Run tests thất bại, job sẽ dừng và không tiến hành deploy.
  • Bước 5 (Deploy to VPS): Chỉ chạy nếu tất cả các bước trước thành công (if: success()). Nó sử dụng action phổ biến appleboy/ssh-action để thiết lập kết nối SSH an toàn đến VPS và thực thi một loạt lệnh script.
  • Script trên VPS: Đoạn script sau | sẽ được chạy trên VPS. Nó thực hiện: di chuyển đến thư mục dự án, pull code mới nhất, cài đặt dependencies production, và khởi động lại dịch vụ ứng dụng.

Nâng cao và Tối ưu hóa

1. Sử dụng Deploy Script chuyên biệt

Thay vì viết script dài trực tiếp trong workflow, hãy tạo một file script riêng trong repository (ví dụ: scripts/deploy.sh) và đẩy nó lên VPS để thực thi. Điều này giúp quản lý dễ dàng hơn và cho phép chạy thử script cục bộ.

# Trong workflow.yml
script: |
  cd ${{ secrets.VPS_DEPLOY_PATH }}
  chmod +x scripts/deploy.sh
  ./scripts/deploy.sh

2. Triển khai Blue-Green hoặc Canary

Đối với ứng dụng yêu cầu thời gian downtime bằng 0, bạn có thể triển khai các chiến lược phức tạp hơn:

  • Blue-Green Deployment: Duy trì hai môi trường giống hệt nhau (Blue và Green). Chỉ có một môi trường phục vụ traffic. Khi deploy phiên bản mới, bạn deploy lên môi trường đang idle, test kỹ lưỡng, sau đó chuyển hướng traffic (bằng load balancer) sang môi trường mới.
  • Canary Deployment: Triển khai phiên bản mới cho một nhóm người dùng nhỏ trước, theo dõi metrics và lỗi, sau đó mới mở rộng ra toàn bộ người dùng.

Việc triển khai các chiến lược này trên VPS đòi hỏi cấu hình thêm về load balancer (như Nginx) và script điều phối phức tạp hơn.

3. Cache Dependencies để tăng tốc độ Build

Sử dụng caching actions của GitHub để lưu trữ dependencies (node_modules, pip packages, etc.) giữa các lần chạy workflow, giúp giảm đáng kể thời gian thực thi.

4. Thông báo kết quả Deploy

Tích hợp với Slack, Discord, hoặc email để gửi thông báo khi deploy thành công hoặc thất bại. Có nhiều actions trên GitHub Marketplace cho mục đích này.

Xử lý Sự cố Thường gặp

Lưu ý Quan trọng: Luôn kiểm tra kỹ script deploy trong môi trường staging trước khi áp dụng cho production. Một lệnh xóa nhầm thư mục có thể gây hậu quả nghiêm trọng.

  • Lỗi "Permission denied (publickey)": Kiểm tra xem SSH private key đã được thêm đúng vào GitHub Secrets chưa (bao gồm cả xuống dòng). Đảm bảo public key tương ứng đã được thêm vào ~/.ssh/authorized_keys của user deployer trên VPS.
  • Lỗi trong quá trình cài đặt dependencies: Có thể do runtime (Node.js, Python version) trên VPS không khớp với môi trường build. Sử dụng version pin chính xác trong script setup.
  • Ứng dụng không restart sau deploy: Kiểm tra lệnh restart service (PM2, systemd). Đảm bảo user deployer có đủ quyền để thực thi lệnh đó (có thể cần cấu hình sudo không cần password cho lệnh cụ thể).
  • Workflow chạy nhưng không pull code mới: Kiểm tra xem VPS đã cài đặt Git chưa và repository trên VPS đã liên kết đúng remote origin chưa.

Kết luận

Việc tích hợp GitHub Actions với VPS để tự động hóa quy trình deploy là một bước tiến quan trọng hướng tới một quy trình phát triển phần mềm chuyên nghiệp, hiệu quả và ít lỗi. Thiết lập ban đầu có thể cần một chút đầu tư thời gian, nhưng lợi ích lâu dài về tốc độ phát triển, độ tin cậy và sự an tâm là hoàn toàn xứng đáng. Bằng cách làm chủ công cụ này, bạn và đội ngũ của mình có thể tập trung nhiều hơn vào việc xây dựng tính năng và cải thiện sản phẩm, thay vì lo lắng về các thao tác triển khai lặp đi lặp lại. Hãy bắt đầu với một workflow đơn giản, sau đó dần dần tối ưu và mở rộng nó để phù hợp với nhu cầu ngày càng phức tạp của dự án.