DevOpsADTEK LABS JOURNAL

Supabase Là Gì? Xây Web App Không Cần VPS và Free Đến Mức Nào?

Supabase là Backend-as-a-Service với PostgreSQL thật, Auto REST API, Auth, Realtime và Edge Functions. Hướng dẫn kiến trúc serverless, bảng quota Free Plan 2026 và lưu ý bảo mật RLS.

adtek
Supabase Là Gì? Xây Web App Không Cần VPS và Free Đến Mức Nào?

Muốn đưa web app lên Internet nhưng không muốn mất thời gian quản lý VPS, cài Nginx, canh PostgreSQL lúc 2 giờ sáng?

Bài này giải thích kiến trúc serverless với Supabase + Cloudflare Pages: database thật, API tự động, auth, realtime — mà không cần SSH vào bất kỳ server nào. Bao gồm bảng quota Free Plan tháng 8/2026 và các lưu ý bảo mật quan trọng.

Mục lục


Supabase là gì?

Supabase là một nền tảng Backend as a Service (BaaS) open-source.

Thay vì tự dựng stack backend truyền thống:

Ubuntu → Nginx → Node.js/PHP → PostgreSQL → Redis → Auth → File Storage

Supabase cung cấp sẵn toàn bộ các thành phần đó trong một project, với PostgreSQL thật làm nền tảng — không phải database proprietary bị lock-in.

Mỗi Supabase project bao gồm:

Thành phần Chức năng
PostgreSQL Database chính
PostgREST API REST API tự động từ schema
Auth Email, OAuth, JWT, Magic link
Storage File/ảnh S3-compatible
Realtime WebSocket subscriptions
Edge Functions Server-side logic trên Deno

1. PostgreSQL Database thật

Đây là điểm quan trọng nhất của Supabase so với các BaaS khác.

Mỗi project có một PostgreSQL instance riêng. Bạn vẫn dùng được toàn bộ SQL chuẩn:

SELECT, INSERT, UPDATE, DELETE
JOIN, VIEW, FUNCTION, TRIGGER, INDEX

Cùng với các PostgreSQL extension như pg_graphql, pgcrypto, uuid-ossp, pg_trgm.

Nếu sau này muốn rời Supabase, dữ liệu vẫn là PostgreSQL chuẩn — dễ migrate sang AWS RDS, Google Cloud SQL, Neon, hoặc VPS tự host.


2. Auto REST API — không cần tự viết backend

Supabase dùng PostgREST để tự sinh REST API từ PostgreSQL schema.

Ví dụ bạn tạo table sites:

CREATE TABLE sites (
  id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
  url text NOT NULL,
  title text,
  boost_count int DEFAULT 0
);

Supabase tự động expose API:

GET    /rest/v1/sites          ← list + filter
GET    /rest/v1/sites?id=eq.X  ← get by id
POST   /rest/v1/sites          ← insert
PATCH  /rest/v1/sites?id=eq.X  ← update
DELETE /rest/v1/sites?id=eq.X  ← delete

Frontend gọi qua Supabase SDK thay vì phải viết backend riêng:

const { data } = await supabase
  .from('sites')
  .select('*')
  .order('boost_count', { ascending: false })

Ngoài REST, Supabase còn hỗ trợ GraphQL thông qua extension pg_graphql.


3. Authentication có sẵn

Supabase Auth xử lý sẵn toàn bộ luồng xác thực phổ biến:

  • Email/password + email verification
  • Magic link (đăng nhập không cần mật khẩu)
  • OAuth: Google, GitHub, Facebook, Discord…
  • JWT + Refresh token tự động
  • Quản lý session

Quan trọng hơn, Auth tích hợp trực tiếp với PostgreSQL Row Level Security (RLS) — giúp giới hạn dữ liệu theo từng user ngay ở tầng database, không phụ thuộc vào logic application.


4. File Storage

Ứng dụng cần lưu avatar, ảnh sản phẩm, file upload, document? Supabase Storage là giải pháp thay cho tự dựng S3 hoặc lưu file trực tiếp trên VPS.

