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

Xây dựng hệ thống Continuous Deployment không cần Server Agent với Kamal 2 trên VPS Ubuntu

27 tháng 5, 2026

Giới thiệu xu hướng tối ưu hóa CI/CD trong kỷ nguyên đơn giản hóa

Trong bối cảnh công nghệ thay đổi nhanh chóng, các doanh nghiệp luôn tìm kiếm giải pháp tối ưu để rút ngắn thời gian đưa sản phẩm ra thị trường (Time-to-Market). Quy trình Continuous Deployment (CD) đóng vai trò cốt lõi trong việc tự động hóa việc phát hành phần mềm. Tuy nhiên, các hệ thống CD truyền thống dựa trên Kubernetes, Jenkins hay các dịch vụ quản lý đám mây (Managed Services) thường đi kèm với chi phí vận hành cao và độ phức tạp lớn.

Sự xuất hiện của Kamal 2 (tiền thân là MRSK do 37signals phát triển) đã mở ra một hướng đi mới: Triển khai ứng dụng container hóa trực tiếp lên máy chủ ảo (VPS) mà không cần cài đặt bất kỳ Server Agent nào. Bài viết này sẽ hướng dẫn các kỹ sư phần mềm và nhà quản trị hệ thống cách xây dựng một quy trình CD chuyên nghiệp, an toàn và tinh gọn bằng Kamal 2 trên nền tảng VPS Ubuntu.

Tại sao lại chọn Kamal 2 thay vì các giải pháp truyền thống?

Trước khi đi vào chi tiết cấu hình, chúng ta cần hiểu rõ lý do Kamal 2 trở thành xu hướng mạnh mẽ trong cộng đồng DevOps gần đây. Khác với các công cụ như Rancher, Portainer hay GitHub Actions Runner yêu cầu cài đặt phần mềm quản lý (Agent) trực tiếp trên server, Kamal 2 hoạt động theo cơ chế Agentless.

  • Không phụ thuộc Agent: Kamal 2 kết nối với VPS thông qua giao thức SSH tiêu chuẩn. Điều này giúp giảm thiểu việc tiêu tốn tài nguyên phần cứng (CPU/RAM) cho các tiến trình nền và loại bỏ một lỗ hổng bảo mật tiềm ẩn.
  • Zero-downtime Deployment: Kamal 2 tự động quản lý việc khởi chạy container mới, kiểm tra trạng thái hoạt động (Healthcheck) và chuyển đổi lưu lượng truy cập qua Traefik một cách mượt mà, đảm bảo người dùng không gặp gián đoạn.
  • Kiểm soát hoàn toàn dữ liệu: Triển khai trên VPS Ubuntu của riêng doanh nghiệp giúp bạn toàn quyền kiểm soát hạ tầng, tối ưu chi phí so với việc thuê các dịch vụ PaaS đắt đỏ như Heroku hay AWS ECS.
  • Hỗ trợ đa nền tảng mạnh mẽ: Dù ứng dụng của bạn viết bằng Ruby on Rails, Node.js, Python hay Go, chỉ cần có Dockerfile, Kamal 2 đều có thể đóng gói và triển khai dễ dàng.

Chuẩn bị môi trường trước khi triển khai

Để đảm bảo quá trình cấu hình diễn ra suôn sẻ, hệ thống của bạn cần đáp ứng các điều kiện tiên quyết sau đây:

1. Cấu hình phía VPS Ubuntu

Mốt máy chủ Ubuntu (khuyến nghị phiên bản 22.04 LTS hoặc 24.04 LTS) với quyền truy cập SSH qua SSH Key (không dùng mật khẩu để đảm bảo tính bảo mật và tự động hóa). Bạn cần mở các cổng mạng cần thiết: Cổng 22 (SSH), Cổng 80 (HTTP) và Cổng 443 (HTTPS).

2. Cấu hình máy máy trạm (Local Machine hoặc CI Runner)

Máy tính thực hiện lệnh deploy (hoặc server chạy GitHub Actions/GitLab CI) cần cài đặt sẵn:

  • Docker: Dùng để đóng gói ứng dụng nội bộ trước khi đẩy lên registry.
  • Ruby (phiên bản 3.0 trở lên): Do Kamal được viết bằng Ruby. Bạn có thể cài đặt thông qua gem: gem install kamal.

3. Docker Registry

Một tài khoản Docker Hub, GitHub Packages (GHCR), hoặc AWS ECR để lưu trữ các image sau khi build.

Hướng dẫn chi tiết các bước cấu hình Kamal 2

Bước 1: Khởi tạo cấu hình Kamal trong dự án

Tại thư mục gốc của mã nguồn ứng dụng, bạn chạy lệnh sau để khởi tạo các file cấu hình tiêu chuẩn:

kamal init

Lệnh này sẽ tạo ra hai file quan trọng: config/deploy.yml (chứa kịch bản cấu hình triển khai) và .env (chứa các biến môi trường bảo mật).

Bước 2: Thiết lập file cấu hình deploy.yml

