Mỗi lần nói chuyện với một solo Rails founder, tôi thấy lặp đi lặp lại ba câu chuyện deploy giống nhau. Kamal trên một con VPS $20 (~510k VNĐ/tháng). Fly.io với câu chuyện global edge. Render với lời hứa “git push xong là quên đi”. Mỗi lựa chọn đều đúng với một ai đó, và cũng là cái giá phải trả của một ai đó khác. Cái khó chịu tôi hay gặp là phần lớn bài so sánh được viết bởi người được trả tiền để giới thiệu một trong số đó. Hoặc bởi những team kỹ thuật cỡ lớn, nơi bài toán vận hành chẳng giống gì bài toán của một shop một người.
Bài này là rubric tôi sẽ đưa cho một founder đang có một Rails app, một database, một background worker, và không có platform engineer. Không phải “cái nào tốt nhất” — mà là “cái nào ít có khả năng làm bạn đau nhất, với khối lượng công việc thực tế bạn làm trong một tuần.”
Thực sự chúng ta đang so sánh cái gì
Ba thứ này, dù marketing nói gì đi nữa, không cùng hình dạng.
Kamal là một deploy tool. Bạn tự mang server — Hetzner, DigitalOcean, hay một cục NUC cũ vứt trong tủ — và Kamal SSH vào để chạy app của bạn dưới dạng Docker container. Không có platform nào ở dưới. Bạn sở hữu cái máy Linux đó, firewall, backup, xoay vòng TLS cert, cập nhật kernel. Hoá đơn là tiền VPS provider thu, mà với một con $5–$20 (~127k–510k VNĐ/tháng) thì đây là lựa chọn rẻ nhất trên bàn.
Fly.io là một platform chạy Firecracker VM (gọi là “machines”) ở các region bạn chọn, có managed Postgres, persistent volume, và CLI cảm giác như Heroku lai Docker. Bạn không động vào host. Bạn động vào fly.toml khá nhiều.
Render là thứ gần nhất với “Heroku ngày xưa” còn sót lại cho Rails: kết nối repo, khai báo services, nhận URL *.onrender.com. Managed Postgres, managed Redis, có cả tier background worker miễn phí trên gói trả phí. Bạn không thấy máy ở đâu cả.
Ba cái này không thực sự là đối thủ. Chúng là ba câu trả lời khác nhau cho câu hỏi “bạn muốn tự sở hữu bao nhiêu hạ tầng?”
Rubric tôi dùng
Tôi chấm điểm chúng cho một solo founder theo năm trục. Không quan tâm bề rộng tính năng. Chỉ những thứ làm bạn thức giấc lúc 2 giờ sáng.
| Trục | Kamal | Fly.io | Render |
|---|---|---|---|
| Thời gian đến lần deploy đầu | Chậm (phải setup host) | Nhanh | Nhanh nhất |
| Chi phí sàn hàng tháng cho app thật | Thấp nhất | Trung bình | Trung bình–cao |
| Bề mặt ops bạn phải gánh | Toàn bộ | Một phần | Gần như không |
| Loại sự cố bạn sẽ phải debug | Linux, Docker, networking | fly.toml, Machines, regions | Render dashboard, build cache |
| Mức lock-in khi rời đi | Không | Vừa | Vừa–cao |
Đọc thật lòng: Kamal rẻ nhất và portable nhất, nhưng nó thu phí bằng sự chú ý của bạn. Render thì ngược lại. Fly nằm giữa ở gần như mọi trục, vừa là điểm mạnh vừa là dấu hiệu — nó không phải winner rõ ràng của ai trừ khi bạn thực sự cần multi-region hoặc persistent volume theo cách Fly làm.
Vài thứ tôi đã bỏ khỏi rubric vì không thực sự xê dịch quyết định của solo founder: con số benchmark thô (nút thắt của bạn là Postgres, không phải runtime), “developer experience” như một điểm số chủ quan (cả ba đều ổn), và tích hợp Kubernetes (nếu bạn đang đọc bài này thì bạn không muốn dính Kubernetes).
Một thứ tôi mới bắt đầu đưa vào: platform hành xử thế nào vào Chủ Nhật khi có chuyện và bạn là người duy nhất có thể fix. Kamal đưa bạn ssh và một stack bạn có thể suy luận hoàn toàn. Fly cho bạn fly ssh console và một lớp trừu tượng. Render cho bạn một dashboard và một form support. Hãy chọn đường thoát hiểm phù hợp với cách bạn giải quyết vấn đề khi căng thẳng.
Những cái bẫy
Lỗi hay gặp nhất với Kamal là coi nó như managed platform. Không phải. Kamal không backup database giúp bạn. Không patch kernel. Không xoay vòng log. Nếu bạn chọn Kamal, bạn cũng đang chọn luôn một practice vận hành Linux nho nhỏ. Đó là một sự đánh đổi xứng đáng với nhiều founder. Và là một sự đánh đổi tệ hại nếu bạn thực sự không muốn học cái stack đó.
Lỗi hay gặp nhất với Fly.io là rải region quá tay. Mọi người thấy câu chuyện global edge rồi deploy bốn region ngay ngày đầu. Giờ họ có gấp bốn bề mặt sự cố, gấp bốn cold start trên gói nhỏ nhất, và một topology Postgres replication họ không hiểu. Với một app sớm có user ở một quốc gia, một region Fly duy nhất là đúng.
Lỗi hay gặp nhất với Render là không tính toán kỹ tier Postgres miễn phí. Postgres free trên Render sẽ hết hạn. Bạn sẽ nhận được mail. Tuần đó bạn sẽ bận. Hãy lên kế hoạch ngay từ ngày đầu dùng database trả phí — hoặc host database ở chỗ khác — nếu muốn ngủ ngon.
Một cái bẫy chung cho cả ba: deploy mà không có câu chuyện job runner. Rails app sinh ra background worker rất nhanh. Bất cứ cái nào bạn chọn cũng phải host được Sidekiq hoặc Solid Queue mà không bắt bạn re-platform sau sáu tháng. Tôi đã viết về quyết định đó trong Sidekiq vs Solid Queue trong 2026; lựa chọn deploy và lựa chọn queue tương tác với nhau nhiều hơn mức nên có.
Pattern thực tế trông như thế nào
Hình dung một Rails SaaS đang có những khách hàng trả tiền đầu tiên. Postgres, Redis, một web process, một worker process, vài inbound webhook, ActionMailer gọi đến một transactional provider. Có thể thêm một storage bucket cho user upload. Đây là vùng tải mà ba lựa chọn tách nhau rõ nhất.
Trên Kamal: một con Hetzner, khoảng $10–$20/tháng (~255k–510k VNĐ) tuỳ RAM. Postgres và Redis chạy như Docker container trên cùng máy. pg_dump hằng ngày sang object storage tương thích S3. Caddy hoặc Traefik đứng trước lo TLS. Kamal lo zero-downtime deploy qua xoay vòng container. Toàn bộ hoá đơn là một dòng VPS cộng vài đô object storage. Cái giá phải trả bằng thời gian: một cuối tuần setup, rồi patching đều đặn sau đó.
Trên Fly: một web Machine nhỏ, một worker Machine nhỏ, managed Postgres gói nhỏ nhất, Upstash Redis hoặc Fly Redis. Hoá đơn rơi vào khoảng vài chục đô mỗi tháng (~500k–1,5tr VNĐ) cho lưu lượng giai đoạn đầu. Deploy là fly deploy. Bạn gần như không tốn thời gian cho host. Bạn tốn một ít thời gian học các primitive của Fly — release commands, secrets, volumes.
Trên Render: một web service, một background worker service, một managed Postgres, một managed Redis. Mỗi cái là một dòng hoá đơn. Bill cao hơn hai lựa chọn kia cho cùng tài nguyên, nhưng thời gian bạn bỏ ra cho infra gần bằng không. Deploy tự động khi push.
Với một founder coi chênh lệch $30 (~765k VNĐ) ít giá trị hơn một ngày thứ Bảy: chọn Render. Với một founder coi ngày thứ Bảy ít giá trị hơn $30, và đã có thể viết một systemd unit không cần Google: chọn Kamal. Fly là lựa chọn đúng khi bạn có lý do thật để cần machine gần user hơn, hoặc khi persistent volume theo region là một phần của sản phẩm. Nếu bạn không nói rõ được lý do đó, Fly là một thắng lợi kém hiển nhiên.
Deploy stack rẻ nhất là cái mà bạn đã biết cách sửa lỗi của nó.
”Xong” trông như thế nào
Một setup deploy được coi là xong — với một solo founder — khi bốn ô được tick, không phải khi dashboard chuyển xanh.
Bạn có thể deploy một thay đổi trong dưới năm phút từ git push đến “khách hàng nhìn thấy” mà không cần suy nghĩ. Bạn có một backup database đã được test, nghĩa là một backup bạn đã thật sự restore vào môi trường mới ít nhất một lần. Bạn có log có thể tìm kiếm trở về ít nhất bảy ngày. Và bạn có một runbook đã ghi chép cho tình huống “phải làm gì nếu production sập ba mươi phút”, kể cả khi runbook đó chỉ là ba gạch đầu dòng trong một trang Notion.
Nếu thiếu bất kỳ ô nào trong bốn ô đó, deploy chưa xong; nó là việc bị hoãn lại đội lốt một app đang chạy.
Lựa chọn platform gần như không quyết định gì ở checklist này. Kamal có thể đạt cả bốn với một cuối tuần làm việc và một con máy $10 (~255k VNĐ/tháng). Render đạt ba điều đầu ngay từ đầu và để runbook cho bạn. Fly đạt ba điều đầu với gói trả phí và để runbook cho bạn. Kỷ luật mới là thứ chịu tải — không phải brand.
Khi rubric này không áp dụng
Nếu bạn có nhiều engineer, đã có practice Kubernetes sẵn, hoặc có yêu cầu compliance buộc dùng region cloud cụ thể, toàn bộ rubric này sụp đổ. Team nhiều engineer nên tối ưu cho mental model chung, không phải chi phí infra. App ràng buộc compliance nên hỏi auditor trước, hỏi deploy tool sau. Và nếu bạn đã chạy trên AWS hoặc GCP vì một lý do không tầm thường, câu trả lời có lẽ là ECS hoặc Cloud Run, không phải ba cái trên.
Rubric này cũng không áp dụng nếu app của bạn không thật sự là một Rails app. Một pipeline dữ liệu nặng Sidekiq không có bề mặt HTTP sẽ được chấm khác. Một static marketing site có câu chuyện riêng — xem Astro trên Cloudflare Workers vs Next.js. Ở thị trường VN, deploy edge qua Cloudflare đang được nhiều dev chọn vì thực tế băng thông trong nước, đây là một xu hướng đáng để cân nhắc cho marketing site.
Một khẳng định nhỏ, có thể bị phản bác
Đây là cái cược tôi sẵn sàng đặt: với một Rails founder ship app trả tiền đầu tiên trong 2026, lựa chọn deploy sẽ không phải thứ giết công ty. Scope mới giết. Pricing mới giết. Auth mới giết. Deploy tool bạn chọn ngày đầu có thể thay trong một cuối tuần nếu bạn giữ Dockerfile sạch và environment variable gọn. Hãy chọn cái mà bạn thà debug lỗi của nó vào Chủ Nhật, ship app đi, và chỉ quay lại câu hỏi này khi có thứ thật sự đang vỡ. Phần còn lại là trì hoãn đội lốt nghiên cứu.