SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

自托管 Wiki 对比:BookStack、Wiki.js 还是 Outline

比较 BookStack、Wiki.js 和 Outline 的部署复杂度、编辑器、登录方式与搜索;明确说明个人管理员和团队分别适合哪一个,并注明版本要求。

应运行哪种自托管 wiki

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

BookStack 最容易部署,并且对文档结构的约束最强。Wiki.js 在同一页面树中提供最广泛的编辑器选择。Outline 的写作体验在三者中最佳,但其文档化的生产环境配置要求使用外部身份提供商来创建初始工作区。

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

结构才是真正的选择

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

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

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

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

运行该脚本前,请先阅读警告。文档声明该脚本“ONLY FOR A FRESH OS,它将安装 Apache、MySQL 8.0 和 PHP 8.3,并可能覆盖计算机上已有的 Web 配置”。24.04 脚本会检查现有的 Apache 配置和 MySQL 数据;如果发现任一项,会在安装前中止。请改用容器,或在 Ubuntu 24.04 上已有的 LAMP 堆栈之上手动安装 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-stopped

APP_URL 必须与读者实际输入的地址匹配,包括协议和任何端口。如果将其设置为 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 时,需要检查应用错误日志进行诊断。默认情况下,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,因为跨越主版本会在运行中的实例中修改数据库架构。

应运行版本 2 系列。截至 2026 年 10 月 27 日,最新的版本 2 发布版本是 2.5.317。这是 2026 年 10 月 23 日发布的 bug 修复版本,使用最新的 Node 安全更新重新构建了镜像。版本 2 的发布版本现在来自独立的 requarks/wiki-v2 仓库,:2 镜像标签仍跟踪这些版本。版本 3 处于公开 beta 阶段。其安装文档说明,镜像使用 3.0.0-beta 标签;在 beta 阶段结束前,普通的 3 和 3.0 标签无法使用。应将其视为预览版本,而不是生产目标。此前的 2.5.316 版本于 2026 年 10 月 2 日发布,新增了导出工具,可用于以后将内容迁移到版本 3。

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

编辑器选择是用户选择 Wiki.js 的主要原因。一台实例可以并列存放 Markdown 页面、可视化编辑器页面、原始 HTML 页面和 AsciiDoc 页面。导入不希望转换格式的旧内容时,这一点很有帮助。但这样也可能让一个 wiki 同时出现四种内部写作规范。因此,应在第一天确定默认编辑器,并记录这一决定。

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

人们说想要一种类似商业笔记工具的体验时,通常指的就是 Outline。它是一个 Node.js 应用。截至 2026 年 10 月 27 日,当前版本为 1.12.0,于 2026 年 10 月 23 日发布。该版本将 Docker 镜像迁移到一个修复了近期披露的多个 Node 漏洞的 Node 版本,因此应将旧安装升级到最新版本。它的示例环境文件列出了所需组件:通过 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 的存储桶中,请将 FILE_STORAGE=s3 设置为 s3,并同时提供 AWS_* 中的值。

接下来是容易令人意外的部分。Outline 没有内置的用户名和密码登录功能。它自己的示例配置说明,必须配置第三方登录凭据:“要使安装正常工作,以下选项中至少需要一个,否则将没有登录方式”。文档列出的提供商包括 Google、Slack、Microsoft Entra、Discord,以及通过 OIDC_CLIENT_ID、OIDC_CLIENT_SECRET、OIDC_AUTH_URI、OIDC_TOKEN_URI 和 OIDC_USERINFO_URI 接入的通用 OpenID Connect(OIDC)服务器。现有工作区还可以启用通行密钥和电子邮件链接或验证码;电子邮件登录需要 SMTP,并且不会绕过已关联 SSO 提供商的账户所使用的 SSO。

