KDIGI CMS
Tự host

Self host là gì? Tự host website bằng Docker và VPS

Đăng 10 phút đọc

Self-host (tự host) là tự cài đặt và vận hành phần mềm trên máy chủ do bạn kiểm soát – VPS, máy chủ riêng hoặc server nội bộ – thay vì dùng dịch vụ do nhà cung cấp vận hành sẵn. Với website, tự host nghĩa là bạn chịu trách nhiệm cài đặt, cập nhật, sao lưu và bảo mật, đổi lại được toàn quyền về dữ liệu, cấu hình và chi phí.

Tóm tắt nhanh

  • Self-host = bạn thuê/đặt máy chủ (thường là VPS Linux) và tự chạy phần mềm trên đó, thường qua Docker.
  • Lợi ích: kiểm soát dữ liệu, không phí giấy phép theo người dùng, tùy biến sâu. Cái giá: phải tự vận hành, sao lưu, bảo mật.
  • Docker đóng gói ứng dụng và phụ thuộc thành container, giúp cài đặt lặp lại được và nâng cấp ít rủi ro hơn.
  • KDIGI CMS là một server Next.js (admin + API, cổng 3000) cộng PostgreSQL; chạy bằng docker compose up, hoặc Coolify, hoặc không dùng Docker.
  • Yêu cầu tối thiểu theo tài liệu dự án: Linux có Docker + Compose, từ 2 GB RAM, một tên miền trỏ về máy chủ.
  • Luôn sao lưu cả cơ sở dữ liệu và thư mục media; kiểm thử khôi phục trước khi cần.

Self-host là gì?

Có ba cách phổ biến để có một website hoặc hệ thống CMS chạy:

Cách Ai vận hành Ví dụ Bạn kiểm soát
SaaS/cloud-hosted Nhà cung cấp Wix, Webflow, WordPress.com, Ghost(Pro) Nội dung và cấu hình trong giới hạn gói
Managed hosting Nhà cung cấp hosting Hosting WordPress được quản lý Ứng dụng; hạ tầng do nhà cung cấp lo
Self-host Bạn VPS + Docker, máy chủ riêng Gần như toàn bộ: hệ điều hành, dữ liệu, mạng, nâng cấp

"Self-host" thường đi cùng phần mềm mã nguồn mở (WordPress, Ghost, Strapi, Payload, KDIGI CMS…) vì giấy phép cho phép bạn tự chạy mà không cần xin phép nhà cung cấp.

Lợi ích

  1. Chủ quyền dữ liệu. Dữ liệu nằm trên máy chủ bạn chọn, có thể đặt tại Việt Nam để thuận tiện cho độ trễ và tuân thủ nội bộ.
  2. Chi phí dự đoán được. Với phần mềm mã nguồn mở, bạn trả tiền hạ tầng (VPS, tên miền), không trả phí theo số người dùng hay số website.
  3. Tùy biến và không bị khóa nhà cung cấp. Bạn cấu hình, sửa mã, chuyển máy chủ khi muốn.
  4. Gom nhiều dự án. Một VPS có thể chạy nhiều ứng dụng.

Đánh đổi

  1. Bạn là bộ phận vận hành. Cập nhật, vá lỗi bảo mật, giám sát, sao lưu đều là việc của bạn.
  2. Rủi ro cấu hình sai. Mở cổng thừa, quên tường lửa, không dùng HTTPS.
  3. Thời gian khắc phục sự cố phụ thuộc năng lực của đội bạn.
  4. Chi phí ẩn là thời gian, không chỉ tiền thuê máy chủ.

Nếu đội không có ai quen Linux/Docker và website không đòi hỏi kiểm soát sâu, dịch vụ được quản lý thường hợp lý hơn. Self-host phù hợp khi bạn có người phụ trách kỹ thuật hoặc muốn học để làm chủ hệ thống.

VPS là gì và cần chuẩn bị gì?

