开源知识库搭建系统PandaWiki

简介

什么是 PandaWiki ?

PandaWiki 是一款 AI 大模型驱动的开源知识库搭建系统,帮助你快速构建智能化的 产品文档、技术文档、FAQ、博客系统,借助大模型的力量为你提供 AI 创作、AI 问答、AI 搜索 等能力。

主要特点

  • AI驱动: 内置 AI 创作、问答和搜索功能,可接入多种 AI 大模型。
  • 多功能: 支持构建产品文档、技术文档、FAQ 和博客等多种形式的知识库。
  • 易于使用: 提供富文本编辑器,支持第三方集成和内容导入。
  • 开源: 采用 AGPL-3.0 开源协议,可免费使用和二次开发。
  • 智能化: 提供智能问答、智能搜索和智能客服等能力。

应用场景

  • 产品文档: 快速构建智能化的产品文档,提升用户体验。
  • 技术文档: 方便地管理和查询技术文档,提高开发效率。
  • FAQ: 建立智能 FAQ 系统,自动回答常见问题。
  • 个人知识库: 构建个人的知识体系,方便知识的积累和回顾。

PandaWiki 是一个灵活且功能强大的知识管理工具,适合各种用户需求,特别是在文档管理和知识共享方面提供了优越的体验。

安装

在群晖上以 Docker 方式安装。

但老苏没有使用官方的一键脚本,而是采用了 docker-compose 方式安装

建目录

通过 SSH 客户端登录到你的群晖,执行下面的命令,创建所需的目录

1
2
3
4
5
# 新建文件夹 pandawiki 和 子目录
mkdir -p /volume1/docker/pandawiki/data/{caddy/{caddy_config,caddy_data,run},conf/api,minio,nats,nginx/ssl,postgres,qdrant,raglite}

# 进入 pandawiki 目录
cd /volume1/docker/pandawiki

env.txt

env.txt 是配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 时区
TIMEZONE=Asia/Shanghai
# 容器网段
SUBNET_PREFIX=169.254.15
# 中间件密码
POSTGRES_PASSWORD={{PASSWORD}}
NATS_PASSWORD={{PASSWORD}}
JWT_SECRET={{PASSWORD}}
S3_SECRET_KEY={{PASSWORD}}
QDRANT_API_KEY={{PASSWORD}}
REDIS_PASSWORD={{PASSWORD}}
# 管理后台登录密码
ADMIN_PASSWORD={{PASSWORD}}
# 管理后台访问端口
ADMIN_PORT=2443
  1. 配置中的 {{PASSWORD}} 部分都是相关内部服务的密码,请生成随机密码来替换掉它们。注意:密码长度需要大于 8 位,且不要包含除了数字字母以外的特殊字符。
  2. ADMIN_PASSWORD 字段是 pandawiki 管理面板的密码,请务必牢记
  3. ADMIN_PORT 字段是后台访问的端口,不冲突就行

下面是一个老苏设置的示例,如果你保留了中文注释,记得保存要使用 UTF-8 格式

1
2
3
4
5
6
7
8
9
10
11
12
13
TIMEZONE=Asia/Shanghai
SUBNET_PREFIX=169.254.15

POSTGRES_PASSWORD=5JAgNyx9h9xu
NATS_PASSWORD=sE5YZjAT7Mtv
JWT_SECRET=vyHPZJsfMZEazzGj2Auc7wwPuajSjCSa
S3_SECRET_KEY=BRup9kYUp8gMAZ8JtzGzM9VKwuZbsUc8
QDRANT_API_KEY=AD23RJ7iCvsYapidU3dx2SiT3iWtDhuU
REDIS_PASSWORD=kB4vVExRdM3W

ADMIN_PASSWORD=laosu123

ADMIN_PORT=8816

docker-compose.yml

可以在当前目录中直接下载官方的文件

1
2
# 下载 docker-compose.yml 文件
wget "https://release.baizhi.cloud/panda-wiki/docker-compose.yml"

也可以将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
services:
caddy:
container_name: panda-wiki-caddy
restart: always
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-caddy:2.10-alpine
cap_add:
- NET_ADMIN
volumes:
- ./data/caddy/caddy_config:/config
- ./data/caddy/caddy_data:/data
- ./data/caddy/run:/var/run/caddy
environment:
- CADDY_ADMIN=unix//var/run/caddy/caddy-admin.sock
network_mode: host

nginx:
container_name: panda-wiki-nginx
depends_on:
- api
restart: always
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-nginx:v3.31.3
ports:
- ${ADMIN_PORT}:8080
volumes:
- ./data/nginx/ssl:/etc/nginx/ssl
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.111"

app:
container_name: panda-wiki-app
restart: always
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-app:v3.31.3
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.112"

api:
container_name: panda-wiki-api
depends_on:
- postgres
- nats
- caddy
- raglite
restart: always
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-api:v3.31.3
volumes:
- ./data/caddy/run:/app/run
- ./data/nginx/ssl:/app/etc/nginx/ssl
- ./data/conf/api:/data
environment:
- NATS_PASSWORD=${NATS_PASSWORD}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- REDIS_PASSWORD=${REDIS_PASSWORD}
- S3_SECRET_KEY=${S3_SECRET_KEY}
- JWT_SECRET=${JWT_SECRET}
- ADMIN_PASSWORD=${ADMIN_PASSWORD}
- SUBNET_PREFIX=${SUBNET_PREFIX}
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.2"

