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 1, 2026

Giới thiệu: Lối đi riêng của Basecamp trong kỷ nguyên Cloud Native

Trong nhiều năm qua, Kubernetes (K8s) và Docker Swarm đã trở thành những tiêu chuẩn vàng khi nói đến việc triển khai ứng dụng container ở quy mô lớn. Tuy nhiên, đối với nhiều doanh nghiệp vừa và nhỏ, hoặc các đội ngũ phát triển tinh gọn, cái giá phải trả cho K8s không chỉ là chi phí hạ tầng đắt đỏ mà còn là độ phức tạp vận hành (Ops overhead) khổng lồ. Nhìn thấy gánh nặng này, Basecamp (công ty đứng sau Ruby on Rails, HEY, và Campfire) dưới sự dẫn dắt của David Heinemeier Hansson (DHH) đã chọn một lối đi hoàn toàn khác: Rời bỏ đám mây công cộng (Cloud Exit) và tối giản hóa quy trình deploy.

Công cụ cốt lõi giúp họ hiện thực hóa chiến lược này chính là Kamal (trước đây là MRSK), và phiên bản mới nhất - Kamal 2 - đã chính thức được tinh chỉnh để trở thành một giải pháp thay thế hoàn hảo cho K8s và Docker Swarm trên môi trường Production. Bài viết này sẽ phân tích sâu sắc về triết lý, kiến trúc của Kamal 2 và hướng dẫn bạn cách cấu hình nó trên một Cloud VPS thông thường.

Tại sao K8s và Docker Swarm có thể là 'Overkill' cho dự án của bạn?

Trước khi đi vào kỹ thuật, hãy thẳng thắn nhìn nhận những vấn đề của các công cụ điều phối container (Container Orchestrators) hiện tại:

  • Kubernetes (K8s): Quá nhiều khái niệm trừu tượng (Pods, Deployments, Services, Ingress, PV/PVC...). Để vận hành K8s an toàn cho Production, bạn cần một đội ngũ Platform Engineering chuyên trách. Nếu chỉ muốn chạy một ứng dụng web và một cơ sở dữ liệu, K8s giống như việc dùng xe tăng để đi chợ.
  • Docker Swarm: Dù đơn giản hơn K8s, Docker Swarm lại thiếu đi sự cập nhật mạnh mẽ từ cộng đồng trong những năm gần đây và gặp khó khăn trong việc quản lý chứng chỉ SSL tự động hoặc cấu hình zero-downtime phức tạp mà không có bên thứ ba trợ giúp.

Kamal 2 xuất hiện để lấp đầy khoảng trống này. Nó mang lại sức mạnh triển khai Zero-downtime, tự động cấu hình SSL/TLS, và quản lý nhiều môi trường trực tiếp trên các máy chủ ảo (Cloud VPS) độc lập thông qua SSH, sử dụng Docker thuần túy mà không cần thiết lập cluster phức tạp.

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

Kamal 2 vận hành dựa trên một kiến trúc vô cùng tinh gọn nhưng cực kỳ mạnh mẽ. Thay vì duy trì một master node liên tục chạy để giám sát các worker node như K8s, Kamal hoạt động theo mô hình Client-Driven Automation từ máy cục bộ (hoặc CI/CD pipeline) thông qua SSH.

1. Khởi tạo và quản lý Container qua Docker Engine

Kamal không thay thế Docker; nó điều khiển Docker. Khi bạn chạy lệnh deploy, Kamal sẽ kết nối tới các Cloud VPS được chỉ định qua SSH, xây dựng (hoặc kéo) Docker Image từ Registry (Docker Hub, GitHub Packages, v.v.), sau đó khởi chạy container mới song song với container cũ.

2. Kamal Proxy: Trái tim của cơ chế Zero-Downtime

Một trong những nâng cấp đáng giá nhất của Kamal 2 so với phiên bản đầu tiên là việc thay thế Traefik bằng Kamal Proxy. Đây là một reverse proxy siêu nhẹ, được thiết kế chuyên biệt. Quy trình deploy diễn ra như sau:

  1. Kamal Proxy nhận traffic ở cổng 80/443.
  2. Khi có phiên bản mới, Kamal khởi chạy container mới và chờ cho đến khi ứng dụng khởi động thành công (Health check pass).
  3. Kamal Proxy lập tức hoán đổi (swap) định tuyến traffic từ container cũ sang container mới chỉ trong vài miligiây.
  4. Container cũ bị dừng và xóa bỏ. Toàn bộ quá trình diễn ra mà người dùng không hề nhận thấy sự gián đoạn (Zero-downtime).

3. Quản lý chứng chỉ SSL tự động với Let's Encrypt

Kamal 2 tích hợp sẵn khả năng tự động cấu hình và gia hạn chứng chỉ SSL miễn phí từ Let's Encrypt, giúp ứng dụng Production của bạn luôn bảo mật một cách hoàn toàn tự động mà không cần thiết lập thêm Nginx hay Certbot thủ công.

Hướng dẫn từng bước triển khai Ứng dụng với Kamal 2 trên Cloud VPS

