用 Docker 搭一套企业知识库:Wiki.js + PostgreSQL + Nginx 完整实战指南
Docker 企业知识库搭建|附完整命令
在企业数字化建设中,“知识库”几乎是每个团队都需要的基础设施。无论是研发文档、运维手册、项目规范、产品说明、客户案例,还是新人培训资料,如果没有一个统一、可检索、可权限管理的平台,知识会很容易散落在个人电脑、聊天记录、网盘文件夹或零散的 Markdown 文档中。
本文将以 Docker 的方式搭建一套企业级知识库系统,方案选择 Wiki.js + PostgreSQL + Nginx。Wiki.js 是一款开源、现代化、支持 Markdown、权限管理、搜索、Git 同步、多语言、认证集成的知识库系统,非常适合中小型团队或企业内部部署。
本文会提供从服务器准备、Docker 安装、目录规划、服务编排、反向代理、HTTPS、备份恢复到日常维护的完整命令,适合直接复制执行。
一、方案选型说明
本文采用如下架构:
用户浏览器
|
| HTTPS
|
Nginx 反向代理
|
| HTTP
|
Wiki.js 应用容器
|
| PostgreSQL 协议
|
PostgreSQL 数据库容器
核心组件如下:
| 组件 | 说明 |
|---|---|
| Wiki.js | 企业知识库应用 |
| PostgreSQL | 存储 Wiki.js 数据 |
| Docker | 容器运行环境 |
| Docker Compose | 编排多个容器 |
| Nginx | 反向代理、域名访问、HTTPS |
| Certbot | 申请免费 SSL 证书 |
为什么选择 Wiki.js?
- 界面现代化:相比传统 Wiki 系统,Wiki.js UI 更美观,用户体验更好。
- 支持 Markdown:研发、运维、产品团队都可以快速编写文档。
- 权限体系完善:支持用户、分组、页面权限等。
- 支持多种认证方式:如本地账号、LDAP、OAuth2、GitHub、GitLab 等。
- 部署简单:通过 Docker Compose 即可快速启动。
- 适合企业内网和公网部署:可以放在公司内网,也可以通过公网域名访问。
二、服务器环境准备
本文以 Ubuntu Server 22.04 LTS 为例。其他 Linux 发行版也可以参考执行。
推荐服务器配置:
| 项目 | 建议配置 |
|---|---|
| CPU | 2 核及以上 |
| 内存 | 4GB 及以上 |
| 磁盘 | 50GB 及以上 |
| 系统 | Ubuntu 20.04 / 22.04 / Debian 11 / CentOS 7+ |
| 网络 | 可访问 Docker Hub,若公网访问需开放 80/443 端口 |
假设服务器信息如下:
服务器系统:Ubuntu 22.04
知识库域名:wiki.example.com
应用目录:/opt/wiki
请将文中的 wiki.example.com 替换为你的真实域名。
三、更新系统并安装基础工具
首先登录服务器:
ssh root@你的服务器IP
更新系统软件包:
apt update && apt upgrade -y
安装常用工具:
apt install -y curl wget vim git unzip tar net-tools lsof ca-certificates gnupg
设置服务器时区为中国上海:
timedatectl set-timezone Asia/Shanghai
查看时间是否正确:
date
四、安装 Docker
1. 卸载旧版本 Docker
如果服务器之前安装过旧版本 Docker,可以先执行:
apt remove -y docker docker-engine docker.io containerd runc
2. 添加 Docker 官方 GPG 密钥
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
3. 添加 Docker 软件源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
> /etc/apt/sources.list.d/docker.list
更新软件源:
apt update
4. 安装 Docker Engine 和 Docker Compose
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
查看 Docker 版本:
docker version
查看 Docker Compose 版本:
docker compose version
设置 Docker 开机自启:
systemctl enable docker
启动 Docker:
systemctl start docker
查看 Docker 状态:
systemctl status docker
五、创建知识库部署目录
为了方便后续维护,我们统一将项目放在 /opt/wiki 目录下:
mkdir -p /opt/wiki
cd /opt/wiki
创建子目录:
mkdir -p postgres-data
mkdir -p wiki-data
mkdir -p nginx/conf.d
mkdir -p nginx/logs
mkdir -p backup
目录说明:
/opt/wiki
├── docker-compose.yml # Docker Compose 编排文件
├── postgres-data # PostgreSQL 数据持久化目录
├── wiki-data # Wiki.js 数据目录
├── nginx
│ ├── conf.d # Nginx 配置文件目录
│ └── logs # Nginx 日志目录
└── backup # 数据库备份目录
六、编写 Docker Compose 文件
在 /opt/wiki 目录下创建 docker-compose.yml:
vim /opt/wiki/docker-compose.yml
写入以下内容:
services:
postgres:
image: postgres:15
container_name: wiki-postgres
restart: always
environment:
POSTGRES_DB: wikijs
POSTGRES_USER: wikijs
POSTGRES_PASSWORD: ChangeThisPostgresPassword
TZ: Asia/Shanghai
volumes:
- ./postgres-data:/var/lib/postgresql/data
networks:
- wiki-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U wikijs -d wikijs"]
interval: 10s
timeout: 5s
retries: 5
wikijs:
image: ghcr.io/requarks/wiki:2
container_name: wikijs
restart: always
depends_on:
postgres:
condition: service_healthy
environment:
DB_TYPE: postgres
DB_HOST: postgres
DB_PORT: 5432
DB_USER: wikijs
DB_PASS: ChangeThisPostgresPassword
DB_NAME: wikijs
TZ: Asia/Shanghai
ports:
- "3000:3000"
networks:
- wiki-net
networks:
wiki-net:
driver: bridge
注意:请务必将
ChangeThisPostgresPassword替换成高强度密码,例如包含大小写字母、数字和特殊符号。
例如可以生成随机密码:
openssl rand -base64 32
假设生成的密码为:
nH2VxG8C9aYpLq7M3zRt5BfEwK6uDs4X
则将 docker-compose.yml 中两个位置的密码都替换为该密码:
sed -i 's/ChangeThisPostgresPassword/nH2VxG8C9aYpLq7M3zRt5BfEwK6uDs4X/g' /opt/wiki/docker-compose.yml
七、启动 Wiki.js 知识库
进入项目目录:
cd /opt/wiki
拉取镜像:
docker compose pull
启动服务:
docker compose up -d
查看容器状态:
docker compose ps
如果看到类似输出,说明服务已启动:
NAME IMAGE STATUS
wiki-postgres postgres:15 Up
wikijs ghcr.io/requarks/wiki:2 Up
查看 Wiki.js 日志:
docker logs -f wikijs
查看 PostgreSQL 日志:
docker logs -f wiki-postgres
此时可以通过以下地址访问:
http://服务器IP:3000
如果你的服务器安全组已经开放 3000 端口,就可以在浏览器中打开 Wiki.js 初始化页面。
不过在企业环境中,不建议直接暴露 3000 端口,推荐使用 Nginx 反向代理并启用 HTTPS。
八、安装 Nginx
安装 Nginx:
apt install -y nginx
设置开机自启:
systemctl enable nginx
启动 Nginx:
systemctl start nginx
查看状态:
systemctl status nginx
如果服务器启用了防火墙,需要开放 80 和 443 端口:
ufw allow 80/tcp
ufw allow 443/tcp
ufw reload
如果你使用的是云服务器,也需要在云厂商安全组中开放以下端口:
80/tcp
443/tcp
九、配置 Nginx 反向代理
创建 Nginx 配置文件:
vim /etc/nginx/conf.d/wiki.conf
写入以下内容:
server {
listen 80;
server_name wiki.example.com;
client_max_body_size 100m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;
}
}
请将 wiki.example.com 替换为你的实际域名。
检查 Nginx 配置:
nginx -t
重新加载 Nginx:
systemctl reload nginx
现在可以访问:
http://wiki.example.com
十、配置 HTTPS 证书
企业知识库通常包含内部制度、技术文档、账号规范、系统部署手册等敏感内容,因此强烈建议开启 HTTPS。
这里使用 Let’s Encrypt 免费证书。
安装 Certbot:
apt install -y certbot python3-certbot-nginx
申请证书:
certbot --nginx -d wiki.example.com
根据提示输入邮箱、同意协议,并选择是否自动重定向到 HTTPS。建议选择自动重定向。
证书申请成功后,查看证书:
certbot certificates
测试自动续期:
certbot renew --dry-run
Certbot 默认会创建定时任务,自动续期证书。你也可以查看定时器状态:
systemctl list-timers | grep certbot
申请完成后,可以通过以下地址访问知识库:
https://wiki.example.com
十一、初始化 Wiki.js
首次访问 Wiki.js 时,需要进行初始化配置。
通常需要填写以下信息:
| 配置项 | 示例 |
|---|---|
| Site URL | https://wiki.example.com |
| Admin Email | admin@example.com |
| Admin Password | 设置管理员密码 |
| Site Title | 企业知识库 |
| Telemetry | 可按需开启或关闭 |
初始化完成后,使用管理员账号登录即可进入后台。
建议初始化后立即完成以下配置:
- 修改默认站点名称。
- 设置站点语言为中文。
- 创建部门和用户分组。
- 配置页面访问权限。
- 开启必要的认证方式。
- 配置备份策略。
- 制定文档目录规范。
十二、企业知识库目录规划建议
搭建平台只是第一步,真正有价值的是知识沉淀和持续维护。建议企业知识库采用清晰的目录结构。
示例目录如下:
企业知识库
├── 01-公司制度
│ ├── 人事制度
│ ├── 财务制度
│ └── 行政制度
├── 02-研发中心
│ ├── 开发规范
│ ├── 架构设计
│ ├── API 文档
│ ├── 数据库规范
│ └── 发布流程
├── 03-运维中心
│ ├── 服务器管理
│ ├── Docker 运维
│ ├── Kubernetes
│ ├── 监控告警
│ └── 故障处理手册
├── 04-产品中心
│ ├── 产品需求文档
│ ├── 产品使用说明
│ └── 版本更新记录
├── 05-项目管理
│ ├── 项目计划
│ ├── 会议纪要
│ └── 交付文档
└── 06-新人培训
├── 入职指南
├── 环境搭建
└── 常见问题
为了避免知识库变成“文档垃圾桶”,建议制定以下规范:
- 页面标题统一命名。
- 文档必须有负责人。
- 重要文档必须有最后更新时间。
- 过期文档要标记废弃。
- 技术文档建议使用模板。
- 关键流程文档需要评审后发布。
- 禁止上传明文密码、私钥、Token 等敏感信息。
十三、配置 PostgreSQL 数据库备份
企业知识库一旦投入使用,数据备份非常关键。下面提供一个 PostgreSQL 自动备份脚本。
创建备份脚本:
vim /opt/wiki/backup/backup-wiki.sh
写入以下内容:
#!/bin/bash
set -e
BACKUP_DIR="/opt/wiki/backup"
DATE=$(date +%F_%H-%M-%S)
CONTAINER_NAME="wiki-postgres"
DB_NAME="wikijs"
DB_USER="wikijs"
BACKUP_FILE="${BACKUP_DIR}/wikijs_${DATE}.sql.gz"
mkdir -p ${BACKUP_DIR}
docker exec ${CONTAINER_NAME} pg_dump -U ${DB_USER} ${DB_NAME} | gzip > ${BACKUP_FILE}
find ${BACKUP_DIR} -name "wikijs_*.sql.gz" -type f -mtime +30 -delete
echo "Backup completed: ${BACKUP_FILE}"
添加执行权限:
chmod +x /opt/wiki/backup/backup-wiki.sh
手动执行一次备份:
/opt/wiki/backup/backup-wiki.sh
查看备份文件:
ls -lh /opt/wiki/backup
配置定时任务,每天凌晨 2 点自动备份:
crontab -e
添加:
0 2 * * * /opt/wiki/backup/backup-wiki.sh >> /opt/wiki/backup/backup.log 2>&1
查看定时任务:
crontab -l
十四、数据库恢复方法
如果需要从备份恢复数据,建议先停止 Wiki.js 应用,避免写入冲突。
进入目录:
cd /opt/wiki
停止 Wiki.js 容器:
docker compose stop wikijs
选择一个备份文件,例如:
/opt/wiki/backup/wikijs_2025-01-01_02-00-00.sql.gz
恢复数据库:
gunzip -c /opt/wiki/backup/wikijs_2025-01-01_02-00-00.sql.gz \
| docker exec -i wiki-postgres psql -U wikijs -d wikijs
恢复完成后启动 Wiki.js:
docker compose start wikijs
查看日志确认是否正常:
docker logs -f wikijs
如果是全量恢复到一个已有数据库,可能需要先清空旧数据库。谨慎执行以下命令:
docker exec -it wiki-postgres psql -U wikijs -d wikijs
进入 PostgreSQL 后执行:
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO wikijs;
GRANT ALL ON SCHEMA public TO public;
然后再执行恢复命令。
十五、升级 Wiki.js
升级前务必备份数据库。
执行备份:
/opt/wiki/backup/backup-wiki.sh
进入项目目录:
cd /opt/wiki
拉取最新镜像:
docker compose pull
重新创建容器:
docker compose up -d
清理无用镜像:
docker image prune -f
查看容器状态:
docker compose ps
查看日志:
docker logs -f wikijs
十六、常用运维命令
查看所有容器:
docker ps -a
查看 Wiki.js 容器日志:
docker logs -f wikijs
查看 PostgreSQL 容器日志:
docker logs -f wiki-postgres
重启所有服务:
cd /opt/wiki
docker compose restart
停止服务:
cd /opt/wiki
docker compose stop
启动服务:
cd /opt/wiki
docker compose start
完全停止并删除容器,但保留数据:
cd /opt/wiki
docker compose down
重新启动:
cd /opt/wiki
docker compose up -d
查看容器资源占用:
docker stats
进入 Wiki.js 容器:
docker exec -it wikijs sh
进入 PostgreSQL 容器:
docker exec -it wiki-postgres bash
连接数据库:
docker exec -it wiki-postgres psql -U wikijs -d wikijs
十七、安全加固建议
企业知识库往往包含大量内部资料,因此安全配置非常重要。
1. 不直接暴露 3000 端口
如果已经使用 Nginx 反向代理,可以修改 docker-compose.yml:
ports:
- "127.0.0.1:3000:3000"
这样 Wiki.js 只允许本机访问,外部只能通过 Nginx 访问。
修改后重启:
cd /opt/wiki
docker compose up -d
2. 开启 HTTPS
HTTPS 是基础要求,尤其是公网部署时必须启用。前文已经介绍了 Certbot 配置方式。
3. 使用强密码
包括:
- PostgreSQL 数据库密码
- Wiki.js 管理员密码
- 普通用户密码
- LDAP 或 OAuth 客户端密钥
建议密码不少于 16 位,并包含大小写字母、数字和特殊符号。
4. 限制后台管理权限
不要所有人都设置为管理员。建议至少划分以下角色:
| 角色 | 权限 |
|---|---|
| 管理员 | 系统配置、用户管理、权限管理 |
| 编辑者 | 创建和编辑文档 |
| 审阅者 | 查看和评论文档 |
| 普通用户 | 查看授权文档 |
5. 定期备份并异地保存
本机备份无法应对服务器磁盘损坏或误删,建议将备份同步到对象存储、NAS 或其他服务器。
例如使用 rsync 同步到远程服务器:
rsync -avz /opt/wiki/backup/ root@backup-server:/data/wiki-backup/
6. 配置服务器防火墙
仅开放必要端口:
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
查看状态:
ufw status
十八、可选:使用 Docker 部署 Nginx
如果你希望 Nginx 也通过 Docker 管理,可以扩展 docker-compose.yml。
示例:
services:
postgres:
image: postgres:15
container_name: wiki-postgres
restart: always
environment:
POSTGRES_DB: wikijs
POSTGRES_USER: wikijs
POSTGRES_PASSWORD: ChangeThisPostgresPassword
TZ: Asia/Shanghai
volumes:
- ./postgres-data:/var/lib/postgresql/data
networks:
- wiki-net
wikijs:
image: ghcr.io/requarks/wiki:2
container_name: wikijs
restart: always
depends_on:
- postgres
environment:
DB_TYPE: postgres
DB_HOST: postgres
DB_PORT: 5432
DB_USER: wikijs
DB_PASS: ChangeThisPostgresPassword
DB_NAME: wikijs
TZ: Asia/Shanghai
expose:
- "3000"
networks:
- wiki-net
nginx:
image: nginx:1.25
container_name: wiki-nginx
restart: always
depends_on:
- wikijs
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/logs:/var/log/nginx
networks:
- wiki-net
networks:
wiki-net:
driver: bridge
对应 Nginx 配置:
server {
listen 80;
server_name wiki.example.com;
client_max_body_size 100m;
location / {
proxy_pass http://wikijs:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
启动:
cd /opt/wiki
docker compose up -d
不过对于生产环境,如果你已经熟悉宿主机 Nginx,使用宿主机 Nginx 管理证书和反向代理会更直观。
十九、常见问题排查
1. 访问 http://服务器IP:3000 无响应
检查容器是否运行:
docker compose ps
查看端口监听:
lsof -i:3000
查看日志:
docker logs -f wikijs
检查安全组和防火墙是否开放端口。
2. Wiki.js 提示数据库连接失败
检查数据库容器:
docker logs -f wiki-postgres
检查 docker-compose.yml 中数据库密码是否一致:
cat /opt/wiki/docker-compose.yml
进入数据库测试连接:
docker exec -it wiki-postgres psql -U wikijs -d wikijs
3. Nginx 502 Bad Gateway
检查 Wiki.js 是否正常:
docker ps | grep wikijs
检查本机是否可以访问 3000 端口:
curl -I http://127.0.0.1:3000
检查 Nginx 配置:
nginx -t
查看 Nginx 错误日志:
tail -f /var/log/nginx/error.log
4. HTTPS 证书申请失败
常见原因:
- 域名没有正确解析到服务器 IP。
- 服务器安全组没有开放 80 端口。
- Nginx 配置错误。
- 服务器无法访问 Let’s Encrypt。
检查域名解析:
ping wiki.example.com
检查 80 端口:
curl -I http://wiki.example.com
重新申请:
certbot --nginx -d wiki.example.com
二十、总结
通过本文,我们完成了一套基于 Docker 的企业知识库搭建方案,核心组件包括:
- Wiki.js:知识库系统
- PostgreSQL:数据存储
- Docker Compose:服务编排
- Nginx:反向代理
- Certbot:HTTPS 证书
- Cron:自动备份
整体部署流程如下:
安装 Docker
↓
创建部署目录
↓
编写 docker-compose.yml
↓
启动 PostgreSQL 和 Wiki.js
↓
配置 Nginx 反向代理
↓
申请 HTTPS 证书
↓
初始化 Wiki.js
↓
配置权限和目录
↓
设置备份和运维策略
对于企业来说,知识库并不只是一个软件系统,更是一套知识管理机制。平台上线后,还需要持续推动文档规范、权限治理、定期更新、过期清理和备份演练。只有这样,知识库才能真正成为团队协作、经验沉淀和效率提升的基础设施。