Triển khai Kamal 2 trên Cloud VPS: Cách Basecamp deploy ứng dụng Production không cần K8s
Giới thiệu về xu hướng "Rời bỏ Cloud" và sự ra đời của Kamal 2
Trong hơn một thập kỷ qua, các nền tảng đám mây lớn (AWS, GCP, Azure) cùng với các công cụ điều phối như Kubernetes (K8s) đã trở thành tiêu chuẩn vàng cho việc vận hành ứng dụng Production. Tuy nhiên, sự phức tạp trong quản lý hệ thống cùng với chi phí bản quyền và hạ tầng ngày càng tăng cao đã khiến nhiều doanh nghiệp phải cân nhắc lại. Đi đầu trong phong trào "Cloud Exit" (Rời bỏ đám mây) chính là 37signals (công ty đứng sau Basecamp và HEY), dẫn dắt bởi David Heinemeier Hansson (DHH).
Để chứng minh rằng doanh nghiệp có thể vận hành các ứng dụng quy mô lớn trên hạ tầng tự quản lý hoặc Cloud VPS giá rẻ mà không cần đến sự cồng kềnh của K8s, Basecamp đã phát triển và cho ra mắt Kamal. Phiên bản nâng cấp Kamal 2 mang lại những cải tiến vượt trội, giúp tự động hóa toàn bộ quy trình đóng gói, cấu hình proxy và mã hóa SSL tự động, biến việc deploy ứng dụng Production lên VPS trở nên dễ dàng hơn bao giờ hết.
Tại sao Kamal 2 là giải pháp thay thế hoàn hảo cho Kubernetes trên VPS?
Kubernetes rất mạnh mẽ, nhưng đối với các doanh nghiệp vừa và nhỏ (SMEs), các startup, hoặc các ứng dụng không có kiến trúc microservices quá phức tạp, K8s giống như "dùng dao mổ trâu để giết gà". Bạn cần một đội ngũ DevOps chuyên trách chỉ để duy trì cluster hoạt động ổn định.
Kamal 2 tiếp cận vấn đề theo triết lý hoàn toàn khác: Đơn giản, trực quan và dựa trên Docker nguyên bản. Dưới đây là các lý do khiến Kamal 2 trở thành lựa chọn tối ưu trên Cloud VPS:
- Kiến trúc Imperative (Mệnh lệnh) thay vì Declarative (Tuyên bố): Khác với cơ chế tự phục hồi phức tạp của K8s, Kamal thực thi các câu lệnh deploy rõ ràng thông qua SSH giống như công cụ Capistrano huyền thoại, giúp lập trình viên dễ dàng kiểm soát và debug.
- Kamal Proxy tích hợp sẵn: Thay thế cho Traefik ở phiên bản cũ,
kamal-proxymới được tối ưu hóa tối đa, hỗ trợ gapless deployments (triển khai không gián đoạn) và tự động cấu hình định tuyến traffic. - Tự động hóa HTTPS với Let's Encrypt: Kamal 2 tự động phân phát và gia hạn chứng chỉ SSL cho các domain mà không cần cấu hình thêm các bên thứ ba như Certbot một cách thủ công.
- Tối ưu hóa tài nguyên: Không có các tiến trình ngầm (agent) nặng nề của K8s chiếm dụng RAM, toàn bộ hiệu năng của VPS được dành trọn vẹn cho ứng dụng của bạn.
Kiến trúc vận hành của Kamal 2 trên một máy chủ Single-Server
Để hiểu cách Kamal 2 hoạt động trên Cloud VPS, chúng ta hãy nhìn vào luồng xử lý luân chuyển traffic khi tiến hành deploy phiên bản mới:
Kamal 2 sử dụng mô hình kết hợp giữa Docker Containers và một cơ chế Proxy thông minh để đảm bảo zero-downtime khi cập nhật ứng dụng.
Khi bạn thực hiện lệnh triển khai, quy trình sau sẽ diễn ra:
- Build & Push: Kamal build Docker image từ mã nguồn của bạn (có thể thực hiện local hoặc qua CI/CD như GitHub Actions) và đẩy lên một Container Registry (Docker Hub, GHCR, v.v.).
- Pull Image: Kamal kết nối tới Cloud VPS qua SSH và ra lệnh tải image mới về máy chủ.
- Boot Container mới: Phiên bản mới của ứng dụng được khởi chạy trên một cổng (port) khác với phiên bản hiện tại đang chạy.
- Health Check: Kamal tiến hành kiểm tra trạng thái container mới (mặc định thông qua route
/up). Nếu phản hồi200 OK, quá trình chuyển đổi bắt đầu. - Chuyển đổi Traffic qua Proxy:
kamal-proxysẽ lập tức chuyển hướng các yêu cầu mới tới container phiên bản mới và ngắt kết nối dần với container cũ sau khi các request tồn đọng được xử lý xong.
Hướng dẫn từng bước triển khai ứng dụng bằng Kamal 2 trên Cloud VPS
Để chuẩn bị cho việc triển khai, bạn cần sở hữu một hoặc nhiều Cloud VPS (Ubuntu là hệ điều hành khuyến nghị), một tên miền đã trỏ về IP của VPS, và tài khoản Container Registry.
Bước 1: Cài đặt Kamal trên môi trường local
Kamal được phân phối dưới dạng một Ruby gem. Bạn có thể dễ dàng cài đặt trên máy tính cá nhân hoặc máy máy chủ điều khiển (Control Server) bằng lệnh:
gem install kamal
Đảm bảo máy tính của bạn đã cấu hình SSH Key để truy cập thẳng vào quyền root của VPS mà không cần nhập mật khẩu.
Bước 2: Khởi tạo cấu hình dự án
Di chuyển vào thư mục gốc của ứng dụng (đảm bảo dự án đã có sẵn Dockerfile chuẩn chỉnh) và chạy lệnh:
kamal init
Lệnh này sẽ tự động sinh ra file cấu hình chính config/deploy.yml và file chứa biến môi trường bảo mật .kamal/secrets (hoặc file .env tùy phiên bản).
Bước 3: Chỉnh sửa file config/deploy.yml
Cấu hình file deploy.yml theo biểu mẫu chuẩn của Kamal 2 dành cho môi trường Production:
service: my-b2b-app
image: username/my-b2b-app
servers:
web:
- 192.168.1.100 # Điền IP Cloud VPS của bạn tại đây
proxy:
ssl: true
host: app.yourdomain.com
app_port: 3000
registry:
username:
- KAMAL_REGISTRY_USERNAME
password:
- KAMAL_REGISTRY_PASSWORD
env:
secret:
- DATABASE_URL
Bước 4: Thiết lập các thông tin bảo mật
Khai báo thông tin đăng nhập registry và các chuỗi kết nối cơ sở dữ liệu trong file bảo mật. Kamal 2 hỗ trợ tích hợp rất tốt với các trình quản lý mật khẩu như 1Password, Bitwarden hoặc khai báo trực tiếp qua biến môi trường của hệ thống.
Bước 5: Tiến hành Deploy ứng dụng lần đầu tiên
Mọi thứ đã sẵn sàng. Bạn chỉ cần thực hiện một câu lệnh duy nhất để kích hoạt toàn bộ quy trình thiết lập máy chủ và deploy:
kamal setup
Lệnh kamal setup sẽ tự động cài đặt Docker trên VPS nếu chưa có, khởi tạo Kamal Proxy, xin cấp chứng chỉ SSL từ Let's Encrypt, kéo image về và khởi chạy ứng dụng. Ở các lần cập nhật mã nguồn tiếp theo, bạn chỉ cần sử dụng lệnh rút gọn:
kamal deploy
Quản lý các thành phần phụ trợ (Accessories) trong môi trường Production
Một ứng dụng Production thực tế luôn đi kèm với các thành phần như Database (PostgreSQL, MySQL) hoặc Redis Cache. Kamal cung cấp khái niệm Accessories để quản lý các dịch vụ này trực tiếp trong cùng một file cấu hình mà không cần tách rời hệ thống.
Bằng cách khai báo phân vùng accessories trong file deploy.yml, Kamal sẽ tự động thiết lập các Docker Volume để lưu trữ dữ liệu bền vững (persistence storage), đảm bảo dữ liệu không bị mất đi khi container khởi động lại hoặc nâng cấp phiên bản hệ quản trị cơ sở dữ liệu.
Lời kết và Khuyến nghị dành cho Doanh nghiệp
Kamal 2 mang lại một làn gió mới cho thế giới DevOps, chứng minh rằng việc triển khai ứng dụng Production an toàn, tin cậy và không gián đoạn hoàn toàn có thể đạt được bằng những công cụ mã nguồn mở đơn giản. Bằng cách loại bỏ sự phức tạp của Kubernetes và tận dụng tối đa hiệu năng của Cloud VPS, doanh nghiệp không chỉ tiết kiệm được một khoản chi phí hạ tầng khổng lồ mà còn giải phóng năng suất cho đội ngũ kỹ sư phát triển phần mềm, tập trung hoàn toàn vào việc xây dựng giá trị cốt lõi cho sản phẩm.
