Hướng Dẫn Toàn Diện Sử Dụng Supabase CLI Cho Nhà Phát Triển (2026)

Ashley Innocent

Ashley Innocent

24 tháng 3 2026

Hướng Dẫn Toàn Diện Sử Dụng Supabase CLI Cho Nhà Phát Triển (2026)

Apidog cho doanh nghiệp

Triển khai tại chỗ

SSO & RBAC

Tuân thủ SOC 2

Khám phá Apidog Enterprise

Tóm tắt

Supabase CLI chạy một ngăn xếp Supabase hoàn chỉnh trên máy của bạn bằng Docker: PostgreSQL, Auth, Storage và Edge Functions. Cài đặt nó bằng brew install supabase/tap/supabase, chạy supabase initsupabase start để khởi động môi trường cục bộ, sau đó sử dụng supabase db pushsupabase functions deploy để triển khai lên môi trường sản xuất. Đây là cách nhanh nhất để xây dựng và kiểm tra backend Supabase mà không cần chạm vào đám mây.

Giới thiệu

73% lỗi backend bị phát hiện trong môi trường sản xuất vì các nhà phát triển bỏ qua việc kiểm thử cục bộ. Với Supabase CLI, điều đó không còn là lý do biện minh nữa. Bạn sẽ có một môi trường tương đương sản xuất đầy đủ chạy trên máy của mình chỉ trong vòng chưa đầy 5 phút.

Đây là vấn đề thực sự: hầu hết các nhà phát triển hoặc kiểm thử trực tiếp trên môi trường sản xuất (rủi ro) hoặc dành hàng giờ để cấu hình các môi trường cục bộ không bao giờ khớp hoàn toàn với đám mây (gây khó chịu). Supabase CLI giải quyết cả hai vấn đề này. Nó cung cấp cho bạn một ngăn xếp cục bộ dựa trên Docker mô phỏng chính xác môi trường sản xuất, vì vậy những gì hoạt động cục bộ sẽ hoạt động trên môi trường sản xuất.

💡
Nếu bạn đang xây dựng các API trên Supabase, bạn sẽ cần một công cụ để thiết kế, kiểm thử và tài liệu hóa các endpoint đó trong quá trình phát triển. Apidog kết nối trực tiếp với các API REST và GraphQL của Supabase, cho phép bạn kiểm thử backend của mình trong khi xây dựng nó cục bộ.
button

Kiểm thử API Supabase của bạn với Apidog - miễn phí

Đến cuối hướng dẫn này, bạn sẽ có thể:

Tại sao phát triển Supabase cục bộ bị lỗi nếu không có CLI

Nếu bạn đã từng cố gắng xây dựng một ứng dụng Supabase mà không có CLI, bạn sẽ hiểu được nỗi đau đó. Dưới đây là ba kịch bản thường xuyên xảy ra.

Cái bẫy "kiểm thử trên môi trường sản xuất". Bạn thực hiện thay đổi schema trực tiếp trong bảng điều khiển Supabase. Nó hoạt động. Bạn đẩy frontend của mình. Ba ngày sau, một đồng đội kéo repo và ứng dụng của họ bị lỗi vì cơ sở dữ liệu của họ không có cột mới đó.

Sự không khớp môi trường. Bạn thiết lập một phiên bản PostgreSQL cục bộ, tạo lại schema Supabase của mình theo cách thủ công và dành hai giờ để gỡ lỗi tại sao các chính sách Bảo mật Cấp độ Dòng (RLS) lại hoạt động khác nhau cục bộ. Chúng không hoạt động khác nhau. Bạn đã bỏ sót một chính sách.

Vấn đề "chạy được trên máy của tôi". Edge Function của bạn hoạt động trong trình chỉnh sửa bảng điều khiển Supabase nhưng lại thất bại trên môi trường sản xuất vì bạn đã kiểm thử với các giá trị được mã hóa cứng thay vì các biến môi trường thực tế.

Đây không phải là những trường hợp cá biệt. Sai lệch schema (cơ sở dữ liệu cục bộ và từ xa không đồng bộ) là vấn đề số 1 được báo cáo đối với các nhóm sử dụng Supabase. CLI khắc phục cả ba vấn đề:

