用 Docker 搭一套公司内部知识库,部署文件和备份脚本都给你
Docker 企业知识库搭建|附源码
在企业数字化建设过程中,知识库几乎是每个团队都会逐渐需要的一类基础系统。无论是研发团队的技术文档、运维团队的故障处理手册、产品团队的需求说明,还是客服团队的常见问题解答,都需要一个统一、可搜索、可沉淀、可协作的平台来承载。
很多企业一开始会使用 Word、Excel、网盘、微信群收藏、飞书文档或语雀等工具来管理知识。但随着团队规模扩大,文档数量增多,权限控制、全文检索、版本管理、私有化部署、备份迁移等问题就会逐渐暴露出来。
本文将介绍如何使用 Docker 快速搭建一套企业内部知识库系统,并提供完整的部署源码示例。本文方案适合中小团队、研发部门、运维团队、创业公司内部文档平台,也适合作为企业私有化知识管理系统的基础模板。
一、为什么企业需要自建知识库?
企业知识库的核心价值不是“存文档”,而是让组织经验可以被持续复用。
一个成熟的企业知识库通常可以解决以下问题:
-
降低重复沟通成本
新员工入职、项目交接、接口说明、部署流程等内容,如果没有统一沉淀,每次都需要人工重复讲解。 -
提升团队协作效率
产品、研发、测试、运维、客服可以围绕同一份文档进行协作,减少信息断层。 -
形成组织资产
员工离职并不意味着经验流失,关键知识可以保留在系统中。 -
规范研发和运维流程
例如接口文档、上线流程、回滚方案、故障应急预案等,都可以形成标准化模板。 -
支持权限隔离
企业内部不同部门、项目、角色可以访问不同的知识空间。 -
便于私有化部署和数据掌控
对于很多企业而言,研发文档、客户资料、内部流程属于敏感信息,自建系统更容易满足安全合规要求。
二、技术选型说明
本文采用 Docker Compose 方式部署一个企业知识库系统,整体架构如下:
用户浏览器
|
| HTTP / HTTPS
|
Nginx 反向代理
|
| 转发请求
|
知识库应用服务
|
| 数据读写
|
PostgreSQL 数据库
|
| 缓存 / 队列
|
Redis
为了便于演示,本文以开源知识库系统 Wiki.js 为例。Wiki.js 是一个基于 Node.js 的现代化 Wiki 系统,支持 Markdown、权限管理、全文搜索、版本历史、用户管理、主题配置等功能,非常适合企业内部知识库搭建。
当然,你也可以将本文的架构思路迁移到其他知识库系统,例如:
- BookStack
- Outline
- DokuWiki
- Wiki.js
- Halo 文档站
- Confluence 私有替代方案
本文重点不是绑定某一个系统,而是讲清楚企业知识库的 Docker 化部署思路。
三、服务器环境准备
建议服务器配置如下:
| 项目 | 建议配置 |
|---|---|
| CPU | 2 核及以上 |
| 内存 | 4GB 及以上 |
| 磁盘 | 40GB 及以上 |
| 操作系统 | Ubuntu 20.04 / 22.04、Debian、CentOS |
| 部署方式 | Docker + Docker Compose |
| 网络 | 内网访问或绑定企业域名 |
如果只是测试环境,1 核 2GB 也可以运行。但如果企业用户较多,建议至少 2 核 4GB。
四、安装 Docker 与 Docker Compose
如果你的服务器还没有安装 Docker,可以使用以下命令安装。
1. Ubuntu / Debian 安装 Docker
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
查看 Docker 是否安装成功:
docker -v
docker compose version
2. 启动 Docker
sudo systemctl enable docker
sudo systemctl start docker
如果希望当前用户免 sudo 使用 Docker,可以执行:
sudo usermod -aG docker $USER
执行后需要重新登录服务器。
五、项目目录结构
我们先创建一个知识库项目目录:
mkdir -p /opt/company-wiki
cd /opt/company-wiki
推荐目录结构如下:
company-wiki/
├── docker-compose.yml
├── .env
├── nginx/
│ └── default.conf
├── data/
│ ├── postgres/
│ └── redis/
├── backup/
│ └── backup.sh
└── README.md
说明:
| 文件或目录 | 作用 |
|---|---|
| docker-compose.yml | Docker Compose 编排文件 |
| .env | 环境变量配置 |
| nginx/default.conf | Nginx 反向代理配置 |
| data/postgres | PostgreSQL 数据持久化目录 |
| data/redis | Redis 数据持久化目录 |
| backup/backup.sh | 数据库备份脚本 |
| README.md | 项目说明文档 |
六、Docker Compose 源码
下面是完整的 docker-compose.yml 文件。
version: "3.8"
services:
postgres:
image: postgres:15-alpine
container_name: company-wiki-postgres
restart: always
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
TZ: Asia/Shanghai
volumes:
- ./data/postgres:/var/lib/postgresql/data
networks:
- wiki-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: company-wiki-redis
restart: always
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
volumes:
- ./data/redis:/data
networks:
- wiki-net
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 10s
timeout: 5s
retries: 5
wiki:
image: requarks/wiki:2
container_name: company-wiki-app
restart: always
depends_on:
postgres:
condition: service_healthy
environment:
DB_TYPE: postgres
DB_HOST: postgres
DB_PORT: 5432
DB_USER: ${POSTGRES_USER}
DB_PASS: ${POSTGRES_PASSWORD}
DB_NAME: ${POSTGRES_DB}
TZ: Asia/Shanghai
networks:
- wiki-net
expose:
- "3000"
nginx:
image: nginx:1.25-alpine
container_name: company-wiki-nginx
restart: always
depends_on:
- wiki
ports:
- "${HTTP_PORT}:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
networks:
- wiki-net
networks:
wiki-net:
driver: bridge
这个文件中定义了四个服务:
postgres:用于存储知识库数据;redis:用于缓存或扩展场景;wiki:知识库应用服务;nginx:反向代理入口。
需要说明的是,Wiki.js 默认主要依赖数据库即可,Redis 在本文中作为企业化扩展预留组件。如果你当前不需要 Redis,也可以移除相关配置。
七、环境变量配置源码
创建 .env 文件:
vim .env
写入以下内容:
# Web 访问端口
HTTP_PORT=8080
# PostgreSQL 配置
POSTGRES_DB=company_wiki
POSTGRES_USER=wiki_user
POSTGRES_PASSWORD=ChangeMe_Postgres_StrongPassword
# Redis 配置
REDIS_PASSWORD=ChangeMe_Redis_StrongPassword
生产环境中一定要修改默认密码,建议使用包含大小写字母、数字和特殊符号的强密码,例如:
M8#wiki@2025_Postgres!Secure
不要将 .env 文件上传到公开代码仓库。
八、Nginx 反向代理源码
创建 Nginx 配置目录:
mkdir -p nginx
vim nginx/default.conf
写入以下内容:
server {
listen 80;
server_name _;
client_max_body_size 100m;
location / {
proxy_pass http://wiki:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
如果你后续绑定了域名,例如:
wiki.example.com
可以将:
server_name _;
改成:
server_name wiki.example.com;
九、启动知识库服务
在 /opt/company-wiki 目录下执行:
docker compose up -d
查看容器运行状态:
docker compose ps
如果全部正常,会看到类似输出:
NAME IMAGE STATUS
company-wiki-postgres postgres:15-alpine Up
company-wiki-redis redis:7-alpine Up
company-wiki-app requarks/wiki:2 Up
company-wiki-nginx nginx:1.25-alpine Up
查看日志:
docker compose logs -f wiki
然后在浏览器访问:
http://服务器IP:8080
第一次访问时,Wiki.js 会进入初始化页面。你需要配置管理员账号、站点名称、语言等信息。
十、初始化企业知识库
进入系统后,建议先做以下初始化配置。
1. 设置站点语言
在管理后台中,将系统语言设置为中文。如果默认没有中文语言包,可以在后台语言设置中下载并启用。
2. 创建管理员账号
管理员账号建议只用于系统配置,不建议日常编辑文档都使用管理员账号。
推荐角色规划:
| 角色 | 权限说明 |
|---|---|
| 系统管理员 | 系统配置、用户管理、权限配置 |
| 空间管理员 | 管理某个部门或项目空间 |
| 编辑者 | 新建、编辑、发布文档 |
| 阅读者 | 只读访问 |
| 访客 | 可关闭或限制访问 |
3. 规划知识库空间
企业知识库不要一开始就随意创建文档,否则很快会变得混乱。建议按部门或业务域划分:
企业知识库
├── 公司制度
│ ├── 考勤制度
│ ├── 报销流程
│ └── 信息安全规范
├── 研发中心
│ ├── 开发规范
│ ├── 接口文档
│ ├── 数据库设计
│ └── 发布流程
├── 运维中心
│ ├── 服务器清单
│ ├── 监控告警
│ ├── 故障处理手册
│ └── 应急预案
├── 产品中心
│ ├── PRD 模板
│ ├── 需求池
│ └── 版本规划
└── 客服中心
├── 常见问题
├── 客户操作手册
└── 工单处理规范
4. 建立文档模板
统一模板是知识库质量的关键。例如技术方案模板可以设计为:
# 技术方案标题
## 一、背景说明
说明当前问题、业务背景和建设目标。
## 二、目标范围
列出本次方案要解决的问题,以及不包含的内容。
## 三、总体设计
描述系统架构、模块关系、数据流向等。
## 四、详细设计
说明接口、数据库、任务调度、异常处理等细节。
## 五、上线方案
包括发布时间、操作步骤、回滚方案。
## 六、风险评估
列出可能风险和对应解决措施。
## 七、相关链接
补充需求文档、接口文档、代码仓库等地址。
十一、配置 HTTPS 访问
生产环境建议开启 HTTPS。可以使用 Nginx + Let’s Encrypt,也可以在公司网关或负载均衡层统一配置证书。
如果你希望在当前服务器上直接配置 HTTPS,可以使用 certbot 获取证书:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d wiki.example.com
如果你仍然希望全部通过 Docker 管理,也可以增加一个证书目录并修改 Nginx 配置。
HTTPS 版 Nginx 示例:
server {
listen 80;
server_name wiki.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name wiki.example.com;
ssl_certificate /etc/nginx/certs/wiki.example.com.pem;
ssl_certificate_key /etc/nginx/certs/wiki.example.com.key;
client_max_body_size 100m;
location / {
proxy_pass http://wiki:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
对应 docker-compose.yml 中 Nginx 增加证书挂载:
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./nginx/certs:/etc/nginx/certs
ports:
- "80:80"
- "443:443"
十二、数据库备份脚本源码
企业知识库最重要的是数据,必须配置备份。下面提供一个 PostgreSQL 数据库备份脚本。
创建文件:
mkdir -p backup
vim backup/backup.sh
写入:
#!/bin/bash
set -e
PROJECT_DIR="/opt/company-wiki"
BACKUP_DIR="${PROJECT_DIR}/backup/files"
DATE=$(date +"%Y%m%d_%H%M%S")
DB_CONTAINER="company-wiki-postgres"
DB_NAME="company_wiki"
DB_USER="wiki_user"
mkdir -p "${BACKUP_DIR}"
echo "开始备份数据库:${DB_NAME}"
docker exec "${DB_CONTAINER}" pg_dump -U "${DB_USER}" "${DB_NAME}" > "${BACKUP_DIR}/wiki_${DATE}.sql"
echo "数据库备份完成:${BACKUP_DIR}/wiki_${DATE}.sql"
echo "开始压缩备份文件"
gzip "${BACKUP_DIR}/wiki_${DATE}.sql"
echo "清理 30 天前的备份文件"
find "${BACKUP_DIR}" -name "*.gz" -type f -mtime +30 -delete
echo "备份任务执行完成"
赋予执行权限:
chmod +x backup/backup.sh
手动执行一次测试:
./backup/backup.sh
如果生成了类似文件,说明备份成功:
backup/files/wiki_20250101_120000.sql.gz
十三、配置定时备份
使用 Linux crontab 配置每天凌晨 2 点自动备份:
crontab -e
加入:
0 2 * * * /opt/company-wiki/backup/backup.sh >> /opt/company-wiki/backup/backup.log 2>&1
建议同时将备份文件同步到其他服务器、对象存储或 NAS,例如:
- 阿里云 OSS
- 腾讯云 COS
- MinIO
- NAS
- 异地备份服务器
因为如果备份文件和数据库都在同一台服务器上,一旦磁盘损坏,仍然可能全部丢失。
十四、数据库恢复方法
如果需要恢复数据库,可以按以下步骤操作。
假设备份文件为:
wiki_20250101_120000.sql.gz
先解压:
gunzip wiki_20250101_120000.sql.gz
复制到服务器对应目录后执行:
cat wiki_20250101_120000.sql | docker exec -i company-wiki-postgres psql -U wiki_user -d company_wiki
如果是全量恢复,建议先停掉应用服务:
docker compose stop wiki
恢复完成后再启动:
docker compose start wiki
十五、企业权限设计建议
知识库系统能不能长期用好,权限设计非常关键。
一个常见误区是:所有人都可以随便创建和编辑文档。这样短期看起来很自由,长期会导致文档重复、目录混乱、内容失效。
建议采用如下权限模型:
| 知识空间 | 管理者 | 编辑者 | 阅读者 |
|---|---|---|---|
| 公司制度 | 行政、人事 | 行政、人事 | 全员 |
| 研发文档 | 技术负责人 | 研发、测试、运维 | 研发中心 |
| 运维手册 | 运维负责人 | 运维 | 研发、运维 |
| 产品文档 | 产品负责人 | 产品、设计 | 研发、测试、运营 |
| 客服知识库 | 客服主管 | 客服、运营 | 客服团队 |
同时建议启用以下规则:
- 重要文档必须指定负责人;
- 文档超过一定时间未更新,需要定期复审;
- 删除文档需要管理员审核;
- 敏感信息不要直接写入文档,例如数据库密码、密钥、客户隐私;
- 已废弃文档不要直接删除,可以移动到“归档区”。
十六、知识库内容规范
企业知识库不是部署完成就结束了,更重要的是运营。
建议制定基础文档规范:
1. 标题清晰
错误示例:
接口说明
正确示例:
用户登录接口说明
2. 目录结构稳定
不要频繁移动核心目录,否则用户难以形成记忆。
3. 文档必须包含更新时间
例如:
> 负责人:张三
> 更新时间:2025-01-01
> 适用系统:订单系统
4. 使用统一标签
例如:
Java
Docker
Kubernetes
故障处理
上线流程
数据库
5. 定期清理无效内容
建议每个季度进行一次知识库巡检,处理重复、过期、无人维护的文档。
十七、常见问题排查
1. 页面打不开
检查容器是否启动:
docker compose ps
检查端口是否监听:
ss -lntp | grep 8080
查看 Nginx 日志:
docker compose logs -f nginx
2. 数据库连接失败
查看数据库日志:
docker compose logs -f postgres
确认 .env 中数据库用户名、密码、数据库名是否一致。
3. Wiki 应用启动失败
查看应用日志:
docker compose logs -f wiki
常见原因包括:
- 数据库未启动完成;
- 数据库密码错误;
- 持久化目录权限异常;
- 镜像拉取不完整。
4. 上传附件失败
检查 Nginx 配置中的上传大小:
client_max_body_size 100m;
如果上传文件超过 100MB,需要调大这个值。
5. 修改配置后不生效
重新加载服务:
docker compose restart nginx
docker compose restart wiki
十八、升级知识库系统
Docker 部署的优势之一是升级方便。
升级前务必备份:
./backup/backup.sh
然后拉取新镜像:
docker compose pull
重建并启动:
docker compose up -d
查看状态:
docker compose ps
如果升级后出现问题,可以使用备份数据恢复,也可以指定旧版本镜像回滚。
生产环境不建议直接使用 latest 标签。本文使用:
image: requarks/wiki:2
你也可以固定到更明确的版本号,降低不可控风险。
十九、完整 README 示例
可以在项目根目录创建 README.md,方便后续维护人员了解部署方式。
# Company Wiki
企业内部知识库系统,基于 Docker Compose 部署。
## 服务组件
- Wiki.js
- PostgreSQL
- Redis
- Nginx
## 启动
```bash
docker compose up -d
停止
docker compose down
查看日志
docker compose logs -f
备份数据库
./backup/backup.sh
访问地址
http://服务器IP:8080
目录说明
data/postgres PostgreSQL 数据目录
data/redis Redis 数据目录
backup 数据库备份目录
nginx Nginx 配置目录
---
## 二十、生产环境优化建议
如果你要将该知识库用于正式企业环境,建议进一步完善以下内容:
1. **接入统一认证**
如果企业已经有 LDAP、AD、OAuth2、OIDC、飞书、企业微信等账号体系,建议接入统一登录。
2. **开启 HTTPS**
内网系统也建议使用 HTTPS,避免账号密码明文传输。
3. **配置访问控制**
可以只允许公司内网、VPN 或指定 IP 段访问。
4. **增加监控告警**
监控 CPU、内存、磁盘、容器状态、数据库状态。
5. **定期备份演练**
备份不是目的,能恢复才是目的。建议每月至少进行一次恢复演练。
6. **限制附件大小**
避免知识库被当作网盘使用,导致磁盘快速增长。
7. **建立内容运营机制**
每个知识空间指定负责人,定期巡检文档质量。
---
## 二十一、总结
本文介绍了如何使用 Docker 搭建一套企业知识库系统,并提供了完整的部署源码,包括:
- `docker-compose.yml`
- `.env`
- `nginx/default.conf`
- `backup.sh`
- `README.md`
通过 Docker Compose,我们可以在较短时间内完成知识库服务、数据库、缓存和反向代理的部署。相比手工安装,Docker 化部署具有环境一致、迁移方便、升级简单、易于备份等优点。
不过,企业知识库真正的价值不只在于系统本身,而在于持续沉淀和维护。一个没人维护的知识库,很快就会变成“文档垃圾场”;而一个有规范、有负责人、有复审机制的知识库,则会成为企业长期积累的核心资产。
如果你的团队还没有统一的知识库平台,可以基于本文方案快速搭建一个内部版本,然后逐步完善权限、模板、备份、认证和运营机制。最终,让知识真正沉淀下来,让经验可以被复用,让团队协作更加高效。