全网第一篇!NAS Docker环境手动部署PandaWiki AI知识库详细教程 (非官方脚本)
还在为团队知识散落各处、查找困难头疼吗?或者想找个智能又强大的知识库平台,把产品文档、技术笔记、FAQ统统管起来?最近我发现了个宝藏——PandaWiki!这款由AI大模型驱动的开源知识库系统,不仅能搞定富文本编辑、多格式导出,更能玩转AI创作、AI问答和AI搜索,智能化程度拉满!
心动想试试?但官方目前只提供了一键安装脚本,对于喜欢手动掌控、尤其是在NAS上折腾Docker的朋友,是不是有点小遗憾?别急!经过一番摸索,我亲自搞定了在NAS上通过Docker手动部署PandaWiki知识库的全过程!
这篇详细图文教程,就是为你准备的!带你一步步绕过脚本,亲手在NAS的Docker环境里,把这个AI驱动的知识库搭建起来,体验它强大的智能化知识管理魅力。准备好你的NAS,咱们马上开始!
👋 项目介绍
PandaWiki 是一款 AI 大模型驱动的开源知识库搭建系统,帮助你快速构建智能化的 产品文档、技术文档、FAQ、博客系统,借助大模型的力量为你提供 AI 创作、AI 问答、AI 搜索 等能力。
⚡️ 界面展示
Wiki 网站前台
PandaWiki 控制台
🔥 功能与特色
AI 驱动智能化:AI 辅助创作、AI 辅助问答、AI 辅助搜索。
强大的富文本编辑能力:兼容 Markdown 和 HTML,支持导出为 word、pdf、markdown 等多种格式。
轻松与第三方应用进行集成:支持做成网页挂件挂在其他网站上,支持做成钉钉、飞书、企业微信等聊天机器人。
通过第三方来源导入内容:根据网页 URL 导入、通过网站 Sitemap 导入、通过 RSS 订阅、通过离线文件导入等。
⚙️部署要求
安装 PandaWiki 前,请确保你的系统环境符合以下要求
操作系统:Linux
CPU 指令架构:x86_64
软件依赖:Docker 20.10.14 版本以上
软件依赖:Docker Compose 2.0.0 版本以上
推荐资源:1 核 CPU / 4 GB 内存 / 20 GB 磁盘
最低资源:1 核 CPU / 2 GB 内存 / 5 GB 磁盘
官方脚本一键安装(显然不是我们想要的)
使用 root 权限登录你的服务器,然后执行以下命令。
bash -c "$(curl -fsSLk https://release.baizhi.cloud/panda-wiki/manager.sh)"
📦部署教程
🚀 一、准备工作
演示以在飞牛NAS系统上安装为例
提示: 其他系统请确保你已安装最新版的 Docker 和 Docker Compose。
注意⚠️:配置文件的注释适合有经验的用户,默认情况下只需要修改PostgreSQL数据库密码和PandaWiki的访问端口,其余的无需任何修改。(不修改任何也可以部署)
1. 开启 SSH 并连接 NAS
登录飞牛NAS后台
开启 SSH 服务
使用终端工具(如 Terminus / PuTTY)连接到 NAS
登录后输入
sudo -i
切换到 root 用户sudo -i
2. 新建项目文件夹并进入
在飞牛文件管理器中新建项目文件夹,例如
/vol1/1002/PandaWiki
,右键文件夹选项中 > 详细信息 > 复制原始路径。在终端执行命令进入项目文件夹内
# 将/vol1/1002/PandaWiki换成你自己的文件夹路径 cd /vol1/1002/PandaWiki
若使用其他 NAS,请手动创建文件夹,右键查看属性复制文件夹路径。
📁 二、初始化目录结构
执行以下命令创建所需目录,防止后续卷挂载失败:
# 创建必要目录结构(防止卷挂载失败)
mkdir -p ./data/{caddy/{caddy_config,caddy_data,run},conf/api,postgres,redis,minio,nats,qdrant}
⚙️ 三、创建 .env
环境变量文件
执行命令创建
.env
环境变量文件vi .env
按字母
i
键进入编辑模式,复制并修改下面的配置文件,粘贴到终端,按Esc
键退出编辑模式,输入:wq
保存并退出。
(排版太挤的就先粘贴到文本文件内,修改后再使用,灵活应变。)# 设置容器的默认时区(影响日志时间、调度等) # 推荐使用 Asia/Shanghai 避免时区混乱 TIMEZONE=Asia/Shanghai # Docker 容器内部网络的子网前缀,用于指定每个服务容器的静态 IP # 例如 SUBNET_PREFIX=169.254.15,则容器 IP 会是 169.254.15.x SUBNET_PREFIX=169.254.15 # PostgreSQL 数据库密码 # 与数据库用户 panda-wiki 搭配使用(用户名固定) POSTGRES_PASSWORD=ICSeRSTePbajUHagv9wuS3Z7mUi55FBi # NATS 消息队列密码 # NATS 用于 PandaWiki 内部模块通信,如通知、任务调度等 NATS_PASSWORD=WWCngTQrFR5p5NPXU6IQAelmW2zwGDfM # JWT 签名密钥(后端服务签发与验证用户身份的令牌) # 用于鉴权 API 请求,必须足够复杂、不可泄露 JWT_SECRET=PBs3F0TaAXDpfqPecTk8TO1tclbuQlcj # MinIO 的 Secret Key,用于文件存储鉴权(对象存储 S3 接口) # 配合固定的 Access Key(s3panda-wiki)使用 S3_SECRET_KEY=3u3e975pj8SblLqWviwbk9MemDNH0SSV # Qdrant 向量搜索数据库的 API Key # 用于文档搜索、智能推荐、RAG 模块调用向量查询时鉴权 QDRANT_API_KEY=Xn2xTANOYuM3Uy7egalFoXkmAsFUAvDq # Redis 密码,用于缓存服务的认证 # PandaWiki 使用 Redis 缓存配置、任务队列等临时数据 REDIS_PASSWORD=vdy15dYTVssB9s0NB0ZOMCrMWHkUHLRK # PandaWiki 管理后台登录密码(用于首次登录 Web 控制台) # 用户名默认为:admin,首次登录后可在前端修改 ADMIN_PASSWORD=VgfHkWpotmuqYD8r4PmMYsx0IDwGS9Za # 管理后台 Web 服务暴露在宿主机的端口号 # 默认 nginx 映射容器内 8080 到宿主机的 2443 # 访问地址示例:http://<你的IP或域名>:2443 ADMIN_PORT=2443
📦 四、编写 docker-compose.yml
启动模板
执行下面的命令创建docker-compose.yml文件
vi docker-compose.yml
按字母
i
键进入编辑模式,复制并修改下面的配置文件,粘贴到终端,按Esc
键退出编辑模式,输入:wq
保存并退出。
(排版太挤的就先粘贴到文本文件内,修改后再使用,灵活应变。)services: # Caddy 作为自动 TLS 的反向代理(可选) 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 # 授权容器修改网络配置(Caddy 有时需设置监听) volumes: - ./data/caddy/caddy_config:/config # Caddy 配置文件持久化路径,可将./data/caddy/caddy_config换成完整的文件夹路径。 - ./data/caddy/caddy_data:/data # Caddy 数据存储路径,可将./data/caddy/caddy_data换成完整的文件夹路径。 - ./data/caddy/run:/var/run/caddy # UNIX socket 路径用于 admin API,可将./data/caddy/run换成完整的文件夹路径。 environment: - CADDY_ADMIN=unix//var/run/caddy/caddy-admin.sock # 管理 socket 地址 network_mode: host # 使用宿主机网络(占用 80/443) # Nginx 作为 Web 前端提供后台界面 nginx: container_name: panda-wiki-nginx depends_on: - api # 启动顺序依赖后端 API restart: always image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-nginx:v1.10.4 ports: - ${ADMIN_PORT}:8080 # 将容器 8080 映射到宿主机指定端口(默认为 2443) networks: panda-wiki: ipv4_address: "${SUBNET_PREFIX:-169.254.15}.111" # 前端应用 UI 静态资源服务 app: container_name: panda-wiki-app restart: always image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-app:v1.10.4 networks: panda-wiki: ipv4_address: "${SUBNET_PREFIX:-169.254.15}.112" # 后端主 API 服务 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:v1.10.4 volumes: - ./data/caddy/run:/app/run # 用于连接 Caddy 的 UNIX socket,可将./data/caddy/run换成完整的文件夹路径。 - ./data/conf/api:/data # 存储 API 配置,可将./data/conf/api换成完整的文件夹路径。 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:v1.10.4 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" # PostgreSQL 数据库 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 # postgres 数据库存储路径,可将./data/postgres换成完整的文件夹路径。 networks: panda-wiki: ipv4_address: "${SUBNET_PREFIX:-169.254.15}.10" # Redis 缓存 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 # redis 数据存储路径,可将./data/redis换成完整的文件夹路径。 networks: panda-wiki: ipv4_address: "${SUBNET_PREFIX:-169.254.15}.11" # MinIO 对象存储服务,兼容 S3 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 # minio 数据存储路径,可将./data/minio换成完整的文件夹路径。 environment: - MINIO_ACCESS_KEY=s3panda-wiki # 将右侧s3panda-wiki改成你实际的MINIO_ACCESS_KEY - MINIO_SECRET_KEY=${S3_SECRET_KEY} networks: panda-wiki: ipv4_address: "${SUBNET_PREFIX:-169.254.15}.12" # NATS 消息队列 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 # nats 数据存储路径,可将./data/nats换成完整的文件夹路径。 networks: panda-wiki: ipv4_address: "${SUBNET_PREFIX:-169.254.15}.13" # Qdrant 向量数据库(用于搜索/嵌入) 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 # qdrant 数据存储路径,可将./data/qdrant换成完整的文件夹路径。 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/panda-wiki-crawler:v0.5.7 container_name: panda-wiki-crawler restart: always init: true # 使用 tini 管理子进程 environment: - S3_ENDPOINT=panda-wiki-minio:9000 # 将右侧地址改成你实际的S3_ENDPOINT - S3_ACCESS_KEY=s3panda-wiki # 将右侧s3panda-wiki改成你实际的S3_ACCESS_KEY - S3_SECRET_KEY=${S3_SECRET_KEY} networks: panda-wiki: ipv4_address: "${SUBNET_PREFIX:-169.254.15}.17" # RAGlite 模块:负责 AI 召回、嵌入向量处理 raglite: image: chaitin-registry.cn-hangzhou.cr.aliyuncs.com/chaitin/panda-wiki-raglite:1-2-7 container_name: panda-wiki-raglite restart: always environment: - GIN_MODE=release - DATABASE_HOST=panda-wiki-postgres - DATABASE_USER=panda-wiki # 数据库用户 - DATABASE_PASSWORD=${POSTGRES_PASSWORD} - MINIO_HOST=panda-wiki-minio:9000 # 将右侧地址改成你实际的MINIO访问地址 - MINIO_USER=s3panda-wiki # 将右侧地址改成你实际的MINIO用户名 - 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" # 定义 PandaWiki 的私有网络配置,使用指定子网 networks: panda-wiki: ipam: driver: default config: - subnet: "${SUBNET_PREFIX:-169.254.15}.0/24"
查看当前项目文件夹路径
pwd
授权该项目文件夹内的读写权限(部分NAS系统需要【如群晖】,否则容器无读写权限访问运行,按需执行。)
# 把/vol1/1002/PandaWiki/换成你自己实际的文件夹路径 chmod -R 777 /vol1/1002/PandaWiki/
🧯 五、启动容器服务
执行以下命令自动拉取镜像并后台运行所有服务:
docker compose up -d 或 docker-compose up -d
🧾 六、查看日志确认启动状态
实时查看容器日志(按
Ctrl+C
可中断并退出):docker compose logs -f 或 docker-compose logs -f
🌐 七、首次访问 PandaWiki
打开浏览器,以NAS的IP+设置的端口号进行访问。
例如:https://192.168.2.5:2443
初始账号密码如下:
用户名:admin
密码:
.env
文件中设定的密码(本文中默认:VgfHkWpotmuqYD8r4PmMYsx0IDwGS9Za
)
🤖 八、添加 AI 模型(首次登录必做)
1. 登录后点击 “去添加模型”
登陆成功,必须要添加AI模型才能使用。
我们以【硅基流动】为例,它支持注册即送额度,适合入门(其他的得先充钱才能用💰),点此直达跳转领免费额度的注册地址。
快速注册后进入后台,点击账户管理 > API 密钥 > 新建 API 密钥。
创建新 API 密钥,复制备用
2. 返回 PandaWiki,粘贴密钥
Chat 模型选择 “硅基流动”
粘贴 API Key
选择模型(建议选择推理型,因为我们是文本内容知识库。)
点击保存
📚 九、创建你的第一个知识库
设置知识库名称
设置访问端口(⚠️ 飞牛NAS 的 80 端口通常被占用,建议使用其他自定义端口)
点击创建
✍️ 十、添加文档与 AI 编辑功能体验
PandaWiki 支持:
创建文档以及分类文件夹
内容页支持 富文本编辑、AI 润色、总结
以及AI智能生成摘要
知识库支持独立页面访问
轻松创建专属的内容知识库
外观简洁,但内在强大,后台配置丰富,助力打造专属页面。
大厂出品,必属精品!随着后期越来越多的开发者进行贡献, PandaWiki 知识库系统会越来越强大,远非个人开发者可比!
✅ 总结:在 NAS 上拥有你的 AI 知识中心
通过以上步骤,你已经成功在本地 NAS 上搭建起一套功能完整、可 AI 驱动的 PandaWiki 知识库系统。
下一步可以:
接入更多模型(如 DeepSeek、OpenAI)
上传你的项目文档、学习资料
与团队协作共享知识
🔗相关地址
官网地址:https://pandawiki.docs.baizhi.cloud/node/0197160c-782c-74ad-a4b7-857dae148f84
GitHub项目地址:https://github.com/chaitin/PandaWiki
硅基流动(领取免费额度)注册地址:https://cloud.siliconflow.cn/i/Uc0SM63Y
购买低价云服务器:https://www.crash.work/aff/CJWFABNM
文末
👇👇👇
- 感谢你赐予我前进的力量