还在为团队知识散落各处、查找困难头疼吗?或者想找个智能又强大的知识库平台,把产品文档、技术笔记、FAQ统统管起来?最近我发现了个宝藏——PandaWiki!这款由AI大模型驱动的开源知识库系统,不仅能搞定富文本编辑、多格式导出,更能玩转AI创作AI问答AI搜索智能化程度拉满!

心动想试试?但官方目前只提供了一键安装脚本,对于喜欢手动掌控、尤其是在NAS上折腾Docker的朋友,是不是有点小遗憾?别急!经过一番摸索,我亲自搞定了在NAS上通过Docker手动部署PandaWiki知识库的全过程!

这篇详细图文教程,就是为你准备的!带你一步步绕过脚本,亲手在NASDocker环境里,把这个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 服务
    fnOS open SSH.png

  • 使用终端工具(如 Terminus / PuTTY)连接到 NAS

  • 登录后输入 sudo -i 切换到 root 用户

    sudo -i

2. 新建项目文件夹并进入

  • 在飞牛文件管理器中新建项目文件夹,例如 /vol1/1002/PandaWiki,右键文件夹选项中 > 详细信息 > 复制原始路径。
    image-CsSj.avif

  • 在终端执行命令进入项目文件夹内

    # 将/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 环境变量文件

  1. 执行命令创建.env 环境变量文件

    vi .env
  2. 按字母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 启动模板

  1. 执行下面的命令创建docker-compose.yml文件

    vi docker-compose.yml
  2. 按字母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"
    
  3. 查看当前项目文件夹路径

    pwd
  4. 授权该项目文件夹内的读写权限(部分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
    image-yhlE.avif


🤖 八、添加 AI 模型(首次登录必做)

1. 登录后点击 “去添加模型”

登陆成功,必须要添加AI模型才能使用。
image-cAKX.avif

我们以【硅基流动】为例,它支持注册即送额度,适合入门(其他的得先充钱才能用💰),点此直达跳转领免费额度的注册地址

  • 快速注册后进入后台,点击账户管理 > API 密钥 > 新建 API 密钥

  • 创建新 API 密钥,复制备用
    image-AGhi.avif

2. 返回 PandaWiki,粘贴密钥

  • Chat 模型选择 “硅基流动”

  • 粘贴 API Key

  • 选择模型(建议选择推理型,因为我们是文本内容知识库。)

  • 点击保存
    image-IvbP.avif


📚 九、创建你的第一个知识库

  1. 设置知识库名称

  2. 设置访问端口(⚠️ 飞牛NAS 的 80 端口通常被占用,建议使用其他自定义端口)

  3. 点击创建
    image-qlin.avif


✍️ 十、添加文档与 AI 编辑功能体验

PandaWiki 支持:

  • 创建文档以及分类文件夹
    image-EnZK.avif

  • 内容页支持 富文本编辑、AI 润色、总结
    image-Uxxh.avif

  • 以及AI智能生成摘要
    image-uZgp.avif

  • 知识库支持独立页面访问
    image-dEBj.avif

  • 轻松创建专属的内容知识库
    image-Whhx.avif

  • 外观简洁,但内在强大,后台配置丰富,助力打造专属页面。
    image-fXoJ.avif

  • 大厂出品,必属精品!随着后期越来越多的开发者进行贡献, PandaWiki 知识库系统会越来越强大,远非个人开发者可比!


✅ 总结:在 NAS 上拥有你的 AI 知识中心

通过以上步骤,你已经成功在本地 NAS 上搭建起一套功能完整、可 AI 驱动的 PandaWiki 知识库系统。

下一步可以:

  • 接入更多模型(如 DeepSeek、OpenAI)

  • 上传你的项目文档、学习资料

  • 与团队协作共享知识


🔗相关地址


文末

👇👇👇