SSD Nodes Learn 8GB 内存 — 每年 $66
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-01

BookStack、Wiki.js 与 Outline 自托管 Wiki 怎么选

对比 BookStack、Wiki.js 和 Outline 的部署组件、编辑方式、登录限制与搜索能力,并说明个人管理员和团队分别适合哪一款。

应运行哪个自托管 wiki

自托管 wiki 会将团队文档集中存放在您控制的服务器上,并支持统一搜索。BookStack、Wiki.js 和 Outline 都能完成这项工作。它们的主要区别在于:首次加载页面前需要组装多少组件,以及允许哪些用户登录。

BookStack 最容易部署,对内容结构的约束也最明确。Wiki.js 在同一个页面树中提供最丰富的编辑器选择。Outline 的写作体验在三者中最佳,但在连接外部身份提供商之前,不允许任何人登录。

以下内容均来自这些项目自己的文档和公开发布的配置文件。这是功能对比,不是性能基准。版本号和要求均标注了日期,因为这三个项目都在持续更新。

结构才是真正的选择

BookStack 固定了内容的层级结构。页面位于书籍中,书籍可以包含章节,书架用于归组书籍。您不能自行创建第 5 级。这种限制正是产品的价值所在:新作者知道页面应放在哪里,因为它只有一个可放置的位置。代价是,不符合这种结构的内容也必须被强行纳入其中。

Wiki.js 使用类似磁盘文件夹的路径树。ops/backup/restic 中的页面可以放在任意位置,层级深度也由您决定。没有任何机制阻止两个人将同一主题归档到两个不同的分支,因此 Wiki.js 实例需要由一个人负责维护目录树。

Outline 使用集合,文档可以嵌套在其他文档中。移动文档时,只需用鼠标拖动。三者中它的灵活性最高,因此也最容易逐渐失去结构。

BookStack:最小安装

BookStack 是一个由 MySQL 支持的 PHP 应用程序。截至 2026 年 7 月,文档要求 PHP 8.2 或更高版本,以及 MySQL 8.0 或 MariaDB 10.6 或更高版本。如果从源代码安装,还需要 Composer 2.2 或更高版本。当前发布版本线为 26.05。

该项目为每个 Ubuntu 版本发布一个安装脚本。24.04 脚本会为您安装 Apache、MySQL 8.0 和 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

运行脚本前,请阅读脚本中的警告。文档声明,该脚本“仅适用于全新操作系统;它会安装 Apache、MySQL 8.0 和 PHP 8.3,并可能覆盖计算机上已有的任何 Web 配置”。如果服务器已经在 port 80 上提供服务,该脚本会占用该端口并重写 Apache 配置。此时应改用容器,或者在 Ubuntu 24.04 上已有的 LAMP 堆栈之上手动安装 BookStack。

容器方案使用 LinuxServer.io 映像,这是 BookStack 文档推荐的选项。BookStack 需要会话加密密钥;没有该密钥就无法提供页面,因此请先生成密钥。

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

将输出的值复制到 APP_KEY,然后写入服务配置:

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 必须与读者实际输入的地址一致,包括 scheme 和 port(如果有)。将其设置为 http://localhost,然后通过 HTTPS 提供站点服务。否则,生成的链接和重定向会指向错误的主机,读者会看到登录页面不断重定向回自身。如果您不熟悉 compose 文件,请先阅读 VPS 上的 Docker Compose 基础知识,再进行本教程的操作。

启动服务,并检查应用程序是否响应,而不只是检查容器是否正在运行:

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

200 OK 表示 PHP 应用程序已启动并连接到数据库。500 几乎总是表示 APP_KEY 为空,或数据库凭据不匹配;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_PASSWORDDB_PASS,因为它们共同构成一个凭据,示例值已公开。标签有意固定为 ghcr.io/requarks/wiki:2。文档不建议使用 latest,因为大版本跳转会在运行中的实例上更改数据库架构。

应运行版本 2 系列。截至 2026 年 7 月,最新的版本 2 发布版是 2.5.314,于 2026 年 5 月发布。版本 3 已存在,其文档明确说明:“此站点面向 Wiki.js 3.0 的不稳定测试版。您不应将其安装在生产环境中。”应将 :3 标签视为预览版本。

首次加载时,Wiki.js 会引导您在浏览器中完成设置,并创建管理员账户。在完成设置前,任何能够访问该端口的人都会看到该向导。因此,在开放防火墙端口前,应将服务置于反向代理和 TLS(传输层安全)之后。当服务器运行的不止此服务时,将 wiki 配置在独立主机名下,可以自然地使用 由 Traefik 置于多个 Docker 应用之前 的架构。

