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

用 Docker 搭一套公司内部知识库,部署文件和备份脚本都给你

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

Docker 企业知识库搭建|附源码

在企业数字化建设过程中,知识库几乎是每个团队都会逐渐需要的一类基础系统。无论是研发团队的技术文档、运维团队的故障处理手册、产品团队的需求说明,还是客服团队的常见问题解答,都需要一个统一、可搜索、可沉淀、可协作的平台来承载。

很多企业一开始会使用 Word、Excel、网盘、微信群收藏、飞书文档或语雀等工具来管理知识。但随着团队规模扩大,文档数量增多,权限控制、全文检索、版本管理、私有化部署、备份迁移等问题就会逐渐暴露出来。

本文将介绍如何使用 Docker 快速搭建一套企业内部知识库系统,并提供完整的部署源码示例。本文方案适合中小团队、研发部门、运维团队、创业公司内部文档平台,也适合作为企业私有化知识管理系统的基础模板。


一、为什么企业需要自建知识库?

企业知识库的核心价值不是“存文档”,而是让组织经验可以被持续复用。

一个成熟的企业知识库通常可以解决以下问题:

  1. 降低重复沟通成本
    新员工入职、项目交接、接口说明、部署流程等内容,如果没有统一沉淀,每次都需要人工重复讲解。

  2. 提升团队协作效率
    产品、研发、测试、运维、客服可以围绕同一份文档进行协作,减少信息断层。

  3. 形成组织资产
    员工离职并不意味着经验流失,关键知识可以保留在系统中。

  4. 规范研发和运维流程
    例如接口文档、上线流程、回滚方案、故障应急预案等,都可以形成标准化模板。

  5. 支持权限隔离
    企业内部不同部门、项目、角色可以访问不同的知识空间。

  6. 便于私有化部署和数据掌控
    对于很多企业而言,研发文档、客户资料、内部流程属于敏感信息,自建系统更容易满足安全合规要求。


二、技术选型说明

本文采用 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. 删除文档需要管理员审核;
  4. 敏感信息不要直接写入文档,例如数据库密码、密钥、客户隐私;
  5. 已废弃文档不要直接删除,可以移动到“归档区”。

十六、知识库内容规范

企业知识库不是部署完成就结束了,更重要的是运营。

建议制定基础文档规范:

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 化部署具有环境一致、迁移方便、升级简单、易于备份等优点。

不过,企业知识库真正的价值不只在于系统本身,而在于持续沉淀和维护。一个没人维护的知识库,很快就会变成“文档垃圾场”;而一个有规范、有负责人、有复审机制的知识库,则会成为企业长期积累的核心资产。

如果你的团队还没有统一的知识库平台,可以基于本文方案快速搭建一个内部版本,然后逐步完善权限、模板、备份、认证和运营机制。最终,让知识真正沉淀下来,让经验可以被复用,让团队协作更加高效。
目录结构
全文