Supabase CLI hoạt động như thế nào

Ngăn xếp cục bộ

Khi bạn chạy supabase start, CLI sẽ khởi động một ngăn xếp Docker Compose với các dịch vụ này:

Dịch vụ Cổng Mục đích
PostgreSQL 54322 Cơ sở dữ liệu của bạn
PostgREST 54321 API REST tự động tạo
GoTrue 54321/auth Dịch vụ xác thực
Realtime 54321/realtime Các gói đăng ký WebSocket
Storage 54321/storage Lưu trữ tệp
Studio 54323 Bảng điều khiển trực quan
Inbucket 54324 Kiểm thử email (nhận tất cả email cục bộ)
Edge Runtime 54321/functions Trình chạy hàm dựa trên Deno

Đây là ngăn xếp tương tự đang chạy trong Supabase Cloud. Trên máy của bạn.

Cài đặt

macOS:

brew install supabase/tap/supabase

Windows (Scoop):

scoop bucket add supabase https://github.com/supabase/scoop-bucket.git
scoop install supabase

Linux / npm:

npm install -g supabase

Xác minh đã hoạt động:

supabase --version
# supabase 1.x.x
supabase start

Thiết lập dự án

mkdir my-project && cd my-project
supabase init

Điều này tạo ra:

supabase/
├── config.toml       # Cổng, cài đặt auth, cấu hình lưu trữ
├── seed.sql          # Dữ liệu phát triển được tải mỗi khi reset db
└── migrations/       # Lịch sử phiên bản schema

Khởi động ngăn xếp cục bộ

supabase start

Lần chạy đầu tiên tải xuống khoảng 1GB hình ảnh Docker. Sau đó, việc khởi động mất khoảng 10 giây.

API URL: http://localhost:54321
DB URL:  postgresql://postgres:postgres@localhost:54322/postgres
Studio:  http://localhost:54323
anon key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Sao chép anon key vào tệp .env.local của bạn. Bạn sẽ cần nó cho frontend của mình.

Quản lý cơ sở dữ liệu với migration

Migration là cốt lõi của quy trình làm việc CLI. Mọi thay đổi schema đều trở thành một tệp SQL được kiểm soát phiên bản và được theo dõi trong Git. Không còn "ai đã thay đổi cơ sở dữ liệu và khi nào" nữa.

Tạo migration đầu tiên của bạn

supabase migration new create_posts_table
# Tạo: supabase/migrations/20260324120000_create_posts_table.sql

Chỉnh sửa tệp:

-- Tạo bảng bài viết với RLS ngay từ đầu
CREATE TABLE posts (
  id          UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  user_id     UUID REFERENCES auth.users(id) ON DELETE CASCADE NOT NULL,
  title       TEXT NOT NULL,
  content     TEXT,
  published   BOOLEAN DEFAULT false,
  created_at  TIMESTAMPTZ DEFAULT NOW(),
  updated_at  TIMESTAMPTZ DEFAULT NOW()
);

-- Bật Bảo mật Cấp độ Dòng (Row Level Security)
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;

-- Bất kỳ ai cũng có thể đọc các bài viết đã xuất bản
CREATE POLICY "Anyone can read published posts"
  ON posts FOR SELECT
  USING (published = true);

-- Người dùng quản lý bài viết của riêng họ
CREATE POLICY "Users manage own posts"
  ON posts FOR ALL
  USING (auth.uid() = user_id);

-- Tự động cập nhật updated_at trên mỗi thay đổi
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
  NEW.updated_at = NOW();
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER posts_updated_at
  BEFORE UPDATE ON posts
  FOR EACH ROW EXECUTE FUNCTION update_updated_at();

Áp dụng nó:

supabase migration up

Tạo các kiểu TypeScript

Sau mỗi thay đổi schema, hãy tạo lại các kiểu của bạn:

supabase gen types typescript --local > src/types/database.ts

Frontend của bạn có được tính an toàn kiểu đầy đủ:

import { Database } from '@/types/database'

type Post = Database['public']['Tables']['posts']['Row']
type NewPost = Database['public']['Tables']['posts']['Insert']

// Bây giờ trình chỉnh sửa của bạn phát hiện lỗi kiểu trước khi chạy
const createPost = async (post: NewPost) => {
  const { data, error } = await supabase
    .from('posts')
    .insert(post)
    .select()
    .single()
  return data
}

