Tôi đã tự xây OTA Update cho React Native bằng Hot Updater và Supabase như thế nào?
Xây dựng hệ thống OTA Update cho React Native miễn phí.
Sau khi AppCenter ngừng hoạt động, tôi nghĩ mình sẽ sớm tìm được một giải pháp thay thế CodePush.
Thực tế không đơn giản như vậy.
Những ngày đầu tiên, tôi đi tìm đủ mọi lựa chọn. Expo EAS Update, Revopush, Shorebird, các dịch vụ OTA thương mại khác... gần như cái tên nào xuất hiện trên Google tôi cũng dành thời gian đọc qua.
Nhưng càng tìm hiểu, tôi càng nhận ra một vấn đề.
Tôi không thực sự cần một hệ thống OTA phức tạp.
Điều tôi cần chỉ là khả năng sửa lỗi production nhanh chóng mà không phải submit lại ứng dụng lên Google Play hay App Store.
Và thế là tôi quyết định thử một hướng đi khác.
Tự xây.

OTA thực chất đơn giản hơn chúng ta tưởng
Trước đây, vì CodePush làm quá nhiều thứ nên tôi luôn nghĩ OTA là một hệ thống khá phức tạp.
Nhưng khi ngồi xuống và vẽ lại toàn bộ luồng hoạt động, tôi nhận ra bản chất của OTA khá đơn giản.
Ứng dụng chỉ cần biết một điều: Có phiên bản mới hay không?
Nếu có, ứng dụng sẽ tải bundle mới về máy, giải nén và sử dụng bundle đó thay cho bundle đang được đóng gói trong ứng dụng.
Chỉ vậy thôi.
Mọi thứ khác như dashboard, rollout, analytics hay rollback thực chất chỉ là những tính năng bổ sung được xây dựng xung quanh quy trình này.
Khi nhìn theo góc độ đó, bài toán trở nên dễ thở hơn rất nhiều.

Vì sao tôi chọn Hot Updater?
Trong lúc tìm giải pháp thay thế CodePush, tôi tình cờ biết đến Hot Updater.
Điều khiến tôi thích nhất là cách tiếp cận của dự án này khá thực tế.
Thay vì cung cấp một nền tảng OTA hoàn chỉnh rồi yêu cầu người dùng phụ thuộc vào hạ tầng riêng, Hot Updater tập trung vào đúng phần cốt lõi: tải và áp dụng bundle mới.
Phần lưu trữ bundle ở đâu, kiểm tra phiên bản như thế nào hay xây dashboard ra sao đều do lập trình viên tự quyết định.
Điều đó đồng nghĩa với việc tôi có thể kết hợp nó với bất kỳ hạ tầng nào mình muốn.
Và đó là lúc Supabase xuất hiện.

Supabase gần như giải quyết toàn bộ phần còn lại
Nếu đã từng sử dụng Supabase, bạn sẽ hiểu cảm giác này.
Ban đầu định dùng nó cho một việc rất nhỏ.
Sau đó phát hiện ra nó làm được gần như mọi thứ.
Trong hệ thống OTA của tôi, Supabase đảm nhận hai vai trò.
Đầu tiên là Storage để lưu các bundle sau khi build.
Thay vì phải cấu hình S3, CloudFront hay một hệ thống lưu trữ riêng, tôi chỉ cần upload bundle lên một bucket trong Supabase.
Vai trò thứ hai là cung cấp API để ứng dụng kiểm tra phiên bản mới nhất.
Khi ứng dụng khởi động, nó sẽ gọi API này để biết liệu có bản cập nhật nào mới hay không.
Nếu có, Hot Updater sẽ xử lý phần còn lại.
Nhìn tổng thể, kiến trúc khá đơn giản.
React Native App → Check Version API → Supabase → Download Bundle → Hot Updater → Apply Update
Không có quá nhiều thành phần.
Không có hạ tầng phức tạp.
Không có dịch vụ OTA bên thứ ba.
Điều bất ngờ nhất là chi phí
Lúc bắt đầu, tôi nghĩ chắc chắn sẽ phải tốn một khoản nào đó.
Nhưng sau vài tuần thử nghiệm, tôi nhận ra chi phí gần như bằng không.
Bundle React Native thường không quá lớn.
Với các ứng dụng vừa và nhỏ, dung lượng lưu trữ miễn phí của Supabase hoàn toàn đủ dùng trong thời gian dài.
Ngay cả khi lượng người dùng tăng lên, chi phí mở rộng vẫn thấp hơn rất nhiều so với việc sử dụng một nền tảng OTA thương mại.
Đối với các startup nhỏ hoặc lập trình viên độc lập, đây là một điểm cộng rất lớn.

Tự xây không phải lúc nào cũng màu hồng
Tất nhiên, tự xây đồng nghĩa với việc phải tự chịu trách nhiệm.
Không có nút rollback thần thánh như thời CodePush.
Không có dashboard đẹp mắt để theo dõi trạng thái cập nhật.
Không có hệ thống rollout theo phần trăm người dùng được cấu hình sẵn.
Nếu muốn những tính năng đó, bạn phải tự xây thêm.
Nhưng điều thú vị là phần lớn dự án thực tế không cần tất cả những thứ đó ngay từ đầu.
Nhiều ứng dụng chỉ cần một hệ thống OTA ổn định, dễ vận hành và đủ an toàn để sửa lỗi production khi cần.
Trong trường hợp đó, giải pháp đơn giản thường lại là giải pháp phù hợp nhất.
Nếu làm lại từ đầu, tôi vẫn chọn cách này
Sau khi thử nghiệm nhiều hướng khác nhau, tôi nhận ra mình không còn cố gắng tìm một "CodePush mới" nữa.
Thay vào đó, tôi tập trung vào việc giải quyết đúng nhu cầu của dự án.
Hot Updater xử lý việc cập nhật bundle.
Supabase xử lý lưu trữ và cung cấp dữ liệu phiên bản.
Phần còn lại có thể bổ sung dần theo thời gian nếu thực sự cần.
Đó không phải là hệ thống OTA mạnh nhất.
Cũng không phải giải pháp nhiều tính năng nhất.
Nhưng nó đơn giản, dễ hiểu và đủ tốt để chạy trong thực tế.
Và đôi khi, đó mới là điều quan trọng nhất.

Kết luận
Khi AppCenter đóng cửa, tôi từng nghĩ việc thay thế CodePush sẽ là một bài toán rất khó.
Nhưng sau khi tự xây hệ thống OTA bằng Hot Updater và Supabase, tôi nhận ra vấn đề thực chất đơn giản hơn nhiều so với tưởng tượng.
OTA không nhất thiết phải đi kèm với một nền tảng lớn hay một dịch vụ đắt tiền.
Đôi khi tất cả những gì bạn cần chỉ là một nơi lưu bundle, một API kiểm tra phiên bản và một cơ chế cập nhật đủ ổn định.
Phần còn lại chỉ là những lớp tính năng được thêm vào sau này.
Nếu bạn cũng đang loay hoay tìm một giải pháp OTA sau thời kỳ AppCenter, có lẽ đây là một hướng đáng để thử.
