【自建 Wiki 02】VPS 自建团队知识库 / WIKI(Wiki.js / Outline / BookStack)(2026)

不想把团队文档锁在 SaaS 里?对比 Wiki.js、Outline、BookStack 三大开源知识库,讲清 VPS 上 Docker + PostgreSQL 部署、协作、权限、搜索与备份迁移,并与 Notion 做对照。

团队文档放哪最踏实?这是这两年我反复被问到的问题。Notion 好用,语雀顺手,Confluence 功能全,但把公司最核心的"知识资产"交给别人保管,总有些不踏实——哪天涨价、哪天改条款、哪天账号被封,主动权都不在自己手里。这篇就聊聊怎么用一台便宜 VPS,把团队 Wiki 建回自己地盘,重点对比三大开源方案:Wiki.js、Outline 和 BookStack。

延伸阅读

更多相关攻略推荐:Ollama AI系列(2):VPS上的AI推理与API应用Ollama AI系列(2):VPS上的AI推理与API应用【CPU选型 01】搭载 AMD Ryzen 9950X 的 VPSARM / Ampere 席卷 VPS:性价比真香还是兼容陷阱?Ollama AI系列(2):VPS上的AI推理与API应用

一、为什么自建,而不是用 Notion / 语雀

先说清楚,我不是劝你把所有东西都搬走。但下面三件事,是 SaaS 知识库天然给不了的:

  • 数据主权:Notion 的数据存在美国服务器,受美国《云法案》(CLOUD Act) 管辖;语雀等国内 SaaS 的密钥也由厂商掌握。自建则数据放在你自己的 VPS、你自己选的区域(比如放欧洲以满足 GDPR),谁也动不了。
  • 成本可控:Notion 按人头收费——Plus 每人每月 10 美元(年付 8 美元),Business 每人每月 15 美元(年付 20 美元),企业版单独报价。一个 50 人的团队,Plus 一年约 6000 美元,Business 约 9000 美元。而自建一台 VPS 年付往往只要几十到一百多美元,用户数量不限
  • 可定制、不锁定:开源方案能改、能接 Git、能换搜索后端、能挂自己的身份系统;导出也自由,不被绑定。

当然,反过来说也成立:自建得自己备份、自己更新、自己排障,没有 24 小时客服。我的建议是——把"重要但不致命"的团队知识搬回来(流程手册、技术文档、内部规范),把真正离了就活不了的(主邮箱、核心身份)留在靠谱大厂。这样既有掌控感,又不会半夜被自己的服务器搞崩溃。

二、三位选手速写:定位各不相同

这三者我都实际跑过,定位差异比想象中大:

  • Wiki.js:基于 Node.js,采用 AGPL 协议,最"工程范"。它最出圈的能力是能把页面内容双向同步到 Git 仓库——等于天然带版本控制和异地备份。支持多种数据库后端(PostgreSQL / MySQL / MariaDB / SQLite / MSSQL),多种编辑器(Markdown、CKEditor 富文本、代码编辑器、原生 HTML),认证方式极丰富(LDAP、SAML、OIDC、Google、本地账号),搜索后端还能换成 Elasticsearch 或 Algolia。适合工程团队、技术文档和 DevOps 流程。
  • Outline:同样基于 Node.js(配 React + ProseMirror 编辑器),采用 BSL 许可(自托管完全免费)。它的编辑器最接近 Notion——块式结构、斜杠命令、所见即所得,并基于 Yjs CRDT 实现真正的实时协作(多人同写一份文档、能看到彼此光标)。但代价是部署需要"三件套":PostgreSQL + Redis + S3 兼容对象存储(如 MinIO),而且没有内置账号系统,必须接 OIDC / Google / Slack / SAML 之一。GitHub 上拥有数万 star,是开源知识库里最活跃的项目之一。
  • BookStack:基于 PHP / Laravel + MySQL / MariaDB,采用最宽松的 MIT 许可,主打"开箱即用的简单"。内容用"书架 → 书 → 章 → 页"的层级组织,自带邮箱密码登录,两个容器就能跑起来(默认管理员 admin@admin.com),约 300MB 内存即可稳定运行。对非技术同事最友好,适合中小团队的流程手册、操作规范。

三、怎么选:一张对照表

