Back to articles
Technology Insight

Triển khai Kamal 2 trên Cloud VPS: Cách Basecamp deploy ứng dụng Production không cần K8s hay Docker Swarm

June 2, 2026

Giới thiệu về Triết lý DevOps Tối giản và Sự Ra đời của Kamal 2

Trong kỷ nguyên của điện toán đám mây, Kubernetes (K8s) đã trở thành một tiêu chuẩn công nghiệp đối với việc quản lý và triển khai container ở quy mô lớn. Tuy nhiên, đối với nhiều doanh nghiệp vừa và nhỏ, hoặc thậm chí là các sản phẩm SaaS thành công như Basecamp và HEY, việc duy trì một cụm K8s cồng kềnh đòi hỏi chi phí vận hành rất lớn, cả về hạ tầng lẫn nhân sự chuyên trách DevOps. Nhận thấy sự phức tạp hóa quá mức này, David Heinemeier Hansson (DHH) cùng đội ngũ Basecamp đã giới thiệu Kamal (tiền thân là MRSK) và gần đây nhất là Kamal 2.

Kamal 2 không phải là một công cụ điều phối container (container orchestration) phức tạp như K8s hay Docker Swarm. Thay vào đó, nó là một công cụ triển khai (deployment tool) tinh gọn, sử dụng SSH để đẩy cấu hình và quản lý các Docker container trực tiếp trên các máy chủ Cloud VPS thông thường. Với Kamal 2, bạn không cần cài đặt các agent phức tạp, không cần duy trì các control plane tốn kém. Mọi thứ được điều khiển trực tiếp từ máy cục bộ hoặc từ hệ thống CI/CD của bạn.

Kiến trúc Tinh giản của Kamal 2: Sức mạnh đến từ sự tối giản

Để hiểu tại sao Kamal 2 có thể thay thế K8s cho các ứng dụng Production quy mô vừa và lớn, chúng ta cần phân tích kiến trúc cốt lõi của nó. Trọng tâm của hệ sinh thái Kamal 2 bao gồm ba thành phần chính phối hợp nhịp nhàng với nhau:

  • Kamal Proxy: Thay thế cho sự kết hợp phức tạp của Traefik trong phiên bản tiền nhiệm, Kamal Proxy là một reverse proxy siêu nhẹ, được thiết kế riêng để xử lý việc định tuyến traffic và thực hiện cơ chế zero-downtime deploys (triển khai không gián đoạn) một cách mượt mà bằng cách tráo đổi các container cũ và mới chỉ trong vài mili-giây.
  • Docker: Nền tảng ảo hóa duy nhất bắt buộc phải có trên máy chủ đích. Kamal tận dụng sức mạnh thuần túy của Docker Engine để cô lập ứng dụng, giúp môi trường staging và production hoàn toàn đồng nhất.
  • SSHKit: Thư viện mạnh mẽ giúp Kamal thực hiện các tập lệnh cấu hình, khởi chạy, và giám sát container từ xa qua giao thức SSH bảo mật mà không cần bất kỳ tiến trình ngầm (daemon) đặc biệt nào chạy trên VPS.
Triết lý của Kamal 2 rất rõ ràng: Hãy để máy chủ chạy Docker, và để SSH làm nhiệm vụ kết nối. Đừng tạo ra các lớp ảo hóa quản lý trung gian nếu một script thông minh có thể giải quyết được việc đó.

Hướng dẫn Từng bước Triển khai Ứng dụng Production bằng Kamal 2

Để bắt đầu triển khai một ứng dụng (ví dụ: Node.js, Ruby on Rails, Go, hoặc Python) lên Cloud VPS, bạn cần chuẩn bị một máy chủ Ubuntu sạch đã mở các cổng cần thiết (80, 443, 22) và một Docker registry (như Docker Hub, GitHub Packages, hoặc Amazon ECR).

Bước 1: Cài đặt Kamal trên máy cục bộ

Kamal được phân phối như một thư viện Ruby, nhưng bạn hoàn toàn có thể chạy nó dưới dạng một lệnh độc lập hoặc thông qua Docker độc lập. Cách phổ biến nhất là cài đặt trực tiếp qua RubyGems:

gem install kamal

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

Di chuyển vào thư mục mã nguồn ứng dụng của bạn và chạy lệnh khởi tạo:

kamal init

Lệnh này sẽ tự động tạo ra hai tệp tin cốt lõi trong thư mục config/ là: deploy.yml (chứa toàn bộ cấu hình hạ tầng) và .env (chứa các biến môi trường bảo mật như mật khẩu Docker registry, khóa API).

Bước 3: Cấu hình tệp tin deploy.yml

Đây là nơi phép màu của Kamal 2 diễn ra. Bạn chỉ định tên ứng dụng, hình ảnh Docker (image), danh sách IP của Cloud VPS, và các biến môi trường cần thiết. Dưới đây là một cấu hình mẫu chuẩn Production:

service: my-saas-app
image: username/my-saas-app

servers:
  web:
    hosts:
      - 192.168.1.100
      - 192.168.1.101

registry:
  username: my-docker-username
  password:
    - KAMAL_REGISTRY_PASSWORD

env:
  clear:
    PORT: 3000
    NODE_ENV: production
  secret:
    - DATABASE_URL

proxy:
  ssl: true
  host: app.mydomain.com
  app_port: 3000

Bước 4: Thiết lập Máy chủ ban đầu (Server Setup)

Trước khi deploy lần đầu, Kamal cần chuẩn bị môi trường trên các Cloud VPS mục tiêu bằng cách cài đặt Docker, Kamal Proxy, và cấu hình mạng Certbot (nếu có sử dụng SSL tự động). Bạn chỉ cần chạy một lệnh duy nhất:

kamal setup

Quá trình này diễn ra hoàn toàn tự động. Kamal sẽ SSH vào từng IP được liệt kê, kiểm tra sự tồn tại của Docker, tải về các cấu hình proxy thiết yếu và chuẩn bị sẵn sàng cho ứng dụng của bạn.

Bước 5: Triển khai Ứng dụng với Zero-Downtime

Khi mã nguồn đã sẵn sàng và Docker image đã được xây dựng, quy trình deploy chỉ gói gọn trong lệnh:

kamal deploy

Lúc này, Kamal sẽ thực hiện các bước: (1) Đóng gói và đẩy Docker image lên registry, (2) Pull image mới về các VPS, (3) Khởi chạy container mới trên một cổng ngẫu nhiên, (4) Kamal Proxy kiểm tra trạng thái sức khỏe (health check) của container mới, (5) Chuyển hướng lưu lượng traffic sang container mới, và cuối cùng (6) Tắt container cũ. Người dùng của bạn sẽ không nhận thấy bất kỳ sự gián đoạn dịch vụ nào.

So sánh Kamal 2, Kubernetes và Docker Swarm: Lựa chọn nào tối ưu?

Để có cái nhìn khách quan cho các quyết định kiến trúc hệ thống, hãy cùng đặt ba giải pháp này lên bàn cân dựa trên các tiêu chí cốt lõi của môi trường doanh nghiệp:

  1. Độ phức tạp và Đường cong học tập (Learning Curve): K8s yêu cầu kiến thức chuyên sâu về Pods, Services, Ingress, và YAML phức tạp. Docker Swarm dễ thở hơn nhưng vẫn yêu cầu quản lý trạng thái cụm (cluster state). Kamal 2 loại bỏ hoàn toàn khái niệm cụm, cấu hình tập trung vào một tệp YAML duy nhất vô cùng trực quan.
  2. Chi phí Hạ tầng (Infrastructure Overhead): K8s tiêu tốn ít nhất 10-15% tài nguyên phần cứng của máy chủ chỉ để chạy các dịch vụ hệ thống (Control Plane, etcd, Kubelet). Kamal 2 có overhead gần như bằng 0, vì tài nguyên VPS được dành trọn vẹn cho Docker container của ứng dụng và một phần cực nhỏ cho Kamal Proxy.
  3. Quản lý Trạng thái và Khôi phục (Resilience): K8s vượt trội trong việc tự động scale (Auto-scaling) và tự phục hồi khi node chết (Self-healing). Kamal 2 không tự động scale theo thời gian thực mà dựa vào việc bạn chủ động thêm IP máy chủ vào file cấu hình. Tuy nhiên, với các ứng dụng SaaS vừa và nhỏ, việc scale thủ công bằng cách thêm VPS diễn ra rất nhanh chóng và dễ kiểm soát chi phí hơn.

Kết luận và Khuyến nghị cho Doanh nghiệp

Kamal 2 là một minh chứng mạnh mẽ cho thấy tư duy "Khử phức tạp hóa" (De-complexification) của Basecamp. Bằng cách loại bỏ các tầng trung gian không cần thiết, Kamal 2 mang lại khả năng triển khai ứng dụng production mạnh mẽ, bảo mật và hoàn toàn không gián đoạn trực tiếp trên Cloud VPS với chi phí tối thiểu.

Nếu doanh nghiệp của bạn đang vận hành các sản phẩm SaaS, các trang thương mại điện tử hoặc các ứng dụng nội bộ với quy mô traffic từ nhỏ đến lớn nhưng không có một đội ngũ DevOps hùng hậu, Kamal 2 chính là sự thay thế hoàn hảo cho Kubernetes. Nó giúp các kỹ sư lập trình (Developers) làm chủ hoàn toàn hạ tầng của mình, tập trung vào việc tạo ra giá trị sản phẩm thay vì tiêu tốn thời gian cấu hình hệ thống đám mây phức tạp.

Triển khai Kamal 2 trên Cloud VPS: Cách Basecamp deploy ứng dụng Production không cần K8s hay Docker Swarm | DPTCloud