SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-13

BookStack, Wiki.js hay Outline: chọn wiki self-hosted

So sánh BookStack, Wiki.js và Outline về độ nặng khi cài, editor, đăng nhập và search. Chọn nhanh bản phù hợp cho admin solo hoặc team.

Nên chạy wiki self-hosted nào

Wiki self-hosted đưa tài liệu của nhóm bạn vào một nơi có thể tìm kiếm trên server do bạn kiểm soát. BookStack, Wiki.js và Outline đều đáp ứng được nhu cầu này. Điểm khác biệt lớn nhất là bạn phải lắp ghép bao nhiêu thành phần trước khi trang đầu tiên tải được, và những ai được phép đăng nhập.

BookStack là lựa chọn nhẹ nhất để triển khai và áp đặt cấu trúc rõ ràng nhất. Wiki.js cho bạn nhiều lựa chọn editor nhất trong cùng một cây trang. Outline có trải nghiệm soạn thảo tốt nhất trong ba sản phẩm, nhưng không cho phép bất kỳ ai đăng nhập cho đến khi bạn kết nối một identity provider bên ngoài.

Toàn bộ nội dung dưới đây được lấy từ tài liệu chính thức của các project và các file cấu hình do họ công bố. Đây là so sánh về tính năng, không phải benchmark. Số phiên bản và yêu cầu được ghi kèm ngày vì cả ba project đều liên tục thay đổi.

Cấu trúc mới là lựa chọn thực sự

BookStack định hình sẵn nội dung của bạn. Một trang nằm trong một quyển sách, một quyển sách có thể chứa các chương, còn các kệ dùng để nhóm những quyển sách. Bạn không thể tự tạo cấp thứ năm. Giới hạn đó chính là đặc điểm của sản phẩm: người viết mới biết đặt trang ở đâu vì chỉ có một vị trí phù hợp. Đổi lại, nội dung không khớp với cấu trúc này sẽ bị ép vào đó.

Wiki.js sử dụng cây đường dẫn, tương tự các thư mục trên ổ đĩa. Một trang tại ops/backup/restic nằm ở bất kỳ vị trí nào bạn đặt, và bạn tự chọn độ sâu. Không có gì ngăn hai người lưu cùng một chủ đề dưới hai nhánh khác nhau, vì vậy một instance Wiki.js cần một người chịu trách nhiệm quản lý cây.

Outline sử dụng các collection, trong đó tài liệu có thể lồng bên trong tài liệu khác. Bạn di chuyển tài liệu bằng cách kéo thả chuột. Đây là hệ thống linh hoạt nhất trong ba hệ thống, nên cũng là hệ thống dễ bị mất cấu trúc nhất.

BookStack: cài đặt tối giản

BookStack là ứng dụng PHP sử dụng MySQL làm backend. Tính đến tháng 7 năm 2026, yêu cầu được ghi trong tài liệu là PHP 8.2 trở lên và MySQL 8.0 hoặc MariaDB 10.6 trở lên. Nếu cài đặt từ source, bạn cần thêm Composer 2.2 trở lên. Nhánh release hiện tại là 26.05.

Dự án phát hành một script cài đặt cho từng bản Ubuntu. Script dành cho 24.04 sẽ tự cài Apache, MySQL 8.0 và PHP 8.3.

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.sh

Đọc cảnh báo trong script trước khi chạy. Tài liệu ghi rõ script này "CHỈ DÙNG CHO HỆ ĐIỀU HÀNH MỚI CÀI, script sẽ cài Apache, MySQL 8.0 và PHP 8.3, đồng thời có thể GHI ĐÈ mọi cấu hình web hiện có trên máy". Nếu server đã phản hồi trên port 80, script sẽ chiếm port đó và ghi lại cấu hình Apache. Trong trường hợp này, hãy dùng container hoặc tự cài BookStack trên LAMP stack hiện có trên Ubuntu 24.04.

