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

Tự động hóa triển khai ứng dụng lên VPS với GitHub Actions và Docker: Hướng dẫn toàn diện

15 tháng 5, 2026

Giới thiệu về tự động hóa triển khai

Trong môi trường phát triển phần mềm hiện đại, việc triển khai ứng dụng thủ công không chỉ tốn thời gian mà còn dễ gây ra lỗi do yếu tố con người. Tự động hóa quy trình triển khai (CI/CD) đã trở thành tiêu chuẩn công nghiệp, giúp các đội ngũ phát triển đẩy nhanh tốc độ phát hành sản phẩm và đảm bảo chất lượng code.

Bài viết này sẽ hướng dẫn chi tiết cách thiết lập một hệ thống tự động hóa triển khai hoàn chỉnh sử dụng GitHub Actions kết hợp với Docker để đưa ứng dụng của bạn lên VPS một cách nhanh chóng, an toàn và hiệu quả.

Tại sao nên sử dụng GitHub Actions và Docker?

Lợi ích của GitHub Actions

GitHub Actions là nền tảng CI/CD được tích hợp sẵn trong GitHub, mang lại nhiều ưu điểm vượt trội:

  • Tích hợp liền mạch: Không cần cấu hình webhook hay kết nối với dịch vụ bên thứ ba
  • Miễn phí cho repository công khai: Tiết kiệm chi phí đáng kể cho các dự án mã nguồn mở
  • Cộng đồng lớn: Hàng nghìn actions có sẵn từ marketplace để tái sử dụng
  • Cấu hình linh hoạt: Sử dụng file YAML đơn giản, dễ quản lý và version control
  • Ma trận build: Hỗ trợ test trên nhiều môi trường, phiên bản khác nhau đồng thời

Ưu điểm của Docker trong triển khai

Docker đã cách mạng hóa cách thức đóng gói và triển khai ứng dụng:

  • Tính nhất quán: Ứng dụng chạy giống hệt nhau trên mọi môi trường từ development đến production
  • Cô lập môi trường: Mỗi container độc lập, tránh xung đột dependencies
  • Khả năng mở rộng: Dễ dàng scale horizontal bằng cách tạo thêm container
  • Quản lý phiên bản: Mỗi image được tag rõ ràng, dễ dàng rollback khi cần
  • Tối ưu tài nguyên: Nhẹ hơn máy ảo truyền thống, khởi động nhanh chóng

Chuẩn bị môi trường và công cụ

Yêu cầu hệ thống

Trước khi bắt đầu, đảm bảo bạn đã có:

  1. VPS: Một máy chủ ảo với quyền root access (Ubuntu 20.04+ hoặc CentOS 7+ được khuyến nghị)
  2. Docker: Đã cài đặt Docker Engine trên VPS
  3. GitHub Repository: Repository chứa source code ứng dụng của bạn
  4. SSH Key: Cặp khóa SSH để GitHub Actions có thể kết nối đến VPS
  5. Domain (tùy chọn): Tên miền đã trỏ về IP của VPS

Cài đặt Docker trên VPS

Kết nối SSH vào VPS và thực hiện các lệnh sau để cài đặt Docker:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
sudo systemctl enable docker
sudo systemctl start docker

Kiểm tra cài đặt thành công bằng lệnh: docker --version

Xây dựng Dockerfile cho ứng dụng

Dockerfile là bản thiết kế để tạo Docker image. Dưới đây là ví dụ Dockerfile cho một ứng dụng Node.js:

Dockerfile tối ưu cho production:

FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
EXPOSE 3000
CMD ["node", "dist/index.js"]

Dockerfile này sử dụng multi-stage build để giảm kích thước image cuối cùng, chỉ giữ lại những gì cần thiết cho production.

Cấu hình GitHub Actions Workflow

Tạo file workflow

Tạo thư mục .github/workflows/ trong repository và tạo file deploy.yml:

Cấu trúc workflow hoàn chỉnh:

name: Deploy to VPS

on:
  push:
    branches: [main]
  workflow_dispatch:

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: username/app:latest

      - name: Deploy to VPS
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.VPS_HOST }}
          username: ${{ secrets.VPS_USERNAME }}
          key: ${{ secrets.VPS_SSH_KEY }}
          script: |
            docker pull username/app:latest
            docker stop app || true
            docker rm app || true
            docker run -d --name app -p 80:3000 username/app:latest

Giải thích các bước trong workflow