VPS (Virtual Private Server) là máy chủ ảo chạy trên máy chủ vật lý của nhà cung cấp, bạn được quyền root và cài tùy ý. Để tự host một CMS bằng Docker, bạn cần:

  • Máy chủ Linux (Ubuntu hoặc Debian là lựa chọn phổ biến) với Docker Engine và Docker Compose plugin.
  • RAM từ 2 GB trở lên – theo tài liệu triển khai của KDIGI CMS, việc build image tốn bộ nhớ (script build cho phép tới 8 GB heap); nếu build bị kill do thiếu bộ nhớ, hãy build trên máy lớn hơn hoặc thêm swap.
  • Tên miền trỏ bản ghi A (và AAAA nếu có IPv6) về IP của máy chủ.
  • Reverse proxy có TLS (Caddy, nginx, Traefik) để có HTTPS.
  • Quyền truy cập SSH bằng khóa, không dùng mật khẩu.

Bảo mật nền tảng cho VPS mới

# cập nhật hệ thống
sudo apt update && sudo apt -y upgrade

# tường lửa: chỉ mở SSH, HTTP, HTTPS
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable

Sau đó tắt đăng nhập SSH bằng mật khẩu (PasswordAuthentication no trong sshd_config), dùng người dùng không phải root và cân nhắc bật cập nhật bảo mật tự động. Quan trọng: nếu cổng ứng dụng (ví dụ 3000) được publish ra tất cả giao diện, hãy chặn nó bằng tường lửa và chỉ để reverse proxy truy cập.

Docker là gì và vì sao dùng Docker để self-host?

Docker đóng gói ứng dụng cùng thư viện và cấu hình thành image; chạy image đó thành container. Docker Compose mô tả nhiều container (ứng dụng + cơ sở dữ liệu) trong một file YAML.

Lợi ích khi tự host:

  • Lặp lại được: cùng một image chạy giống nhau trên máy dev và VPS.
  • Cô lập: ứng dụng và cơ sở dữ liệu không làm bẩn hệ điều hành.
  • Nâng cấp/rollback rõ ràng: build image mới, chạy lại; dữ liệu nằm trong volume riêng.
  • Dễ sao lưu: biết chính xác dữ liệu nằm ở volume nào.

Lưu ý: Docker không thay thế việc bảo mật và sao lưu. Volume chỉ giữ dữ liệu qua các lần down/up; nó không phải bản sao lưu.

Ví dụ: tự host KDIGI CMS bằng Docker Compose

Theo tài liệu triển khai, KDIGI CMS là một server Next.js (admin + API trên cổng 3000) và một cơ sở dữ liệu PostgreSQL. Ảnh tải lên nằm trên volume bền vững hoặc trong Cloudflare R2 (cấu hình riêng cho từng site). Image dựa trên Node 22 Alpine, chạy bằng người dùng node không đặc quyền; entrypoint tự chạy payload migrate khi khởi động.

Thử nhanh trên máy local

Yêu cầu: Docker có Compose.

git clone https://github.com/kdigivn/kdigi-cms-open.git
cd kdigi-cms-open
SEED_DEMO=true docker compose up --build

Mở http://localhost:3000/admin, tạo tài khoản đầu tiên (tự động là super-admin) rồi chọn site demo. Dữ liệu nằm trong các volume postgres_data, media_data, app_data và được giữ sau docker compose down. Bỏ SEED_DEMO=true nếu muốn bản cài trống. Không bật SEED_DEMO=true ở production.

Triển khai production trên VPS

  1. Chuẩn bị máy chủ: cài Docker + Compose plugin, mở tường lửa như trên, trỏ DNS cms.example.com về IP máy chủ.
  2. Lấy mã nguồn và tạo .env:
git clone https://github.com/kdigivn/kdigi-cms-open.git
cd kdigi-cms-open
cat > .env <<'EOF'
POSTGRES_PASSWORD=change-me-to-a-long-random-password
PAYLOAD_SECRET=change-me-to-a-random-string-of-32-chars-or-more
PAYLOAD_PUBLIC_SERVER_URL=https://cms.example.com
ENABLE_JOBS_AUTORUN=true
EOF
docker compose up -d --build
  1. Đặt reverse proxy có TLS. Ví dụ Caddy (tự lấy chứng chỉ HTTPS):
cms.example.com {
    reverse_proxy 127.0.0.1:3000
}

