Hướng dẫn Supabase toàn tập: từ tạo project đến dùng MCP cho AI Agent trực tiếp quản cơ sở dữ liệu

Supabase là giải pháp thay thế Firebase mã nguồn mở, bên dưới là PostgreSQL thứ thiệt. Thay đổi lớn nhất năm 2026 là tích hợp MCP — Claude Code, Cursor, Codex có thể trực tiếp truy vấn database, chạy migration, deploy Edge Function. Bài này đi từ tạo project đến RLS và branching, đồng thời chỉ ra những cái bẫy khiến dữ liệu của bạn phơi ra ngoài.

Một kỹ sư làm side project ở Đà Nẵng kể với tôi, anh dùng AI sinh ra một website đăng ký thuê bao, ba ngày là lên sóng, tự thấy mình như thiên tài. Ngày thứ năm anh phát hiện có người tải nguyên bảng dữ liệu người dùng của anh đi — không phải bị hack, mà là anh quên bật Row Level Security, còn anon key thì viết thẳng trong JavaScript ở phía frontend, bấm F12 là thấy.

Bài hướng dẫn này sẽ dạy Supabase từ đầu, nhưng tôi muốn đặt chuyện này lên trước nhất: Supabase dễ làm quen, cũng dễ gây họa.

Supabase là gì

Supabase là nền tảng dịch vụ backend mã nguồn mở, thường được gọi là "giải pháp thay thế Firebase". Nó đóng gói sẵn cho bạn một backend hoàn chỉnh: cơ sở dữ liệu PostgreSQL, xác thực danh tính, lưu trữ tệp, subscription thời gian thực, Edge Functions, và REST cùng GraphQL API sinh tự động.

Khác biệt then chốt nhất so với Firebase là: bên dưới là PostgreSQL thứ thiệt. Bạn viết SQL chuẩn, có foreign key, có transaction, có view và trigger. Điều này nghĩa là hai chuyện — một là kiến thức SQL sẵn có của bạn dùng được hết, hai là ngày nào muốn dọn đi, chỉ cần dump database ra rồi ném lên bất kỳ Postgres nào, không bị khóa chân.

Thay đổi đáng chú ý nhất của Supabase năm 2026 là tích hợp AI. MCP server do hãng phát hành cho phép các coding agent như Claude Code, Cursor, Codex, Gemini CLI thao tác trực tiếp trên project của bạn; ngoài ra còn có tích hợp ChatGPT, tài liệu chính thức nhắc tới khoảng 29 công cụ, bao phủ chạy SQL, sửa schema, mở branch, deploy Edge Function, xem log thời gian thực.

Nó làm được gì

Backend mà một ứng dụng Web hoặc mobile điển hình cần, Supabase gần như gói trọn:

  • Database: PostgreSQL, kèm REST API sinh tự động
  • Auth: email, mật khẩu, magic link, OAuth kiểu Google/GitHub/Apple
  • Storage: tải tệp lên và phân phối qua CDN, quyền tích hợp với chính sách của database
  • Realtime: dữ liệu thay đổi là đẩy tức thời tới frontend
  • Edge Functions: hàm serverless chạy trên môi trường Deno
  • Vector: mở rộng pgvector, dùng ngay để làm truy hồi vector cho RAG

Điểm cuối này rất hữu ích cho ứng dụng AI — bạn không phải mua thêm một vector database riêng cho RAG, Postgres cộng pgvector thừa sức cho ứng dụng quy mô vừa và nhỏ.

Cách dùng: từ tạo project đến truy vấn đầu tiên

Bước 1: Tạo project

Vào supabase.com đăng ký, tạo organization và project. Có ba thứ phải chọn:

  • Region: chọn nơi gần người dùng nhất. Người dùng Việt Nam nên chọn Singapore hoặc Tokyo, chọn us-east thì độ trễ tăng thêm một hai trăm mili-giây
  • Database password: đây là mật khẩu superuser của database, lưu vào trình quản lý mật khẩu, cái này không phải API key
  • Gói: Free có thể bắt đầu trước

