Thay thế Supabase bằng Directus: biến PostgreSQL thành CMS/API no-code
Supabase rất hấp dẫn: PostgreSQL, Auth, Storage, Realtime, Edge Functions, REST/GraphQL gần như “có sẵn”. Với nhiều team, Supabase là cách nhanh nhất để dựng backend cho MVP.
Nhưng sau giai đoạn đầu, nhu cầu thường đổi: cần admin panel tốt hơn, quản trị nội dung dễ hơn, phân quyền chi tiết hơn, workflow biên tập rõ hơn, API linh hoạt hơn, ít lệ thuộc hơn vào một platform backend-as-a-service. Lúc này, Directus là lựa chọn đáng cân nhắc.
Directus không thay PostgreSQL bằng một hệ riêng. Ngược lại, nó đứng trực tiếp trên DB có sẵn, đọc schema thật, rồi biến DB thành CMS no-code, REST API, GraphQL API, admin app, permission engine. Nói ngắn: PostgreSQL → CMS/API tức thì.
Directus là gì?
Directus là một nền tảng data/API mã nguồn mở. Điểm mạnh nhất: Directus hoạt động theo kiểu database-first.
Thay vì ép bạn lưu dữ liệu theo cấu trúc riêng, Directus kết nối vào DB, đọc bảng, cột, quan hệ, constraint. Sau đó nó sinh ra:
– Admin UI để quản trị dữ liệu. – REST API tự động. – GraphQL API tự động. – Role/permission chi tiết. – File library. – Flows để automation. – Extensions để mở rộng logic.
Với PostgreSQL, Directus đặc biệt phù hợp vì hỗ trợ quan hệ, kiểu dữ liệu, view, function, permission pattern khá tốt.
Vì sao muốn thay Supabase?
Supabase mạnh. Không nên thay chỉ vì “trend”. Nhưng có vài tình huống Directus hợp hơn.
1. Cần CMS thật sự
Supabase Studio có UI quản lý DB, nhưng không phải CMS hoàn chỉnh. Với nội dung như bài viết, sản phẩm, landing page, media, category, translation, trạng thái draft/published, editor non-tech cần giao diện dễ dùng hơn.
Directus cho phép cấu hình field interface:
– Text input. – Rich text. – Markdown. – Image/file picker. – Relation dropdown. – Tags. – Date/time picker. – Repeater. – Conditional display.
Kết quả: bảng PostgreSQL thô → form quản trị thân thiện.
2. Team non-tech cần tự vận hành
Nếu marketer, content editor, operation team phải vào DB editor để sửa dữ liệu, rủi ro cao. Directus cho họ dashboard, form, filter, permission, workflow rõ ràng hơn.
Ví dụ:
– Editor chỉ sửa bài viết. – Manager duyệt bài. – Support chỉ xem user/order. – Intern chỉ upload media. – Admin xem toàn bộ.
Không cần viết admin panel riêng.
3. Muốn API sinh từ DB, không viết CRUD lặp lại
Directus tự sinh endpoint:
GET /items/posts
POST /items/posts
PATCH /items/posts/:id
DELETE /items/posts/:idCó filter, sort, pagination, field selection, deep relation:
GET /items/posts?filter[status][_eq]=published&sort=-created_at&fields=,author.name,categories.GraphQL cũng có sẵn:
query {
posts(filter: { status: { _eq: "published" } }) {
id
title
slug
author {
name
}
}
}Với app content-heavy, việc này tiết kiệm rất nhiều thời gian.
4. Muốn kiểm soát DB độc lập
Supabase cũng dùng PostgreSQL chuẩn, nhưng nhiều tính năng gắn với hệ sinh thái Supabase: Auth schema, Storage, Realtime, Edge Function. Nếu muốn kiến trúc “DB là trung tâm, tool thay được”, Directus hợp hơn.
Bạn có thể host PostgreSQL ở:
– VPS riêng. – Neon. – AWS RDS. – Google Cloud SQL. – Azure Database. – Supabase Postgres. – Railway. – Render.
Directus chỉ là lớp API/admin phía trên.
Directus khác Supabase thế nào?
Supabase: backend platform
Supabase cung cấp nhiều mảnh ghép backend:
– PostgreSQL. – Auth. – Storage. – Realtime. – Edge Functions. – Database Studio. – API auto-generated. – Row Level Security.
Phù hợp khi bạn muốn một Firebase-like backend nhưng dùng SQL.
Directus: data platform/CMS
Directus tập trung vào:
– Data modeling. – Admin UI. – API layer. – Permission. – Content workflow. – Automation. – No-code/low-code data operations.
Directus không cố thay mọi thứ. Nó làm một việc chính: biến DB thành sản phẩm có thể dùng ngay bởi dev lẫn non-dev.
Kiến trúc phổ biến khi dùng Directus + PostgreSQL
Một setup thực tế:
Frontend/App
↓ REST/GraphQL
Directus
↓ SQL
PostgreSQLNếu cần auth riêng:
Frontend
↓
Backend/API riêng
↓
Directus API hoặc PostgreSQLNếu dùng Directus làm backend chính:
Next.js/Nuxt/Mobile App
↓
Directus REST/GraphQL
↓
PostgreSQLNếu vẫn muốn giữ Supabase Postgres:
Frontend
↓
Directus
↓
Supabase-hosted PostgreSQLĐiểm quan trọng: Directus có thể kết nối vào PostgreSQL đang chạy. Không bắt buộc migrate hạ tầng ngay.
Cài Directus nhanh với Docker
Ví dụ docker-compose.yml tối giản:
version: "3"
services:
database:
image: postgres:16
environment:
POSTGRES_USER: directus
POSTGRES_PASSWORD: directus
POSTGRES_DB: directus
volumes:
- ./data/database:/var/lib/postgresql/data
directus:
image: directus/directus:latest
ports:
- "8055:8055"
environment:
KEY: "replace-with-random-key"
SECRET: "replace-with-random-secret"
ADMIN_EMAIL: "[email protected]"
ADMIN_PASSWORD: "strong-password"
DB_CLIENT: "pg"
DB_HOST: "database"
DB_PORT: "5432"
DB_DATABASE: "directus"
DB_USER: "directus"
DB_PASSWORD: "directus"
depends_on:
- database
Chạy:
docker compose up -dMở:
http://localhost:8055Sau đó tạo collection, field, relation trong UI. Directus sẽ tạo bảng/cột trong PostgreSQL. Hoặc nếu DB đã có sẵn, Directus đọc schema rồi hiển thị collection tương ứng.
Biến PostgreSQL thành CMS no-code
Giả sử có bảng posts:
create table posts (
id uuid primary key default gen_random_uuid(),
title text not null,
slug text unique not null,
content text,
status text default 'draft',
published_at timestamptz,
created_at timestamptz default now()
);Trong Directus, bạn có thể:
– Đặt title là text input.
– Đặt slug auto-generated hoặc editable.
– Đặt content là rich text/markdown.
– Đặt status là dropdown: draft, review, published.
– Đặt published_at là datetime picker.
– Ẩn các field kỹ thuật khỏi editor.
Kết quả: editor có CMS gần như WordPress, nhưng dữ liệu vẫn nằm trong PostgreSQL chuẩn.
Permission: điểm rất mạnh của Directus
Directus cho phép tạo role rồi gán quyền theo collection, field, action.
Ví dụ role Public:
– posts: chỉ đọc.
– Điều kiện: status = published.
– Field trả về: title, slug, content, published_at.
Role Editor:
– Tạo/sửa bài viết.
– Không xóa.
– Không sửa published_at.
– Chỉ thấy bài của mình.
Role Admin:
– Toàn quyền.
Pattern này rất hữu ích cho CMS, dashboard nội bộ, catalog, CRM nhẹ, knowledge base.
So với Supabase RLS, Directus permission dễ tiếp cận hơn với non-dev. Supabase RLS mạnh hơn ở tầng DB, nhưng cần hiểu SQL policy. Directus thiên về cấu hình UI, nhanh hơn cho team vận hành.
API tự động: REST và GraphQL
Directus API có nhiều tính năng “ăn tiền”:
Lọc dữ liệu
GET /items/products?filter[price][_lt]=100Chọn field
GET /items/products?fields=id,name,price,category.nameSắp xếp
GET /items/products?sort=-created_atPhân trang
GET /items/products?limit=20&page=2Quan hệ sâu
GET /items/orders?fields=,customer.,items.product.*Bạn không phải viết controller CRUD thông thường. Chỉ cần thiết kế DB tốt, API gần như có ngay.
Automation bằng Flows
Directus Flows giống một automation builder. Có thể trigger khi:
– Item được tạo. – Item được cập nhật. – Webhook gọi vào. – Theo lịch cron. – Người dùng bấm nút.
Ví dụ use case:
– Khi bài viết published → gọi webhook revalidate Next.js. – Khi order mới → gửi email. – Khi user upload file → resize ảnh. – Khi status đổi sang approved → ghi log. – Khi form submit → tạo ticket.
Với logic phức tạp, có thể viết custom operation hoặc gọi service ngoài.
Khi nào Directus thay Supabase tốt?
Directus rất hợp nếu dự án:
– Content-heavy. – Cần admin panel nhanh. – Cần CMS cho non-tech. – Cần REST/GraphQL từ DB. – Cần permission dễ cấu hình. – Có PostgreSQL sẵn. – Muốn self-host. – Muốn tránh viết CRUD/admin lặp lại.
Ví dụ:
– Headless CMS cho website. – Product catalog. – Internal tool. – CRM nhẹ. – Knowledge base. – Dashboard quản trị. – App marketplace. – Backend cho mobile app có dữ liệu quan hệ rõ.
Khi nào không nên thay Supabase?
Không nên thay nếu bạn đang dùng sâu:
– Supabase Auth. – Realtime. – Storage. – Edge Functions. – RLS phức tạp. – Supabase client SDK. – Database trigger/function đã gắn chặt với auth schema.
Directus có auth, file, API, automation, nhưng không phải bản sao 1:1 của Supabase. Nếu app cần realtime collaboration, chat, presence, hoặc auth social phức tạp, cần đánh giá kỹ.
Một lựa chọn trung gian: giữ Supabase Postgres/Auth, thêm Directus làm admin CMS. Nghĩa là không “thay” toàn bộ, chỉ thay phần quản trị dữ liệu.
Chiến lược migration thực tế
Bước 1: Audit Supabase hiện tại
Liệt kê:
– Bảng chính. – RLS policy. – Function/trigger. – Storage bucket. – Auth dependency. – API đang frontend gọi. – Realtime subscription.
Mục tiêu: biết phần nào Directus thay được, phần nào cần giữ.
Bước 2: Kết nối Directus vào DB staging
Không làm trực tiếp production. Dựng bản staging, kết nối Directus vào PostgreSQL copy. Kiểm tra collection, relation, field type.
Bước 3: Thiết kế role/permission
Map role cũ sang Directus:
– Public. – Authenticated. – Editor. – Manager. – Admin.
Test kỹ API response. Tránh lộ field nhạy cảm như email, phone, internal_notes.
Bước 4: Thay API từng phần
Không rewrite toàn bộ. Chọn module dễ:
– Blog. – FAQ. – Category. – Product catalog.
Frontend chuyển dần từ Supabase query sang Directus REST/GraphQL.
Bước 5: Quyết định auth
Có 3 hướng:
– Dùng Directus Auth. – Giữ Supabase Auth. – Dùng auth ngoài như Auth0, Clerk, Keycloak.
Không có đáp án chung. Chọn theo mức phụ thuộc hiện tại.
Lưu ý bảo mật
Directus mở API rất nhanh, nên phải khóa đúng:
– Tắt public access nếu không cần. – Chỉ expose field cần thiết. – Dùng HTTPS. – Dùng secret mạnh. – Không dùng admin token phía frontend. – Backup DB định kỳ. – Kiểm tra permission sau mỗi thay đổi schema. – Tách môi trường dev/staging/prod.
No-code không có nghĩa no-security. API sinh tự động càng tiện càng cần kiểm soát.
Kết luận: Directus không thay Supabase trong mọi trường hợp, nhưng rất đáng dùng
Nếu Supabase là “Firebase cho PostgreSQL”, Directus là “CMS/API layer cho PostgreSQL”. Hai công cụ giải quyết các bài toán giao nhau nhưng không giống nhau.
Chọn Directus khi bạn muốn biến database thành sản phẩm quản trị được ngay: có UI, permission, REST/GraphQL, automation, workflow. Đặc biệt khi team non-tech cần thao tác dữ liệu hằng ngày, Directus giúp tiết kiệm hàng tuần hoặc hàng tháng xây admin panel.
Cách tiếp cận thực tế nhất: đừng vội thay toàn bộ Supabase. Hãy bắt đầu bằng việc dùng Directus cho CMS/admin trên PostgreSQL hiện có. Nếu phù hợp, mở rộng dần sang API chính. Nếu không, vẫn có một lớp quản trị dữ liệu mạnh mà không phá kiến trúc cũ.
PostgreSQL vẫn là lõi. Directus chỉ làm điều nên làm: biến dữ liệu thô thành hệ thống có thể dùng, quản trị, phân quyền, mở rộng — gần như không cần viết CRUD.
Bình luận (0)
Chưa có bình luận. Hãy là người đầu tiên!