So sánh BookStack, Wiki.js và Outline cho server tự lưu
So sánh chi tiết BookStack, Wiki.js và Outline dựa trên độ nặng hệ thống, cơ chế xác thực và trình soạn thảo. Hướng dẫn chọn wiki phù hợp cho cá nhân hoặc nhóm làm việc.
Bạn nên chạy wiki tự lưu trữ nào
Một wiki tự lưu trữ giúp tập trung tài liệu của nhóm bạn vào một nơi có thể tìm kiếm được trên máy chủ do bạn kiểm soát. BookStack, Wiki.js và Outline đều thực hiện công việc đó. Sự khác biệt lớn nhất giữa chúng nằm ở khối lượng công việc bạn phải thiết lập trước khi trang đầu tiên tải lên, và quy định về việc ai được phép đăng nhập.
BookStack là phần mềm nhẹ nhất để triển khai và có quan điểm rõ ràng nhất về cấu trúc. Wiki.js cung cấp cho bạn nhiều lựa chọn trình soạn thảo nhất trên một cây trang. Outline mang lại trải nghiệm viết tốt nhất trong ba loại, và nó sẽ không cho phép bất kỳ ai đăng nhập cho đến khi bạn kết nối với một nhà cung cấp danh tính bên ngoài.
Mọi thông tin dưới đây được đọc từ tài liệu của chính các dự án và các tệp cấu hình đã công bố của chúng. Đây là bảng so sánh khả năng, không phải là bài kiểm tra hiệu năng. Các số phiên bản và yêu cầu được đóng dấu ngày tháng vì cả ba đều thay đổi liên tục.
Cấu trúc là lựa chọn thực sự
BookStack cố định hình thái nội dung của bạn. Một trang nằm trong một cuốn sách, một cuốn sách có thể chứa các chương, và các kệ sách nhóm các cuốn sách lại với nhau. Bạn không thể tạo ra cấp độ thứ năm. Giới hạn đó chính là sản phẩm: một người viết mới biết trang đó nằm ở đâu vì chỉ có một nơi duy nhất nó có thể nằm. Cái giá phải trả là những nội dung không khớp với hình thái này sẽ bị ép buộc phải tuân theo.
Wiki.js sử dụng cây đường dẫn, giống như các thư mục trên ổ đĩa. Một trang tại ops/backup/restic nằm ở bất cứ đâu bạn đặt nó, và bạn tự chọn độ sâu. Không có gì ngăn cản hai người lưu cùng một chủ đề vào hai nhánh khác nhau, vì vậy một instance Wiki.js cần một người quản lý cây thư mục đó.
Outline sử dụng các bộ sưu tập với các tài liệu được lồng trong các tài liệu khác. Việc di chuyển một tài liệu phải thực hiện bằng cách kéo chuột. Đây là công cụ linh hoạt nhất trong ba loại, vì vậy nó cũng dễ bị mất kiểm soát nhất.
BookStack: cài đặt tối giản
BookStack là một ứng dụng PHP chạy trên nền tảng MySQL. Tính đến tháng 7 năm 2026, các yêu cầu hệ thống được ghi nhận là PHP 8.2 trở lên và MySQL 8.0 hoặc MariaDB 10.6 trở lên, cùng với Composer 2.2 trở lên nếu bạn cài đặt từ mã nguồn. Dòng release hiện tại là 26.05.
Dự án phát hành một script cài đặt cho mỗi bản phát hành Ubuntu. Script cho bản 24.04 sẽ tự động cài đặt Apache, MySQL 8.0 và PHP 8.3 cho bạn.
wget https://codeberg.org/bookstack/devops/raw/branch/main/scripts/installation-ubuntu-24.04.sh
chmod a+x installation-ubuntu-24.04.sh
sudo ./installation-ubuntu-24.04.shHãy đọc cảnh báo trên script đó trước khi chạy. Tài liệu nêu rõ rằng nó "CHỈ DÀNH CHO HỆ ĐIỀU HÀNH MỚI, nó sẽ cài đặt Apache, MySQL 8.0 & PHP 8.3 và có thể GHI ĐÈ lên bất kỳ cấu hình web nào hiện có trên máy". Trên một server đã phản hồi ở cổng 80, script sẽ chiếm cổng đó và ghi đè cấu hình Apache. Hãy sử dụng container trong trường hợp này, hoặc cài đặt BookStack thủ công trên một LAMP stack hiện có trên Ubuntu 24.04.
Phương thức container sử dụng image của LinuxServer.io, đây là tùy chọn mà tài liệu BookStack khuyến nghị. BookStack cần một khóa mã hóa phiên (session encryption key) và sẽ không phục vụ trang web nếu thiếu nó, vì vậy hãy tạo khóa này trước.
docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkeySao chép giá trị vừa in ra vào APP_KEY, sau đó viết file service:
services:
bookstack:
image: lscr.io/linuxserver/bookstack:latest
container_name: bookstack
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- APP_URL=https://wiki.example.com
- APP_KEY=paste_the_generated_key_here
- DB_HOST=bookstack_db
- DB_PORT=3306
- DB_USERNAME=bookstack
- DB_PASSWORD=change_me
- DB_DATABASE=bookstackapp
volumes:
- ./config:/config
ports:
- 6875:80
restart: unless-stoppedAPP_URL phải khớp với địa chỉ mà người dùng thực tế nhập vào, bao gồm cả scheme và cổng (nếu có). Nếu bạn đặt nó là http://localhost và sau đó phục vụ trang web qua HTTPS, các liên kết và chuyển hướng được tạo ra sẽ trỏ đến host sai, khiến người dùng thấy trang đăng nhập bị lặp vô tận. Nếu bạn chưa quen với các file compose, hãy bắt đầu với kiến thức cơ bản về Docker Compose trên VPS trước khi thực hiện bước này.
Khởi chạy ứng dụng và kiểm tra xem ứng dụng có phản hồi hay không, thay vì chỉ kiểm tra xem container có đang chạy hay không:
docker compose up -d
docker compose ps
curl -sI http://127.0.0.1:6875/loginMột 200 OK có nghĩa là ứng dụng PHP đã khởi động và kết nối được với database. Một 500 gần như luôn có nghĩa là APP_KEY đang trống hoặc thông tin đăng nhập database không khớp, và docker compose logs bookstack sẽ in ra lỗi cụ thể là trường hợp nào trong hai trường hợp trên.
Wiki.js: một cây thư mục, nhiều trình soạn thảo
Wiki.js là một ứng dụng Node.js. Thiết lập Docker được tài liệu hóa ghép nối nó với PostgreSQL, mặc dù phần mềm này cũng chấp nhận MySQL, MariaDB, MSSQL và SQLite. Đây là file compose từ trang Docker của chính dự án:
services:
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: wiki
POSTGRES_PASSWORD: wikijsrocks
POSTGRES_USER: wikijs
logging:
driver: none
restart: unless-stopped
volumes:
- db-data:/var/lib/postgresql/data
wiki:
image: ghcr.io/requarks/wiki:2
depends_on:
- db
init: true
environment:
DB_TYPE: postgres
DB_HOST: db
DB_PORT: 5432
DB_USER: wikijs
DB_PASS: wikijsrocks
DB_NAME: wiki
restart: unless-stopped
ports:
- "80:3000"
volumes:
db-data:Hãy thay đổi POSTGRES_PASSWORD và DB_PASS cùng lúc trước khi bạn chạy nó, vì chúng là một cặp thông tin xác thực và giá trị mẫu đã được công khai. Tag được ghim vào ghcr.io/requarks/wiki:2 một cách có chủ đích. Tài liệu khuyến cáo không nên dùng latest, vì việc nhảy phiên bản lớn sẽ làm thay đổi schema cơ sở dữ liệu của một instance đang chạy.
Phiên bản 2 là dòng để chạy. Tính đến tháng 7 năm 2026, bản phát hành phiên bản 2 mới nhất là 2.5.314, từ tháng 5 năm 2026. Phiên bản 3 đã tồn tại, và tài liệu của nó ghi rõ: "Trang web này dành cho bản beta không ổn định của Wiki.js 3.0. Bạn KHÔNG nên cài đặt bản này trong môi trường production." Hãy coi tag :3 là bản xem trước.
Trong lần tải đầu tiên, Wiki.js sẽ hướng dẫn bạn qua quá trình thiết lập trên trình duyệt để tạo tài khoản quản trị viên. Cho đến khi bạn hoàn tất, bất kỳ ai truy cập vào port đó đều sẽ thấy trình hướng dẫn này, vì vậy hãy đặt dịch vụ phía sau reverse proxy và TLS (transport layer security) của bạn trước khi mở firewall. Một wiki trên hostname riêng sẽ hoạt động ổn định phía sau Traefik phía trước nhiều ứng dụng Docker khi server lưu trữ nhiều hơn một dịch vụ này.
Lựa chọn trình soạn thảo là lý do mọi người chọn Wiki.js. Một instance có thể chứa các trang Markdown, trang trình soạn thảo trực quan, trang HTML thô và trang AsciiDoc cùng nhau. Điều này hữu ích khi bạn nhập nội dung cũ ở định dạng mà bạn không muốn chuyển đổi. Đây cũng là cách dẫn đến việc có bốn phong cách trình bày trong một wiki, vì vậy hãy quyết định trình soạn thảo mặc định ngay từ ngày đầu tiên và ghi lại quyết định đó.
Outline: trình soạn thảo tốt nhất, các yêu cầu hệ thống nặng nề
Outline là thứ mà mọi người thường nhắc đến khi muốn một công cụ ghi chú có cảm giác như các phần mềm thương mại. Đây là một ứng dụng Node.js và bản phát hành hiện tại tính đến tháng 7 năm 2026 là 1.9.2. Tệp môi trường mẫu của nó liệt kê những gì cần thiết: PostgreSQL thông qua DATABASE_URL, Redis thông qua REDIS_URL, hai chuỗi bí mật ngẫu nhiên và một URL có thể truy cập công khai.
openssl rand -hex 32
openssl rand -hex 32Chạy lệnh đó hai lần và giữ lại cả hai giá trị. Giá trị đầu tiên trở thành SECRET_KEY, giá trị thứ hai trở thành UTILS_SECRET. Phần cốt lõi của tệp môi trường sau đó sẽ trông như thế này:
NODE_ENV=production
URL=https://docs.example.com
PORT=3000
SECRET_KEY=<first openssl value>
UTILS_SECRET=<second openssl value>
DATABASE_URL=postgres://outline:change_me@postgres:5432/outline
PGSSLMODE=disable
REDIS_URL=redis://redis:6379
FILE_STORAGE=local
FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/dataPGSSLMODE=disable chỉ chính xác khi cơ sở dữ liệu nằm trên cùng một máy hoặc cùng một Docker network. Hãy bỏ qua nó đối với cơ sở dữ liệu được truy cập qua mạng, nếu không kết nối sẽ được truyền dưới dạng văn bản thuần (không mã hóa). Các tệp đính kèm không còn bắt buộc bạn phải sử dụng object storage: FILE_STORAGE=local ghi các tệp tải lên vào thư mục phía trên, thư mục này phải là một volume mà container có thể ghi vào và là nơi chứa các bản sao lưu của bạn. Hãy thiết lập FILE_STORAGE=s3 với các giá trị AWS_* thay thế nếu bạn muốn lưu trữ các tệp đó trong một bucket tương thích với S3.
Bây giờ là phần gây bất ngờ cho mọi người. Outline không có tính năng đăng nhập bằng tên người dùng và mật khẩu tích hợp sẵn. Cấu hình mẫu của nó nêu rõ rằng cần có thông tin đăng nhập từ bên thứ ba: "cần có ÍT NHẤT MỘT trong số này để cài đặt hoạt động, nếu không bạn sẽ không có tùy chọn đăng nhập nào". Các nhà cung cấp được ghi nhận bao gồm Google, Slack, Microsoft Entra, Discord và bất kỳ máy chủ OpenID Connect (OIDC) chung nào thông qua OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_AUTH_URI, OIDC_TOKEN_URI và OIDC_USERINFO_URI.
Vì vậy, chi phí thực tế của Outline là Outline cộng với PostgreSQL, cộng với Redis và một nhà cung cấp danh tính (identity provider). Nếu nhóm của bạn đã đăng nhập bằng Google Workspace hoặc Microsoft Entra, phần cuối cùng này chỉ tốn của bạn mười phút và Outline trở nên rất hấp dẫn. Nếu không, bạn cũng phải tự host một dịch vụ như Keycloak hoặc Authentik, đây là dịch vụ thứ hai cần phải vá lỗi và sao lưu. Hãy dự trù bộ nhớ cho phù hợp: hướng dẫn của Outline yêu cầu khoảng 512 MB cho mỗi web process, được thiết lập bởi WEB_CONCURRENCY, cộng thêm bộ nhớ cho cơ sở dữ liệu và Redis.
Cách mỗi hệ thống quản lý quyền truy cập
BookStack hỗ trợ sẵn tài khoản email và mật khẩu cục bộ, đồng thời hỗ trợ LDAP, SAML2 và OIDC như các phương thức thay thế. Quyền được thiết lập theo vai trò và có thể ghi đè trên từng shelf, book, chapter hoặc page. Vì cấu trúc phân cấp là cố định, quyền sẽ được kế thừa theo cách bạn có thể dự đoán trước.
Wiki.js cũng cung cấp tài khoản cục bộ và bổ sung một danh sách dài các chiến lược mà bạn có thể kích hoạt trong khu vực quản trị. Các quy tắc trang của nó cho phép hoặc từ chối dựa trên mẫu đường dẫn. Điều này rất mạnh mẽ nhưng dễ gây sai sót, vì một quy tắc được viết cho ops/* sẽ âm thầm áp dụng cho mọi trang bạn lưu trữ dưới đường dẫn đó sau này.
Outline ủy quyền hoàn toàn vấn đề này. Tư cách thành viên tuân theo nhà cung cấp danh tính của bạn, và bên trong Outline, bạn kiểm soát quyền truy cập theo collection và theo group. Không có tài khoản cục bộ nào bị bỏ lại khi ai đó rời công ty, đây là một lợi thế thực sự khi nhà cung cấp danh tính chính là hệ thống mà bạn dùng để hủy cấp quyền.
Cách thức hoạt động của tính năng tìm kiếm trong từng hệ thống
Tính năng tìm kiếm là yếu tố quyết định một wiki trở nên hữu ích hay chỉ là một thư mục chứa các tệp tin bị lãng quên.
BookStack tìm kiếm trong cơ sở dữ liệu và cung cấp cho người đọc một ngôn ngữ truy vấn có thể học trong một phút. Việc đặt một cụm từ trong dấu ngoặc kép, như trong "london meeting", yêu cầu khớp chính xác chuỗi đó. Dấu ngoặc vuông dùng để tìm kiếm thẻ: [location=london] khớp theo tên thẻ, giá trị hoặc cả hai, với các phép so sánh bao gồm !=, >= và like. Dấu ngoặc nhọn dùng để lọc theo siêu dữ liệu, như trong {created_after:2016-12-30}. Bất kỳ thuật ngữ chính xác, thẻ hoặc bộ lọc nào cũng có thể được phủ định bằng cách thêm tiền tố - vào trước. BookStack giới hạn số lượng thuật ngữ cho mỗi loại trong một truy vấn, vì vậy một truy vấn quá dài sẽ bị cắt bớt thay vì thực thi.
Wiki.js xử lý tìm kiếm như một module có thể cắm vào. Các engine được tài liệu hóa bao gồm engine cơ sở dữ liệu cơ bản, engine PostgreSQL, Elasticsearch, Algolia, AWS CloudSearch và Azure Search. Engine cơ bản là đủ dùng cho vài trăm trang. Nếu bạn chạy PostgreSQL, hãy chuyển sang engine PostgreSQL trong khu vực quản trị, vì nó sử dụng chỉ mục toàn văn bản (full text index) của chính cơ sở dữ liệu thay vì so sánh đơn giản. Chỉ nên dùng Elasticsearch cho wiki đủ lớn để bạn chấp nhận việc vận hành và vá lỗi thêm một dịch vụ tìm kiếm thứ hai.
Outline tìm kiếm dựa trên các chỉ mục toàn văn bản của PostgreSQL. Không có engine nào để lựa chọn và không có gì để tinh chỉnh, nó cũng tìm kiếm cả nội dung văn bản bên trong các tài liệu đã tải lên. Đối với một wiki nhóm có số lượng tài liệu ở mức vài nghìn, đây là giải pháp ít tốn công sức nhất trong ba lựa chọn. Tuy nhiên, cũng không có tùy chọn nào để can thiệp nếu tốc độ tìm kiếm không còn đáp ứng được nhu cầu.
Lựa chọn phù hợp với bạn
Hãy chọn BookStack nếu bạn muốn wiki chạy ngay trong chiều nay và muốn ưu tiên thảo luận về nội dung thay vì cấu trúc. Nó có ít thành phần nhất: một ứng dụng PHP và một cơ sở dữ liệu MySQL. Nó phù hợp cho các runbook nội bộ và tài liệu khách hàng, cũng như các nhóm mà đa số người viết không phải là kỹ sư. Đây cũng là lựa chọn dễ sao lưu nhất trong ba loại, vì toàn bộ trạng thái chỉ bao gồm một bản dump cơ sở dữ liệu và thư mục uploads.
Hãy chọn Wiki.js nếu bạn cần một trình soạn thảo cụ thể hoặc một chiến lược xác thực mà các lựa chọn khác không cung cấp, hoặc nếu bạn đang nhập một lượng lớn Markdown hoặc AsciiDoc hiện có và muốn giữ nguyên cấu trúc đường dẫn. Hãy chấp nhận rằng bạn đang vận hành một stack nặng hơn và hãy ghim tag phiên bản chính.
Hãy chọn Outline nếu chất lượng viết là ưu tiên hàng đầu, wiki dành cho một nhóm thay vì công chúng và bạn đã có sẵn một nhà cung cấp danh tính (identity provider). Nó đền đáp thiết lập đó bằng một trình soạn thảo mà mọi người thực sự thích sử dụng. Đừng chọn nó làm ứng dụng tự lưu trữ (self-hosted) đầu tiên của bạn.
Nếu không có lựa chọn nào trong ba loại trên phù hợp, sự không tương thích thường nằm ở loại nội dung. Các hóa đơn và hợp đồng đã quét nên nằm trong một hệ thống quản lý tài liệu như Paperless-ngx thay vì trong wiki, và việc ép buộc chúng vào wiki là lý do khiến nhiều wiki bị bỏ hoang. Để có cái nhìn rộng hơn về những gì khác xứng đáng có mặt trên máy chủ của bạn, hãy xem danh sách rút gọn các ứng dụng tự lưu trữ cho năm 2026.
Kích thước và sao lưu
Cả ba ứng dụng đều chạy được trên một VPS nhỏ, nhưng mức tối thiểu thực tế phụ thuộc vào những gì đi kèm phía sau mỗi ứng dụng. BookStack là một tiến trình ứng dụng và MySQL. Wiki.js là một tiến trình Node và PostgreSQL. Outline là một tiến trình Node, PostgreSQL và Redis, thường đi kèm với một nhà cung cấp định danh, đó là lý do tại sao nó cần nhiều bộ nhớ hơn.
Hãy sao lưu cơ sở dữ liệu và các tệp tải lên cùng nhau, đồng thời khôi phục cả hai vào một instance dùng thử một lần trước khi bạn tin tưởng vào bản sao lưu đó. Một bản sao lưu wiki chưa từng được khôi phục chỉ là một sự phỏng đoán. Đối với BookStack, điều này có nghĩa là mysqldump cộng với volume /config. Đối với Wiki.js và Outline, điều này có nghĩa là pg_dump cộng với volume dữ liệu, và đối với Outline thì cần thêm cả những gì nằm trong FILE_STORAGE_LOCAL_ROOT_DIR.
FAQ
Wiki tự host nào dễ cài đặt nhất?
BookStack. Đây là một ứng dụng PHP đơn lẻ dùng cơ sở dữ liệu MySQL, và dự án này phát hành một script cài đặt cho Ubuntu 24.04 giúp thiết lập Apache, MySQL 8.0 và PHP 8.3 trong một lần chạy. Image container chỉ cần một APP_KEY và thông tin đăng nhập cơ sở dữ liệu. Wiki.js yêu cầu thêm Node runtime và máy chủ PostgreSQL, còn Outline yêu cầu thêm Redis và một nhà cung cấp danh tính bên ngoài.
Tôi có thể dùng Outline mà không cần Google hoặc nhà cung cấp SSO khác không?
Không. Outline không hỗ trợ đăng nhập bằng tên người dùng và mật khẩu cục bộ. Cấu hình mẫu của nó nêu rõ rằng cần ít nhất một nhà cung cấp đăng nhập bên thứ ba, nếu không bạn sẽ không có tùy chọn đăng nhập nào cả. Bạn có thể dùng Google, Slack, Microsoft Entra, Discord hoặc bất kỳ máy chủ OpenID Connect chung nào như Keycloak hoặc Authentik tự host. Việc vận hành nhà cung cấp đó là một phần chi phí khi chạy Outline.
Tôi nên cài đặt Wiki.js 3 hay Wiki.js 2?
Phiên bản 2. Tính đến tháng 7 năm 2026, bản phát hành mới nhất của phiên bản 2 là 2.5.314, từ tháng 5 năm 2026, và tài liệu của phiên bản 3 nêu rõ rằng đó là bản beta không ổn định mà bạn không nên cài đặt trong môi trường production. Hãy ghim image của bạn vào ghcr.io/requarks/wiki:2 thay vì latest, vì thay đổi phiên bản chính sẽ làm thay đổi schema cơ sở dữ liệu của instance đang chạy.
Công cụ nào có tính năng tìm kiếm tốt nhất?
Mỗi công cụ mạnh theo cách riêng. BookStack cung cấp cho người đọc ngôn ngữ truy vấn với các cụm từ chính xác, bộ lọc thẻ như [location=london] và bộ lọc metadata như {created_after:2016-12-30}, và bất kỳ thuật ngữ nào trong số đó đều có thể được phủ định bằng cách thêm - vào phía trước. Outline không cần cấu hình và có thể tìm kiếm văn bản bên trong các tệp đã tải lên. Wiki.js là công cụ có khả năng tùy chỉnh cao nhất vì bạn có thể chọn engine, và engine PostgreSQL rất đáng để chuyển sang ngay khi wiki của bạn vượt quá vài trăm trang.
Sau này tôi có thể chuyển nội dung từ công cụ này sang công cụ khác không?
Chỉ một phần, và bạn nên chuẩn bị cho việc thực hiện thủ công. Cả ba đều hỗ trợ xuất và nhập Markdown, nên văn bản trang thường được giữ nguyên. Cấu trúc không được giữ nguyên hoàn toàn: sách và chương của BookStack không có tương đương trong các tài liệu lồng nhau của Outline, và các đường dẫn của Wiki.js không khớp với hệ thống phân cấp cố định của BookStack. Tệp đính kèm, quyền truy cập và lịch sử trang là những phần dễ bị mất nhất, vì vậy hãy xuất thử một mẫu và kiểm tra trước khi thực hiện di chuyển.