Để giúp bạn hình dung rõ ràng hơn, dưới đây là quy trình cấu hình thực tế để đưa một ứng dụng (ví dụ: Node.js, Ruby on Rails, hoặc Python) lên một Cloud VPS (Ubuntu) bằng Kamal 2.

Bước 1: Chuẩn bị hạ tầng và môi trường

Bạn cần chuẩn bị các thành phần sau:

  • Một máy chủ Cloud VPS (ví dụ: DigitalOcean, Linode, Hetzner hoặc Vietnix) cài đặt hệ điều hành Ubuntu.
  • Một domain đã trỏ bản ghi A về địa chỉ IP của VPS.
  • Máy tính cá nhân (hoặc CI/CD runner) đã cài đặt Docker và Kamal (cài đặt thông qua Ruby gem hoặc sử dụng bản phân phối standalone).
  • Quyền truy cập SSH vào VPS bằng SSH Key (không dùng password).

Bước 2: Khởi tạo cấu hình Kamal

Tại thư mục gốc của dự á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 thông tin 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 3: Thiết lập file config/deploy.yml

Dưới đây là một mẫu cấu hình chuẩn chỉnh cho Production sử dụng Kamal 2:

# Tên ứng dụng của bạn
service: my-awesome-app

# Hình ảnh Docker sẽ được đẩy lên registry
image: username/my-awesome-app

# Cấu hình máy chủ ứng dụng
servers:
  web:
    - 123.45.67.89 # IP của Cloud VPS

# Cấu hình Registry
registry:
  username: my-dockerhub-username
  password:
    - KAMAL_REGISTRY_PASSWORD

# Cấu hình Kamal Proxy và SSL
proxy:
  ssl: true
  host: app.yourdomain.com

# Các biến môi trường cho ứng dụng
env:
  clear:
    NODE_ENV: production
  secret:
    - DATABASE_URL

Bước 4: Thiết lập các biến bảo mật trong file .env

Nghiêm cấm lưu mật khẩu trực tiếp vào file YAML. Thay vào đó, hãy đưa chúng vào file .env:

KAMAL_REGISTRY_PASSWORD=dckr_pat_your_secret_token_here
DATABASE_URL=postgresql://user:pass@host:port/db

Bước 5: Kích hoạt hệ thống và Triển khai (Deploy)

Trước khi deploy lần đầu, Kamal cần thiết lập môi trường ban đầu trên VPS (cài đặt Docker nếu chưa có, cấu hình Kamal Proxy). Hãy chạy lệnh:

kamal setup

Lệnh này sẽ tự động hóa toàn bộ quy trình thiết lập ban đầu. Sau khi quá trình setup hoàn tất thành công, các lần cập nhật mã nguồn tiếp theo, bạn chỉ cần chạy duy nhất một lệnh:

kamal deploy

Kamal sẽ tự động build image mới, push lên registry, pull về VPS, kiểm tra sức khỏe ứng dụng và chuyển đổi traffic mượt mà.

Đánh giá ưu điểm và hạn chế của Kamal 2

Ưu điểm vượt trội

  • Hiệu suất tối đa, chi phí tối thiểu: Vì không có các tiến trình ngầm (agents) nặng nề như K8s, ứng dụng của bạn được tận dụng gần như 100% tài nguyên phần cứng của VPS.
  • Sở hữu hoàn toàn hạ tầng: Bạn không bị khóa chặt vào bất kỳ nhà cung cấp Cloud lớn nào (Vendor lock-in). Việc chuyển từ nhà cung cấp VPS này sang nhà cung cấp khác chỉ tốn vài phút đổi IP trong file cấu hình.
  • Đơn giản hóa quy trình: Toàn bộ cấu hình nằm trong một file YAML duy nhất, dễ đọc, dễ quản lý theo mô hình GitOps.

Hạn chế cần lưu ý

  • Tự quản lý lưu trữ (Storage): Kamal không có cơ chế quản lý volume phân tán như K8s. Đối với dữ liệu bền vững (Database), tốt nhất bạn nên sử dụng các dịch vụ Managed Database bên ngoài hoặc cấu hình backup nghiêm ngặt trên VPS.
  • Không tự động mở rộng (No Auto-scaling): Kamal không tự động tăng số lượng container dựa trên tải (CPU/RAM). Bạn phải thêm IP máy chủ mới vào file cấu hình một cách thủ công khi muốn mở rộng theo chiều ngang.

Kết luận: Kamal 2 dành cho ai?

Kamal 2 không sinh ra để tiêu diệt Kubernetes. Đối với các siêu tập đoàn với hàng trăm microservices, K8s vẫn là sự lựa chọn bắt buộc. Tuy nhiên, nếu bạn là một Startup cần tối ưu chi phí, một SaaS founder muốn vận hành ứng dụng Production ổn định với chi phí vài chục USD một tháng, hoặc một Đội ngũ phát triển tinh gọn muốn giải phóng bản thân khỏi nỗi ám ảnh mang tên DevOps phức tạp, thì Kamal 2 trên Cloud VPS chính là câu trả lời hoàn hảo nhất hiện nay.

Hãy thử nghiệm Kamal 2 ngay hôm nay để trải nghiệm cảm giác deploy ứng dụng Production mượt mà, nhanh chóng và tự chủ hoàn toàn hạ tầng của chính mình.

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