Gieo dữ liệu phát triển

Chỉnh sửa supabase/seed.sql:

-- Người dùng thử nghiệm (bỏ qua xác thực cho phát triển cục bộ)
INSERT INTO auth.users (id, email) VALUES
  ('00000000-0000-0000-0000-000000000001', 'alice@example.com'),
  ('00000000-0000-0000-0000-000000000002', 'bob@example.com');

-- Bài viết thử nghiệm
INSERT INTO posts (user_id, title, content, published) VALUES
  ('00000000-0000-0000-0000-000000000001', 'Bắt đầu với Supabase', 'Đây là những gì tôi đã học...', true),
  ('00000000-0000-0000-0000-000000000002', 'Bản nháp: Các mẫu thiết kế API', 'Đang trong quá trình...', false);

Đặt lại và gieo lại bất cứ lúc nào:

supabase db reset

Lệnh này sẽ xóa mọi thứ, chạy lại tất cả các migration và tải dữ liệu hạt giống của bạn. Chạy nó mỗi sáng để bắt đầu lại từ đầu.

Kiểm thử API Supabase với Apidog

Khi Supabase cục bộ của bạn đang chạy, bạn có một API REST hoạt động đầy đủ tại http://localhost:54321. Supabase tự động tạo các endpoint cho mọi bảng thông qua PostgREST. Việc kiểm thử thủ công những thứ này bằng curl sẽ nhanh chóng trở nên tẻ nhạt, đặc biệt khi bạn cần kiểm thử các chính sách RLS với các mã thông báo người dùng khác nhau.

Apidog kết nối trực tiếp với phiên bản Supabase cục bộ của bạn. Bạn có thể:

Thiết lập Apidog với Supabase cục bộ:

  1. Tạo một dự án mới trong Apidog
  2. Đặt URL cơ sở: http://localhost:54321
  3. Thêm biến môi trường: anon_key = your-local-anon-key
  4. Thêm tiêu đề Authorization: Bearer {{anon_key}}

Kiểm thử endpoint bài viết:

GET http://localhost:54321/rest/v1/posts?published=eq.true
Authorization: Bearer {{anon_key}}
apikey: {{anon_key}}

Lưu yêu cầu này, thêm xác nhận rằng phản hồi chứa ít nhất một bài viết và chạy nó mỗi khi bạn thay đổi chính sách RLS của mình. Bạn sẽ bắt được các chính sách bị lỗi trước khi chúng đến môi trường sản xuất.

Bắt đầu kiểm thử API Supabase của bạn với Apidog

Edge Functions: xây dựng và kiểm thử cục bộ

Edge Functions chạy trên Deno ở biên, gần với người dùng của bạn. Chúng hoàn hảo cho các webhook, công việc nền và các endpoint API cần logic phía máy chủ.

Tạo một hàm

supabase functions new send-welcome-email

Điều này tạo ra supabase/functions/send-welcome-email/index.ts:

import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'

serve(async (req) => {
  const { user_id } = await req.json()

  // Service role bỏ qua RLS - sử dụng cẩn thận
  const supabase = createClient(
    Deno.env.get('SUPABASE_URL')!,
    Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
  )

  const { data: profile } = await supabase
    .from('profiles')
    .select('email, full_name')
    .eq('id', user_id)
    .single()

  // Logic gửi email của bạn ở đây
  console.log(`Đang gửi email chào mừng tới ${profile?.email}`)

  return new Response(
    JSON.stringify({ success: true }),
    { headers: { 'Content-Type': 'application/json' } }
  )
})

Kiểm thử cục bộ với hot reload

supabase functions serve

Máy chủ hàm theo dõi các thay đổi tệp và tự động tải lại. Kiểm thử nó:

curl -X POST http://localhost:54321/functions/v1/send-welcome-email \
  -H "Authorization: Bearer YOUR_ANON_KEY" \
  -H "Content-Type: application/json" \
  -d '{"user_id": "00000000-0000-0000-0000-000000000001"}'

Triển khai lên môi trường sản xuất

# Triển khai một hàm
supabase functions deploy send-welcome-email