不想看长文,先记住这条经验法则:要最简单选 BookStack,要最好看的实时协作选 Outline,要 Git 同步和工程化选 Wiki.js。下面把几个关键维度摊开:

  • 技术栈:Wiki.js 与 Outline 都是 Node.js;BookStack 是 PHP/Laravel。
  • 默认数据库:Wiki.js 可选 Postgres/MySQL/SQLite 等;Outline 必须 PostgreSQL;BookStack 必须 MySQL/MariaDB。
  • 部署复杂度:BookStack 最低(2 个容器);Wiki.js 低(2 个容器);Outline 中等(Postgres + Redis + 对象存储 + 身份提供方,4 类依赖)。
  • 实时协作:Outline 原生最强(光标可见);Wiki.js 原生偏弱(靠页面锁 + 版本对比,实时协作需插件或第三方);BookStack 支持并发编辑但无实时光标。
  • 内置登录:BookStack 与 Wiki.js 都自带邮箱密码;Outline 必须接外部身份源。
  • 许可证:BookStack 是 MIT(最自由);Wiki.js 是 AGPL;Outline 是 BSL(自托管免费,但有限制性条款)。
  • 内存占用(全栈):BookStack 约 300MB;Wiki.js 约 400MB 起;Outline 约 500MB–1GB(要养三个服务)。

四、动手前准备:VPS、Docker 与 HTTPS

无论选哪个,地基都一样:

  • 机器配置:BookStack 1GB 内存就能跑舒服;Outline 建议 1–2GB(三服务叠加);Wiki.js 1–2GB 起步。50 人以上的团队再往上加。一台年付几十美元的便宜 VPS(如 RackNerdCloudCone 这类)就够小团队起步。
  • 装好 Docker 与 Docker Compose:这是三个方案统一的部署方式。
  • 域名 + 反向代理 + 免费证书:强烈建议套一层 Caddy 或 Nginx 做反代,并用 Let's Encrypt(Caddy 能自动申请)把服务暴露在 HTTPS 下。Wiki.js 和 BookStack 的网页端、Outline 的 OAuth 回调都要求 HTTPS 安全上下文。
  • 安全基线:防火墙只放行 80/443/22;数据库端口不要暴露在公网;所有密码用强随机串。

五、Wiki.js 部署实战(多后端 + Git 同步)

Wiki.js 官方提供预构建镜像,最省事的是用 Docker Compose 把应用和 PostgreSQL 一起拉起来。下面是一份可直接用的关键配置:

services:
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: wiki
      POSTGRES_USER: wikijs
      POSTGRES_PASSWORD: yourstrongpassword
    volumes:
      - db-data:/var/lib/postgresql/data
    restart: unless-stopped
  wiki:
    image: ghcr.io/requarks/wiki:2
    depends_on:
      - db
    environment:
      DB_TYPE: postgres
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: wikijs
      DB_PASS: yourstrongpassword
      DB_NAME: wiki
    ports:
      - "80:3000"
    restart: unless-stopped
volumes:
  db-data:

把上面的内容存成 docker-compose.yml,在同目录执行 docker compose up -d,等一两分钟,浏览器打开你的域名就能看到初始化向导:填管理员邮箱密码、选语言(含简体中文)、挑默认编辑器。注意 Wiki.js 不自带数据库引擎,所以必须有一个独立的 Postgres 容器。

Wiki.js 真正值钱的功能在后台的模块(Modules)

  • Git 同步:在存储模块里填入你的 Git 仓库地址,页面的每次保存都会双向同步到仓库——相当于自动版本控制 + 异地备份,将来换服务器或换工具,内容一把 clone 就走,迁移成本极低。
  • 编辑器:可为不同同事指定不同编辑器(技术写 Markdown,非技术用 CKEditor 富文本),共存不冲突。
  • 搜索后端:默认用数据库全文搜索即可;内容量大、要中文分词或更精准排序时,可切到 Elasticsearch。

六、Outline 部署实战(三件套 + 实时协作)

Outline 的"现代简洁"是用基础设施复杂度换来的。它必须同时有 PostgreSQL、Redis 和对象存储。下面是一份最小可用的 Compose:

services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: outline
      POSTGRES_PASSWORD: yourdbpassword
      POSTGRES_DB: outline
    volumes:
      - pg-data:/var/lib/postgresql/data
    restart: unless-stopped
  redis:
    image: redis:7-alpine
    restart: unless-stopped
  minio:
    image: minio/minio
    command: server /data
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    volumes:
      - minio-data:/data
    restart: unless-stopped
  outline:
    image: docker.getoutline.com/outlinewiki/outline:latest
    depends_on:
      - postgres
      - redis
      - minio
    environment:
      SECRET_KEY: 用openssl生成的64位十六进制串
      UTILS_SECRET: 用openssl生成的64位十六进制串
      DATABASE_URL: postgres://outline:yourdbpassword@postgres:5432/outline
      REDIS_URL: redis://redis:6379
      URL: https://wiki.yourdomain.com
      AWS_S3_UPLOAD_BUCKET_URL: http://minio:9000
      AWS_S3_UPLOAD_BUCKET_NAME: outline
      AWS_ACCESS_KEY_ID: minioadmin
      AWS_SECRET_ACCESS_KEY: minioadmin
      FILE_STORAGE: s3
    ports:
      - "3000:3000"
    restart: unless-stopped
volumes:
  pg-data:
  minio-data:

几个容易踩的坑:SECRET_KEY 和 UTILS_SECRET 必须各是 32 字节的十六进制,用 openssl rand -hex 32 各生成一次填进去;启动前要先在 MinIO 里建一个名为 outline 的存储桶;认证必须接外部身份源,比如填一组 OIDC 环境变量(Authelia、Authentik、Keycloak 等)或用 Google / Slack 登录,否则谁也登不进来。Redis 负责实时事件队列,对象存储负责图片和附件,二者缺一不可。

跑通之后,Outline 的体验确实对得起"最接近 Notion"的评价:块式编辑、斜杠命令、输入即出的全文搜索(基于 PostgreSQL 全文检索 + 相关度排序),多人同文档编辑时能看到彼此的光标和实时更新。

七、BookStack 怎么部署(见系列第 1 篇)

BookStack 的逐行部署我放在本系列第 1 篇里完整写了:两容器 Compose、用 docker run --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack appkey 生成 APP_KEY、默认账号 admin@admin.com 改密、以及"书架 → 书 → 章 → 页"的结构搭建,照着复制就能跑起来。本文作为选型篇,重点是把它和 Wiki.js、Outline 放在一起比定位、比部署成本、比适用团队,不重复贴 BookStack 的部署命令。如果你已经决定用 BookStack,直接跳到第 1 篇按步骤操作即可。下面接着说三个方案在"后半程"的通用运维。

八、权限、搜索、备份与迁移(通用运维)

三个方案在"后半程"的关注点一致:

  • 权限与用户管理:三者都支持分组/角色与页面级权限。Wiki.js 用"用户组 + 页面规则"做细粒度控制;Outline 在集合、文档、用户三层设权,角色分管理员/编辑/访客/外部 guest,还能生成带密码的公开分享链接;BookStack 用"实体权限"控制到书架、书、章、页,并支持 LDAP / SAML / OIDC 对接公司账号体系。
  • 全文搜索:Wiki.js 最灵活,小站用数据库全文检索,大站可接 Elasticsearch / Algolia;Outline 的 PostgreSQL 全文检索输入即出、体验最佳;BookStack 内置搜索对绝大多数团队够用,但不如接了 Elasticsearch 的 Wiki.js 精细。
  • 备份策略:Wiki.js 最优雅——靠 Git 同步自动留痕;Outline 和 BookStack 则定期做 pg_dump / mysqldump,再把附件卷(MinIO 桶 / BookStack 的 uploads 目录)打包,用 Rclone 推到异地(Backblaze B2、Cloudflare R2、阿里云 OSS 等)。备份做完一定要试一次恢复,这是自托管最常踩的坑。
  • 迁移成本:从 Notion / 语雀迁出时,Outline 的导入工具对文档结构还原得尚可;Wiki.js 因内容躺在 Git 仓库里,迁移和版本回退最顺;BookStack 导出一个数据库 dump 也很干净。但要清醒:Notion 的数据库视图、看板、关联表这些"花活"在开源 Wiki 里基本没有对应物,迁移时会丢,需要提前和团队对齐预期。

#自建知识库 #Wiki-js #Outline #BookStack #VPS运维 #Notion替代 #Docker部署