Supabase Alternative cho Next.js: Stack nhanh, gọn, dễ deploy

24/05/2026 · P T P · Chung

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 đề xuất: Next.js + Neon + Drizzle + Auth.js + UploadThing

Stack gọn:

Next.js: frontend, API routes, server actions.
Neon: serverless PostgreSQL.
Drizzle ORM: schema, query, migration.
Auth.js: authentication, OAuth, credentials, session.
UploadThing hoặc S3/R2: file upload.
Vercel: deploy.
Resend: email transactional.
Upstash Redis: rate limit, cache, queue nhẹ nếu cần.

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";

export const users = pgTable("users", { id: uuid("id").primaryKey().defaultRandom(), email: text("email").notNull().unique(), name: text("name"), createdAt: timestamp("created_at").defaultNow().notNull(), });

Query:

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õ.


Storage: UploadThing, S3 hoặc Cloudflare R2

Supabase Storage tiện, nhưng thay thế không khó.

Option 1: UploadThing

Phù hợp app Next.js muốn upload nhanh:

– Cài nhanh.
– Type-safe.
– Có route handler.
– Validate file dễ.
– DX tốt.

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.

Quy trình gọn

1. Push code lên GitHub.
2. Tạo project Vercel.
3. Thêm env:
DATABASE_URL
AUTH_SECRET
– OAuth client id/secret
– storage token
– email API key
4. Chạy migration.
5. Deploy.

Migration nên chạy thế nào?

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.


Template kiến trúc thư mục

Cấu trúc gọn cho Next.js App Router:

src/
  app/
    (auth)/
    dashboard/
    api/
  db/
    schema.ts
    index.ts
    migrations/
  lib/
    auth.ts
    permissions.ts
    validators.ts
  server/
    actions/
    queries/
  components/

Nguyên tắc:

db/: schema và database client.
lib/auth.ts: config Auth.js.
server/actions/: mutation.
server/queries/: đọc dữ liệu.
validators.ts: Zod schema.
– UI không chứa logic bảo mật chính.

Cấu trúc này không hoàn hảo cho mọi app, nhưng đủ sạch để scale từ MVP lên SaaS nhỏ.


So sánh nhanh với Supabase

| Nhu cầu | Supabase | Stack alternative |
|—|—|—|
| Setup nhanh | Rất nhanh | Nhanh, cần ghép |
| Postgres | Có | Neon Postgres |
| Auth | Built-in | Auth.js/Clerk |
| Storage | Built-in | UploadThing/R2/S3 |
| Realtime | Mạnh | Cần Ably/Pusher |
| Migration bằng code | Có, nhưng không trung tâm | Rõ với Drizzle |
| Vendor lock-in | Trung bình | Thấp hơn |
| Dashboard all-in-one | Có | Không |
| Linh hoạt | Tốt | Rất tốt |

Nếu bạn cần backend platform đầy đủ, Supabase vẫn ngon. Nếu bạn cần stack tinh gọn quanh Next.js, alternative modular đáng thử.


Khi nào nên dùng Clerk thay Auth.js?

Auth.js mạnh nhưng cần tự cấu hình. Nếu muốn auth “xong nhanh”, dùng Clerk.

Clerk có:

– UI đăng nhập sẵn.
– Organization/team support.
– MFA, passkey, social login.
– Dashboard quản user.
– Next.js integration tốt.

Đổi lại: chi phí cao hơn, phụ thuộc vendor hơn. Với SaaS B2B cần organization nhanh, Clerk thường tiết kiệm nhiều tuần dev.

Stack lúc đó:

– Next.js
– Neon
– Drizzle
– Clerk
– UploadThing/R2
– Vercel

Nhanh hơn Auth.js, ít tự code hơn.


Kết luận: chọn stack theo độ phức tạp thật

Supabase là lựa chọn tốt. Nhưng không phải mặc định duy nhất cho Next.js. Nếu muốn stack nhanh, gọn, dễ deploy, hãy nghĩ theo module:

Database: Neon.
ORM: Drizzle.
Auth: Auth.js nếu muốn tự chủ, Clerk nếu muốn nhanh.
Storage: UploadThing cho đơn giản, R2/S3 cho bền.
Email: Resend.
Deploy: Vercel.

Stack đề xuất cho phần lớn MVP:

Next.js + Neon + Drizzle + Auth.js + UploadThing + Resend + Vercel

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ỏ.

#alternative #next #nhanh #stack #supabase
Chia sẻ:
← Trước
Backend-as-a-Service hậu Supabase: cơ hội mới cho indie dev

Bài viết tương tự

Bình luận

Chưa có bình luận. Hãy là người đầu tiên!