Cách dùng container sử dụng image LinuxServer.io, là lựa chọn được tài liệu BookStack hướng dẫn. BookStack cần session encryption key và sẽ không phục vụ trang nếu thiếu key này, vì vậy hãy tạo key trước.

docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkey

Chép giá trị được in ra vào APP_KEY, rồi ghi 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-stopped

APP_URL phải khớp với địa chỉ mà người đọc thực sự nhập, bao gồm scheme và port nếu có. Nếu đặt thành http://localhost rồi phục vụ site qua HTTPS, các link và redirect được tạo ra sẽ trỏ đến host sai. Người đọc sẽ thấy trang đăng nhập liên tục quay lại chính nó. Nếu bạn chưa quen với compose file, hãy bắt đầu bằng kiến thức cơ bản về Docker Compose trên VPS trước khi làm theo phần này.

Khởi động container và kiểm tra ứng dụng có phản hồi, không chỉ kiểm tra container đang chạy:

docker compose up -d
docker compose ps
curl -sI http://127.0.0.1:6875/login

200 OK cho biết ứng dụng PHP đã khởi động và kết nối được đến database. 500 gần như luôn có nghĩa là APP_KEY đang trống hoặc thông tin xác thực database không khớp. docker compose logs bookstack sẽ in ra nguyên nhân thuộc trường hợp nào trong hai trường hợp đó.

Wiki.js: một cây nội dung, nhiều trình chỉnh sửa

Wiki.js là một ứng dụng Node.js. Cấu hình Docker được tài liệu hướng dẫn sử dụng PostgreSQL, nhưng phần mềm cũng hỗ trợ MySQL, MariaDB, MSSQL và SQLite. Đây là compose file 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_PASSWORDDB_PASS cùng lúc trước khi chạy, vì chúng là một credential và giá trị mẫu đã được công khai. Tag được ghim vào ghcr.io/requarks/wiki:2 có chủ đích. Tài liệu khuyến cáo không dùng latest, vì việc nhảy qua một major version có thể thay đổi schema database trong khi instance đang chạy.

Version 2 là nhánh nên chạy. Tính đến tháng 7 năm 2026, bản phát hành mới nhất của version 2 là 2.5.314, phát hành vào tháng 5 năm 2026. Version 3 đã tồn tại, và tài liệu riêng của version này ghi: "Trang này dành cho bản beta chưa ổ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 xem tag :3 là bản preview.

Trong lần tải đầu tiên, Wiki.js sẽ hướng dẫn bạn qua quy trình setup trên trình duyệt để tạo tài khoản administrator. Cho đến khi hoàn tất, bất kỳ ai truy cập được cổng này đều sẽ thấy wizard đó. Vì vậy, hãy đặt service phía sau reverse proxy và TLS (bảo mật lớp truyền tải) trước khi mở firewall. Khi server chạy nhiều hơn một service, một wiki dùng hostname riêng sẽ phù hợp để đặt phía sau Traefik phía trước nhiều ứng dụng Docker.

Lựa chọn trình chỉnh sửa là lý do người dùng chọn Wiki.js. Một instance có thể chứa đồng thời các trang Markdown, trang dùng visual editor, trang HTML thô và trang AsciiDoc. Điều này hữu ích khi bạn nhập nội dung cũ ở định dạng không muốn chuyển đổi. Tuy nhiên, wiki cũng có thể kết thúc với bốn kiểu trình bày khác nhau. Vì vậy, hãy quyết định editor mặc định ngay từ ngày đầu và ghi lại quyết định đó.

Khái quát: trình biên tập tốt nhất, yêu cầu nền tảng nặng nhất