Storage hỗ trợ:

  • Public bucket (ảnh public không cần auth)
  • Private bucket với RLS policy
  • CDN tự động cho file public
  • Image transformation (resize, format convert)

5. Realtime qua WebSocket

Supabase Realtime cho phép frontend nhận thay đổi database ngay lập tức qua WebSocket — không cần polling hay F5 trang.

const channel = supabase
  .channel('sites-changes')
  .on('postgres_changes', {
    event: 'UPDATE',
    schema: 'public',
    table: 'sites'
  }, (payload) => {
    console.log('Site updated:', payload.new)
    updateLeaderboard(payload.new)
  })
  .subscribe()

Realtime phù hợp cho: dashboard, chat, notification, leaderboard, collaborative app, live tracking.

Supabase Realtime chạy trên cluster Elixir Phoenix phân tán — kiến trúc được thiết kế cho high-concurrency.


6. Edge Functions khi cần server-side logic

Không phải logic nào cũng nên chạy thẳng từ frontend xuống database. Các trường hợp cần server-side:

  • Xử lý payment (cần giữ secret key)
  • Gọi webhook bên ngoài
  • Gửi email qua Resend/SendGrid
  • Xử lý dữ liệu nhạy cảm trước khi lưu
  • Gọi API bên thứ ba với rate limit

Supabase Edge Functions chạy trên Deno runtime và được distribute qua hạ tầng edge:

// supabase/functions/send-notification/index.ts
Deno.serve(async (req) => {
  const { userId, message } = await req.json()
  
  // Gửi Telegram notification
  await fetch(`https://api.telegram.org/bot${Deno.env.get('TG_TOKEN')}/sendMessage`, {
    method: 'POST',
    body: JSON.stringify({ chat_id: userId, text: message })
  })
  
  return new Response(JSON.stringify({ ok: true }))
})

Kiến trúc hoàn chỉnh: Web app không có VPS hoạt động như thế nào?

Stack hoàn chỉnh cho một web app hiện đại:

┌─────────────────────────────────────────────┐
│                  Developer                  │
│          git push origin main               │
└──────────────────┬──────────────────────────┘


┌──────────────────────────────────────────────┐
│                  GitHub                      │
│            Source code repository            │
└──────────────────┬───────────────────────────┘
                   │  Auto CI/CD trigger

┌──────────────────────────────────────────────┐
│            Cloudflare Pages                  │
│   React / Vue / Next.js → Build → CDN        │
│   Custom domain + SSL tự động                │
└──────────────────┬───────────────────────────┘
                   │  HTTPS / SDK

┌──────────────────────────────────────────────┐
│                 Supabase                     │
├──────────────────────────────────────────────┤
│  PostgreSQL  │  Auth  │  Storage  │ Realtime │
│  REST API    │  Edge Functions               │
└──────────────────────────────────────────────┘

Workflow deploy chỉ là:

git add .
git commit -m "feat: add feature X"
git push origin main
# → Cloudflare Pages tự build và deploy

Không cần SSH. Không cần apt update. Không cần systemctl restart. Không cần certbot renew.


Supabase Free Plan: quota cụ thể

Tại thời điểm tháng 8/2026, Free Plan của Supabase:

Tài nguyên Free Plan
Free projects 2
PostgreSQL Database 500 MB / project
File Storage 1 GB
Egress bandwidth 5 GB / tháng
Monthly Active Users (Auth) 50.000
Edge Functions invocations 500.000 / tháng
Realtime messages 2 triệu / tháng
Realtime peak connections 200

Nguồn: Supabase Pricing — cập nhật tháng 8/2026.

500 MB database có đủ không?

Với dữ liệu dạng text (users, posts, settings, transactions), 500 MB chứa được hàng triệu records. Thứ làm database tăng nhanh thường là:

  • Log từng request
  • Tracking event chi tiết
  • Lưu JSON blob lớn
  • Lưu file binary trong database (dùng Storage thay thế)

Lưu ý: auto-pause trên Free Plan