Tạo mất một hai phút. Xong rồi vào Project Settings > API sẽ thấy hai chiếc chìa khóa:

  • anon key: được thiết kế để công khai, sẽ đặt trong mã frontend
  • service_role key: tuyệt đối không được đặt ở frontend, nó bỏ qua mọi kiểm tra quyền

Khác biệt giữa hai chiếc chìa khóa này là quan niệm quan trọng nhất cả bài hướng dẫn.

Bước 2: Tạo bảng dữ liệu

Vào Table Editor bấm New table. Lấy ví dụ một danh sách việc cần làm đơn giản:

  • Tên bảng todos
  • Các cột: id (int8, khóa chính, tự tăng, mặc định đã có), user_id (uuid), title (text), done (bool, mặc định false), created_at (timestamptz, mặc định now())

Cột user_id rất then chốt — nó sẽ được đem đối chiếu với ID của người đăng nhập, quyết định ai xem được dòng nào. Khi tạo bảng nhớ tick Enable Row Level Security, giờ Supabase mặc định sẽ nhắc bạn.

Cũng có thể tạo thẳng bằng SQL Editor:

create table todos (
  id bigint primary key generated always as identity,
  user_id uuid references auth.users(id) not null,
  title text not null,
  done boolean default false,
  created_at timestamptz default now()
);
alter table todos enable row level security;

Bước 3: Cài chính sách RLS (bước này không được bỏ)

Sau khi bật RLS, mặc định là cấm tất cả. Bạn phải viết rõ ai được làm gì.

Vào Authentication > Policies, hoặc dùng thẳng SQL:

-- chỉ đọc được todo của chính mình
create policy "read own todos" on todos
  for select using (auth.uid() = user_id);

-- chỉ thêm được dữ liệu có user_id là của mình
create policy "insert own todos" on todos
  for insert with check (auth.uid() = user_id);

-- chỉ sửa được của mình
create policy "update own todos" on todos
  for update using (auth.uid() = user_id);

-- chỉ xóa được của mình
create policy "delete own todos" on todos
  for delete using (auth.uid() = user_id);

auth.uid() là hàm do Supabase cung cấp, trả về ID của người đang đăng nhập. Bốn chính sách này đảm bảo mỗi người chỉ chạm được vào dữ liệu của chính mình.

Viết xong nhất định phải test. Đăng nhập bằng hai tài khoản khác nhau, xác nhận A thật sự không thấy được dữ liệu của B. Đừng tin vào kiểu "tôi viết chính sách rồi thì chắc đúng".

Bước 4: Kết nối từ frontend

Cài SDK:

npm install @supabase/supabase-js

Tạo client và truy vấn:

import { createClient } from '@supabase/supabase-js'

const supabase = createClient(
  process.env.NEXT_PUBLIC_SUPABASE_URL,
  process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
)

// truy vấn (RLS sẽ tự chỉ trả về dữ liệu của người này)
const { data, error } = await supabase
  .from('todos')
  .select('*')
  .order('created_at', { ascending: false })

// thêm mới
await supabase.from('todos').insert({ title: 'viết hướng dẫn', user_id: user.id })

Lưu ý ở đây dùng anon key, quyền hoàn toàn do RLS quyết định. Frontend không lấy được dữ liệu không được phép, vì đã bị chặn ngay ở tầng database.

Bước 5: Thêm đăng nhập

// Đăng ký bằng Email + mật khẩu
await supabase.auth.signUp({ email, password })

// Đăng nhập
await supabase.auth.signInWithPassword({ email, password })

// Đăng nhập Google
await supabase.auth.signInWithOAuth({ provider: 'google' })

Nhà cung cấp OAuth phải bật trước tại Authentication > Providers và điền client ID cùng secret của nền tảng đó. Cấu hình Google phải vào Google Cloud Console tạo OAuth credential, nhớ điền địa chỉ callback mà Supabase cấp vào.

Kỹ thuật nâng cao

Dùng MCP cho AI Agent quản database

