知识库MaxKB 从零搭建 → AI智能体对外发布 技术清单(完整复盘)
说明:构建智能体机器人,嵌入主页发布,以下全部来自本次会话真实落地过程;带「💡讲解」的是原理说明。
采用多种技术, Docker 容器化层、 frp 内网穿透层,并对链路图、坑位表、总结做同步记录。
一、基础设施层
| 技术/组件 | 用途 | 备注 |
|---|---|---|
| 腾讯云 Windows 云主机 | 承载 frps / Nginx / Docker 宿主 | 非生产环境;Administrator 账户运行 |
| Windows Server | 操作系统底座 | 使用 Windows 任务计划程序、cmd/PowerShell |
| 阿里云云解析 DNS | 域名解析托管 | 主机在腾讯云、解析在阿里云(这是关键认知) |
域名ai.dql5251.top | MaxKB 对外访问子域 | 8083 端口绑定 ai 子域;域名ai.dql5251.top:8083 |
💡讲解:很多同学会把“主机厂商”和“DNS 厂商”搞混。HTTP 请求打到主机 IP 后由 Nginx 处理,但证书 DNS-01 挑战验证 TXT 记录时,只认域名解析在哪一家→ 所以走阿里云 DNS API,不走腾讯云。
二、Web 发布层(Nginx)
| 技术/组件 | 用途 |
|---|---|
| Nginx for Windows | 反向代理 + HTTPS 终结 |
nginx.conf单server块 | 精简配置,避免多 server 冲突 |
error_page 497 =301 https://$host:8083$request_uri | HTTP→HTTPS 强制跳转(497 是非 HTTPS 请求专用码) |
| 端口规划:8083 ssl(ai 子域) | 端口隔离,清晰对照云主机本地 8082(内网穿透给到本地8081端口) |
nginx -t语法校验 | 每次改配置必过 |
nginx -s reload | 证书替换后零中断重载 |
💡讲解:MaxKB 本身监听容器内部端口,对外不直接暴露,由 Nginx 反代出来;nginx.conf里证书路径固定指向C:/nginx/certs/ai.DQL5251.top-*.pem,所以证书覆盖后 reload 即可生效,配置文件一行不用改。
三、HTTPS 证书自动化层
| 技术/组件 | 作用 |
|---|---|
| Git for Windows 2.56 | 提供Git Bash(MSYS2/MinTTY)终端环境,是跑 acme.sh 的前置依赖 |
Gitee 镜像git clone | 绕过 GitHub 被阻断,拉取 acme.sh 源码 |
| acme.sh(官方脚本) | Let’s Encrypt 客户端,负责签发+续签 |
| Let’s Encrypt(CA) | 免费 DV 证书,90 天有效期 |
--server letsencrypt | 切换默认 CA |
dns_aliDNS-01 插件 | 通过阿里云 API 自动增删_acme-challengeTXT 记录,不占 80 端口 |
阿里云 RAM 子账号AccessKey(Ali_Key/Ali_Secret) | DNS 写入凭证(⚠️最小权限原则) |
--install-cert部署钩子 | 续签成功后自动拷贝 fullchain/key 到 nginx certs 目录 |
Windows 任务计划程序任务名acme.sh.cron | 每天触发一次acme.sh --cron |
| 续签判断策略 | cron 内部判断剩余<30天才真续,每天跑≠每天签 |
💡讲解(自动续签完整链路):
[Windows 任务计划 acme.sh.cron] 每天触发 │ ▼ [acme.sh --cron] ├─ 剩余 > 30 天 → Skip(不消耗 Let's Encrypt 配额) └─ 快到期 → dns_ali 自动加 TXT → 签发 → 覆盖 pem → nginx -s reload证书替换是 acme.sh 钩子干的,不是计划任务直接 copy 文件。
四、Docker 容器化层(本次新增) 🆕
| 技术/组件 | 用途 |
|---|---|
| Docker Engine(Windows) | 容器运行时,把 MaxKB 跑在隔离容器里 |
| Docker Image(MaxKB 官方镜像) | 一键拉取,免去手动装 Python/依赖的繁琐 |
| Container(容器实例) | MaxKB 实际运行载体,内部监听8080 |
端口映射-p | 容器8080→ 宿主机8081(或 8082) |
Volume 挂载-v | 持久化知识库、向量数据、日志(容器删除数据不丢) |
docker-compose.yml | 声明式编排,一键 up / down / 重启 |
docker logs/docker ps | 排错与状态查看 |
💡讲解:用 Docker 装 MaxKB 的最大好处是环境隔离、一键迁移、版本回滚。不用 Docker 就得在宿主机上装一堆 Python 依赖,版本冲突风险高;用容器后,docker compose up -d一条命令就能起服务,换机器也只需拷走 compose 文件 + volume 目录。
端口流向:容器 8080→(映射)→宿主机 8081→(frp 隧道 / 本地反代)→Nginx 8083→ 公网。
五、frp 内网穿透层 🆕
| 技术/组件 | 作用 |
|---|---|
| frp(fast reverse proxy) | 高性能反向代理,实现内网穿透 |
| frps(服务端) | 跑在有公网 IP 的腾讯云主机上,监听外部端口 |
| frpc(客户端) | 跑在内网机器上,主动连 frps 建隧道 |
frps.toml/frpc.toml | 配置文件(新版本用 TOML 格式) |
TCP 类型代理(type = "tcp") | 把 MaxKB 的端口映射出去 |
| 自定义端口(如 7000 控制面、7500/7400 数据面板服务端和客户端) | 需腾讯云安全组放行 启用端口:7000,7400,7500 |
tls.enable = true | 隧道加密,防止明文传输 |
authentication.method = "token" | 客户端服务端鉴权,防未授权连接 |
💡讲解:frp 解决的是"内网服务没有公网 IP / 被防火墙挡住"的问题。MaxKB 跑在本地内网机器上,frpc 主动向外建立长连接隧道,外部请求经公网 frps 转发进来,Nginx 再反代到 frps 暴露的端口。
最小配置示例:
frps.toml(腾讯云公网主机):
bindPort = 7000 --auth.method = "token" --auth.token = "你的复杂随机token"frpc.toml(内网机器):
serverAddr = "腾讯云公网IP" serverPort = 7000 --auth.method = "token" --auth.token = "和frps一致的token" [[proxies]] name = "maxkb" type = "tcp" localIP = "127.0.0.1" localPort = 8081 # docker内部MaxKB端口8080,映射到宿主机后的8081 remotePort = 8082 # 远程端口8082 给到云主机, Nginx反代外部应用 8083腾讯云安全组需放行:
7000(控制面)、8083(数据面)、443/80(Nginx)。
六、MaxKB 应用本身
| 技术/点 | 说明 |
|---|---|
| MaxKB 社区版 | GPLv3 开源,无需注册会员,本地免费 |
| MaxKB-Embedding | 本地向量化模型,不上云、不调云 API、不产生费用 |
| Markdown(.md)知识源 | 放弃 Web URL 抓取(飞书/语雀有登录鉴权+JS动态渲染,抓不到) |
| 手工导出 MD → 上传 | 知识入库正确姿势 |
| QA 格式分段 | 提升命中率的标准切分方式 |
| 相似度阈值 0.75 | 调优后命中率明显改善 |
| 简易智能体(非高级工作流) | 公司介绍类“问答检索”场景,简易智能体=表单黑盒检索就够了;高级工作流易接错 |
| 应用↔知识库关联绑定 | 排错关键点:不关联新库 / 未向量化成功 是问答不命中的两大主因 |
💡讲解:高级智能体适合多步编排、外部API串联;纯知识库问答选简易,稳定、好排查。
七、辅助工具链
| 工具 | 场景 |
|---|---|
| OpenSSL(Git 捆绑) | 证书查看、到期日核验:openssl x509 -dates |
| PowerShell(管理员) | 任务计划查看/排错、frp 服务安装 |
| notepad++/文本编辑器 | 改 bat、改 conf、改 toml |
| 浏览器开发者工具 | 点地址栏小锁核验证书链 |
| Docker CLI | 容器管理、docker compose编排 |
八、端到端发布链路图(完整版)
[用户浏览器] │ https://ai.dql5251.top:8083 ▼ ┌─────────────────────────────────────────────────────┐ │ 腾讯云公网主机 │ │ │ │ [Nginx :8082 HTTPS 本地] │ │ │ proxy_pass │ │ ▼ │ │ [frps :8082] ◀────── TCP 隧道(TLS 加密)────────┐ │ │ │ │ │ └────────│────────────────────────────────────────────┘ │ │ │ ┌─────────────┘ │ ▼ │ [frpc](内网机器) │ │ │ ▼ │ [宿主机 :8081] │ │ 端口映射 │ ▼ │ [Docker 容器 :8080] │ │ │ ▼ │ [MaxKB 服务] │ └─ 证书文件 ←── acme.sh 钩子自动覆盖 ▲ │ 每天由 Windows 任务计划 acme.sh.cron 触发 │ [阿里云DNS dns_ali 自动TXT验证]端口流向一览:
| 段 | 协议/端口 | 说明 |
|---|---|---|
| 浏览器 → Nginx | HTTPS8083 | 用户访问入口 |
| Nginx → frps | TCP `:8082 | 反代到 frps 暴露端口 |
| frps ↔ frpc | TCP:7000(控制面)+:7500(服务端数据面)+7400(客户端数据面板) | 加密隧道穿越防火墙 |
| frpc → 宿主机 | TCP:8081 | 内网机器本地转发 |
| 宿主机 → 容器 | TCP8081:8080 | Docker 端口映射 |
| 容器内部 | :8080 | MaxKB 实际监听 |
九、本次踩过的典型坑(沉淀为经验)
| # | 现象 | 根因 | 正确做法 |
|---|---|---|---|
| 1 | Web URL 抓不到飞书/语雀 | 登录态+JS渲染 | 导出 MD 上传 |
| 2 | 问答不命中 | 应用未关联新库/未向量化 | 检查关联+重向量化+阈值0.75,命中测试 |
| 3 | acme.sh: command not found | 安装中断 alias 未写 | 用绝对路径~/.acme.sh/acme.sh |
| 4 | You don't specify aliyun api key | 环境变量以域名所在为准 | 须是Ali_Key/Ali_Secret**; |
| 5 | curl 红字 35/28 | DNS检查阶段网络抖动 | 自动重试成功即可忽略 |
| 6 | schtasks参数报错 | 在Git Bash里跑了 Windows 原生命令 | 查计划任务走图形界面taskschd.msc或 CMD/PowerShell |
| 7 | 主机腾讯云却用 dns_tencent | 混淆主机与解析 | 看解析在哪就用哪个 dns 插件 |
| 8 | 名称识别异常 | l和1不分,L小写和数字1 难区分,界面识别难 | 换名,手写确认 |
| 9 | frp 隧道连不上 | 安全组没放行 7000 | 腾讯云控制台放行控制面端口 |
| 10 | 隧道通但网页打不开 | frpcremotePort与 Nginx 反代端口不一致 | 对齐 remotePort 与 proxy_pass |
| 11 | Docker 容器端口冲突 | 宿主机 8081 被占用 | netstat -ano查占用,换端口或停掉占用进程 |
| 12 | 容器重启后数据丢失 | 没挂 volume | compose 里声明-v持久化目录 |
十、技术栈全景一句话
Docker 容器化 MaxKB→frp 内网穿透打通公网→Nginx 反代 + Let’s Encrypt(dns_ali) 全自动证书 HTTPS 终结→阿里云 DNS 解析,
四层各司其职,实现"内网服务安全发布到公网、证书零人工续签"的完整闭环。
附录:分层速查表
| 层级 | 核心技术 | 关键配置/命令 |
|---|---|---|
| 基础设施 | 腾讯云 + 阿里云DNS | 安全组放行 80/443/7000/8083 |
| 容器层 | Docker + docker-compose | -p 8081:8080、volume 挂载 |
| 穿透层 | frp (frps + frpc) | token 鉴权、TLS 加密、remotePort 对齐 |
| 发布层 | Nginx | proxy_pass指 frps 端口、497 跳转 |
| 证书层 | acme.sh + dns_ali | --install-cert钩子 + 计划任务 |
| 应用层 | MaxKB 社区版 | 简易智能体 + MD 知识源 + 阈值 0.75 |