Backend serverless thay Supabase cho SaaS: rẻ, nhanh, dễ mở rộng

17/05/2026 · P T P · Chung

Kiến trúc backend serverless thay thế Supabase cho ứng dụng SaaS

Supabase tốt. Nhanh. Dễ bắt đầu. Có Postgres, Auth, Storage, Realtime, Edge Functions. Nhưng SaaS lớn dần, câu hỏi khó xuất hiện: chi phí tăng sao? giới hạn nền tảng ở đâu? dữ liệu nhạy cảm đặt chỗ nào? vendor lock-in ra sao? cần multi-tenant phức tạp thì làm thế nào?

Giải pháp: tự ghép kiến trúc backend serverless. Không phải “tự build mọi thứ từ số không”. Mà chọn dịch vụ managed đúng việc: database, auth, API, job, storage, observability. Kết quả: linh hoạt hơn Supabase, scale theo phần, kiểm soát bảo mật tốt hơn, đổi nhà cung cấp dễ hơn.

Bài viết này đưa kiến trúc thực tế cho SaaS: thay Supabase bằng stack serverless hiện đại, vẫn giữ tốc độ phát triển cao.

Supabase cung cấp gì, cần thay bằng gì?

Supabase thường đóng vai trò “backend all-in-one”. Khi thay, phải tách thành từng khối:

Database: Postgres serverless hoặc managed Postgres.
Auth: đăng nhập, session, OAuth, MFA, organization.
API layer: REST/GraphQL/RPC, business logic.
Storage: file upload, avatar, invoice, asset.
Realtime: websocket, pub/sub, event stream.
Background jobs: email, billing, sync, export.
Edge/serverless functions: logic gần người dùng.
Observability: log, metric, tracing, audit.
Authorization: RBAC/ABAC, tenant isolation.

Sai lầm thường gặp: chỉ thay database rồi gọi đó là kiến trúc. Không đủ. SaaS cần toàn bộ vòng đời: đăng ký, thanh toán, phân quyền, giới hạn gói, audit, retry, backup.

Kiến trúc đề xuất

Mô hình nền:

Frontend: Next.js, Remix, Nuxt, SvelteKit.
API: serverless functions hoặc edge functions.
Database: Neon, AWS Aurora Serverless v2, PlanetScale nếu không cần Postgres, hoặc RDS managed.
Auth: Clerk, Auth0, AWS Cognito, WorkOS, hoặc Lucia/Auth.js nếu muốn tự quản.
Storage: S3/R2/GCS.
Queue: SQS, Cloud Tasks, Upstash QStash, Inngest, Trigger.dev.
Realtime: Ably, Pusher, Liveblocks, WebSocket API, hoặc Postgres logical replication.
Cache/Rate limit: Upstash Redis, Cloudflare KV/Durable Objects.
Billing: Stripe.
Observability: OpenTelemetry, Sentry, Datadog, Grafana Cloud.
IaC: Terraform, Pulumi, SST, AWS CDK.

Luồng request đơn giản:

1. User đăng nhập qua Auth provider.
2. Frontend nhận token/session.
3. API serverless xác thực token.
4. API kiểm tra tenant, role, plan limit.
5. API đọc/ghi database.
6. Event ghi vào queue.
7. Worker xử lý email, webhook, export, sync.
8. Log, metric, trace gửi về observability.

Database: trung tâm kiến trúc SaaS

Nếu thay Supabase nhưng vẫn muốn Postgres, Neon thường hợp. Có branching, autoscaling, connection pooling. Hợp môi trường preview, CI, multi-stage. Aurora Serverless v2 hợp workload lớn trong AWS, cần VPC, compliance, tích hợp sâu. RDS hợp ổn định, kiểm soát cao, ít “serverless” hơn.

Thiết kế schema SaaS cần rõ:

tenant_id trong bảng business.
organization_id nếu mô hình team.
user_id cho ownership.
rolepermission tách riêng.
audit_log cho hành động quan trọng.
subscriptionusage_meter cho billing.

