Thay thế Supabase bằng Appwrite: hướng dẫn triển khai auth, database, file storage
Supabase nổi tiếng vì trải nghiệm “Firebase nhưng dùng PostgreSQL”: auth nhanh, database mạnh, storage tiện. Nhưng không phải dự án nào cũng hợp Supabase. Nếu bạn muốn self-host dễ hơn, API backend dạng service rõ ràng, console trực quan, phân quyền tài nguyên chi tiết, Appwrite là lựa chọn đáng cân nhắc.
Appwrite không phải bản sao Supabase. Khác biệt lớn nhất: Supabase xoay quanh PostgreSQL + SQL + Row Level Security, còn Appwrite dùng mô hình Collections/Documents, permissions theo tài nguyên, SDK đa nền tảng. Vì vậy, thay thế Supabase bằng Appwrite không chỉ là đổi SDK. Bạn cần đổi tư duy thiết kế auth, database, file storage.
Bài viết này hướng dẫn triển khai thực tế 3 phần cốt lõi: Auth, Database, File Storage.
1. Khi nào nên chuyển từ Supabase sang Appwrite?
Appwrite phù hợp nếu bạn cần:
– Self-host đơn giản qua Docker.
– Backend-as-a-service đầy đủ: Auth, DB, Storage, Functions, Realtime.
– Permission model trực tiếp theo user/team/document/file.
– SDK đồng nhất cho Web, Mobile, Server.
– Console dễ dùng cho team nhỏ, startup, sản phẩm MVP.
Supabase gắn auth chặt với PostgreSQL RLS. Appwrite dùng permissions. Nghĩa là: user đăng nhập chỉ là một phần. Bạn vẫn phải cấp quyền đọc/ghi cho document/file.
Appwrite hỗ trợ relationship attributes, nhưng nếu ứng dụng cần join phức tạp, hãy cân nhắc kỹ. Với mô hình phổ biến như user → notes, user → posts, post → comments, Appwrite xử lý tốt. Với dashboard analytics, reporting, truy vấn tổng hợp sâu, PostgreSQL vẫn thuận hơn.
5. File Storage: thay Supabase Storage bằng Appwrite Storage
Supabase Storage dùng bucket + policy. Appwrite cũng dùng bucket, nhưng quyền nằm ở bucket/file permissions.
Tạo bucket
Trong Console:
Storage → Create bucket
Bucket ID: avatars
Allowed extensions: jpg,png,webp
Maximum file size: tùy nhu cầu
Permissions: tùy mô hình
Nếu avatar riêng tư theo user, cấp quyền từng file. Nếu ảnh public, bucket/file có quyền đọc public.
Upload file
import { storage, ID } from "./appwrite";
import { Permission, Role } from "appwrite";
– Cho Role.any() quyền write.
– Tin userId từ client mà không kiểm tra.
– Dùng collection public nếu chứa dữ liệu riêng tư.
– Bỏ index rồi query tùy tiện.
– Đưa API key server vào frontend.
Nên
– Dùng account.get() lấy user hiện tại.
– Cấp permission theo Role.user(user.$id).
– Public read chỉ cho dữ liệu thật sự public.
– Server-side Function xử lý logic nhạy cảm.
– Tách collection public/private.
– Review quyền bucket/file trước production.
– Entity nào thành collection?
– Field nào cần query?
– Field nào cần index?
– Document nào private/public?
– Có cần relationship không?
Bước 3: Export dữ liệu
Với Supabase PostgreSQL:
pg_dump
Hoặc export CSV từ dashboard.
Bước 4: Import bằng server script
Dùng Appwrite Server SDK + API key. Không import bằng frontend.
Pseudo-flow:
Read CSV/JSON → transform → createDocument → set permissions
Bước 5: Chuyển storage
Tải file từ Supabase Storage, upload sang Appwrite Storage, lưu mapping:
old_path → new_file_id
Sau đó update document liên quan.
Bước 6: Chuyển auth
Phần khó nhất. Mật khẩu hash thường không thể migrate trực tiếp giữa hệ thống. Cách thực tế:
– Cho user reset password.
– Hoặc dùng custom migration flow.
– Hoặc giữ Supabase Auth tạm thời trong giai đoạn chuyển tiếp.
8. Ví dụ flow hoàn chỉnh: app ghi chú cá nhân
Luồng:
1. User đăng ký/đăng nhập.
2. App gọi account.get().
3. User tạo note.
4. Note được lưu với permission theo user.
5. User chỉ query được note của mình.
6. User upload file đính kèm nếu cần.
7. File cũng có permission theo user.
Không dùng userId từ input form. Lấy từ session hiện tại.
Kết luận
Appwrite là lựa chọn mạnh nếu bạn muốn thay Supabase bằng một backend service dễ self-host, SDK rõ ràng, auth/database/storage tích hợp tốt. Nhưng đừng kỳ vọng chuyển đổi 1:1. Supabase mạnh ở SQL và PostgreSQL; Appwrite mạnh ở API, document model, permissions trực tiếp, trải nghiệm backend-as-a-service gọn.
Nếu app của bạn là SaaS nhỏ, mobile app, MVP, dashboard nội bộ, nền tảng nội dung, app cộng đồng: Appwrite rất đáng thử. Nếu app cần truy vấn SQL phức tạp, reporting nặng, transaction sâu: nên giữ Supabase/PostgreSQL hoặc kết hợp thêm database chuyên dụng.
Cách tiếp cận tốt nhất: migrate từng phần. Bắt đầu với Auth + Storage, sau đó chuyển các module database đơn giản, cuối cùng mới xử lý nghiệp vụ phức tạp. Làm chậm nhưng chắc → ít lỗi quyền, ít mất dữ liệu, ít downtime.