Cấu hình lại file config/deploy.yml để định nghĩa cách Kamal 2 giao tiếp với VPS Ubuntu của bạn. Dưới đây là một biểu mẫu cấu hình chuẩn chỉnh doanh nghiệp có thể áp dụng trực tiếp:

service: corporate-app
image: username/corporate-app

servers:
  web:
    - 192.168.1.100 # Thay thế bằng IP VPS của bạn

registry:
  username: docker_hub_username
  password:
    - KAMAL_REGISTRY_PASSWORD

env:
  secret:
    - DATABASE_URL
    - RAILS_MASTER_KEY

boot:
  limit: 3
  interval: 2

proxy:
  ssl: true
  host: app.yourcompany.com
  ssl_email: [email protected]

Lưu ý quan trọng: Hãy đảm bảo các biến như KAMAL_REGISTRY_PASSWORD và DATABASE_URL đã được khai báo chính xác trong file .env ở máy cục bộ hoặc trong phần Secrets của hệ thống CI.

Bước 3: Thiết lập ban đầu cho Server (Server Setup)

Trước khi có thể deploy ứng dụng, Kamal cần chuẩn bị môi trường trên VPS Ubuntu bằng cách cài đặt tự động Docker và cấu hình mạng nội bộ. Bạn chỉ cần thực hiện lệnh này một lần duy nhất:

kamal setup

Quá trình này sẽ thực hiện các tác vụ sau một cách tự động:

  • Kết nối tới VPS qua SSH.
  • Kiểm tra và cài đặt Docker Engine nếu chưa có.
  • Khởi tạo hệ thống proxy Traefik để định tuyến luồng dữ liệu.
  • Tạo các thư mục lưu trữ chứng chỉ SSL miễn phí từ Let's Encrypt.
  • Xây dựng Pipeline Continuous Deployment hoàn chỉnh

    Để đạt được trạng thái Continuous Deployment thực thụ, quy trình deploy cần được kích hoạt tự động mỗi khi mã nguồn được gộp (merge) vào nhánh chính (ví dụ: main hoặc production). Dưới đây là cách tích hợp Kamal 2 vào GitHub Actions.

    Hãy tạo file .github/workflows/deploy.yml với nội dung sau:

    name: CD Pipeline
    
    on:
      push:
        branches:
          - main
    
    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout code
            uses: actions/checkout@v4
    
          - name: Set up Ruby
            uses: ruby/setup-ruby@v1
            with:
              ruby-version: '3.2'
              bundle-cache: true
    
          - name: Install Kamal
            run: gem install kamal
    
          - name: Set up SSH Key
            uses: webfactory/[email protected]
            with:
              ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
    
          - name: Deploy Application
            env:
              KAMAL_REGISTRY_PASSWORD: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
              DATABASE_URL: ${{ secrets.DATABASE_URL }}
            run: kamal deploy

    Khi pipeline này chạy, GitHub Actions sẽ đóng vai trò là thực thể điều khiển, gọi lệnh qua SSH tới VPS Ubuntu để kéo Image mới nhất về và thực hiện hoán đổi container theo kiến trúc rolling-update mà không gây ảnh hưởng tới người dùng cuối.

    Các lưu ý về bảo mật và tối ưu hóa hiệu năng

    Khi triển khai hệ thống Agentless, việc bảo mật kênh truyền thông và quản lý tài nguyên trên VPS là tối quan trọng để hệ thống vận hành bền bỉ:

    • Giới hạn quyền SSH Key: Chỉ cấp quyền truy cập SSH cho key dùng trong CI/CD tới đúng user có quyền chạy Docker trên VPS, hạn chế dùng trực tiếp user root nếu có thể.
    • Quản lý log và dọn dẹp bộ nhớ: Quá trình build và deploy liên tục sẽ để lại các Docker image cũ (dangling images). Kamal 2 hỗ trợ tự động dọn dẹp, tuy nhiên bạn nên thiết lập thêm một cronjob định kỳ chạy lệnh docker system prune -f trên VPS để tránh tình trạng đầy ổ cứng.
    • Giám sát tài nguyên (Monitoring): Do không có agent theo dõi, bạn nên cài đặt thêm các công cụ gọn nhẹ độc lập như Prometheus Node Exporter hoặc Uptime Kuma để kiểm soát dung lượng RAM/CPU của VPS.

    Lời kết

    Xây dựng hệ thống Continuous Deployment với Kamal 2 trên VPS Ubuntu mang lại sự cân bằng hoàn hảo giữa chi phí, hiệu năng và tính đơn giản. Việc loại bỏ Server Agent không chỉ giúp tối ưu tài nguyên máy chủ mà còn giúp đơn giản hóa kiến trúc DevOps của doanh nghiệp. Đây là giải pháp lý tưởng cho các doanh nghiệp startup, các dự án vừa và nhỏ muốn sở hữu hạ tầng CI/CD mạnh mẽ như các tập đoàn lớn mà không phải gánh chịu chi phí vận hành đắt đỏ.