Ví dụ bảng chính:

create table organizations (
  id uuid primary key,
  name text not null,
  created_at timestamptz default now()
);

create table memberships ( organization_id uuid references organizations(id), user_id text not null, role text not null, primary key (organization_id, user_id) );

create table projects ( id uuid primary key, organization_id uuid references organizations(id), name text not null, created_at timestamptz default now() );

Supabase có Row Level Security mạnh. Khi rời Supabase, phải thay bằng lớp kiểm soát rõ. Có hai hướng:

Database-level RLS: dùng Postgres RLS, truyền tenant context.
Application-level authorization: kiểm tra trong API, dễ debug hơn, nhưng phải kỷ luật.

Với SaaS B2B, kết hợp tốt nhất: app-level cho logic, database constraint cho hàng rào cuối.

Auth: đừng tự làm nếu chưa cần

Auth nhìn đơn giản, nhưng khó: OAuth, password reset, session rotation, MFA, SSO/SAML, SCIM, device management, breach protection. SaaS B2B nên cân nhắc Clerk, Auth0, WorkOS. SaaS enterprise cần SAML/SCIM thì WorkOS mạnh.

Cấu trúc token nên chứa ít dữ liệu:

sub: user id.
org_id: organization hiện tại nếu có.
roles: vai trò cơ bản.
session_id: truy vết.
– Không nhét quyền phức tạp, giá gói, dữ liệu nhạy cảm vào token.

API phải luôn kiểm tra quyền từ nguồn tin cậy: database hoặc permission service. Token chỉ là bằng chứng danh tính.

API layer: nơi business logic sống

Supabase khuyến khích client nói chuyện trực tiếp với database qua generated API. Nhanh, nhưng với SaaS lớn có rủi ro: logic rải rác, policy khó đọc, workflow phức tạp khó quản.

Kiến trúc thay thế nên đặt API layer làm cổng chính:

POST /projects: tạo project, kiểm tra plan limit, ghi audit.
POST /invites: kiểm tra role admin, gửi email qua queue.
POST /billing/checkout: tạo Stripe Checkout.
POST /webhooks/stripe: xác minh signature, cập nhật subscription.

Có thể dùng:

Next.js Route Handlers: đơn giản, tốt cho app vừa.
Hono: nhẹ, chạy Cloudflare Workers, Bun, Node.
tRPC: type-safe với TypeScript.
GraphQL Yoga: hợp client phức tạp.
AWS Lambda + API Gateway: chuẩn enterprise.

Nguyên tắc: client không tự quyết business rule. API quyết.

Background jobs: phần hay bị quên

SaaS không chỉ request-response. Nhiều việc phải chạy nền:

– Gửi email mời thành viên.
– Xử lý webhook Stripe.
– Đồng bộ CRM.
– Tạo báo cáo PDF.
– Import CSV.
– Xoá dữ liệu theo retention.
– Tính usage hằng ngày.

Dùng queue để tránh mất dữ liệu khi lỗi. Lựa chọn:

Inngest: workflow tốt, retry, step function dễ.
Trigger.dev: developer experience tốt.
AWS SQS + Lambda: bền, rẻ, chuẩn.
Cloud Tasks: tốt trên GCP.
QStash: đơn giản cho HTTP jobs.

Quy tắc vàng: mọi job phải idempotent. Chạy lại không gây nhân đôi tiền, email, record. Với webhook Stripe, lưu event_id đã xử lý.

Storage: tách file khỏi database

Supabase Storage tiện. Thay bằng S3, Cloudflare R2, hoặc Google Cloud Storage. Không upload file qua API nếu không cần. Dùng signed URL:

1. Client xin URL upload.
2. API kiểm tra quyền và giới hạn.
3. API tạo signed URL.
4. Client upload thẳng lên object storage.
5. API lưu metadata vào database.

Metadata nên có:

organization_id
owner_id
bucket
key
content_type
size
visibility
created_at

