Supabase alternative cho Next.js: stack nhanh, gọn, dễ deploy
Supabase hay. PostgreSQL thật, Auth có sẵn, Storage tiện, Realtime mạnh. Với nhiều app Next.js, Supabase đủ tốt để đi từ ý tưởng tới production. Nhưng không phải team nào cũng cần full backend platform. Có app cần nhẹ hơn. Có team muốn ít magic hơn. Có dự án muốn deploy nhanh trên Vercel, code rõ, database riêng, auth linh hoạt, không bị khóa vào một dashboard.
“Supabase alternative” không nhất thiết là một dịch vụ giống Supabase 1:1. Cách hay hơn: ghép stack nhỏ, mỗi phần làm đúng việc. Next.js làm web và server routes. Database serverless làm dữ liệu. Auth provider làm đăng nhập. ORM quản schema. Object storage làm file. Deploy trên Vercel hoặc Cloudflare.
Mục tiêu: nhanh, gọn, dễ deploy, vẫn đủ chắc cho sản phẩm thật.
Khi nào nên tìm alternative cho Supabase?
Supabase mạnh, nhưng có vài tình huống nên cân nhắc stack khác:
– App chủ yếu CRUD: không cần Realtime, Edge Functions, dashboard quá nhiều.
– Team muốn kiểm soát schema bằng code: migration rõ, review qua Git.
– Deploy trên Vercel là chính: muốn stack ăn khớp với Next.js App Router.
– Auth cần custom flow: organization, role, invitation, SSO, passkey.
– Database workload nhỏ hoặc vừa: serverless Postgres đủ, không cần tự vận hành.
– Muốn thay từng mảnh dễ: đổi auth, đổi DB, đổi storage không đập lại cả app.
Tư duy đúng: chọn ít thành phần, dùng chuẩn phổ biến, tránh over-engineering.
Stack này giống Supabase ở phần “build app nhanh”, nhưng modular hơn. Không có dashboard all-in-one. Đổi lại: code rõ, deploy dễ, chi phí kiểm soát tốt.
Database: Neon thay Supabase Postgres
Supabase dùng Postgres. Neon cũng dùng Postgres, nhưng thiết kế serverless mạnh hơn cho môi trường như Vercel.
Vì sao Neon hợp Next.js?
– Serverless Postgres: scale về 0, hợp app ít traffic.
– Connection pooling: tránh lỗi quá nhiều connection khi chạy serverless.
– Branch database: tạo branch DB cho preview deployment.
– Postgres chuẩn: không học database mới.
– Tích hợp Vercel tốt: env, preview workflow mượt.
Với Next.js, mỗi request có thể tạo execution environment riêng. Database truyền thống dễ chạm giới hạn connection. Neon có pooled connection string, phù hợp hơn.
Khi nào không dùng Neon?
– Workload cực nặng, cần tuning sâu.
– Query realtime latency cực thấp.
– Cần self-host DB nội bộ.
– Cần extension đặc thù không hỗ trợ.
Phần lớn SaaS nhỏ, internal tool, marketplace, dashboard, blog platform: Neon đủ khỏe.
ORM: Drizzle thay Prisma nếu muốn gọn
Prisma phổ biến, DX tốt. Nhưng Drizzle nhẹ hơn, gần SQL hơn, chạy ổn trong serverless.
Drizzle mạnh ở đâu?
– Schema bằng TypeScript.
– Query type-safe.
– Ít runtime overhead.
– Migration rõ.
– Không cần Prisma engine.
– Hợp edge/serverless hơn.
Ví dụ schema đơn giản:
import { pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";
const user = await db.query.users.findFirst({
where: eq(users.email, email),
});
Không có nhiều magic. SQL vẫn hiện rõ trong đầu. Team backend thích kiểm soát sẽ dễ chịu.
Auth: Auth.js thay Supabase Auth
Supabase Auth tiện, nhất là email magic link, OAuth, row level security. Nhưng nếu app Next.js cần flow custom, Auth.js rất đáng dùng.
Auth.js phù hợp khi nào?
– Login bằng Google, GitHub, email.
– Session chạy trong Next.js App Router.
– Cần adapter database.
– Muốn tự quản user table.
– Cần role, organization, team membership.
– Muốn tích hợp middleware bảo vệ route.
Auth.js không phải dịch vụ hosted. Nó là thư viện. Nghĩa là bạn tự cấu hình, tự hiểu session, tự lưu user. Ban đầu mất thêm thời gian, nhưng về dài hạn linh hoạt.
Role và permission
Thay vì phụ thuộc RLS như Supabase, bạn có thể kiểm tra quyền ở server:
if (user.role !== "admin") {
throw new Error("Unauthorized");
}
Hoặc tạo helper:
await requireRole("admin");
Cách này dễ hiểu với team Next.js. Nhưng phải kỷ luật: mọi mutation quan trọng phải chạy server-side và check quyền rõ.
Hợp avatar, attachment, image upload, tài liệu nhỏ.
Option 2: Cloudflare R2 hoặc AWS S3
Phù hợp production lớn hơn:
– Chi phí tốt.
– Chuẩn S3 API.
– CDN dễ.
– Không khóa vào framework.
R2 đặc biệt hấp dẫn vì không tính egress theo kiểu AWS S3. Với app nhiều ảnh/file, R2 giúp giảm bill.
Realtime: cần không rồi mới chọn
Supabase Realtime là lợi thế lớn. Nếu app cần chat, presence, live dashboard, collaborative UI, hãy cân nhắc kỹ trước khi rời Supabase.
Nhưng nhiều app không cần realtime thật. Notification có thể poll. Dashboard có thể refresh. Order status có thể dùng webhook. Admin panel không cần socket.
Nếu cần realtime trong stack alternative:
– Ably: realtime managed, mạnh.
– Pusher: đơn giản, phổ biến.
– Liveblocks: collaboration, comments, presence.
– Socket.io: tự host, linh hoạt nhưng thêm vận hành.
– SSE trong Next.js: đủ cho stream một chiều.
Nguyên tắc: đừng thêm realtime nếu business chưa cần. Realtime làm system phức tạp hơn.
Deploy: Vercel là đường ngắn nhất
Với Next.js, Vercel vẫn là đường nhanh nhất tới production.
Không nên để migration tự chạy tùy tiện trong mỗi request. Cách an toàn:
– Chạy migration trong CI/CD step.
– Hoặc chạy thủ công trước release.
– Hoặc dùng script riêng:
pnpm db:migrate
Drizzle Kit hỗ trợ generate và migrate tốt. Mọi thay đổi schema nằm trong Git, review được.
Chi phí: stack nhỏ, bill dễ đoán
Supabase có free tier tốt, nhưng khi scale, chi phí gồm database, storage, auth, edge, bandwidth. Stack modular cũng có chi phí, nhưng chia rõ từng phần.
Ví dụ cho MVP:
– Vercel: free/pro tùy team.
– Neon: free hoặc gói nhỏ.
– Auth.js: không tính phí thư viện.
– UploadThing/R2: theo dung lượng.
– Resend: free tier đủ test.
– Upstash: free tier đủ rate limit nhẹ.
Điểm mạnh: phần nào tăng thì trả phần đó. Điểm yếu: nhiều dashboard hơn. Với team nhỏ, nên giữ số dịch vụ dưới 5.
Bảo mật: ít magic, nhiều trách nhiệm
Rời Supabase nghĩa là mất một số guardrail như RLS mặc định nếu bạn dùng tốt. Stack custom đòi hỏi kỷ luật.
Checklist tối thiểu:
– Validate input bằng Zod.
– Check auth server-side cho mọi mutation.
– Check ownership: user chỉ sửa dữ liệu của mình.
– Không tin client.
– Rate limit endpoint nhạy cảm.
– Hash token nếu lưu API key hoặc reset token.
– Dùng HTTPS và secure cookie.
– Không log secret.
– Backup database.
Ví dụ lỗi phổ biến: chỉ ẩn nút “Delete” trên UI nhưng API vẫn cho xóa. Fix: check quyền trong server action hoặc route handler.
Stack này đủ nhẹ để build nhanh, đủ rõ để bảo trì, đủ mở để thay từng mảnh khi sản phẩm lớn lên. Không phải “Supabase clone”. Là cách ghép công cụ đúng việc, giảm magic, tăng kiểm soát.
Chọn Supabase nếu bạn cần all-in-one và realtime mạnh. Chọn stack modular nếu bạn muốn Next.js làm trung tâm, schema bằng code, deploy thẳng, và không mang quá nhiều nền tảng khi app còn nhỏ.