Đây là thứ mới hữu ích nhất năm 2026. Sau khi cài Supabase MCP server, các agent như Claude (kết hợp Hướng dẫn Claude Code), Cursor có thể trực tiếp truy vấn database của bạn, sinh migration, deploy Edge Function, và hãng còn đóng gói sẵn agent skills, nên agent sẽ làm theo best practice chứ không sửa lung tung.

Khác biệt cảm nhận thực tế là: trước đây bạn phải mô tả cho AI "bảng của tôi trông thế này, có các cột này", giờ nó tự đi xem. Khi sửa schema nó sẽ sinh file migration chứ không xuống thẳng ALTER TABLE.

Nhưng nhất định chỉ nối vào branch phát triển hoặc preview. Để AI Agent nối thẳng database chính thức, một câu lệnh hiểu sai là có thể xóa mất đồ. Quy trình đúng là agent sửa trên branch, migration bạn đã review mới merge vào môi trường chính thức.

Database branching

Branching của Supabase cho bạn mở một nhánh database độc lập để test thay đổi schema, xác nhận ổn rồi mới merge về môi trường chính thức. Về tính phí không có phí tháng cố định, branch preview chạy trên Micro compute khoảng 0,01344 đô mỗi giờ — một ngày mở tám tiếng khoảng 0,11 đô, rất rẻ.

Dùng kèm MCP là tuyệt đối hợp: agent cứ sửa thoải mái trên branch, hỏng thì xóa đi mở lại.

Edge Functions

Logic cần chạy ở backend (gọi API bên thứ ba, xử lý webhook, giấu khóa bí mật) đặt ở đây:

supabase functions new send-notification
supabase functions deploy send-notification

Môi trường chạy là Deno, viết TypeScript. Những thao tác cần service_role key (ví dụ chức năng quản trị) thì đặt ở đây, tuyệt đối đừng đặt ở frontend.

Dùng pgvector làm RAG

create extension if not exists vector;

create table documents (
  id bigserial primary key,
  content text,
  embedding vector(1536)
);

create index on documents using ivfflat (embedding vector_cosine_ops);

Sau đó dùng SQL làm tìm kiếm tương đồng là được. Ứng dụng RAG quy mô vừa và nhỏ như vậy là đủ, không cần đưa thêm Pinecone hay Qdrant.

Lưu ý

RLS là phòng tuyến duy nhất của bạn. Nói lại lần nữa: anon key là công khai, nhìn thấy trong mã nguồn frontend, đây là thiết kế cố ý. Quyền hoàn toàn dựa vào RLS. Trước khi lên chạy hãy kiểm tra từng bảng đều đã bật RLS và chính sách đúng. Trang quản trị Supabase sẽ hiện cảnh báo với những bảng công khai chưa bật RLS, đừng bỏ qua nó.

service_role key tuyệt đối không vào frontend. Nó bỏ qua mọi RLS. Chỉ được đặt trong Edge Functions, máy chủ backend hoặc biến môi trường của CI. Trước khi commit vào git hãy kiểm tra một lần.

Gói miễn phí sẽ bị tạm dừng. Project để không một thời gian sẽ bị pause, phải đánh thức thủ công. Sản phẩm có người dùng thật thì ít nhất nên lên Pro (25 đô/tháng).

Cẩn thận các hạng mục mua thêm. PITR khôi phục theo thời điểm 100 đô mỗi 7 ngày, tên miền tùy chỉnh 10 đô, MFA nâng cao project đầu 75 đô. Những đơn giá này không rẻ, mở trước hãy xác nhận thật sự cần.

Nơi lưu trữ dữ liệu. Khi chọn region không chỉ cân nhắc độ trễ. Nếu dịch vụ của bạn có dữ liệu cá nhân và có yêu cầu lưu trữ trong nước, phải xác nhận khu vực đã chọn phù hợp quy định. Việt Nam hiện chưa có region của Supabase, gần nhất là Singapore và Tokyo.

Nhận định của TheAI Academy

