Giải pháp KDIGI CMS cho agency
Cập nhật lần cuối:

KDIGI CMS cho phép một agency vận hành nhiều website khách hàng trên cùng một bản cài và một database PostgreSQL. Mỗi website là một bản ghi trong collection Sites; nội dung, media, menu và cấu hình SEO gắn với site đó. Thêm khách mới là nhập dữ liệu, không cần deploy lại.
Tóm tắt nhanh
- Một deployment, một database, nhiều frontend: mỗi khách là một document trong collection
sites.- Bốn vai trò xếp bậc:
super-admin>admin>editor>author; chỉsuper-admintạo site và gán người dùng vào site.- SEO template (
seoTitles) vàknowledgeGraphđặt riêng từng site; lưu trữ media mặc định ở ổ đĩa, có thể chuyển sang Cloudflare R2 riêng cho từng site.- Frontend là phần việc riêng: CMS chỉ cung cấp trang quản trị và API, không có giao diện công khai dựng sẵn.
- Truy vấn ẩn danh không tự lọc theo site: frontend phải thêm
where[tenant][equals]=<id>.
Bài toán của agency khi mỗi khách một CMS
Mô hình quen thuộc là mỗi khách một bản WordPress riêng: nhiều bản cập nhật, nhiều database, nhiều tài khoản quản trị phải theo dõi. KDIGI CMS gom phần quản trị về một nơi, còn frontend vẫn tách theo từng khách (Next.js, Astro hoặc framework bạn chọn). Xem so sánh chi tiết ở KDIGI CMS vs WordPress.
Nền tảng của mô hình này là quản lý nhiều website: các collection pages, posts, products, landings, taxonomies, menus, faqs, authors, comments, shortcodes, redirects cùng media đều mang trường tenant trỏ về Sites. Một tài liệu thuộc đúng một site.

