在家庭服务器上自建 FastGPT,知识库用本地 Markdown 和图片,模型走外部 API,不必在家里跑大模型。外网访问用 Cloudflare Tunnel,不需要公网 IPv4、DDNS 或路由器端口转发。
下文按 FastGPT 稳定版 v4.16(实际拉取的 App 镜像为 v4.16.2)整理。版本更新后向导选项和配置项可能变化,请以当时官方文档为准。
凭证只留在服务器上安装过程和 Cloudflare 会生成 root 密码、数据库口令、API Key 和 Tunnel Token。这些只在本机填写、保存,不要贴到公开笔记或截图里或AI聊天里。
1. 方案与环境
推荐做法:
- FastGPT 用独立 Docker Compose 部署,数据库和附件放在本机目录。
cloudflared以系统服务运行,把本机回环地址上的端口映射到自己的域名。- 向量库选用 PostgreSQL + pgvector。
- 聊天、索引、重排都走外部 API,降低本机算力需求。
示例环境:4 核、16GB 内存的 x86 小主机,Ubuntu 24.04 LTS,已安装 Docker 与 Compose。近年 Intel 小主机一般支持 AVX / AVX2,不必为此降级 MongoDB。若 CPU 不支持 AVX,再查 MongoDB 官方说明。
部署目录示例:/opt/fastgpt。
NOTE本机若已有面板、博客、数据库或其他容器,先确认端口和内存,不要直接使用官方默认的 MinIO
9000/9001。下文用覆盖文件把服务绑到127.0.0.1,只给 Tunnel 访问。
2. 部署前检查资源
先看内存、负载、容器和监听端口:
free -huptimesudo docker stats --no-streamsudo docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}'sudo ss -lntp普通用户访问 Docker socket 可能报 permission denied,加上 sudo 即可,不必重装 Docker。
如果机器上有已经不用、但很占内存的服务,先停掉并关闭开机自启,数据可以先留着。以 GitLab 为例:
sudo gitlab-ctl statussudo systemctl status gitlab-runsvdir --no-pagersudo gitlab-ctl stopsudo systemctl disable --now gitlab-runsvdir这不会卸载软件,也不会删除仓库和数据库。是否彻底清理可以以后再决定。
重点看 free -h 的 available,不要只看 free 列。Linux 会把空闲内存拿去当文件缓存,这部分可以回收。
3. Cloudflare Tunnel
3.1 创建与安装
控制台入口因界面版本而异,可能在「网络 → 隧道」,或 Zero Trust 的网络 / 连接器页面。新建一条隧道,名称自定即可。
操作系统选 Debian、64-bit:Ubuntu 可用 Debian 安装包;常见 Intel / AMD 小主机是 amd64,不要选 arm64。
按 Cloudflare 页面给出的官方命令安装,再执行页面生成的服务安装命令。
cloudflared --versiondpkg-query -W -f='${Status}\n' cloudflared正常时应看到版本号,包状态为 install ok installed。
3.2 安装时报 dpkg 错误
如果日志里出现类似:
update-alternatives: 候选项路径 /etc/mysql/mariadb.cnf 不存在多半是本机原先未配置完整的 mariadb-common、libmariadb3 或 mariadb-client 在捣乱。cloudflared 本身往往已经装好。
先确认 cloudflared 包状态,再继续配隧道。不要急着重装、自动清理或覆盖 /etc/mysql,以免伤到面板和现有数据库。MariaDB 的包管理问题可以另外修。
3.3 Token 文件不存在
检查服务:
sudo systemctl status cloudflared --no-pager -lsudo journalctl -u cloudflared --since "10 minutes ago" --no-pager -n 40若服务命令类似:
/usr/bin/cloudflared --no-autoupdate tunnel run --token-file /etc/cloudflared/token而日志是:
Failed to read token file: open /etc/cloudflared/token: no such file or directory就需要补建 Token 文件。下面必须分段执行:先跑 read,看到提示后再粘贴 Token,不要把 Token 写进命令历史或文档。
sudo systemctl stop cloudflaredsudo install -d -m 700 /etc/cloudflaredsudo -v单独执行:
read -r -s -p "请粘贴Token并按回车:" cf_tunnel_token输入后再执行:
printf '\n'if [ -n "$cf_tunnel_token" ]; then printf '%s' "$cf_tunnel_token" | sudo tee /etc/cloudflared/token >/dev/null sudo chmod 600 /etc/cloudflared/tokenelse echo "没有输入 Token,请重试"fiunset cf_tunnel_tokensudo systemctl restart cloudflared变量名必须带$如果写成
"cf_tunnel_token"而漏掉$,文件里会存进字面量,随后报Provided Tunnel token is not valid.。正确写法是"$cf_tunnel_token"。不要用
cat打印 Token 文件来排查。检查非空即可:Terminal window sudo test -s /etc/cloudflared/token && echo "token 文件非空"
3.4 域名路由
在隧道的「已发布的应用程序 / 公共主机名」里添加路由,不要自己在 DNS 里新建指向内网的 A 记录。隧道路由会写入对应 DNS。
把下面的域名换成你自己的:
| 用途 | 主机名示例 | 源站 |
|---|---|---|
| FastGPT 主站 | gpt.example.com | http://127.0.0.1:3300 |
| 附件 / MinIO | files.example.com | http://127.0.0.1:39000 |
| 代码沙箱 | sandbox.example.com | http://127.0.0.1:3006 |
路径留空;服务 URL 必须带 http://。本机用 HTTP,用户访问域名走 HTTPS。
IMPORTANT不要把局域网地址填进 A 记录。上面的
127.0.0.1只适合cloudflared和 FastGPT 跑在同一台机器、且作为系统服务的情况。如果改成 Docker 桥接网络里的容器,连接地址也要跟着改。
沙箱子域容易漏配。主站能打开之后,到隧道日志里确认三条路由都在。
4. 生成 FastGPT 配置
sudo mkdir -p /opt/fastgptsudo chown "$(id -un):$(id -gn)" /opt/fastgptcd /opt/fastgptumask 077curl -fL --retry 3 https://doc.fastgpt.cn/deploy/install.sh -o install.shbash -n install.sh国内域名失败时,可改用 https://doc.fastgpt.io/deploy/install.sh。
首次生成配置:
FASTGPT_REGION=cn \FASTGPT_VECTOR=pg \FASTGPT_AUTO_GENERATE_CREDENTIALS=true \FASTGPT_FE_DOMAIN=https://gpt.example.com \FASTGPT_PORT=3300 \bash install.sh把 FASTGPT_FE_DOMAIN 换成你的主站 HTTPS 地址。向导里选择稳定版 v4.16,并填写:
- Sandbox WebSocket:
wss://sandbox.example.com - Sandbox 预览:
https://sandbox.example.com - Sandbox 宿主机端口:
3006
脚本会随机生成 root 密码、服务 Token 和数据库凭证。把原配置备份好,以后不要直接重跑生成流程覆盖已有凭证。
v4.16 向导可能不会询问 S3 外部地址,不要照搬旧教程强行加存储变量。附件的外网访问和引用行为,以你实际上传测试为准。
常见组件包括 App、Plugin、AIProxy,以及 PostgreSQL、pgvector、MongoDB、Redis、MinIO、Code Sandbox、Agent Sandbox Proxy、OpenSandbox Server、Volume Manager。
5. 端口与并发覆盖文件
先备份官方生成的 Compose 文件:
cd /opt/fastgptcp -p docker-compose.yml "docker-compose.yml.bak-$(date +%Y%m%d-%H%M%S)"chmod 600 docker-compose.yml新建 /opt/fastgpt/docker-compose.override.yml。作用有两件:把端口绑到回环地址,避免和本机已有 9000 / 9001 冲突;把解析并发压到适合小主机的水平。
services: fastgpt-app: ports: !override - "127.0.0.1:3300:3000" environment: DATASET_PARSE_MAX_PROCESS: "2" VECTOR_MAX_PROCESS: "2" QA_MAX_PROCESS: "1" VLM_MAX_PROCESS: "1"
fastgpt-agent-sandbox-proxy: ports: !override - "127.0.0.1:3006:1006"
fastgpt-minio: ports: !override - "127.0.0.1:39000:9000" - "127.0.0.1:39001:9001"!override 会整段替换端口列表,避免新旧映射叠在一起。需要 Compose 2.24.4 或更高。默认的 docker compose 命令会读取这个覆盖文件。
chmod 600 docker-compose.override.ymlsudo docker compose config --quietWARNING完整的
docker compose config输出可能带上数据库密码等凭证,不要复制到聊天或公开文档。
16GB 内存的机器上,上述并发比较稳妥。内存更宽裕再逐步加大。
6. 拉取、启动与验证
cd /opt/fastgptsudo docker compose --profile prepull pullSSH 断开或机器重启后,不确定是否拉完,可以再执行一次。Docker 会复用已经下完的镜像层。
拉取结束后立刻看退出码:
echo "拉取退出码:$?"为 0 后再启动:
sudo docker compose up -dsudo docker compose ps -afree -hcurl -I --max-time 15 http://127.0.0.1:3300预期:列出的常驻容器为 Up,带健康检查的为 healthy;本机主站返回 HTTP 200。再看一次 available 内存,确认还有余量。
7. 外网 Error 1033:OpenClash Fake-IP
本机 curl 已经 200,域名却显示 Cloudflare Error 1033,说明边缘连不上这条隧道。
sudo systemctl is-enabled cloudflaredsudo systemctl is-active cloudflaredsudo journalctl -u cloudflared --since "10 minutes ago" --no-pager -n 40enabled / active 只表示进程在跑,不表示隧道已经连上 Cloudflare。若路由器开了 OpenClash(或同类 Fake-IP 模式),失败日志里常能看到:
ip=198.18.3.173ip=198.18.3.174failed to dial to edge with quic: timeout: no recent network activity198.18.0.0/16 是 Fake-IP 段。cloudflared 必须解析到 Cloudflare 边缘的真实地址,不能走这套虚假 IP。
处理步骤:
- 在默认黑名单模式的 Fake-IP 过滤列表里追加
+.argotunnel.com、+.cftunnel.com,让这些域名解析为真实 IP。输入格式取决于 OpenClash 编辑框,不要整份覆盖 DNS 配置。 - 在已有的持久化自定义规则里,于
rules:下添加:
rules: - DOMAIN-SUFFIX,argotunnel.com,DIRECT - DOMAIN-SUFFIX,cftunnel.com,DIRECT不要再创建第二个 rules:;新规则不要带 # 注释。放到宽泛代理规则之前,启用自定义规则后保存应用。
本机清缓存并复查:
sudo resolvectl flush-cachesgetent ahostsv4 region1.v2.argotunnel.comgetent ahostsv4 region2.v2.argotunnel.comsudo systemctl restart cloudflaredsudo journalctl -u cloudflared --since "2 minutes ago" --no-pager -n 30正常日志会回到 198.41.* 一类 Cloudflare 地址,DNS / UDP / TCP 检查为 PASS,并出现多条 Registered tunnel connection。之后主站外网即可访问。
TIPQUIC 能通则不必强制 HTTP/2。若你这边 UDP 仍不通,再试 HTTP/2。Cloudflare Tunnel 出站端口是 7844(QUIC 用 UDP,HTTP/2 用 TCP),不需要在路由器上开放入站端口。
8. 配置模型
8.1 聊天模型(以 DeepSeek 为例)
在管理员后台打开模型提供商配置。
「模型渠道」负责 API 地址、密钥和可路由的模型;「模型配置」还要单独启用模型。只开渠道时,默认模型下拉框仍可能是空的。
渠道示例:
- 协议:DeepSeek
- 地址:页面默认
https://api.deepseek.com/v1 - 密钥:该服务商自己的 API Key
- 名称一致时,模型映射填
{}
页面上的「代理地址」指模型 API 地址,不是路由器上的 HTTP 代理。
模型 ID 更新很快,以你账号实际可用的模型和官方文档为准。接通后,在「模型配置」里启用,再设为默认聊天模型。
8.2 索引与重排(以硅基流动为例)
一套可用的组合:
- 索引:
BAAI/bge-m3 - 重排:
BAAI/bge-reranker-v2-m3 - 渠道地址:
https://api.siliconflow.cn/v1 - 使用该服务商自己的 Key,不要复用聊天模型的 Key
常见错误:
- 渠道里写成
bge-m3这类短名称,提示模型不存在。应与服务商完整 API ID 对齐。 - 渠道测试成功,模型配置测试失败。通常是主配置 ID 和渠道允许的模型列表不一致。主配置若用
BAAI/bge-m3,渠道里也要包含这个完整 ID。
若上游实际走 Pro 路径,可在渠道映射里写:
{ "BAAI/bge-m3": "Pro/BAAI/bge-m3"}左边是 FastGPT 发出的模型 ID,右边是上游接收的 ID。两边相同就保持 {}。
建议默认:语言和文本理解用聊天模型;索引用 BGE-M3;重排用 BGE Reranker;语音可以先不配。
NOTE旧教程常通过
OPENAI_BASE_URL、CHAT_API_KEY和一份 JSON 模型列表来配硅基流动。v4.16 已改为界面渠道管理,不要照抄旧环境变量去覆盖现有配置。
8.3 图片理解
视觉模型和普通 Flash 是否支持图片,以执行时的官方文档为准。DeepSeek 视觉说明见文末链接。
在 FastGPT 中新增对应模型、打开视觉能力、加入同一渠道,先小范围测一张图,再设为图片理解模型。模型 ID 和能力表更新频繁,以实际调用结果为准。
9. 社区版与图文知识库
官方功能对比里,图片知识库属于商业版 / 云服务能力。配了视觉模型,不等于社区版会出现原生「图片入库 / 图片索引」入口。
把 Markdown 丢进知识库时,文中的相对图片链接也不会因为你在库里建了 figures 文件夹就自动生效。需要实际上传图片,并改写链接。
如果知识库来自本地「章节 Markdown + 配图」工程,比较稳妥的做法是:
- 工程清单文件通常只描述结构,并不等于带齐全部资源的压缩包。
- 按清单读取章节 Markdown 和图片目录。
- 上传时保留章节、页码、图号等信息,把链接改成 FastGPT 能访问的地址。
- 若还需要按图像内容检索,先生成图像说明,再参与文本索引。
- 批量导入建议做成可增量、可失败重试的同步,而不是一次性手工上传。
先用一章验证分块、问答引用和图片显示,再批量导入。
10. 上线后建议
- 确认沙箱子域已经写进隧道路由。
- 给主站加上访问控制(例如 Cloudflare Access,只放行自己的账号)。附件域名不要直接套交互式登录页,除非已经验证服务端拉文件不受影响。
- 备份不要只复制正在写入的数据库目录。需要涵盖数据库一致性备份、附件、Compose 文件和同步状态。
- 本机若还有数据库监听在
0.0.0.0或 IPv6 上,检查防火墙。监听所有接口不等于已经暴露到公网,但这些端口也不应加入 Tunnel。 - 若安装 cloudflared 时留下了残缺的 MariaDB 包问题,单独修复,不要和 FastGPT 绑在一起处理。
11. 参考
评论
正在加载评论…