上一篇 下一篇 分享链接 返回 返回顶部

用 Docker 搭一套企业知识库:Wiki.js + PostgreSQL + Nginx 完整实战指南

发布人:慈云数据-客服中心 发布时间:22小时前 阅读量:4

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?

  1. 界面现代化:相比传统 Wiki 系统,Wiki.js UI 更美观,用户体验更好。
  2. 支持 Markdown:研发、运维、产品团队都可以快速编写文档。
  3. 权限体系完善:支持用户、分组、页面权限等。
  4. 支持多种认证方式:如本地账号、LDAP、OAuth2、GitHub、GitLab 等。
  5. 部署简单:通过 Docker Compose 即可快速启动。
  6. 适合企业内网和公网部署:可以放在公司内网,也可以通过公网域名访问。

二、服务器环境准备

本文以 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 可按需开启或关闭

初始化完成后,使用管理员账号登录即可进入后台。

建议初始化后立即完成以下配置:

  1. 修改默认站点名称。
  2. 设置站点语言为中文。
  3. 创建部门和用户分组。
  4. 配置页面访问权限。
  5. 开启必要的认证方式。
  6. 配置备份策略。
  7. 制定文档目录规范。

十二、企业知识库目录规划建议

搭建平台只是第一步,真正有价值的是知识沉淀和持续维护。建议企业知识库采用清晰的目录结构。

示例目录如下:

企业知识库
├── 01-公司制度
│   ├── 人事制度
│   ├── 财务制度
│   └── 行政制度
├── 02-研发中心
│   ├── 开发规范
│   ├── 架构设计
│   ├── API 文档
│   ├── 数据库规范
│   └── 发布流程
├── 03-运维中心
│   ├── 服务器管理
│   ├── Docker 运维
│   ├── Kubernetes
│   ├── 监控告警
│   └── 故障处理手册
├── 04-产品中心
│   ├── 产品需求文档
│   ├── 产品使用说明
│   └── 版本更新记录
├── 05-项目管理
│   ├── 项目计划
│   ├── 会议纪要
│   └── 交付文档
└── 06-新人培训
    ├── 入职指南
    ├── 环境搭建
    └── 常见问题

为了避免知识库变成“文档垃圾桶”,建议制定以下规范:

  1. 页面标题统一命名。
  2. 文档必须有负责人。
  3. 重要文档必须有最后更新时间。
  4. 过期文档要标记废弃。
  5. 技术文档建议使用模板。
  6. 关键流程文档需要评审后发布。
  7. 禁止上传明文密码、私钥、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 证书申请失败

常见原因:

  1. 域名没有正确解析到服务器 IP。
  2. 服务器安全组没有开放 80 端口。
  3. Nginx 配置错误。
  4. 服务器无法访问 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
   ↓
配置权限和目录
   ↓
设置备份和运维策略

对于企业来说,知识库并不只是一个软件系统,更是一套知识管理机制。平台上线后,还需要持续推动文档规范、权限治理、定期更新、过期清理和备份演练。只有这样,知识库才能真正成为团队协作、经验沉淀和效率提升的基础设施。

目录结构
全文