编辑器选择是人们选择 Wiki.js 的原因。一个实例可以同时保存 Markdown 页面、可视化编辑器页面、原始 HTML 页面和 AsciiDoc 页面。如果您要导入不希望转换格式的旧内容,这会很有帮助。但这也可能导致同一个 wiki 中出现 4 种内部样式。因此,请在第一天确定默认编辑器,并记录这一决定。

Outline:最佳编辑器,最繁重的前置条件

人们通常所说的“想要使用类似商业笔记工具的产品”,指的就是 Outline。它是一个 Node.js 应用,截至 2026 年 7 月的当前版本是 1.9.2。它的示例环境文件列出了所需组件:通过 DATABASE_URL 配置 PostgreSQL,通过 REDIS_URL 配置 Redis,两个随机密钥,以及一个可公开访问的 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 网络中时,PGSSLMODE=disable 才是正确的配置。对于通过网络访问的数据库,应省略该配置,否则连接会以明文传输。附件不再强制要求使用对象存储:FILE_STORAGE=local 会将上传文件写入上方的目录。该目录必须是容器可写入的卷,并且必须包含在备份中。如果希望将这些文件存储在兼容 S3 的存储桶中,请改用 AWS_* 中的值设置 FILE_STORAGE=s3

接下来是容易让人意外的部分。Outline 没有内置的用户名和密码登录功能。它自己的示例配置说明,必须配置第三方登录凭据:“要使安装正常工作,以下配置中至少需要一个,否则将没有任何登录选项”。文档列出的身份提供商包括 Google、Slack、Microsoft Entra、Discord,以及通过 OIDC_CLIENT_IDOIDC_CLIENT_SECRETOIDC_AUTH_URIOIDC_TOKEN_URIOIDC_USERINFO_URI 接入的通用 OpenID Connect (OIDC) 服务器。

因此,Outline 的实际成本是 Outline、PostgreSQL、Redis 和一个身份提供商。如果团队已经使用 Google Workspace 或 Microsoft Entra 登录,最后一项只需花费 10 分钟,Outline 就会非常有吸引力。如果没有,您还需要自行托管 Keycloak 或 Authentik 之类的服务,这意味着还要额外维护和备份第二个服务。请据此规划内存:Outline 官方建议每个 Web 进程大约使用 512 MB,由 WEB_CONCURRENCY 设置;此外还要为数据库和 Redis 分配内存。

各者如何处理读取权限

BookStack 开箱即用地提供本地电子邮件和密码账户,也支持 LDAP、SAML2 和 OIDC 作为替代方案。权限按角色设置,也可以在单个书架、图书、章节或页面上覆盖。由于层级结构固定,权限会按可预测的方式向下继承。

