Outline 自托管团队知识库/Wiki 搭建教程(Notion 替代方案)
团队知识管理是每个技术团队的刚需,Notion 固然好用,但数据托管在海外服务器、价格随团队规模线性增长、网络访问有时不稳定,这些痛点让很多团队开始寻找可以私有化部署的替代品。Outline 是目前开源社区中最接近 Notion 体验的知识库工具,支持 Markdown 编写、实时协作、文档嵌套、全文搜索、多种登录方式,界面美观现代。本文讲解如何用 Docker Compose + Caddy 完整部署 Outline。
Outline 核心特性
- Notion 式编辑器:块编辑器,支持标题、列表、代码块、表格、图片、内嵌内容
- 实时协作:多人同时编辑同一文档,变更实时同步
- 文档结构:支持集合(Collection)→ 文档→ 子文档三级嵌套
- 全文搜索:基于 PostgreSQL 全文索引,中英文搜索均支持
- SSO 登录:支持 Google、GitHub、Slack OAuth,以及 SAML/OIDC 企业登录
- API 接口:完整 REST API,可与其他工具集成
- 导出功能:支持导出为 Markdown、PDF,数据随时可迁移
服务器配置
Outline 依赖 PostgreSQL、Redis 和对象存储,整体内存需求适中。推荐使用 2 核 4GB 机型,可以流畅支持 10-50 人团队日常使用,文档量不受限制。
推荐选用雨云服务器 rainyun-com ,注册填优惠码 2026off 领 5 折优惠券,2 核 4GB 机型性价比出色,比 Notion Team 版年费便宜得多,数据还完全掌控在自己手里。系统建议选 Ubuntu 22.04 LTS,磁盘至少 40GB(含文档附件存储)。
准备工作
安装 Docker 和 Docker Compose
bash
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker compose version
域名与防火墙
将域名(如 wiki.example.com)A 记录解析到服务器 IP:
bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
生成必要的密钥
Outline 需要几个随机密钥,提前生成好:
bash
# 生成 SECRET_KEY(64位十六进制)
openssl rand -hex 32
# 生成 UTILS_SECRET
openssl rand -hex 32
将两个输出分别保存,稍后填入配置文件。
docker-compose.yml
创建项目目录:
bash
mkdir -p ~/outline && cd ~/outline
创建 docker-compose.yml:
yaml
version: "3.8"
services:
outline:
image: outlinewiki/outline:latest
container_name: outline_app
env_file: .env
depends_on:
- postgres
- redis
restart: unless-stopped
networks:
- outline-net
volumes:
- ./data:/var/lib/outline/data
postgres:
image: postgres:15-alpine
container_name: outline_postgres
environment:
POSTGRES_USER: outline
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: outline
volumes:
- pgdata:/var/lib/postgresql/data
restart: unless-stopped
networks:
- outline-net
redis:
image: redis:7-alpine
container_name: outline_redis
restart: unless-stopped
networks:
- outline-net
caddy:
image: caddy:alpine
container_name: outline_caddy
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
restart: unless-stopped
networks:
- outline-net
volumes:
pgdata:
caddy_data:
caddy_config:
networks:
outline-net:
driver: bridge
创建环境变量文件 .env:
bash
cat > .env << 'EOF'
# 应用基础配置
SECRET_KEY=替换为openssl生成的第一个密钥
UTILS_SECRET=替换为openssl生成的第二个密钥
URL=https://wiki.example.com
PORT=3000
NODE_ENV=production
# 数据库
DATABASE_URL=postgres://outline:替换为数据库密码@outline_postgres:5432/outline
POSTGRES_PASSWORD=替换为数据库密码
# Redis
REDIS_URL=redis://outline_redis:6379
# 文件存储(本地存储模式)
FILE_STORAGE=local
FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data
FILE_STORAGE_UPLOAD_MAX_SIZE=262144000
# 语言和时区
DEFAULT_LANGUAGE=zh_CN
TZ=Asia/Shanghai
# 邮件(可选,用于邀请成员,暂时留空也能用)
# SMTP_HOST=
# SMTP_PORT=
# SMTP_USERNAME=
# SMTP_PASSWORD=
# SMTP_FROM_EMAIL=
# 登录方式(至少配置一种,这里演示 GitHub OAuth)
# 在 GitHub Settings → Developer settings → OAuth Apps 创建应用
GITHUB_CLIENT_ID=替换为GitHub_OAuth_Client_ID
GITHUB_CLIENT_SECRET=替换为GitHub_OAuth_Client_Secret
# 允许创建账号(生产环境建议改为 false,通过邀请制管理)
TEAM_LOGO=
ENABLE_UPDATES=true
EOF
Caddy 反向代理配置
创建 Caddyfile:
caddyfile
wiki.example.com {
reverse_proxy outline_app:3000
# 支持上传附件
request_body {
max_size 256MB
}
# 开启压缩
encode gzip
# WebSocket 支持(实时协作需要)
@websocket {
header Connection *Upgrade*
header Upgrade websocket
}
handle @websocket {
reverse_proxy outline_app:3000
}
}
启动服务
bash
cd ~/outline
# 创建数据目录
mkdir -p data
# 启动所有服务
docker compose up -d
# 查看启动日志
docker compose logs -f outline
# 执行数据库迁移(首次必须执行)
docker compose exec outline yarn db:migrate
数据库迁移完成后,访问 https://wiki.example.com 即可看到登录界面。
初始化配置
配置 OAuth 登录
Outline 不支持传统用户名/密码注册,必须通过 OAuth 或邮件邀请登录。最简单的方式是配置 GitHub OAuth:
- 进入 GitHub → Settings → Developer settings → OAuth Apps → New OAuth App
- 填写信息:
- Application name:
团队知识库 - Homepage URL:
https://wiki.example.com - Authorization callback URL:
https://wiki.example.com/auth/github.callback
- Application name:
- 创建完成后,将 Client ID 和 Client Secret 填入
.env
如果团队使用 Google Workspace,也可以配置 Google OAuth(需要在 Google Cloud Console 创建应用):
bash
# 在 .env 中添加
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
修改 .env 后重启服务:
bash
docker compose up -d
团队初始化
首次登录后:
- 创建工作区名称(即团队/公司名称)
- 通过「设置」→「成员」→「邀请成员」向同事发送邀请链接
- 在「集合」中创建第一个文档集合(类似 Notion 的空间)
推荐初始文档结构
知识库
├── 工程规范
│ ├── 代码风格指南
│ ├── Git 提交规范
│ └── 代码审查流程
├── 产品文档
│ ├── 需求文档
│ └── 设计规范
├── 运维手册
│ ├── 部署流程
│ └── 故障处理 SOP
└── 会议记录
└── 2026 年
常见问题
Q:登录后提示"工作区不存在"?
首次登录的用户会自动创建工作区。如果出现错误,检查数据库迁移是否完成:
bash
docker compose exec outline yarn db:migrate
Q:图片上传失败?
检查数据目录权限:
bash
# 确保容器内用户有写权限
docker compose exec outline ls -la /var/lib/outline/
# 如权限不足,在宿主机执行
chmod 777 ~/outline/data
Q:如何备份数据?
bash
#!/bin/bash
# 保存为 ~/outline/backup.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=~/outline-backups
mkdir -p "$BACKUP_DIR"
# 备份数据库
docker exec outline_postgres pg_dump -U outline outline | \
gzip > "$BACKUP_DIR/db-$DATE.sql.gz"
# 备份附件文件
tar -czf "$BACKUP_DIR/files-$DATE.tar.gz" ~/outline/data
# 保留最近 30 天
find "$BACKUP_DIR" -mtime +30 -delete
echo "备份完成: $DATE"
bash
chmod +x ~/outline/backup.sh
# 每天凌晨 3 点自动备份
(crontab -l 2>/dev/null; echo "0 3 * * * ~/outline/backup.sh") | crontab -
Q:如何升级 Outline?
bash
cd ~/outline
docker compose pull
docker compose up -d
# 新版本可能需要数据库迁移
docker compose exec outline yarn db:migrate
Q:实时协作不生效?
确认 Caddy 配置中包含了 WebSocket 代理规则(上方 Caddyfile 已包含),且防火墙允许 443 端口的 WebSocket 连接。
Outline 是 Notion 最强力的开源替代品,美观的块编辑器、实时协作、强大的全文搜索、灵活的权限控制,功能丝毫不逊于付费产品,而且数据完全自托管,不必担心数据主权和价格上涨问题。