Outline là lựa chọn mà mọi người thường nói đến khi muốn một công cụ ghi chú có trải nghiệm giống sản phẩm thương mại. Đây là ứng dụng Node.js. Bản phát hành hiện tại tính đến tháng 7 năm 2026 là 1.9.2. File môi trường mẫu của ứng dụng liệt kê các thành phần cần thiết: PostgreSQL thông qua DATABASE_URL, Redis thông qua REDIS_URL, hai secret ngẫu nhiên và một URL có thể truy cập công khai.

openssl rand -hex 32
openssl rand -hex 32

Chạy lệnh đó hai lần và giữ lại cả hai giá trị. Giá trị thứ nhất dùng cho SECRET_KEY, giá trị thứ hai dùng cho UTILS_SECRET. Phần chính của file môi trường sẽ có dạng như sau:

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/data

PGSSLMODE=disable chỉ đúng khi database chạy trên cùng máy hoặc cùng Docker network. Không đặt biến này khi kết nối đến database qua network, nếu không kết nối sẽ truyền dưới dạng không mã hóa. File đính kèm không còn bắt buộc phải dùng object storage: FILE_STORAGE=local ghi file upload vào thư mục bên trên. Thư mục này phải là volume mà container có thể ghi và phải được đưa vào backup. Nếu muốn lưu các file đó trong S3 compatible bucket, hãy đặt FILE_STORAGE=s3 bằng các giá trị AWS_*.

Phần tiếp theo thường khiến người dùng bất ngờ. Outline không có chức năng đăng nhập bằng username và password tích hợp sẵn. Cấu hình mẫu của ứng dụng nêu rõ rằng cần thông tin xác thực đăng nhập qua bên thứ ba: "ít nhất MỘT trong các tùy chọn này là bắt buộc để cài đặt hoạt động, nếu không bạn sẽ không có tùy chọn đăng nhập". Các provider được tài liệu hỗ trợ gồm Google, Slack, Microsoft Entra, Discord và mọi server OpenID Connect (OIDC) thông qua OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_AUTH_URI, OIDC_TOKEN_URIOIDC_USERINFO_URI.

Vì vậy, chi phí thực tế của Outline là Outline cộng với PostgreSQL, Redis và một 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 này chỉ mất khoảng 10 phút cấu hình và Outline trở nên rất đáng dùng. Nếu chưa có, bạn cũng phải tự host một hệ thống như Keycloak hoặc Authentik. Đây là service thứ hai cần patch và backup. Hãy tính đủ memory: hướng dẫn của Outline khuyến nghị khoảng 512 MB cho mỗi web process, được đặt bằng WEB_CONCURRENCY, chưa tính database và Redis.

Cách từng nền tảng xử lý quyền đọc nội dung

BookStack có sẵn tài khoản local dùng email và password, đồng thời hỗ trợ LDAP, SAML2 và OIDC làm các phương án thay thế. Quyền được đặt theo từng role và có thể ghi đè trên một shelf, book, chapter hoặc page cụ thể. Vì cấu trúc phân cấp là cố định, quyền được kế thừa xuống các cấp bên dưới theo cách có thể dự đoán.