Wiki.js 同样提供本地账户,并增加了一个较长的策略列表,您可以在管理区域启用这些策略。其页面规则按路径模式授予或拒绝访问权限。这种方式功能强大,但也容易配置错误,因为为 ops/* 编写的规则会静默覆盖以后归档到该路径下的所有页面。

Outline 完全将此问题交给身份系统处理。成员资格由您的身份提供商管理,您可以在 Outline 中按集合和组控制访问权限。当有人离开公司时,Outline 中不会遗留本地账户。如果身份提供商已经是您用于撤销账户的系统,这是一个实际优势。

各产品的搜索工作方式

搜索功能决定了 wiki 是否真正有用,还是最终变成一堆被遗忘的文件。

BookStack 会搜索数据库,并提供一种读者可以在一分钟内学会的查询语言。使用引号括起短语(例如 "london meeting")时,必须匹配该确切字符串。方括号用于搜索标签:[location=london] 可以按标签名称、标签值或两者进行匹配,支持 !=>=like 等比较运算。花括号用于按元数据筛选,例如 {created_after:2016-12-30}。任何确切匹配、标签或筛选条件,都可以在前面加上 - 进行排除。BookStack 限制单个查询可包含的各类条件数量,因此过长的查询会被截短,而不是直接执行。

Wiki.js 将搜索作为可插拔模块处理。文档列出的搜索引擎包括基本数据库引擎、PostgreSQL 引擎、Elasticsearch、Algolia、AWS CloudSearch 和 Azure Search。基本引擎适合只有几百个页面的 wiki。如果使用 PostgreSQL,应在管理区域切换到 PostgreSQL 引擎,因为它使用数据库自身的全文索引,而不是简单匹配。只有当 wiki 的规模足够大,并且可以接受运行和维护第二个搜索服务时,才应使用 Elasticsearch。

Outline 使用 PostgreSQL 全文索引进行搜索。它没有可选的搜索引擎,也无需进行调优,同时还会搜索上传文档中的文本。对于文档数量只有几千份的团队 wiki,三者中它的维护工作最少。如果搜索速度最终不再满足要求,也没有可调整的选项。

哪一款适合您

如果您希望今天下午就运行 wiki,并且更愿意讨论内容而不是结构,请选择 BookStack。它包含的组件最少:一个 PHP 应用和一个 MySQL 数据库。它适合内部运行手册和客户文档,也适合大多数作者不是工程师的团队。它也是这三款中最容易备份的,因为完整状态就是一个数据库转储和 uploads 目录。

如果您需要其他产品不提供的特定编辑器或身份验证策略,或者要导入大量现有 Markdown 或 AsciiDoc,并希望保留路径结构,请选择 Wiki.js。请接受需要运行更重的技术栈这一点,并固定 major version 标签。

如果写作质量最重要,wiki 面向团队而不是公众,并且您已经有身份提供商,请选择 Outline。这样的配置可以提供真正易用的编辑器。不要把它作为您的第一个自托管应用。

如果三款都不适合,通常是因为内容类型不匹配。扫描的发票和合同应放在Paperless-ngx 等文档管理系统中,而不是 wiki 中。强行将这些内容放入 wiki,正是许多 wiki 最终被弃用的原因。如果想更全面地了解哪些应用值得部署在自己的服务器上,请参阅2026 年自托管应用候选清单

资源配置和备份

这三种软件都可以运行在小型 VPS 上。实际最低配置取决于每种软件背后的组件。BookStack 由一个应用进程和 MySQL 组成。Wiki.js 由一个 Node 进程和 PostgreSQL 组成。Outline 由一个 Node 进程、PostgreSQL 和 Redis 组成,通常还需要配合身份提供商。因此,Outline 需要分配更多内存。

同时备份数据库和上传文件,并在依赖该备份之前,先将两者恢复到一次性实例中。没有经过恢复验证的 wiki 备份只是猜测。对于 BookStack,这意味着备份 mysqldump/config 卷。对于 Wiki.js 和 Outline,这意味着备份 pg_dump 和数据卷;对于 Outline,还要备份 FILE_STORAGE_LOCAL_ROOT_DIR 中的内容。

FAQ

哪个自托管 wiki 最容易安装?

BookStack。它是一个 PHP 应用,使用 MySQL 数据库。该项目提供适用于 Ubuntu 24.04 的安装脚本,可一次性配置 Apache、MySQL 8.0 和 PHP 8.3。容器映像只需要一个 APP_KEY 和数据库凭据。Wiki.js 还需要 Node 运行时和 PostgreSQL 服务器,Outline 则在此基础上还需要 Redis 和外部身份提供商。

不使用 Google 或其他 SSO 提供商,可以运行 Outline 吗?

不可以。Outline 不提供本地用户名和密码登录。其示例配置明确要求至少配置一个第三方登录提供商,否则完全没有登录方式。您可以使用 Google、Slack、Microsoft Entra、Discord,或任何通用的 OpenID Connect 服务器,例如自托管的 Keycloak 或 Authentik。运行该提供商也是运行 Outline 的成本之一。

应该安装 Wiki.js 3 还是 Wiki.js 2?

选择版本 2。截至 2026 年 7 月,最新的版本 2 是 2.5.314,于 2026 年 5 月发布。版本 3 文档明确说明该版本是一个不稳定的 beta 版本,不应安装在生产环境中。请将映像固定到 ghcr.io/requarks/wiki:2,而不是 latest,因为主版本变更会修改运行中实例的数据库架构。

哪个产品的搜索功能最好?

它们各有优势。BookStack 为读者提供查询语言,支持精确短语、[location=london] 等标签筛选器,以及 {created_after:2016-12-30} 等元数据筛选器。任何这些条件前面都可以加 - 表示排除。Outline 无需配置,并且可以搜索已上传文件中的文本。Wiki.js 的可调节性最高,因为您可以选择搜索引擎。当 wiki 超过几百个页面后,值得尽快切换到 PostgreSQL 引擎。

以后可以在它们之间迁移内容吗?

可以部分迁移,但应预期需要手动处理。三者都支持导入和导出 Markdown,因此页面文本通常可以保留。结构无法顺利保留:BookStack 的书籍和章节在 Outline 的嵌套文档中没有对应结构,Wiki.js 的路径也无法映射到 BookStack 的固定层级。附件、权限和页面历史最容易丢失,因此在确定迁移方案前,请先导出一个样本并检查这些内容。

#bookstack#wikijs#outline#wiki#自托管#knowledge-base