consumer:
container_name: panda-wiki-consumer
depends_on:
- nats
- api
restart: always
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-consumer:v3.31.3
environment:
- NATS_PASSWORD=${NATS_PASSWORD}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- REDIS_PASSWORD=${REDIS_PASSWORD}
- S3_SECRET_KEY=${S3_SECRET_KEY}
- JWT_SECRET=${JWT_SECRET}
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.3"

postgres:
container_name: panda-wiki-postgres
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-postgres:17.5
restart: always
healthcheck:
test: ["CMD", "pg_isready", "-U", "panda-wiki", "-d", "panda-wiki"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
environment:
- POSTGRES_USER=panda-wiki
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=panda-wiki
volumes:
- ./data/postgres:/var/lib/postgresql/data
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.10"

redis:
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-redis:7.4.2-alpine
container_name: panda-wiki-redis
restart: always
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}", "--appendonly", "yes", "--appendfilename", "appendonly.aof", "--save", "900 1", "--save", "300 10", "--save", "60 10000"]
volumes:
- ./data/redis:/data
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.11"

minio:
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-minio:RELEASE.2025-04-22T22-12-26Z-cpuv1
container_name: panda-wiki-minio
restart: always
command: ["minio", "server", "/data", "--console-address", ":9001"]
volumes:
- ./data/minio:/data
environment:
- MINIO_ACCESS_KEY=s3panda-wiki
- MINIO_SECRET_KEY=${S3_SECRET_KEY}
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.12"

nats:
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-nats:2.11.3-alpine
container_name: panda-wiki-nats
restart: always
command: ["nats-server", "-c", "/etc/nats/nats.conf", "--user", "panda-wiki", "--pass", "${NATS_PASSWORD}"]
volumes:
- ./data/nats:/data
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.13"

qdrant:
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-qdrant:v1.14.1
container_name: panda-wiki-qdrant
restart: always
volumes:
- ./data/qdrant:/qdrant/storage
environment:
- QDRANT__SERVICE__API_KEY=${QDRANT_API_KEY}
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.14"

crawler:
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/anydoc:v0.6.11
container_name: panda-wiki-crawler
restart: always
init: true
environment:
- GLOG_GLOBAL_LEVEL=info
- NAMESPACE=anydoc
- MQ_NATS_URL=nats://panda-wiki-nats:4222
- MQ_NATS_USER=panda-wiki
- MQ_NATS_PASSWORD=${NATS_PASSWORD}
- OSS_MINIO_ACCESS_KEY=s3panda-wiki
- OSS_MINIO_SECRET_KEY=${S3_SECRET_KEY}
- OSS_MINIO_ENDPOINT=panda-wiki-minio:9000
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.17"

raglite:
image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-raglite:1-3-9
container_name: panda-wiki-raglite
restart: always
volumes:
- ./data/raglite:/data
environment:
- GIN_MODE=release
- DATABASE_HOST=panda-wiki-postgres
- DATABASE_USER=panda-wiki
- DATABASE_PASSWORD=${POSTGRES_PASSWORD}
- MINIO_HOST=panda-wiki-minio:9000
- MINIO_USER=s3panda-wiki
- MINIO_PASSWORD=${S3_SECRET_KEY}
- QDRANT_HOST=panda-wiki-qdrant
- QDRANT_API_KEY=${QDRANT_API_KEY}
depends_on:
- postgres
- minio
- qdrant
networks:
panda-wiki:
ipv4_address: "${SUBNET_PREFIX:-169.254.15}.18"

networks:
panda-wiki:
ipam:
driver: default
config:
- subnet: "${SUBNET_PREFIX:-169.254.15}.0/24"

当前目录结构如下

现在执行一键启动

1
2
# 一键启动
docker-compose --env-file env.txt up -d

如果没有什么意外,会启动 12 个容器

运行

在浏览器中输入 https://群晖IP:8816

注意:https而不是 http 协议

打开 高级,继续前往

就能看到控制台登录界面了

用户名默认为 admin,而密码就是环境变量中 ADMIN_PASSWORD 的值

登录成功

接入 AI 模型

PandaWiki 是由 AI 大模型驱动的,在使用之前请先接入 AI 大模型,否则将无法正常使用

目前硅基流动(SiliconFlow),注册就送 2000Tokens,虽然不是免费,但也够用一阵子的

注册地址:

https://cloud.siliconflow.cn/i/NkUiXVhQ

如果设置没问题,可以获取到模型列表

创建 Wiki 站点

找一个群晖上未被占用的端口,例如: 8817

跟随向导

可以创建或者导入文档

访问 Wiki

因为我们在上一步创建 Wiki 站点时监听的是 8817 端口,所以我们可以用 http://群晖IP:8817 访问

注意: 这次是 http而不是 https 协议

可以问 AI 或者搜索文档

速度还是很快的

参考文档

chaitin/PandaWiki: PandaWiki 是一款 AI 大模型驱动的开源知识库搭建系统,帮助你快速构建智能化的 产品文档、技术文档、FAQ、博客系统,借助大模型的力量为你提供 AI 创作、AI 问答、AI 搜索等能力。
地址:https://github.com/chaitin/PandaWiki

PandaWiki
地址:https://pandawiki.docs.baizhi.cloud/

PandaWiki - PandaWiki 介绍
地址:https://pandawiki.docs.baizhi.cloud/node/0197160c-782c-74ad-a4b7-857dae148f84