File private phải phục vụ bằng signed URL ngắn hạn. Không public bucket trừ asset thật sự công khai.

Realtime: chọn theo use case

Supabase Realtime dùng tốt cho dashboard, notification nhẹ. Khi thay, đừng tự build websocket nếu chưa cần.

Tùy nhu cầu:

Notification đơn giản: Ably, Pusher.
Collaborative editor: Liveblocks, Yjs provider.
Internal event stream: Kafka, EventBridge, NATS.
Per-user updates: WebSocket API + Redis pub/sub.
Cache invalidation: event queue + revalidate.

Realtime đắt khi scale sai. Đừng broadcast dữ liệu lớn. Gửi event nhỏ: project.updated, invoice.paid, comment.created. Client tự fetch chi tiết nếu cần.

Multi-tenant: quyết định sớm

SaaS cần tenant isolation. Có ba mô hình:

Shared database, shared schema

Mọi bảng có organization_id. Rẻ, dễ vận hành. Phù hợp phần lớn SaaS nhỏ-vừa. Rủi ro: bug query thiếu tenant filter.

Shared database, schema per tenant

Mỗi tenant có schema riêng. Cô lập tốt hơn. Migration phức tạp hơn. Hợp khách hàng lớn vừa phải.

Database per tenant

Cô lập mạnh. Backup, compliance, custom region tốt. Chi phí và vận hành cao. Hợp enterprise.

Khuyến nghị thực tế: bắt đầu shared schema với guardrail mạnh:

– Middleware bắt buộc organization_id.
– Query builder tự thêm tenant filter.
– Test chống data leak.
– Audit log mọi truy cập nhạy cảm.
– Optional RLS cho bảng quan trọng.

Bảo mật và compliance

Kiến trúc serverless không tự an toàn. Cần checklist:

– Mã hóa at rest và in transit.
– Secret trong secret manager, không trong .env production trôi nổi.
– Webhook phải xác minh signature.
– Rate limit login, invite, export, API công khai.
– Audit log admin action.
– Backup định kỳ, restore test thật.
– Principle of least privilege cho IAM.
– Dependency scanning.
– Data retention và deletion flow.
– Region strategy nếu có GDPR/DPPA.

Với B2B, audit log và quyền admin quan trọng không kém tính năng.

Chi phí: serverless không luôn rẻ

Serverless rẻ khi traffic thất thường. Đắt khi workload liên tục, chatty, hoặc realtime nhiều. Cần đo:

– Số request API.
– Số query database/request.
– Connection database.
– Queue invocation.
– Storage egress.
– Realtime connection-minute.
– Log volume.

Tối ưu sớm nhất: giảm query thừa, cache dữ liệu đọc nhiều, batch job, giới hạn log debug, dùng CDN. Đừng cache dữ liệu phân quyền nếu chưa có invalidation tốt.

Kết luận thực tế

Thay Supabase không nghĩa build lại Supabase. Nghĩa là tách backend thành các dịch vụ chuyên dụng, có ranh giới rõ: Auth lo danh tính, API lo business logic, Postgres lo dữ liệu, queue lo việc nền, object storage lo file, observability lo vận hành.

Stack khuyến nghị cho SaaS TypeScript hiện đại:

Next.js + Hono/tRPC
Neon Postgres
Clerk hoặc WorkOS
S3/R2
Inngest hoặc SQS
Stripe
Sentry + OpenTelemetry
Terraform/SST

Bắt đầu đơn giản: shared schema, API layer rõ, queue cho job quan trọng, signed URL cho file, auth managed. Khi SaaS lớn, nâng từng phần: tenant isolation mạnh hơn, realtime chuyên dụng, compliance sâu hơn, database per tenant cho khách enterprise.

Supabase tốt cho khởi đầu. Kiến trúc serverless ghép đúng tốt cho giai đoạn cần kiểm soát, scale, và khác biệt sản phẩm.

Chia sẻ:

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!