因此,Outline 文档所述的生产环境的实际成本是 Outline、PostgreSQL、Redis 和身份提供商。如果团队已经使用 Google Workspace 或 Microsoft Entra 登录,Outline 会非常有吸引力。如果没有,那么还需要自行托管类似 Keycloak 或 Authentik 的服务,这就增加了一个需要打补丁和备份的服务。应据此规划内存:Outline 自己的建议是每个 Web 进程大约使用 512 MB,由 WEB_CONCURRENCY 设置;这还不包括数据库和 Redis 的内存。

每种方案如何处理内容访问权限

BookStack 开箱即用地提供本地电子邮件和密码账户,也支持 LDAP、SAML2 和 OIDC 作为替代方案。权限按角色设置,也可以在单个书架、书籍、章节或页面上覆盖。书籍和章节权限会向下继承到子内容,除非被覆盖;书架权限必须显式复制到书籍。

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

Outline 使用您的身份提供商管理 SSO 成员资格,您可以在 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。基本引擎匹配标题、描述和路径,不匹配页面正文。如果使用 PostgreSQL,应在管理区域切换到 PostgreSQL 引擎,因为它使用数据库自身的全文索引,而不是简单匹配。只有当 wiki 的规模足够大,并且你愿意运行和维护第二个搜索服务时,才应使用 Elasticsearch。

Outline 使用 PostgreSQL 全文索引。其内置的关键词搜索不需要单独的搜索服务。对于文档数量处于几千这一较低数量级的团队 wiki,三者中它的维护工作最少。

哪一个适合您

如果您希望今天下午就运行 Wiki,并且更愿意讨论内容而不是结构,请选择 BookStack。它包含的组件最少:一个 PHP 应用和一个 MySQL 数据库。它适合内部运行手册和客户文档,也适合大多数作者不是工程师的团队。三者中它也最容易备份,因为状态由一个数据库转储、上传的文件以及 .env 配置组成,其中包括 APP_KEY。

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

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

如果这三个产品都不适合,通常是因为内容类型不匹配。扫描的发票和合同应放在 Paperless-ngx 等文档管理系统 中,而不是放在 Wiki 中;强行将这类内容放入 Wiki,正是许多 Wiki 最终被弃用的原因。另一种常见的不匹配是您需要工作区而不是 Wiki:在同一画布上使用文档、表格和白板。这种情况下,自托管的 AFFiNE 工作区 比上面的三个产品都更合适。若要了解哪些其他服务值得部署在您自己的服务器上,请参阅 2026 年自托管服务候选清单。

容量规划与备份

这三种方案都能运行在小型 VPS 上,但实际所需的最低配置取决于各自依赖的组件。BookStack 由一个应用进程和 MySQL 组成。Wiki.js 由一个 Node 进程和 PostgreSQL 组成。Outline 由一个 Node 进程、PostgreSQL 和 Redis 组成,通常还需要配合身份提供商,因此应为它分配更多内存。

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

FAQ

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

BookStack。它是一个使用 MySQL 数据库的单体 PHP 应用,项目为 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?

Wiki.js 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,因为主版本变更会修改运行中实例的数据库架构。

哪个的搜索功能最好?

它们各有优势。BookStack 为读者提供查询语言,支持精确短语、[location=london] 等标签过滤器,以及 {created_after:2016-12-30} 等元数据过滤器;这些条件都可以在前面加上 - 进行排除。Outline 的内置关键词搜索不需要单独的搜索服务。Wiki.js 的可调性最高,因为您可以选择搜索引擎;其中 PostgreSQL 引擎可以搜索页面正文,而基础引擎无法搜索页面正文。

以后可以将内容从一个平台迁移到另一个平台吗?

可以部分迁移,但应预期需要手动处理。三者都可以导出 Markdown,但 BookStack 的内置导入功能接受 Portable ZIP 格式,因此仅有 Markdown 不能直接导入 BookStack。内容结构也无法完整保留:BookStack 的书籍和章节在 Outline 的嵌套文档中没有对应结构,Wiki.js 的路径也无法映射到 BookStack 的固定层级。附件、权限和页面历史最容易丢失,因此请先导出样本并检查这些内容,再决定是否迁移。

这篇文章对您有帮助吗?

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