Đóng góp lớn nhất của Supabase mấy năm nay là làm cho việc "một người làm trọn cả sản phẩm" trở nên thật sự khả thi. Trước đây bạn phải biết backend, phải dựng database, phải xử lý đăng nhập, giờ những thứ này đều là cài đặt. Cộng thêm tích hợp MCP của năm 2026, AI Agent quản database trực tiếp, tốc độ phát triển lại nhanh thêm một bậc.

Nhưng tôi phải nói thẳng mặt còn lại: nó khiến người không hiểu database cũng đẩy được database lên chạy, và đó chính là chỗ rủi ro. Kỹ sư ở Đà Nẵng kia không ngốc, anh chỉ không biết key ở frontend là công khai. Công cụ hạ thấp ngưỡng vào, nhưng hậu quả rò rỉ dữ liệu không hạ theo.

Lời khuyên của tôi rất đơn giản: bạn có thể dùng AI viết 90% mã, nhưng đoạn chính sách RLS xin hãy tự hiểu, tự test qua. Đây là loại việc "sai là không có cơ hội thứ hai".

Nhận định: Supabase hiện là lựa chọn backend mạnh nhất cho lập trình viên cá nhân, nhưng hãy coi "kiểm tra RLS" là mục đầu tiên trong checklist lên chạy, chứ không phải mục cuối cùng.

Lời khuyên cụ thể cho độc giả Việt Nam: hãy dùng gói miễn phí làm một project nhỏ có đăng nhập, cố ý dùng hai tài khoản để test cách ly dữ liệu, tận mắt thấy RLS có hiệu lực rồi mới làm tiếp. Muốn nối AI Agent thì mở một branch tập trước, xác nhận luồng suôn rồi mới cân nhắc chạm môi trường chính thức. Quan niệm an ninh liên quan có thể xem kèm Checklist an ninh ứng dụng LLM.

Nguồn tham khảo

Tổng hợp theo thông tin công khai, tính năng và giá lấy theo tài liệu chính thức.

Câu hỏi thường gặp

Supabase với Firebase nên chọn thế nào?

Khác biệt lớn nhất là mô hình dữ liệu. Supabase bên dưới là PostgreSQL, bạn viết SQL chuẩn, có quan hệ và transaction, sau này muốn dọn sang Postgres tự host gần như không mất chi phí di trú. Firebase là NoSQL, đồng bộ thời gian thực và SDK mobile trưởng thành hơn. Nhu cầu là dữ liệu quan hệ, báo cáo, truy vấn phức tạp thì chọn Supabase; nhu cầu là app mobile đồng bộ thời gian thực thì chọn Firebase.

Không bật RLS thì sao?

Dữ liệu của bạn sẽ công khai luôn. Anon key của Supabase được thiết kế để đặt ở frontend, quyền hoàn toàn dựa vào chính sách Row Level Security canh giữ. Không bật RLS thì bất kỳ ai lấy được anon key của bạn (thấy ngay trong mã nguồn frontend) đều đọc ghi được cả bảng. Đây là nguyên nhân rò rỉ phổ biến nhất của project Supabase, trước khi lên chạy nhất định kiểm tra từng bảng.

Tích hợp MCP có an toàn không?

Tùy bạn cho nó quyền gì. MCP server cho AI Agent chạy SQL, sửa schema, deploy hàm, điều này rất tiện trên branch phát triển, nhưng nối thẳng môi trường chính thức thì rủi ro rất cao. Khuyến nghị là chỉ nối MCP vào branch phát triển hoặc preview, thay đổi ở môi trường chính thức đi theo luồng migration có người duyệt.

Gói miễn phí có dùng để lên chạy được không?

Project nhỏ thì được, nhưng phải chấp nhận hai giới hạn: project để không một thời gian sẽ bị tạm dừng (phải đánh thức thủ công), và trần tài nguyên khá thấp. Sản phẩm có người dùng thật nên ít nhất lên Pro (25 đô/tháng), mới có backup, không bị tạm dừng và hạn mức tài nguyên hợp lý hơn.

繁體中文版 →