Supabase tự động pause project Free nếu không có activity trong 7 ngày. Project bị pause vẫn có thể resume lại (Supabase giữ data tối đa 1 năm).

Free Plan phù hợp cho: học tập, demo, MVP, side project, portfolio có backend. Khi production cần uptime ổn định → nâng Pro Plan ($25/tháng).


Bảo mật: RLS và Service Role Key

Row Level Security (RLS)

Sai lầm phổ biến nhất với Supabase: nghĩ rằng dùng Supabase thì database tự động an toàn. Không phải vậy.

Khi tạo table mới, phải luôn bật RLS và định nghĩa policy:

-- Bật RLS cho table
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;

-- Chỉ user sở hữu order mới được xem
CREATE POLICY "Users can view own orders"
ON orders FOR SELECT
USING (auth.uid() = user_id);

-- Chỉ user đã đăng nhập mới được insert
CREATE POLICY "Authenticated users can insert"
ON orders FOR INSERT
WITH CHECK (auth.role() = 'authenticated');

Nếu không có policy, table sẽ bị block hoàn toàn (với RLS enabled) hoặc public hoàn toàn (nếu dùng anon key mà không có RLS).

Tuyệt đối không expose Service Role Key ra frontend

✅ anon key    → Dùng ở frontend (bị giới hạn bởi RLS)
❌ service_role → CHỈ dùng ở server-side (bypass RLS hoàn toàn)

service_role key phải nằm trong:

  • Supabase Edge Functions (environment variable)
  • Server-side code (Cloudflare Workers, Next.js server action)
  • CI/CD secrets

Không bao giờ commit key này lên GitHub hay đưa vào frontend JavaScript.


Ưu điểm và nhược điểm

Ưu điểm

Ưu điểm Chi tiết
Không quản lý server Không cần lo CPU, RAM, OS, SSL, backup
Deploy nhanh Git push → live. Database tạo bằng SQL hoặc dashboard
Chi phí khởi đầu thấp GitHub + Cloudflare Pages + Supabase Free = $0
PostgreSQL chuẩn Không bị lock-in, dễ migrate sau này
Scale giai đoạn đầu Nâng plan thay vì resize VPS

Nhược điểm

Nhược điểm Chi tiết
Phụ thuộc nhà cung cấp Supabase down → app down
Free có giới hạn Phải trả phí khi app lớn
Auto-pause Free project Không activity 7 ngày → bị pause
Không phải mọi workload Không chạy được Asterisk, FFmpeg, AI GPU inference…

Khi nào dùng Supabase? Khi nào vẫn cần VPS?

Dùng Supabase khi:

  • Web SaaS, CRM nhỏ, Dashboard, Leaderboard ✅
  • MVP, side project, portfolio có backend ✅
  • Tool nội bộ, directory website, marketplace nhỏ ✅
  • App phát triển nhanh với AI-assisted coding ✅
  • Cần auth + realtime mà không muốn tự dựng ✅

Vẫn cần VPS khi:

  • Asterisk, FreeSWITCH, SIP server ❌
  • FFmpeg, video processing nặng ❌
  • AI model inference với GPU ❌
  • Background worker chạy liên tục ❌
  • Custom daemon, Redis, RabbitMQ riêng ❌
  • Cần quyền root toàn bộ hệ điều hành ❌

Supabase không “giết chết VPS”. Hai mô hình giải quyết hai bài toán khác nhau.


Kết luận

Stack GitHub + Cloudflare Pages + Supabase cho phép xây và deploy web app hoàn chỉnh — có database thật, auth, realtime, file storage — mà gần như không cần vận hành server.

Điều này đặc biệt có giá trị ở giai đoạn đầu: trả lời câu hỏi quan trọng nhất trước — “Có người thực sự muốn dùng sản phẩm này không?” — thay vì mất vài ngày chỉ để dựng hạ tầng.

Tuy nhiên, không cần VPS không có nghĩa là không cần hiểu backend. RLS, phân quyền, API key management, rate limiting và backup vẫn phải thiết kế đúng trước khi đưa lên production.


Đọc thêm