作为一个在团队协作工具里摸爬滚打多年的老运维,我对 Notion 的感情很复杂:功能确实好用,but 那个订阅价格,尤其是团队规模上来之后,每年算总账的时候真的肉疼。后来我盯上了开源知识库这条路线,尤其是那个在 GitHub 上挂着 40K Star 的项目,前前后后折腾了小一个月,总算把团队 wiki 从 Notion 完整搬迁到了自建服务上,成本几乎是零,而且数据彻底握在自己手里。
这篇文章就把我从选型到落地的完整过程掰开揉碎讲清楚,包括为什么放弃 Notion、开源方案怎么对比、部署时踩过的那些坑、以及团队 wiki 到底怎么搭才不至于变成摆设。如果你也在为团队知识管理工具头疼,或者正被 SaaS 订阅费用困扰,这篇文章应该能帮你省下不少时间和预算。
1. 为什么我觉得 Notion 的订阅越来越“肉疼”
先说清楚问题,不然很多人不理解为什么要折腾自建。Notion 的免费版对于个人轻度使用确实够用,可一旦团队用起来,尤其是超过十个成员、需要权限管理、历史版本、文件上传这些基础功能时,免费额度立刻见底,升级到商业版是按人头收费的。十个人还好,几十个人甚至上百人的团队,这笔账算下来一年就是大几万。而且这钱是持续支出的,不是一次性买断。
另一个让我不爽的点是数据主权。Notion 的数据存在别人家的服务器上,哪天服务出问题、政策变动、或者你被误封了账号,找回数据的绝望感只有经历过的才懂。我见过不止一个团队因为平台方账号异常,导致几年积累的文档资料一夜之间打不开,那真是叫天天不应。自建知识库就没有这个问题,数据就在你自己的服务器或者公司内网里,备份策略自己定,谁也动不了你的东西。
再加上国内访问 Notion 的网络环境,虽然能用,但时不时的卡顿和加载延迟,对日常高频使用的 wiki 来说体验并不好。团队协作工具最重要的是“顺手”,每次打开都要等几秒,大家的怨气会直接写在脸上。综合这些因素,我决定认真研究开源自建方案。
1.1 Notion 的定价逻辑与团队成本账
我来帮你算一笔更具体的账。Notion 的商业版 Plan 按年付每人每月大概 8 到 10 美元,按当前汇率折算,每人每年大约 700 到 900 元人民币。一个 50 人的团队,一年光订阅费就在 35000 到 45000 元之间。这还没算如果用到更高阶的 AI 功能、更长的历史版本保留,价格还得往上走。
这笔钱如果是投入在服务器上,能买一台相当不错的物理机或者云主机,甚至够跑一年多的托管服务。也就是说,自建方案节省的不是小钱,而是把一笔持续的运营成本,变成了一次性的技术投入。当然,自建不是完全没有成本,你需要花时间部署、维护、备份,但这些工作熟练之后其实很轻量,只靠一个懂点 Docker 的人就能顺带管起来。
1.2 开源自建到底划不划算
肯定会有人说,开源自建要有技术门槛,出问题了没人给你售后。这个说法对了一半。确实需要有个人懂点服务器和 Docker,但只要部署完、配置好,日常维护的负担真的不大。而且社区的力量你想象不到,40K Star 级别的项目,文档齐全、Issue 反馈快、插件生态也丰富,遇到问题搜一搜基本都有答案。
更重要的是,自建知识库的长期收益非常明显。数据资产在积累,工具本身却不用再付费,团队扩容也只是加个账号的事,成本不会跟着人员规模线性增长。这种“一次投入、长期复用”的模式,对预算敏感的中小团队来说,吸引力是巨大的。下面我展开讲讲具体怎么选型。
2. 40K Star 的开源知识库,市面上的主流选择怎么挑
既然决定自建,第一步就是选型。市面上号称“Notion 替代品”的开源项目不少,但能兼顾界面颜值、操作体验、协作功能和社区活跃度的,其实没几个。我当时重点考察了三款:AppFlowy、Outline 以及 AFFiNE,最后锁定了标题里提到的这个 40K Star 的项目。这里我把它们放在一起做个横向对比,方便你判断哪个更适合自己的团队。
先说结论:如果你希望团队尽量无缝过渡,选那个操作逻辑最接近 Notion 的;如果你更看重界面简洁和文档发布,那另一个可能更好。没有绝对的好坏,只有合不合适。
2.1 核心选手:最接近 Notion 操作习惯的平替
这个 40K Star 的项目,最大的亮点就是“用起来像 Notion”。它一开始就是冲着“Notion 的开源替代”这个定位去的,所以页面布局、块编辑器、数据库视图这些核心交互,Notion 老用户上手几乎零成本。团队成员从 Notion 切过来,基本不用重新培训,这一条就省了巨大的落地成本。
从技术架构上看,它采用 Rust 写的后端核心,前端用 Flutter,保证了跨平台的一致性体验,同时性能表现相当出色。数据模型基于本地文件优先,意味着即使服务器暂时离线,本地内容也不会丢,重连后自动同步。这一点在团队协作里至关重要,谁都不想写了半天的文档因为断网直接蒸发。
项目本身还内置了数据库、看板、日历等 Notion 标志性功能,对于需要做项目管理、内容库、知识沉淀的团队来说,开箱即用。虽然某些高级插件和第三方便捷度还不如 Notion 丰富,但核心场景覆盖完全足够,而且它的开发迭代非常活跃,每两周左右就有新版本发布,功能补齐的速度肉眼可见。
2.2 备选方案:Outline 与 AFFiNE 的横向对比
再来看另外两个热门选手。Outline 是另一个很优秀的开源 wiki 解决方案,它最大的特点是“文档即网站”,排版美观、阅读体验极佳,很适合对外发布产品文档或团队公开知识库。它基于 React 和 Node.js 开发,支持 Markdown,还集成了不少第三方登录方式。但它的操作逻辑和 Notion 差异比较大,没有块编辑器和数据库视图,更像一个“增强版的信息架构型 wiki”,从 Notion 迁过去团队成员可能需要一段时间适应。
AFFiNE 则是把白板和文档结合起来,主打“双模式切换”,既可以当文档工具,也可以当白板工具。这个项目的理念很新颖,视觉设计也很在线,但在稳定性和插件生态上相对弱一些,更适合设计师、创意团队等重视觉、轻流程的群体。如果你要的是“什么都能往里丢”的团队知识库,AFFiNE 的文档管理能力跟成熟方案比还是有差距的。
2.3 我的选型结论与原因
最终我选定了那个 40K Star 的项目,核心原因就三个:第一,迁移成本最低,团队不需要改变使用习惯;第二,功能覆盖最全面,数据库视图、看板、日历这些团队里高频依赖的功能原生支持;第三,社区活跃度最高,Star 数和贡献者数量就是最好的背书,出了问题能在社区快速找到答案。
选型这件事,我要提醒一句:不要盲目追求技术最热门或者功能最丰富,而要看“团队当前和未来半年内最需要什么”。如果团队主要用 Notion 管理项目进度、沉淀文档,那 AppFlowy 类交互是优选;如果团队需要大量对外输出文档,Outline 可能是更好的选择。认清自己的核心需求,比挑选工具的炫酷功能重要得多。
3. 从零部署:用 Docker 把团队 wiki 跑起来,实测全流程
选型确定之后就是动手实践了。我用 Docker 部署,全程大概四十分钟,包括下载镜像、启动服务、初始化配置。我的环境是一台 4 核 8G 的云服务器,操作系统是 Ubuntu 22.04,日常跑着十几个容器,资源占用情况还算余裕。这个部署步骤是我实测踩过坑之后整理出来的,照着做基本能一次成功。
先说部署思路。用 Docker 的好处是环境隔离、升级方便、迁移简单。不管你的服务器是 Linux、Windows 还是 macOS,只要装了 Docker,跑起来的效果都是一样的。团队人员规模不大时,单机部署完全够用,没必要一上来就搞 K8s 集群,那是给自己找麻烦。
3.1 部署前置准备与配置清单
开始之前,先确认几项前提条件:
- 一台可以长期运行的服务器或旧电脑,内存建议不少于 4G,磁盘根据团队使用量选择,最少给 50G
- 安装好 Docker 和 Docker Compose 插件,版本不要太老,我用的是 Docker 24 以上
- 一个域名,配上 SSL 证书。这一步不是必须的,但对外访问时强烈建议配,不然浏览器会一直提示不安全,团队成员信任感会大打折扣
- 如果团队完全在内网使用,可以跳过域名和证书,直接 IP 访问也完全可以
服务器配置方面,我的建议是宁可 CPU 稍弱一些,磁盘 IO 一定要够好。知识库系统大量的小文件读写,机械硬盘会拖慢整体响应速度,SSD 是底线。内存方面 8G 比较从容,4G 也跑得起来,但开多个服务时要注意别超载。
3.2 用 Docker Compose 一键起服务的实操步骤
下面把我用的 Docker Compose 配置给你参考。这个配置里我把数据库和主服务拆分开了,方便单独备份和排查问题。以我选用方案为例,它的官方仓库里带了一个现成的 docker-compose.yml,但你最好自己定制一下,特别是数据目录和端口映射。
version: "3.9" services: appflowy_cloud: image: appflowyinc/appflowy_cloud:latest container_name: appflowy_cloud restart: always depends_on: - postgres - redis environment: - DATABASE_URL=postgres://appflowy:appflowy@postgres:5432/appflowy - REDIS_URL=redis://redis:6379 - APPFLOWY_S3_ENABLED=false ports: - "8000:8000" volumes: - ./data:/appflowy_data networks: - appflowy_net postgres: image: postgres:15 container_name: appflowy_postgres restart: always environment: - POSTGRES_USER=appflowy - POSTGRES_PASSWORD=appflowy - POSTGRES_DB=appflowy volumes: - ./postgres_data:/var/lib/postgresql/data networks: - appflowy_net redis: image: redis:7-alpine container_name: appflowy_redis restart: always volumes: - ./redis_data:/data networks: - appflowy_net networks: appflowy_net: driver: bridge拿到配置文件后,按以下步骤操作:
- 在服务器上建一个工作目录,比如
/opt/appflowy,把上面的 docker-compose.yml 放进去 - 执行
docker compose up -d拉取镜像并启动服务 - 等待一两分钟,执行
docker compose ps查看三个容器是否都处于 running 状态 - 浏览器访问
http://服务器IP:8000,看到注册页面就说明服务已经起来了
要注意新版项目的环境变量可能会有调整,如果启动报错,去官方文档对照一下最新的参数说明就行。初次启动后第一件事是注册管理员账号,建议用公司邮箱,方便后续统一管理。
3.3 数据持久化与备份策略,别等数据丢了才后悔
部署成功只是第一步,数据安全才是自建系统的生命线。我的建议是把备份策略写入日常运维清单,而不是想起来才手动备份一次。这个开源项目的数据主要存在 PostgreSQL 数据库里,附件存在文件系统里,所以备份要两头都兼顾。
最简单可靠的备份方式是用计划任务定时执行数据库导出,再把整个数据目录同步到异地存储。下面这个脚本是我在用的,每天凌晨两点跑一次,保留最近 30 天的备份:
#!/bin/bash BACKUP_DIR="/backup/appflowy" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR docker exec appflowy_postgres pg_dump -U appflowy appflowy | gzip > $BACKUP_DIR/db_$DATE.sql.gz # 清理 30 天前的旧备份 find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete echo "Backup completed at $DATE"数据库备份是最核心的部分,文档的标题、正文、权限关系、历史版本全在里面。附件文件可以同步用 rsync 或 rclone 推到其他存储桶,即使服务器硬盘挂了也能快速恢复。我个人还习惯每周手动检查一次备份文件能否正常解压和导入,不然真到灾难恢复时才发现备份是坏的,那才叫欲哭无泪。
另外强烈建议把备份文件放到与服务器不同的位置,如果服务器在同一机房损坏或遭遇勒索加密,本地备份也会一起遭殃。有条件就用对象存储存一份,没条件至少把备份定时同步到另一台机器上。
4. 团队 wiki 的落地配置:权限、模板与协作规范
系统跑起来之后,真正的挑战才刚开始:怎么让团队把知识库真正用起来,而不是部署完就吃灰。这一章我主要讲落地层面的配置和规则设计,包括目录结构、权限体系、文档模板以及从 Notion 迁移过来的实操方案。
很多人建知识库失败,不是因为工具不好用,而是从一开始就乱。文档散落各地、目录层级混乱、没有统一的命名和模板规范,时间一长就变成了数字垃圾场。所以在上线之前,必须先想清楚团队的信息要如何组织。
4.1 项目空间规划:目录结构与文档模板设计
我在规划空间结构时,按照“部门 + 项目 + 类型”三层模型来设计。第一层是大的分类,比如产品研发部、市场运营部、综合管理部;第二层是具体项目或者小组,比如官网改版项目、季度增长计划;第三层是文档类型,比如会议纪要、需求文档、复盘报告、FAQ 等。这样做的好处是任何人想找一份资料,都能顺着层级快速定位,而不是靠搜索碰运气。
为了强制统一规范,我预先搭建了几套标准文档模板,比如“项目启动模板”包含背景说明、目标、里程碑、负责人、风险点;“会议纪要模板”包含参会人、议题、结论、待办事项、下次会议时间。团队新建文档时直接套模板,既减少了从空白页开始的心理压力,又保证了文档信息完整统一。
命名规范也很有必要。我建议统一使用“日期 + 项目名 + 文档类型 + 简述”的格式,比如“20250115-官网改版-需求文档-首页交互方案”。这样在列表视图里按名称排序,时间线一目了然,比随手起个“新建文档 1”要靠谱得多。规范不需要太多条,三条以内,不然大家根本记不住。
4.2 权限体系配置:谁能看、谁能改、谁能管
知识库的权限配置直接关系到信息安全和工作效率。我把团队分成三个角色维度:普通成员、编辑者、管理员。普通成员可以查看和评论,适合需要了解项目但不直接参与协作的同事;编辑者可以创建和修改文档,是日常主力;管理员掌握空间配置、成员管理和删除操作权限,通常是团队负责人或运维同学。
具体到每一篇文档,建议遵循“默认允许、按需限制”的原则,开放共享为主,遇到机密内容再单独设置访问范围。如果一个团队里所有文档都默认私密,协作效率和知识流动就会大打折扣;反过来如果什么都没有限制,内部敏感信息又容易泄露。这里面的平衡需要管理员根据团队文化慢慢摸索。
我特别提醒一点,知识库的“删除”操作一定要设置二次确认或回收站机制。这个开源项目对删除行为本身就比较谨慎,但我还是建议在团队规则里约定:任何删除前先放到“待归档”目录观察一个月,确认确实不需要再彻底清理。因为文档这种东西,很多时候删除的时候觉得用不上,三个月后翻需求又哭着找回来。
4.3 从 Notion 迁移内容的实操方案与踩坑记录
迁移是整个切换过程中最让人头疼的环节,内容多、关系杂、附件散落,稍不小心就丢东西。我的做法是分三步走:先导出、再清理、最后分批导入。
先在 Notion 后台把需要的页面导出为 Markdown 或 CSV 格式。注意 Notion 的导出会把 Markdown 文件和附件分开打包,解压后要检查一下附件目录是否完整。然后用脚本把导出的 Markdown 批量处理成目标平台支持的格式,其实大部分 Markdown 是通用的,但 Notion 特有的块类型(比如数据库视图、同步块)无法导出为通用格式,这些部分建议在导入后手动重建。
导入过程我强烈不建议一次性全量导入,除非你的团队内容很少。正确姿势是先选一两个核心项目作为“试点”,导入并检查格式无误后,再逐步迁移其他项目。这样既能验证流程可行性,又能避免大批量导入出错后排查困难。我们当时花了整整两天时间分批迁移,过程中发现了不少格式错乱和附件路径问题,都在试点阶段就解决了。
迁移完成之后,记得在 Notion 里把旧文档处理一下,该归档的归档,该删除的删除。我建议保留一个月观察期,确认新系统中所有内容都找得到、打的开,再彻底跟 Notion 说拜拜。
5. 常见问题与排查技巧实录,以及我踩过的那些坑
自建系统的维护过程中,最让人头疼的其实不是功能缺失,而是各种奇奇怪怪的环境问题。这一章我把实际运维过程中遇到的高频问题整理成一份速查表,包括部署类、使用类、数据类和性能类,每个问题都附上排查思路和解决建议,方便你遇到类似情况时快速对照。
这里想先强调一个心态:遇到问题别慌。大部分故障都是有规律可循的,按日志、依赖、网络、数据四个维度逐步排查,95% 的问题都能解决。剩下 5% 解决不了的,大概率是版本兼容问题,去 GitHub Issue 或社区里提问,记得贴上日志。
5.1 部署类问题:容器起不来、端口冲突、环境变量不对
容器启动失败最常见的三个原因:镜像与系统架构不兼容、环境变量缺项、端口被占用。
最开始我部署时遇到的就是端口冲突,服务器上已经有一个服务占用了 8000 端口,容器一直提示port is already allocated。解决办法很简单,改一下映射端口,对外用 8080 之类没被占用的端口就行。
如果容器启动后立刻退出,先执行docker compose logs appflowy_cloud查看日志,根据报错信息定位问题。数据库连接失败多半是 DATABASE_URL 里的密码和 postgres 环境变量不一致,检查这两处是否匹配。Redis 连接失败则要确认 REDIS_URL 的地址和端口写对了。
另外提醒一句,升级版本时不要直接拉 latest 标签,一定要看官方仓库的 Release Notes,确认升级路径和数据迁移要求。有些大版本升级需要额外执行数据迁移命令,跳过这步会导致启动后功能异常。我一开始升级时图省事,直接拉最新镜像,结果数据库结构和旧版本不匹配,白折腾了几个小时。
5.2 使用与协作类问题:同步冲突、多人编辑、客户端连接不上
自建知识库在多人协同编辑时偶尔会出现文档同步冲突,尤其是两个成员同时修改同一段文字。这个项目对于简单情况能自动合并,复杂冲突时会在界面上提示手动解决。我的建议是,除了文档夹里“谁正在编辑”的头像提醒之外,团队规则里要约定某些核心文档(比如季度计划、OKR)不要多人同时编辑,一个负责人为主,其他人在旁边提评论意见就好。
客户端连接不上是另一个高频问题。团队成员使用的桌面端或移动端,首次连接需要填服务器地址。如果服务器是 HTTP 协议且没有配置 SSL,一些新版客户端会强制拦截不安全连接,导致无法登录。这种情况要么配好域名和证书,要么在客户端设置里允许不安全的本地连接。我建议直接配 HTTPS,一劳永逸。
如果团队分布在不同的网络环境,有的在外网、有的在内网,最好配置好反代和正确的访问地址。不要出现“我在公司能用,回家就连接超时”的状况。最简单的方式是固定一个公网域名,内网 DNS 解析到内网 IP,外网解析到公网 IP,这样对团队成员来说,地址始终只有一个。
5.3 几个独家避坑技巧
这里分享几个常规文档里不会写、但我实际用过觉得非常值得实践的技巧。
第一个是定期做“灾后演练”。不要只看备份文件存在,要找一天真正把备份恢复到一台临时服务器上,确认团队成员能正常访问和操作数据。我每季度做一次这样的演练,虽然麻烦,但换来的是对数据安全百分之百的底气和信心。实测中间就发现过一次因为版本升级导致旧备份无法恢复的情况,好在发现得早,及时调整了备份策略。
第二个是善用搜索功能。很多人把知识库当“存放”工具而不是“检索”工具,但一个团队 wiki 真正的价值在于“用的时候能找到”。建议管理员定期清理无标题文档、规范标签和关键词,让搜索入口成为团队获取信息的主要方式,而不是靠人肉问“那个文档谁写的”。我平时会抽查式地搜索几个高频关键词,如果首页结果跟预期不符,就去优化文档标题和摘要。
第三个是关注社区动态,但不盲从升级。开源项目的 Issue 和 Discussion 区是宝库,很多疑难杂症早就有人踩过坑并给出解决方案。但每次版本升级前,我会先看 Release Notes、已知问题清单和用户反馈,确认没有影响核心场景的严重 bug 再决定是否升级。那些“看起来不错”的新功能,先让子弹飞一会儿,稳定大于一切。
写在最后的几点体会
整个从 Notion 迁移到开源自建知识库的过程,带给我的收获不只是省下了订阅费那么简单。更重要的是,我亲眼看到了团队信息流转效率的提升——文档存储在自家服务器上,加载速度快了,权限可控了,知识沉淀的意愿也明显增强了。以前在 Notion 里那些“懒得写”的文档,现在因为顺手、没有访问焦虑,大家的积极性反而高了。
如果你也在考虑切换,我的建议是:先别急着动手大迁移,花一周时间把团队需求调研清楚,选定一两个核心场景做试点,验证流程和体验后再扩大范围。别把“自建”想得太难,也不要低估规范的重要性,工具只是载体,真正决定知识库能不能发挥价值的,是团队是否愿意持续往里沉淀内容。
最后分享一个小技巧:给知识库设定一个“每周五下午文档维护时间”,每次花十五分钟归档过期内容、补充缺失资料、清理无效文档。这个习惯让我们的 wiki 始终保持着干干净净的结构,也让团队养成了主动维护的意识。开源工具的坑确实有,但当你真正把数据握在自己手里、把规则建起来之后,那种踏实感和自由度,是任何付费 SaaS 都给不了的。