Workflow trên thực hiện các bước sau:

  1. Checkout code: Tải source code từ repository về runner
  2. Login Docker Hub: Xác thực để có thể push image lên registry
  3. Build và Push: Build Docker image từ Dockerfile và đẩy lên Docker Hub
  4. SSH vào VPS: Kết nối đến VPS qua SSH
  5. Deploy: Pull image mới nhất, dừng container cũ và chạy container mới

Quản lý Secrets trong GitHub

Để bảo mật thông tin nhạy cảm, bạn cần thêm các secrets vào GitHub repository:

  1. Vào Settings của repository
  2. Chọn Secrets and variables → Actions
  3. Click New repository secret và thêm các secrets sau:
  • DOCKER_USERNAME: Username Docker Hub của bạn
  • DOCKER_PASSWORD: Password hoặc access token Docker Hub
  • VPS_HOST: Địa chỉ IP của VPS
  • VPS_USERNAME: Username SSH (thường là root hoặc ubuntu)
  • VPS_SSH_KEY: Private SSH key để kết nối VPS

Lưu ý: Không bao giờ commit secrets trực tiếp vào code. Luôn sử dụng GitHub Secrets hoặc các công cụ quản lý secrets chuyên dụng.

Tối ưu hóa quy trình triển khai

Sử dụng Docker Compose

Đối với ứng dụng phức tạp có nhiều services (database, cache, queue), nên sử dụng Docker Compose để quản lý:

version: '3.8'
services:
  app:
    image: username/app:latest
    ports:
      - "80:3000"
    environment:
      - DATABASE_URL=postgresql://db:5432
    depends_on:
      - db
  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
volumes:
  postgres_data:

Chiến lược rollback

Để đảm bảo có thể quay lại phiên bản trước khi gặp sự cố, nên:

  • Tag image với version cụ thể thay vì chỉ dùng latest
  • Giữ lại 3-5 phiên bản image gần nhất trên Docker Hub
  • Tạo workflow riêng cho rollback thủ công khi cần
  • Sử dụng health check để tự động phát hiện lỗi sau deploy

Monitoring và logging

Sau khi triển khai tự động, việc giám sát hệ thống trở nên quan trọng hơn:

  • Tích hợp logging centralized (ELK Stack, Loki)
  • Thiết lập alerts cho các metrics quan trọng (CPU, memory, response time)
  • Sử dụng health check endpoints để monitoring uptime
  • Cấu hình Docker logs driver phù hợp

Best practices và lưu ý bảo mật

Bảo mật VPS

Khi triển khai tự động, bảo mật VPS là ưu tiên hàng đầu:

  • Tắt SSH password authentication: Chỉ cho phép đăng nhập bằng SSH key
  • Cấu hình firewall: Chỉ mở các port cần thiết (80, 443, 22)
  • Cập nhật thường xuyên: Giữ hệ điều hành và Docker luôn được update
  • Sử dụng non-root user: Chạy container với user có quyền hạn chế
  • Scan vulnerabilities: Sử dụng công cụ như Trivy để scan Docker image

Tối ưu hiệu suất

Một số tips để cải thiện tốc độ build và deploy:

  • Sử dụng Docker layer caching hiệu quả
  • Tối ưu thứ tự các lệnh trong Dockerfile
  • Sử dụng .dockerignore để loại bỏ file không cần thiết
  • Cân nhắc sử dụng Docker registry riêng (Harbor, GitLab Registry) thay vì Docker Hub
  • Implement blue-green deployment để zero-downtime

Kết luận

Việc tự động hóa triển khai ứng dụng lên VPS với GitHub Actions và Docker không chỉ giúp tiết kiệm thời gian mà còn nâng cao đáng kể chất lượng và độ tin cậy của quy trình phát triển phần mềm. Hệ thống CI/CD được thiết lập đúng cách sẽ giúp đội ngũ phát triển tập trung vào việc xây dựng tính năng thay vì lo lắng về việc triển khai.

Bằng cách áp dụng các best practices về bảo mật, monitoring và tối ưu hóa được đề cập trong bài viết, doanh nghiệp của bạn sẽ có một nền tảng vững chắc để phát triển và mở rộng quy mô ứng dụng một cách bền vững.

Bước tiếp theo: Hãy bắt đầu với một dự án nhỏ, thử nghiệm quy trình này và dần dần mở rộng sang các ứng dụng phức tạp hơn. Đừng ngần ngại thử nghiệm và điều chỉnh workflow cho phù hợp với nhu cầu cụ thể của tổ chức bạn.