# Triển khai tất cả các hàm
supabase functions deploy

Các kỹ thuật nâng cao và phương pháp đã được chứng minh

Quản lý bí mật

Không bao giờ mã hóa cứng các khóa API trong các hàm của bạn. Sử dụng bí mật:

# Đặt các bí mật sản xuất
supabase secrets set RESEND_API_KEY=re_xxx STRIPE_KEY=sk_live_xxx

# Liệt kê tất cả các bí mật
supabase secrets list

# Xóa một bí mật
supabase secrets unset STRIPE_KEY

Truy cập chúng trong các hàm:

const resendKey = Deno.env.get('RESEND_API_KEY')
// Không bao giờ: const resendKey = 're_xxx'

Phân nhánh cơ sở dữ liệu

Đang thực hiện một thay đổi schema lớn? Tạo một nhánh độc lập:

supabase branches create feature-payments
supabase branches switch feature-payments

# Thực hiện thay đổi, kiểm thử, sau đó hợp nhất
supabase branches merge feature-payments

Điều này giữ cho cơ sở dữ liệu phát triển chính của bạn sạch sẽ trong khi bạn thử nghiệm.

Những lỗi thường gặp cần tránh

Chỉnh sửa trực tiếp cơ sở dữ liệu trong Studio. Luôn sử dụng migration. Các chỉnh sửa trực tiếp không được theo dõi và đồng đội của bạn sẽ không có chúng.

Commit các tệp .env. Sử dụng supabase secrets set cho môi trường sản xuất. Thêm .env* vào .gitignore của bạn.

Bỏ qua supabase db reset sau khi pull. Khi bạn pull các thay đổi của đồng đội, các migration mới của họ cần phải chạy cục bộ. Reset để áp dụng chúng.

Không tạo lại các kiểu sau khi thay đổi schema. Các kiểu TypeScript của bạn sẽ lỗi thời ngay khi bạn thêm một cột. Hãy biến việc tạo kiểu thành một phần của quy trình làm việc migration của bạn.

Triển khai các hàm mà không kiểm thử cục bộ. Luôn chạy supabase functions serve và kiểm thử với các yêu cầu thực tế trước khi triển khai.

Sử dụng khóa vai trò dịch vụ trong mã frontend. Khóa vai trò dịch vụ bỏ qua RLS. Nó chỉ thuộc về Edge Functions và mã phía máy chủ, không bao giờ trong trình duyệt của bạn.

Mẹo tối ưu hiệu suất

# Bỏ qua các dịch vụ bạn không cần để tiết kiệm bộ nhớ
supabase start --exclude-studio --exclude-inbucket

# Kiểm tra những gì đang sử dụng tài nguyên
docker stats

Các lựa chọn thay thế và so sánh

Tính năng Supabase CLI Firebase CLI PlanetScale CLI
Cơ sở dữ liệu cục bộ PostgreSQL đầy đủ Chỉ trình giả lập Chỉ đám mây
Migration Tệp SQL trong Git Không hỗ trợ gốc Phân nhánh
Edge Functions Thời gian chạy Deno Cloud Functions Không bao gồm
Xác thực cục bộ GoTrue đầy đủ Trình giả lập Không bao gồm
Mã nguồn mở Hoàn toàn mở Độc quyền Độc quyền
Tạo kiểu Tích hợp sẵn Thủ công Thủ công

Trình giả lập cục bộ của Firebase tốt cho việc tạo mẫu nhanh nhưng không cung cấp cho bạn một phiên bản PostgreSQL thực sự. Mô hình phân nhánh của PlanetScale rất tuyệt vời cho các thay đổi schema nhưng bạn luôn phải làm việc với đám mây. Supabase CLI thắng thế đối với các nhóm muốn có trải nghiệm phát triển cục bộ hoàn toàn mã nguồn mở, gốc PostgreSQL.

Các trường hợp sử dụng thực tế

Ứng dụng SaaS với dữ liệu đa đối tượng thuê. Một công ty khởi nghiệp fintech quản lý 47 migration trên ba môi trường (dev, staging, prod). Các chính sách RLS được kiểm thử cục bộ với các vai trò người dùng khác nhau trước khi bất kỳ mã nào được đưa vào môi trường sản xuất. Kết quả: không có sự cố sản xuất nào liên quan đến schema trong sáu tháng.

