自架 wiki 怎麼選?BookStack、Wiki.js、Outline 比較
比較 BookStack、Wiki.js 與 Outline 的部署重量、編輯方式、登入選項與搜尋,並指出適合單人管理者及團隊的選擇。
應執行哪一套自架 wiki
自架 wiki 會將團隊文件集中放在由你管理的伺服器上,方便搜尋。BookStack、Wiki.js 與 Outline 都能完成這項工作。三者最大的差異,在於首次載入頁面前需要組裝多少元件,以及允許哪些使用者登入。
BookStack 最容易部署,對內容結構的要求也最明確。Wiki.js 在同一個頁面樹狀結構中,提供最廣泛的編輯器選擇。Outline 的寫作體驗在三者中最佳,但其文件所述的正式環境設定要求使用外部身分識別提供者,才能建立初始工作區。
以下內容均整理自各專案的官方文件與公開設定檔。這是功能比較,不是效能基準測試。由於三個專案都持續變更,版本號碼與需求均附上日期。
結構才是真正的選擇
BookStack 會固定內容的結構。頁面位於書籍中,書籍可以包含章節,而書架則將書籍分組。你無法自行建立第五層。這項限制就是產品的核心:新作者知道頁面應放在哪裡,因為它只有一個可能的位置。代價是,不符合這種結構的內容也必須套入其中。
Wiki.js 使用類似磁碟資料夾的路徑樹。位於 ops/backup/restic 的頁面可以放在你指定的任何位置,深度也由你決定。系統不會阻止兩個人將同一主題分別歸檔到兩個不同的分支,因此 Wiki.js 執行個體需要由一個人負責管理樹狀結構。
Outline 使用 collection,文件可以巢狀放在其他文件中。移動文件只需用滑鼠拖曳。三者之中,它的彈性最高,因此也最容易逐漸失去一致性。
BookStack:最精簡的安裝
BookStack 是以 MySQL 為後端的 PHP 應用程式。截至 2026 年 10 月,文件列出的需求為 PHP 8.2 或更新版本,以及 MySQL 8.0 或 MariaDB 10.6 或更新版本;若從原始碼安裝,還需要 Composer 2.2 或更新版本。目前的發行系列為 26.09,於 2026 年 9 月 24 日發布;最新穩定版本為 26.09.2,這是 2026 年 10 月 20 日發布的安全性版本。從 26.09 開始,必須設定 APP_KEY;下方的容器步驟已涵蓋此設定。BookStack 也在 2026 年 10 月 21 日發布了 PHP 重大安全性通知:請更新底層 PHP 套件,或拉取並重新建立包含修補程式的容器,因為僅確認 BookStack 版本並不能證明 PHP 已完成修補。
專案官方支援針對列出的 Ubuntu LTS 版本使用安裝指令碼與指南,目前包括 22.04、24.04 和 26.04;有時也會針對其他環境發布不受支援的指南與指令碼。24.04 指令碼會代為安裝 Apache、MySQL 8.0 和 PHP 8.3。在 26.04 上,請改在下方指令中使用 installation-ubuntu-26.04.sh;它會安裝 MySQL 8.4 和 PHP 8.5。
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執行前請先閱讀該指令碼中的警告。文件指出,該指令碼「僅適用於全新的作業系統,會安裝 Apache、MySQL 8.0 和 PHP 8.3,且可能覆寫機器上現有的任何 Web 設定」。24.04 指令碼會檢查現有的 Apache 設定與 MySQL 資料;若發現其中任一項,會在安裝前中止。請改用容器,或在 Ubuntu 24.04 上現有的 LAMP stack 上手動安裝 BookStack。
容器方式使用 LinuxServer.io 映像檔,這是 BookStack 文件列出的兩種社群容器設定之一。BookStack 需要工作階段加密金鑰,沒有金鑰就不會提供頁面,因此請先產生金鑰。
docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkey將輸出的值複製到 APP_KEY,然後寫入服務。此服務也需要現有的 MySQL 或 MariaDB 資料庫;請依該資料庫設定 DB_* 的值,因為此程式碼片段不會建立資料庫服務。
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 必須符合讀者實際輸入的位址,包括配置和任何連接埠。請將它設定為 http://localhost,然後透過 HTTPS 提供網站;否則產生的連結與重新導向會指向錯誤的主機,讀者會看到不斷重新導向回自身的登入頁面。如果你不熟悉 compose 檔案,請先閱讀 VPS 上的 Docker Compose 基礎,再進行本節操作。
啟動服務,並確認應用程式有回應,而不只是確認容器正在執行:
docker compose up -d
docker compose ps
curl -sI http://127.0.0.1:6875/login200 OK 表示 PHP 應用程式已啟動並連上資料庫。出現 500 時,需要查看應用程式錯誤日誌才能診斷。BookStack 預設會將錯誤寫入日誌檔,而不是容器輸出,因此請在主機上開啟 ./config/log/bookstack/laravel.log 以查看原因。docker compose logs bookstack 會顯示容器本身的啟動訊息,其中可能不包含應用程式錯誤。
Wiki.js:一棵樹,多位編輯者
Wiki.js 是 Node.js 應用程式。文件所述的 Docker 設定會搭配 PostgreSQL,但此軟體也支援 MySQL、MariaDB、MSSQL 和 SQLite。以下是專案自有 Docker 頁面提供的 compose 檔案:
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:執行前請同時修改 POSTGRES_PASSWORD 和 DB_PASS,因為兩者構成同一組認證資料,且範例值已公開。這裡刻意將標籤固定在 ghcr.io/requarks/wiki:2。文件不建議使用 latest,因為跨越主要版本時,執行中的實例會變更資料庫 schema。
應使用 Version 2 系列。截至 October 27, 2026,最新的 Version 2 版本是 2.5.317。這是 October 23, 2026 發布的錯誤修正版本,會以最新的 Node 安全性更新重新建置映像檔。Version 2 版本目前從獨立的 requarks/wiki-v2 repository 發布,:2 映像檔標籤仍會追蹤這些版本。Version 3 目前處於公開 beta 階段。其安裝文件指出,該版本的映像檔標籤為 3.0.0-beta,而單獨使用 3 和 3.0 標籤,在 beta 階段結束前都不會運作。請將它視為預覽版本,不要用於 production。前一個版本 2.5.316 於 October 2, 2026 發布,新增了匯出工具,方便日後將內容移轉至 Version 3。
首次載入時,Wiki.js 會引導你在瀏覽器中完成設定,並建立 administrator 帳號。在完成設定前,任何能連線至該埠的使用者都會看到此精靈,因此在開啟防火牆前,請先將服務置於 reverse proxy 和 TLS(transport layer security)後方。當伺服器託管的不只這項服務時,讓 wiki 使用獨立的 hostname,搭配 多個 Docker 應用程式前方的 Traefik,是自然的部署方式。
人們選擇 Wiki.js 的原因在於編輯器選項。同一個實例可以並列管理 Markdown 頁面、視覺化編輯器頁面、原始 HTML 頁面和 AsciiDoc 頁面。若要匯入不想轉換格式的舊內容,這項功能會很有幫助。但這也可能讓同一個 wiki 出現 4 種內部格式,因此請在第一天決定預設編輯器,並記錄這項決定。
大綱:最佳編輯器,但前置條件最複雜
人們通常所說的「想要具備商業筆記工具使用感」的產品,就是 Outline。它是 Node.js 應用程式;截至 2026 年 10 月 27 日,目前版本為 1.12.0,於 2026 年 10 月 23 日發布。此版本將 Docker image 移至可修正數個近期揭露之 Node 漏洞的 Node 版本,因此請將舊版安裝更新至最新版本。其範例環境檔列出必要項目:透過 DATABASE_URL 使用 PostgreSQL、透過 REDIS_URL 使用 Redis、兩組隨機 secret,以及可從公開網路連線的 URL。
openssl rand -hex 32
openssl rand -hex 32執行兩次並保留兩個值。第一個值設為 SECRET_KEY,第二個值設為 UTILS_SECRET。環境檔的核心內容如下:
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只有在資料庫位於同一台機器或同一個 Docker network 時,PGSSLMODE=disable 才是正確設定。若資料庫需跨網路連線,請省略此設定,否則連線會以明文傳輸。附件不再強制使用物件儲存:FILE_STORAGE=local 會將上傳檔案寫入上述目錄。該目錄必須是容器可寫入的 volume,且必須納入備份範圍。若要將檔案儲存至相容於 S3 的 bucket,請改用 AWS_* 中的值設定 FILE_STORAGE=s3。
接下來是最容易令人意外的部分。Outline 沒有內建的使用者名稱和密碼登入功能。其範例設定明確指出,必須提供第三方登入憑證:「要讓安裝正常運作,以下設定至少需要一項,否則將沒有任何登入選項」。文件列出的 provider 包括 Google、Slack、Microsoft Entra、Discord,以及任何通用的 OpenID Connect (OIDC) server,分別透過 OIDC_CLIENT_ID、OIDC_CLIENT_SECRET、OIDC_AUTH_URI、OIDC_TOKEN_URI 和 OIDC_USERINFO_URI 設定。現有 workspace 也可以啟用 passkey,以及電子郵件連結或驗證碼;電子郵件登入需要 SMTP,且對於已連結 SSO provider 的帳戶,不會繞過 SSO。
因此,Outline 文件所述的正式環境設定,實際成本是 Outline 加上 PostgreSQL、Redis 和 identity provider。如果團隊已使用 Google Workspace 或 Microsoft Entra 登入,Outline 會非常適合。若尚未具備這些服務,就還需要自行代管類似 Keycloak 或 Authentik 的服務,這代表多一項需要修補與備份的服務。請據此規劃記憶體:Outline 的建議值約為每個 web process 512 MB,由 WEB_CONCURRENCY 設定,此外還要加上資料庫和 Redis 所需的記憶體。
每個系統如何處理內容讀取權限
BookStack 預設提供本機電子郵件與密碼帳號,也支援 LDAP、SAML2 及 OIDC 作為替代方案。權限可依角色設定,也能在單一 shelf、book、chapter 或 page 上覆寫。book 與 chapter 的權限會向下繼承至子內容,除非另行覆寫;shelf 的權限則必須明確複製到 book。
Wiki.js 同樣提供本機帳號,並在管理區域加入許多可啟用的驗證策略。其頁面規則可依路徑模式授予或拒絕存取權。這項功能彈性很高,但也容易設定錯誤,因為針對 ops/* 撰寫的規則,之後歸檔到該路徑下的所有頁面都會受到影響,而且不會另外提示。
Outline 使用您的身分提供者處理 SSO 成員資格,並可在 Outline 內依 collection、document 及 group 控制存取權。從身分提供者移除的使用者,下一次載入 Outline 時會被登出;若要立即結束現有工作階段,請在 Outline 中停權。
各產品的搜尋方式
搜尋功能決定 wiki 是否實用,或只是存放被遺忘檔案的資料夾。
BookStack 會搜尋資料庫,並提供讀者只需幾分鐘即可學會的查詢語言。使用引號包住片語,例如 "london meeting",可要求比對完全相同的字串。使用方括號可搜尋標籤:[location=london] 可依標籤名稱、值或兩者進行比對,支援 !=、>= 和 like 等比較運算子。使用大括號可依中繼資料篩選,例如 {created_after:2016-12-30}。任何精確比對、標籤或篩選條件,都可以在前面加上 - 來排除。BookStack 限制單一查詢可包含的各類條件數量,因此過長的查詢會被截短,不會直接執行。
Wiki.js 將搜尋視為可插拔模組。文件列出的引擎包括基本資料庫引擎、PostgreSQL 引擎、Elasticsearch、Algolia、AWS CloudSearch 和 Azure Search。基本引擎會比對標題、描述和路徑,不會搜尋頁面本文。如果使用 PostgreSQL,請在管理區域切換至 PostgreSQL 引擎,因為它會使用資料庫本身的全文索引,而不是簡單比對。只有在 wiki 的規模大到足以接受執行及修補第二個搜尋服務時,才建議使用 Elasticsearch。
Outline 會搜尋 PostgreSQL 的全文索引。其內建的關鍵字搜尋不需要額外的搜尋服務。對於只有數千份文件的團隊 wiki,三者之中它需要的維護工作最少。
哪一種適合你
如果你希望今天下午就能讓 wiki 運作,並且比較在意內容而不是結構,請選擇 BookStack。它的組成最精簡:一個 PHP 應用程式和一個 MySQL 資料庫。它適合內部操作手冊與客戶文件,也適合多數撰寫者不是工程師的團隊。三者之中,它也是最容易備份的選項,因為狀態只包含一份資料庫傾印、上傳的檔案,以及 .env 設定(包括 APP_KEY)。
如果你需要其他選項沒有提供的特定編輯器或驗證策略,或者要匯入大量既有的 Markdown 或 AsciiDoc,並希望保留路徑結構,請選擇 Wiki.js。請接受需要執行較複雜的堆疊,並固定 major version tag。
如果寫作品質最重要、wiki 是供團隊使用而非公開提供,而且你已經有 identity provider,請選擇 Outline。這樣的環境能讓你使用實際上更容易上手的編輯器。不要把它選為第一個自架應用程式。
如果三者都不適合,通常是內容類型不匹配。掃描的發票與合約應放在 Paperless-ngx 等文件管理系統,而不是 wiki。硬要將這些內容放進 wiki,正是許多 wiki 最後遭到棄用的原因。另一種常見的不匹配,是你需要的其實是 workspace,而不是 wiki:文件、表格與白板位於同一個畫布上。這種情況下,自架的 AFFiNE workspace 比上述三者更適合。若要更全面了解哪些服務值得放在自己的伺服器上,請參閱 2026 年自架服務候選清單。
容量規劃與備份
這 3 個系統都能部署在小型 VPS 上,但實際所需的最低規格取決於各自的後端元件。BookStack 只需要 1 個應用程式程序和 MySQL。Wiki.js 需要 1 個 Node 程序和 PostgreSQL。Outline 需要 1 個 Node 程序、PostgreSQL 和 Redis,通常還要搭配身分識別提供者,因此需要額外配置記憶體。
請一併備份資料庫和上傳檔案,並在依賴該備份前,先將兩者還原至一次性的測試執行個體。從未還原過的 wiki 備份,只是假設。對 BookStack 而言,這表示 mysqldump 以及 /config volume。對 Wiki.js 和 Outline 而言,這表示 pg_dump 加上資料 volume;對 Outline 而言,還包括 FILE_STORAGE_LOCAL_ROOT_DIR 中的內容。
FAQ
哪個自架 wiki 最容易安裝?
BookStack。它是單一 PHP 應用程式,搭配 MySQL 資料庫。專案提供 Ubuntu 24.04 的安裝指令碼,可一次設定 Apache、MySQL 8.0 與 PHP 8.3。容器映像需要 APP_KEY、APP_URL,以及現有資料庫的認證資訊。Wiki.js 還需要 Node 執行環境與 PostgreSQL 伺服器;Outline 的文件化初始設定則需要 Redis 與外部身分識別提供者。
沒有 Google 或其他 SSO 提供者時,可以使用 Outline 嗎?
Outline 的文件化正式環境設定需要身分識別提供者來建立初始工作區。Outline 沒有本機使用者名稱與密碼登入功能。其範例設定指出,至少需要一個第三方登入提供者,否則完全沒有登入選項。你可以使用 Google、Slack、Microsoft Entra、Discord,或任何通用的 OpenID Connect 伺服器,例如自架的 Keycloak 或 Authentik。現有工作區可以啟用 passkey 或電子郵件連結與驗證碼;使用電子郵件登入時需要 SMTP。已連結 SSO 的帳戶仍會使用該提供者。
應該安裝 Wiki.js 3 還是 Wiki.js 2?
Version 2。截至 October 27, 2026,最新的 version 2 版本是 2.5.317,發行日期為 October 23, 2026;version 3 仍是 beta,且其映像帶有 3.0.0-beta 標籤。請將映像固定為 ghcr.io/requarks/wiki:2,不要使用 latest,因為 major version 變更會修改執行中 instance 的資料庫 schema。
哪一個的搜尋功能最好?
三者各有優勢。BookStack 提供查詢語言,支援完整片語、[location=london] 等標籤篩選,以及 {created_after:2016-12-30} 等 metadata 篩選;上述任一條件都可在前面加上 - 予以排除。Outline 的內建關鍵字搜尋不需要額外的搜尋服務。Wiki.js 的可調整性最高,因為你可以選擇搜尋引擎;其中 PostgreSQL engine 能搜尋頁面本文,而 basic engine 無法搜尋。
之後可以把內容從一個系統移到另一個系統嗎?
只能部分移轉,而且應預期需要手動處理。三者都能匯出 Markdown,但 BookStack 的內建匯入功能接受其 Portable ZIP 格式,因此單獨的 Markdown 無法直接匯入 BookStack。內容結構也無法完整保留:BookStack 的 books 與 chapters 在 Outline 的巢狀文件中沒有對應項目,而 Wiki.js 的路徑也無法對應到 BookStack 的固定階層。附件、權限與頁面歷程最容易遺失,因此在決定移轉前,請先匯出一份範例並檢查這些內容。