Wiki.js cũng có sẵn tài khoản local và bổ sung một danh sách dài các strategy mà bạn bật trong khu vực quản trị. Quy tắc của page cho phép hoặc từ chối quyền dựa trên pattern của path. Cơ chế này mạnh nhưng dễ cấu hình sai, vì một rule viết cho ops/* sẽ âm thầm áp dụng cho mọi page sau này bạn đặt dưới path đó.

Outline giao toàn bộ việc này cho hệ thống khác. Membership tuân theo identity provider, còn trong Outline, bạn kiểm soát quyền truy cập theo collection và group. Khi một người rời công ty, Outline không để lại tài khoản local nào. Đây là lợi thế thực tế nếu identity provider đã là hệ thống bạn dùng để deprovision tài khoản.

Cách tìm kiếm hoạt động trong từng hệ thống

Tìm kiếm quyết định một wiki có thực sự hữu ích hay chỉ trở thành một thư mục chứa các file bị bỏ quên.

BookStack tìm kiếm trong database và cung cấp một ngôn ngữ truy vấn mà người đọc có thể học trong một phút. Đặt cụm từ trong dấu ngoặc kép, như trong "london meeting", yêu cầu chuỗi đó phải khớp chính xác. Dấu ngoặc vuông dùng để tìm tag: [location=london] khớp theo tên tag, giá trị hoặc cả hai, với các phép so sánh gồm !=, >=like. Dấu ngoặc nhọn lọc theo metadata, như trong {created_after:2016-12-30}. Có thể phủ định mọi term chính xác, tag hoặc bộ lọc bằng cách thêm - ở phía trước. BookStack giới hạn số term của mỗi loại trong một query, vì vậy query quá dài sẽ bị cắt bớt thay vì được chạy.

Wiki.js xem tìm kiếm là một module có thể thay thế. Các engine được tài liệu hóa gồm basic database engine, PostgreSQL engine, Elasticsearch, Algolia, AWS CloudSearch và Azure Search. Basic engine phù hợp với vài trăm trang. Nếu bạn chạy PostgreSQL, hãy chuyển sang PostgreSQL engine trong khu vực quản trị, vì engine này dùng full text index của database thay vì cách so khớp đơn giản. Chỉ dùng Elasticsearch khi wiki đủ lớn để bạn chấp nhận vận hành và patch thêm một search service thứ hai.

Outline tìm kiếm bằng full text index của PostgreSQL. Bạn không cần chọn engine hay tinh chỉnh cấu hình, và hệ thống cũng tìm kiếm cả nội dung bên trong các tài liệu đã upload. Với wiki nhóm có vài nghìn tài liệu, đây là lựa chọn ít công việc nhất trong ba hệ thống. Nếu tốc độ tìm kiếm không còn đủ nhanh, bạn cũng không có tùy chọn nào để điều chỉnh.

Lựa chọn nào phù hợp với bạn

Chọn BookStack nếu bạn muốn wiki chạy ngay trong chiều nay và muốn tập trung tranh luận về nội dung thay vì cấu trúc. BookStack có ít thành phần phải quản lý nhất: một ứng dụng PHP và một cơ sở dữ liệu MySQL. Nó phù hợp với runbook nội bộ và tài liệu cho khách hàng, cũng như các nhóm mà phần lớn người viết không phải kỹ sư. Đây cũng là ứng dụng dễ backup nhất trong 3 lựa chọn, vì toàn bộ trạng thái chỉ gồm một database dump và thư mục uploads.

Chọn Wiki.js nếu bạn cần một editor cụ thể hoặc một chiến lược xác thực cụ thể mà các lựa chọn còn lại không có, hoặc nếu bạn đang import một lượng lớn Markdown hay AsciiDoc hiện có và muốn giữ nguyên cấu trúc đường dẫn. Bạn phải chấp nhận việc vận hành một stack nặng hơn và nên pin major version tag.

Chọn Outline nếu chất lượng bài viết là ưu tiên hàng đầu, wiki dành cho một nhóm thay vì công khai, và bạn đã có identity provider. Cấu hình này mang lại một editor mà người dùng thực sự thích. Không nên chọn Outline làm ứng dụng self-hosted đầu tiên.

Nếu không lựa chọn nào trong 3 ứng dụng phù hợp, nguyên nhân thường là do loại nội dung không phù hợp. Hóa đơn và hợp đồng đã scan nên được lưu trong một hệ thống quản lý tài liệu như Paperless-ngx thay vì trong wiki. Việc cố đưa chúng vào wiki là lý do nhiều wiki cuối cùng bị bỏ không. Một trường hợp không phù hợp phổ biến khác là bạn cần một workspace thay vì wiki, với tài liệu, bảng và whiteboard trên cùng một canvas. Khi đó, một workspace AFFiNE self-hosted sẽ phù hợp hơn cả 3 lựa chọn trên. Để có cái nhìn rộng hơn về những ứng dụng khác đáng chạy trên server riêng, xem danh sách rút gọn các ứng dụng self-hosting cho năm 2026.

Định cỡ và backup

Cả ba đều chạy được trên một VPS nhỏ. Mức tài nguyên tối thiểu thực tế khác nhau vì mỗi ứng dụng có các thành phần phía sau khác nhau. BookStack gồm một tiến trình ứng dụng và MySQL. Wiki.js gồm một tiến trình Node và PostgreSQL. Outline gồm một tiến trình Node, PostgreSQL và Redis, thường chạy cùng một identity provider. Vì vậy, Outline cần được cấp thêm memory.

Hãy backup database cùng với dữ liệu upload, rồi restore cả hai vào một instance tạm thời một lần trước khi phụ thuộc vào bản backup đó. Một bản backup wiki chưa từng được restore chỉ là phỏng đoán. Với BookStack, việc này có nghĩa là mysqldump cùng với volume /config. Với Wiki.js và Outline, việc này có nghĩa là pg_dump cùng với data volume; riêng Outline còn cần backup 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 độc lập dùng cơ sở dữ liệu MySQL. Dự án có sẵn script cài đặt cho Ubuntu 24.04, tự thiết lập Apache, MySQL 8.0 và PHP 8.3 trong một lần chạy. Container image chỉ cần một APP_KEY và thông tin xác thực cơ sở dữ liệu. Wiki.js cần thêm Node runtime và PostgreSQL server. Outline còn cần Redis và một identity provider bên ngoài.

Tôi có thể dùng Outline mà không cần Google hoặc một SSO provider khác không?

Không. Outline không có cách đăng nhập bằng username và password cục bộ. Cấu hình mẫu của ứng dụng nêu rõ phải có ít nhất một third-party sign-in provider; nếu không, bạn sẽ hoàn toàn không có tùy chọn đăng nhập. Bạn có thể dùng Google, Slack, Microsoft Entra, Discord hoặc bất kỳ OpenID Connect server nào, chẳng hạn Keycloak hoặc Authentik tự host. Việc vận hành provider đó là một phần chi phí khi chạy Outline.

Tôi nên cài Wiki.js 3 hay Wiki.js 2?

Version 2. Tính đến tháng 7 năm 2026, bản phát hành mới nhất của version 2 là 2.5.314, phát hành vào tháng 5 năm 2026. Tài liệu version 3 nói rõ đây là beta không ổn định và không nên cài trong production. Hãy pin image vào ghcr.io/requarks/wiki:2 thay vì latest, vì thay đổi major version sẽ thay đổi database schema trong khi instance đang chạy.

Bản nào có tính năng tìm kiếm tốt nhất?

Mỗi bản mạnh theo một cách khác nhau. BookStack cung cấp cho người đọc một query language hỗ trợ cụm từ chính xác, các bộ lọc tag như [location=london] và các bộ lọc metadata như {created_after:2016-12-30}. Bạn có thể phủ định bất kỳ điều kiện nào bằng cách thêm - ở đầu. Outline không cần cấu hình và tìm kiếm được nội dung bên trong các file đã upload. Wiki.js có khả năng tùy chỉnh cao nhất vì bạn được chọn engine. PostgreSQL engine đá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ừ nền tảng này sang nền tảng khác không?

Có thể chuyển một phần, nhưng bạn nên dự kiến sẽ phải xử lý thủ công. Cả 3 nền tảng đều hỗ trợ export và import Markdown, nên nội dung văn bản của trang thường vẫn giữ được. Cấu trúc không được giữ nguyên hoàn toàn: book và chapter của BookStack không có cấu trúc tương đương trong các document lồng nhau của Outline, còn path của Wiki.js không ánh xạ được vào hierarchy cố định của BookStack. Attachments, 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 export thử một mẫu và kiểm tra các phần này trước khi thực hiện migration.