Xử lý đơn hàng thương mại điện tử. Một nhóm thương mại điện tử sử dụng Edge Functions để xử lý webhook Stripe. Họ kiểm thử các payload webhook cục bộ bằng cách sử dụng supabase functions serve với các sự kiện kiểm thử Stripe thực tế. Thời gian triển khai giảm từ 2 giờ xuống còn 15 phút.

Backend ứng dụng di động. Một nhóm React Native tạo các kiểu TypeScript sau mỗi migration và chia sẻ chúng dưới dạng một gói npm nội bộ. Frontend và backend tự động đồng bộ. Không còn các câu hỏi "endpoint này trả về những trường nào?" trong Slack nữa.

Tổng kết

Đây là những gì bạn có thể làm ngay bây giờ:

Quy trình làm việc này mang lại hiệu quả ngay lập tức. Nhóm của bạn triển khai nhanh hơn, phát hiện lỗi sớm hơn và không bao giờ phải đối phó với sự sai lệch schema nữa.

Các bước tiếp theo của bạn:

  1. Cài đặt: brew install supabase/tap/supabase
  2. Chạy supabase init trong dự án của bạn
  3. Tạo migration đầu tiên của bạn
  4. Thiết lập Apidog để kiểm thử các endpoint cục bộ của bạn
  5. Triển khai lên môi trường sản xuất một cách tự tin

Kiểm thử API Supabase của bạn với Apidog - miễn phí

button

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

Tôi có cần Docker để sử dụng Supabase CLI không?Có. Docker Desktop phải đang chạy trước khi supabase start. CLI sử dụng Docker Compose để chạy toàn bộ ngăn xếp cục bộ. Nếu Docker không chạy, bạn sẽ nhận được lỗi "Cannot connect to Docker daemon".

Làm cách nào để đồng bộ hóa cơ sở dữ liệu cục bộ của tôi với môi trường sản xuất?Sử dụng supabase db pull để tạo migration từ schema từ xa của bạn, sau đó supabase db push để áp dụng các migration cục bộ lên môi trường sản xuất. Chạy supabase db reset cục bộ sau khi pull để đảm bảo môi trường của bạn khớp.

Tôi có thể sử dụng Supabase CLI mà không cần tài khoản Supabase Cloud không?Có. Bạn có thể sử dụng CLI hoàn toàn cục bộ để phát triển mà không cần tài khoản đám mây. Bạn chỉ cần supabase loginsupabase link khi bạn sẵn sàng triển khai lên môi trường sản xuất.

Làm cách nào để xử lý xung đột migration trong một nhóm?Kéo các thay đổi Git mới nhất và chạy supabase db reset trước khi tạo migration mới. Sử dụng tên migration mô tả và trao đổi với nhóm của bạn khi thực hiện các thay đổi schema gây phá vỡ.

Sự khác biệt giữa supabase db pushsupabase migration up là gì?supabase migration up áp dụng các migration đang chờ xử lý vào cơ sở dữ liệu cục bộ của bạn. supabase db push áp dụng chúng vào dự án từ xa (sản xuất) của bạn. Luôn kiểm thử cục bộ trước.

Tôi có thể sử dụng Supabase CLI với một dự án hiện có không?Có. Chạy supabase link --project-ref YOUR_PROJECT_ID để liên kết với một dự án hiện có, sau đó supabase db pull để tạo migration từ schema từ xa hiện tại của bạn.

Làm cách nào để kiểm thử các chính sách RLS cục bộ?Sử dụng Supabase Studio tại http://localhost:54323 để chuyển đổi giữa các vai trò người dùng hoặc kiểm thử qua API với các mã thông báo JWT khác nhau. Apidog giúp việc này dễ dàng: tạo nhiều môi trường với các mã thông báo người dùng khác nhau và chạy cùng các yêu cầu với tư cách là những người dùng khác nhau.

Supabase CLI có miễn phí không?Có. CLI là miễn phí và mã nguồn mở. Phát triển cục bộ không tốn chi phí. Bạn chỉ trả tiền cho các tài nguyên Supabase Cloud khi bạn triển khai lên môi trường sản xuất.

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API