Nếu dùng nginx: proxy tới 127.0.0.1:3000, chuyển tiếp Host và X-Forwarded-Proto, đặt client_max_body_size 50m; để tải media.

  1. Tạo người dùng đầu tiên ngay. Trên cơ sở dữ liệu trống, bất kỳ ai truy cập được /admin đều có thể tạo tài khoản đầu tiên và trở thành super-admin; hãy mở admin ngay sau lần deploy đầu hoặc giới hạn truy cập ở proxy cho tới khi bạn tạo xong.
  2. Kiểm tra sức khỏe: GET /api/health trả {"status":"ok"} (chỉ là liveness, không truy vấn cơ sở dữ liệu).

Ba biến bắt buộc cho production: PAYLOAD_SECRET (≥ 32 ký tự), PAYLOAD_PUBLIC_SERVER_URL (URL https:// công khai chính xác) và cơ sở dữ liệu (DATABASE_URI, hoặc dùng service db đi kèm). Các biến tùy chọn (lưu trữ media, AI SEO, reCAPTCHA, OpenTelemetry…) có trong tài liệu cấu hình.

Dùng Coolify thay vì tự viết proxy

Coolify là nền tảng tự host mã nguồn mở giúp triển khai ứng dụng bằng giao diện web, lo sẵn domain và chứng chỉ TLS. Repo có sẵn docker-compose.coolify.yml:

  1. Trong Coolify: New Resource → Docker Compose, chọn repo, đặt Docker Compose Location là /docker-compose.coolify.yml.
  2. Thêm biến PAYLOAD_SECRET (openssl rand -hex 32) – biến bắt buộc duy nhất; Coolify tạo domain, TLS và mật khẩu cơ sở dữ liệu.
  3. Gắn domain vào service app (cổng 3000); với domain riêng, đặt thêm PAYLOAD_PUBLIC_SERVER_URL=https://cms.example.com.
  4. Deploy; lần chạy đầu áp dụng toàn bộ migration. Mở /admin và tạo người dùng đầu tiên.

Không dùng Docker

Cũng có thể chạy trực tiếp với Node.js ≥ 20.9, pnpm 10 và PostgreSQL: pnpm install --frozen-lockfile, đặt DATABASE_URI, PAYLOAD_SECRET, PAYLOAD_PUBLIC_SERVER_URL, NODE_ENV=production, rồi pnpm build, pnpm migrate, pnpm start dưới một trình quản lý tiến trình (systemd, pm2) và đặt MEDIA_DIR vào thư mục bền vững.

Hướng dẫn đầy đủ ở trang Tự host KDIGI CMS.

Sao lưu: phần không được bỏ qua

Sao lưu cả cơ sở dữ liệu và media, và giữ lại PAYLOAD_SECRET đang dùng (mất khóa này thì phiên đăng nhập và API key hiện có ngừng hoạt động, nhưng dữ liệu vẫn đọc được).

# cơ sở dữ liệu
docker compose exec -T db pg_dump -U kdigi --format=custom kdigi > kdigi-$(date +%F).dump

# media trên ổ đĩa
docker compose exec -T app tar czf - -C /app/media . > media-$(date +%F).tgz

Khôi phục:

docker compose exec -T db pg_restore -U kdigi -d kdigi --clean --if-exists < kdigi-2026-01-01.dump
docker compose exec -T app tar xzf - -C /app/media < media-2026-01-01.tgz

Với site dùng Cloudflare R2, tệp nằm trong bucket; hãy bật versioning/replication bên phía Cloudflare. Đặt lịch bằng cron trên máy chủ hoặc Scheduled Task trong Coolify, giữ bản sao ngoài máy chủ, và thử khôi phục trên máy khác trước khi bạn thật sự cần.

Nâng cấp an toàn

Schema chỉ thay đổi bằng migration tường minh. Quy trình khuyến nghị:

  1. Sao lưu cơ sở dữ liệu và media.
  2. Đọc CHANGELOG và hướng dẫn nâng cấp.
  3. git pull && docker compose up -d --build (migration chạy khi container khởi động).
  4. Kiểm tra /api/health, đăng nhập admin, mở vài bài viết.
  5. Nếu lỗi: khôi phục bản sao lưu cơ sở dữ liệu trước nâng cấp (chỉ chạy lại image cũ nếu nó hiểu schema hiện tại).

Sự cố hay gặp khi tự host

Triệu chứng Nguyên nhân thường gặp
Đăng nhập admin bị lặp, API trả 403 PAYLOAD_PUBLIC_SERVER_URL không khớp đúng origin (scheme, host, port) trong thanh địa chỉ
Ứng dụng không kết nối được DB Trong Compose dùng host db, không phải localhost
Ảnh biến mất sau khi redeploy /app/media không nằm trên volume bền vững
Frontend không làm mới sau khi xuất bản Thiếu ENABLE_JOBS_AUTORUN=true (chỉ một instance), site chưa có domain hoặc frontend chưa có /api/cms/revalidate
Build bị kill Thiếu RAM: build trên máy lớn hơn hoặc thêm swap

Có nên tự host không? Khung quyết định

  • Nên, nếu bạn có người phụ trách kỹ thuật, muốn giữ dữ liệu và chi phí dự đoán được, hoặc quản lý nhiều website trên một hạ tầng (KDIGI CMS phục vụ nhiều site mà không cần deploy lại khi thêm site).
  • Cân nhắc dịch vụ được quản lý, nếu đội không có kinh nghiệm Linux/Docker và downtime ảnh hưởng nghiêm trọng đến doanh thu.
  • Kết hợp: dùng PostgreSQL được quản lý và snapshot của nhà cung cấp, chỉ tự chạy ứng dụng bằng Docker/Coolify.

Xem thêm: CMS là gì?, API là gì?, Quản lý nhiều website và chuyển từ WordPress sang KDIGI CMS.

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

Self host là gì?

Self-host là tự cài đặt và vận hành phần mềm trên máy chủ do bạn kiểm soát (VPS, server riêng) thay vì dùng dịch vụ có sẵn. Bạn chịu trách nhiệm cập nhật, sao lưu và bảo mật, đổi lại có toàn quyền về dữ liệu, cấu hình và chi phí hạ tầng.

Tự host website bằng Docker cần những gì?

Cần một máy chủ Linux có Docker và Compose plugin, ít nhất khoảng 2 GB RAM, tên miền trỏ về máy chủ, reverse proxy có HTTPS và kế hoạch sao lưu. Với KDIGI CMS còn cần PostgreSQL (có sẵn trong Compose) và các biến PAYLOAD_SECRET, PAYLOAD_PUBLIC_SERVER_URL.

Self-host có rẻ hơn dùng dịch vụ không?

Thường rẻ hơn về tiền thuê khi bạn chạy phần mềm mã nguồn mở và gom nhiều dự án trên một VPS, vì không trả phí theo người dùng hay theo site. Nhưng bạn trả bằng thời gian vận hành, nên hãy tính cả công sức bảo trì và rủi ro khi so sánh.

Tự host có an toàn không?

An toàn nếu bạn làm đúng các việc cơ bản: cập nhật hệ điều hành và ứng dụng, tường lửa chỉ mở cổng cần thiết, SSH bằng khóa, HTTPS, quyền tối thiểu cho người dùng và sao lưu ngoài máy chủ. Phần lớn sự cố đến từ cấu hình sai và thiếu cập nhật, không phải từ việc tự host.

Coolify là gì và có cần thiết không?

Coolify là nền tảng tự host mã nguồn mở để triển khai ứng dụng bằng giao diện web, tự lo domain và chứng chỉ TLS. Không bắt buộc: bạn vẫn có thể dùng Docker Compose với Caddy hoặc nginx. Coolify tiện khi muốn quản lý nhiều ứng dụng trên một máy chủ.

Làm sao sao lưu và khôi phục KDIGI CMS?

Sao lưu cơ sở dữ liệu bằng pg_dump --format=custom và thư mục /app/media bằng tar, giữ PAYLOAD_SECRET, rồi khôi phục bằng pg_restore và tar xzf. Site dùng Cloudflare R2 thì bật versioning ở bucket. Luôn thử khôi phục trên máy khác để chắc chắn bản sao lưu dùng được.

Nguồn

Bài viết do Đội ngũ KDIGI biên soạn, cập nhật 03/11/2026. Lệnh và biến môi trường của KDIGI CMS đối chiếu với docs/deploy.md trong kho mã nguồn; hãy kiểm tra lại với phiên bản bạn đang cài.

Bài viết liên quan

Chính sách biên tập: bài viết do đội ngũ KDIGI biên soạn, thông tin sản phẩm đối chiếu với mã nguồn và tài liệu chính thức, thông tin về sản phẩm khác kèm nguồn dẫn. Xem thêm giới thiệu KDIGI.