Setup khuyến nghị cho agency
- Cài một lần bằng Docker Compose hoặc Coolify (xem tự host). Người dùng đầu tiên tạo trên màn hình "create first user" tự động là
super-admin; đó là tài khoản của agency. - Tạo site cho từng khách (Sites → Create): điền
siteKey(duy nhất, ví dụkhach-a),domain(tên miền trần, không cóhttps://) vàdefaultLanguage(vihoặcen). - Gán người dùng: Users → mở người dùng → thêm một dòng vào
tenantscho mỗi site. Người chưa có dòng nào không thấy gì. - Chọn vai trò theo người:
admincho đầu mối phía khách (sửa cài đặt site, xuất bản, xóa vĩnh viễn trong site được gán),editorcho biên tập nội bộ,authorcho freelancer. - Cấu hình SEO từng site:
seoTitles(mẫu title/description dạng%title%,%sitename%,%sep%) vàknowledgeGraph(thông tin Organization/LocalBusiness). Chi tiết ở SEO và JSON-LD. - Lưu media: để trống nhóm
r2nếu dùng ổ đĩa; hoặc điềnbucket,accountId,publicBaseUrlrồi nhập hai khóa qua ô bí mật để site đó dùng R2 riêng. Xem thư viện media. - Trỏ frontend về URL CMS với
siteKeycủa khách và triển khaiPOST /api/cms/revalidatetrên domain của khách để nội dung đã xuất bản được làm mới.
Quy trình onboarding khách
Khi nhận một khách mới, agency lặp lại cùng một chuỗi việc, tất cả nằm trong admin (không cần deploy):
- Khách cung cấp tên miền và ngôn ngữ chính; super-admin tạo site với
siteKey,domain,defaultLanguage. - Nếu khách có WordPress, chạy pipeline di chuyển vào đúng
siteKeyđó; nếu không, tạopageGroupvà các trang nền (giới thiệu, liên hệ, chính sách). - Điền
seoTitles,knowledgeGraph,socialProfilesvà mã GA4/GTM của khách. - Gán người dùng của khách (
adminhoặceditor) và freelancer (author) vào site. - Frontend của khách lấy id site theo
siteKey, lọc mọi truy vấn bằngwhere[tenant][equals]=<id>và nhận revalidate ở/api/cms/revalidate. - Kiểm tra bằng tài khoản
editorthử đăng một bài, rồi bàn giao.
Phân quyền theo site, theo khách
| Vai trò | Phạm vi | Dùng cho |
|---|---|---|
super-admin |
Mọi site | Agency: tạo/xóa site và người dùng, gán site, sửa r2, chạy job |
admin |
Site được gán | Đầu mối phía khách: cài đặt site, xuất bản, kiểm duyệt bình luận, xóa vĩnh viễn |
editor |
Site được gán | Biên tập: xuất bản, kiểm duyệt bình luận, chuyển vào thùng rác |
author |
Site được gán | Freelancer: tạo nội dung, chỉ sửa bài của mình, không xuất bản |
Cơ chế chi tiết nằm ở trang phân quyền người dùng. Hai điểm cần lưu ý khi giao việc cho cộng tác viên:
authorbị chặn xuất bản bằng cả access predicate lẫn hookbeforeChange, kể cả khi sửa trực tiếp bài đang live hoặc khôi phục bài đã xuất bản từ thùng rác.- Tuy vậy
authorvẫn có thể tạo và sửataxonomies,menus,faqs,shortcodes,redirectsvàmediatrong site được gán, vì các collection này chỉ dùng điều kiện theo site, không có điều kiện "bài của chính mình".
Cài đặt riêng từng site
| Hạng mục | Riêng từng site? |
|---|---|
| Nội dung, taxonomy, menu, FAQ, shortcode, redirect, bình luận, tác giả | Có |
| Media (file và thư mục) | Có; backend lưu trữ chọn theo site |
seoTitles, knowledgeGraph, socialProfiles, GA4/GTM/Clarity |
Có |
| Shortcode trùng tên giữa hai khách | Được; mỗi tài liệu chỉ mở rộng shortcode của đúng site mình |
| Người dùng | Dùng chung; truy cập qua tenants[] |
Vai trò, ngôn ngữ (vi/en) |
Toàn cục |
| Biến môi trường (database, khóa AI, reCAPTCHA, jobs) | Toàn cục theo bản cài |
Chi phí và vận hành
Một bản cài nghĩa là một image Docker (Next.js, cổng 3000), một PostgreSQL và một nơi để sao lưu. Nâng cấp là git pull && docker compose up -d --build; migration chạy khi khởi động. Sao lưu database bằng pg_dump:
docker compose exec -T db pg_dump -U kdigi --format=custom kdigi > kdigi-$(date +%F).dump
Hãy sao lưu thêm volume media_data cho các site dùng ổ đĩa. Lưu ý vận hành: hàng đợi revalidate chỉ chạy khi ENABLE_JOBS_AUTORUN=true trên đúng một instance. Chúng tôi không công bố con số chi phí hay benchmark; chi phí phụ thuộc máy chủ bạn chọn.
Chuyển site WordPress của khách
Pipeline di chuyển nhập một site WordPress vào một site KDIGI qua --site <siteKey>: bài viết, trang, taxonomy, media, menu, tác giả, bình luận, SEO Yoast/RankMath, redirect và tùy chọn sản phẩm WooCommerce. Dữ liệu qua bước raw/ → staged/ → cổng review; database không phải local luôn được pg_dump trước khi ghi. Đọc chuyển từ WordPress trước khi báo giá cho khách.
Khi nào KDIGI CMS không phù hợp với agency
- Bạn cần giao diện dựng sẵn. KDIGI CMS là headless: không có theme, giỏ hàng hay thanh toán. Mỗi khách cần một frontend, và đó là công việc dựng riêng (Headless API).
- Một người cần vai trò khác nhau ở các khách khác nhau. Vai trò là toàn cục theo người dùng; hiện phải tạo tài khoản riêng.
- Khách không chấp nhận chung hạ tầng. Các site dùng chung một database và biến môi trường; khách cần cô lập hạ tầng nên có bản cài riêng.
- Frontend quên lọc theo site. Truy vấn ẩn danh trả về nội dung đã xuất bản của mọi site nếu thiếu
where[tenant][equals]=<id>. Đây là điều phải kiểm tra trong code review. - Khách phụ thuộc plugin WordPress hoặc page builder. Giao diện, plugin và nội dung page builder lưu ngoài
post_contentkhông được chuyển.
Xem thử trang quản trị tại demo, hoặc dựng bản cài riêng theo hướng dẫn tự host.
Câu hỏi thường gặp
Một bản cài KDIGI CMS quản lý được bao nhiêu site khách?
Nhân viên của khách có thấy dữ liệu của khách khác không?
Freelancer viết bài cho nhiều khách thì phân quyền thế nào?
Frontend của từng khách có tự biết mình thuộc site nào không?
Chuyển site WordPress của khách sang KDIGI CMS có mất SEO không?
Đọc tiếp
Quản lý nhiều website
Một bảng quản trị cho nhiều website: tách dữ liệu theo site, cấu hình tên miền, thương hiệu, SEO riêng. Phù hợp agency và doanh nghiệp nhiều thương hiệu.
Phân quyền người dùng
Bốn vai trò super-admin, admin, editor, author; gán theo từng website; tác giả gửi bài chờ duyệt. Có tài khoản demo để thử ngay không cần cài đặt.
Chuyển từ WordPress
Hướng dẫn chuyển WordPress sang KDIGI CMS: bài viết, trang, media, menu, dữ liệu Yoast/RankMath, WooCommerce, redirect 301. Có checklist và giới hạn rõ ràng.
SEO và JSON-LD
Trường SEO, mẫu title kiểu RankMath, đồ thị JSON-LD, ảnh OG dự phòng, kiểm tra SEO, gợi ý internal link và AI SEO tùy chọn ngay trong trình soạn thảo.