开源知识库搭建系统PandaWiki

简介
什么是 PandaWiki ?
PandaWiki是一款AI大模型驱动的开源知识库搭建系统,帮助你快速构建智能化的 产品文档、技术文档、FAQ、博客系统,借助大模型的力量为你提供 AI 创作、AI 问答、AI 搜索 等能力。
主要特点
-
AI驱动: 内置 AI 创作、问答和搜索功能,可接入多种 AI 大模型。
-
多功能: 支持构建产品文档、技术文档、
FAQ和博客等多种形式的知识库。 -
易于使用: 提供富文本编辑器,支持第三方集成和内容导入。
-
开源: 采用
AGPL-3.0开源协议,可免费使用和二次开发。 -
智能化: 提供智能问答、智能搜索和智能客服等能力。
应用场景
-
产品文档: 快速构建智能化的产品文档,提升用户体验。
-
技术文档: 方便地管理和查询技术文档,提高开发效率。
-
FAQ: 建立智能
FAQ系统,自动回答常见问题。 -
个人知识库: 构建个人的知识体系,方便知识的积累和回顾。

PandaWiki 是一个灵活且功能强大的知识管理工具,适合各种用户需求,特别是在文档管理和知识共享方面提供了优越的体验。
安装
在群晖上以 Docker 方式安装。
但老苏没有使用官方的一键脚本,而是采用了 docker-compose 方式安装
建目录
通过 SSH 客户端登录到你的群晖,执行下面的命令,创建所需的目录
# 新建文件夹 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/pandawikienv.txt
env.txt 是配置文件
# 时区
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-
配置中的
{{PASSWORD}}部分都是相关内部服务的密码,请生成随机密码来替换掉它们。注意:密码长度需要大于 8 位,且不要包含除了数字字母以外的特殊字符。 -
ADMIN_PASSWORD字段是pandawiki管理面板的密码,请务必牢记。 -
ADMIN_PORT字段是后台访问的端口,不冲突就行
下面是一个老苏设置的示例,如果你保留了中文注释,记得保存要使用 UTF-8 格式
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=8816docker-compose.yml
可以在当前目录中直接下载官方的文件
# 下载 docker-compose.yml 文件
wget "https://release.baizhi.cloud/panda-wiki/docker-compose.yml"
也可以将下面的内容保存为 docker-compose.yml 文件
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"当前目录结构如下

现在执行一键启动
# 一键启动
docker-compose --env-file env.txt up -d 如果没有什么意外,会启动 12 个容器

运行
在浏览器中输入 https://群晖IP:8816
注意: 是
https而不是http协议

打开 高级,继续前往

就能看到控制台登录界面了
用户名默认为
admin,而密码就是环境变量中ADMIN_PASSWORD的值

登录成功

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

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

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

创建 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
@所有人:写文不易,如果你都看到了这里,请点个赞和在看,分享给更多的朋友;为确保你能收到每一篇文章,请主页右上角设置星标。