我最近看到很多人想做“公司内部知识库 AI 问答”,但第一步就选错工具。
有的人直接把 PDF 丢给 ChatGPT,方便是真方便,但合同、客户资料、内部 SOP 全都要上传到第三方平台;有的人部署 Dify,功能很全,但只是想让几个人查文档,反而觉得流程重;还有人装 Open WebUI,聊天体验不错,但文档知识库这块不一定是最顺手的入口。
如果你的需求很具体:
上传一批文档,然后让 AI 按这些资料回答问题。
AnythingLLM 就挺适合。
它不是单纯的聊天壳子,也不是复杂的 AI 应用开发平台。更像一个“私有文档问答后台”:你建 Workspace,上传 PDF、Markdown、TXT、网页内容,配置模型和向量检索,然后就能围绕这些资料聊天。
这篇按 VPS 自托管的方式讲:怎么部署、VPS 要多大、OpenAI 和 Ollama 怎么选、哪些数据一定要备份、哪些坑别踩。
别看到 AI 工具热门就直接装。
我会这样判断:
| 需求 | 适不适合 AnythingLLM | 更适合的工具 |
|---|---|---|
| 私有文档问答 | 适合 | AnythingLLM |
| 多人共享知识库 | 适合 | AnythingLLM Docker |
| 做复杂 AI 工作流 | 一般 | Dify / n8n |
| 只是和本地模型聊天 | 一般 | Open WebUI |
| 统一多个模型 API | 不适合 | One-API / New-API / LiteLLM |
| 做客服嵌入网站 | 可以 | AnythingLLM Chat Widget |
一句话:AnythingLLM 的强项是文档、Workspace、RAG 和团队访问。
如果你只是想问模型“帮我写一段文案”,Open WebUI 更直接。你要做一整套 AI 应用编排,Dify 更像平台。你要把公司资料、产品文档、教程、合同模板放进去查,AnythingLLM 更贴近需求。
这里要分两种情况。
这种最省 VPS 资源。模型推理不在你的 VPS 上跑,VPS 只负责:
- AnythingLLM Web 后台
- 文档上传和切分
- 向量索引
- 用户登录和工作区
- 和外部 LLM API 通信
配置建议:
| 用法 | VPS 配置 |
|---|---|
| 个人测试 | 1 核 / 2GB / 20GB SSD |
| 小团队 2-5 人 | 2 核 / 4GB / 40GB SSD |
| 文档较多、多人使用 | 4 核 / 8GB / 80GB SSD |
如果你只是接 OpenAI API,不需要 GPU。
很多人一听“AI 工具”就去找 GPU VPS,其实没必要。你用云端模型时,真正烧钱的是 API 调用,不是 VPS 算力。
这就完全不一样了。
Ollama 跑 7B 小模型,内存就会明显吃紧。CPU 也能跑,但速度不会快;没有 GPU 的情况下,生成速度可能慢到你怀疑服务坏了。
我的建议:
| 模型方案 | 建议配置 |
|---|---|
| 只跑 AnythingLLM + 云端模型 | 2 核 4GB 就够舒服 |
| AnythingLLM + Ollama 小模型 | 4 核 16GB 起步 |
| 想跑更大的本地模型 | GPU 服务器或本地显卡机器 |
所以别拿 1C1G 小鸡硬跑本地大模型。能启动不代表能用,能回答不代表体验好。
这篇用 Ubuntu / Debian 系 VPS 举例。
先 SSH 登录:
ssh root@your_server_ip
更新系统:
apt update && apt upgrade -y
安装基础工具:
apt install -y ca-certificates curl gnupg ufw
检查系统资源:
free -h
df -h
AnythingLLM 默认监听 3001 端口。先确认没被占用:
ss -tlnp | grep 3001
如果没输出,说明端口空着。
如果 VPS 还没装 Docker,可以用官方仓库安装。
添加 Docker GPG key:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
添加 Docker 源:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list
安装 Docker:
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
确认版本:
docker --version
docker compose version
官方 Docker 部署思路很直接:准备一个持久化目录,把它挂载到容器的 /app/server/storage。
我建议把数据放到 /opt/anythingllm:
mkdir -p /opt/anythingllm
cd /opt/anythingllm
touch .env
运行容器:
docker run -d \
--name anythingllm \
--restart unless-stopped \
-p 3001:3001 \
--cap-add SYS_ADMIN \
-v /opt/anythingllm:/app/server/storage \
-v /opt/anythingllm/.env:/app/server/.env \
-e STORAGE_DIR="/app/server/storage" \
mintplexlabs/anythingllm:latest
看容器状态:
docker ps --filter "name=anythingllm"
看日志:
docker logs anythingllm --tail=100
浏览器访问:
http://your_server_ip:3001
第一次进入会走初始化向导,创建管理员账号,然后选择 LLM Provider、Embedding Provider 和向量数据库。
如果你更习惯 Compose,可以这样写。
创建目录:
mkdir -p /opt/anythingllm
cd /opt/anythingllm
touch .env
创建 docker-compose.yml:
services:
anythingllm:
image: mintplexlabs/anythingllm:latest
container_name: anythingllm
restart: unless-stopped
ports:
- "127.0.0.1:3001:3001"
cap_add:
- SYS_ADMIN
environment:
STORAGE_DIR: /app/server/storage
JWT_SECRET: "replace-with-a-long-random-string-at-least-32-chars"
PASSWORDMINCHAR: "10"
DISABLE_TELEMETRY: "true"
volumes:
- /opt/anythingllm:/app/server/storage
- /opt/anythingllm/.env:/app/server/.env
启动:
docker compose up -d
这里我把端口写成了:
127.0.0.1:3001:3001
意思是只让本机访问 3001,不直接暴露公网。后面用 Caddy 反向代理到 HTTPS 域名。
这比直接把 3001 开给全网更安全。
假设你的域名是:
ai.example.com
DNS 里添加 A 记录:
ai.example.com -> your_server_ip
安装 Caddy:
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' > /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install -y caddy
编辑 Caddyfile:
nano /etc/caddy/Caddyfile
写入:
ai.example.com {
reverse_proxy 127.0.0.1:3001
}
检查配置:
caddy validate --config /etc/caddy/Caddyfile
重载:
systemctl reload caddy
现在访问:
https://ai.example.com
Caddy 会自动申请和续期 HTTPS 证书。
如果用 Caddy 反代,公网只需要开 SSH、80、443。
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status
不要把 3001 直接开放给公网:
ufw deny 3001/tcp
如果你前面 Docker Compose 已经绑定 127.0.0.1:3001:3001,即使云厂商安全组误开了 3001,外部也访问不到容器端口。
AnythingLLM 只是前台和知识库,它本身还要接模型。
这套适合大多数 VPS 用户。
优点:
- VPS 配置要求低
- 回答速度稳定
- 不用管理本地模型
- 小团队部署最省心
缺点:
- 文档内容会发给对应 API 服务商处理
- 有 API 成本
- 依赖外部服务可用性
如果资料不是极度敏感,比如公开产品文档、客服 FAQ、博客资料、内部普通流程文档,这套更现实。
适合想尽量把数据留在自己机器上的用户。
先安装 Ollama:
curl -fsSL https://ollama.com/install.sh | sh
拉一个小模型测试:
ollama pull llama3.1:8b
测试接口:
curl http://127.0.0.1:11434/api/tags
如果 AnythingLLM 在 Docker 里,容器里的 localhost 指的是容器自己,不是宿主机。
Linux 上可以在 Compose 里加:
extra_hosts:
- "host.docker.internal:host-gateway"
然后在 AnythingLLM 里把 Ollama 地址填成:
http://host.docker.internal:11434
如果你用 Docker Run,需要加:
--add-host=host.docker.internal:host-gateway
这个地方很多人会踩坑:在容器里填 http://localhost:11434,结果一直连接失败。
AnythingLLM 里最容易搞混的是这件事。
简单理解:
| 方式 | 适合场景 | 影响范围 |
|---|---|---|
| Attach 文件 | 临时问一个文件 | 当前对话更合适 |
| Embed 到 Workspace | 长期知识库 | 工作区后续都能检索 |
如果你只是让 AI 看一份 PDF,问几个问题,Attach 就够了。
如果你要做“公司制度问答”“产品手册问答”“客户支持知识库”,就应该把文档嵌入到 Workspace,让它变成可检索知识库。
我的建议:
- 一个部门一个 Workspace
- 一个产品线一个 Workspace
- 敏感资料不要和公开资料混在同一个 Workspace
- 不确定要不要长期使用的文件,先 Attach,不要急着 Embed
RAG 不是把所有文件一股脑塞进去。资料边界越清楚,答案越容易靠谱。
AnythingLLM Docker 版支持多用户和权限管理。
但多用户不是“先开了再说”。你要先想清楚:
- 谁能看到哪个 Workspace
- 哪些文档能共享
- 管理员账号谁保管
- 离职用户怎么移除
- 是否允许公开 Chat Widget
如果只是你一个人测试,先单用户跑通流程。
等你确认工作区、文档分类、模型设置都稳定,再考虑多人使用。权限设计没想清楚就开放团队访问,后面很容易乱。
自托管知识库最怕的不是服务挂一下,而是文档索引和配置丢了。
AnythingLLM 的关键数据在你挂载的存储目录里,比如:
/opt/anythingllm
至少要备份:
.env- storage 目录里的数据库和配置
- 上传的文档
- 向量索引相关数据
可以先做一个本地压缩包:
cd /opt
tar -czf anythingllm-backup-$(date +%F).tar.gz anythingllm
再用 rclone 同步到对象存储:
rclone copy /opt/anythingllm-backup-$(date +%F).tar.gz r2:backup-bucket/anythingllm/
备份只做不恢复,等于没做完。
找个低峰期演练一次:
docker compose down
mv /opt/anythingllm /opt/anythingllm-old
mkdir -p /opt/anythingllm
tar -xzf /opt/anythingllm-backup-2026-07-12.tar.gz -C /opt
docker compose up -d
确认账号、Workspace、文档和聊天功能都还在。
Docker 部署升级很简单,但生产环境别闭眼升级。
进入目录:
cd /opt/anythingllm
先备份:
tar -czf /opt/anythingllm-before-upgrade-$(date +%F).tar.gz /opt/anythingllm
拉新镜像:
docker compose pull
重启:
docker compose up -d
看日志:
docker logs anythingllm --tail=100
升级后重点检查:
- 能不能登录
- Workspace 是否还在
- 文档能不能检索
- LLM Provider 是否正常
- Embedding Provider 是否正常
- Caddy HTTPS 是否正常
如果发现异常,先别删数据。保留旧目录和备份,再决定回滚。
看容器是否运行:
docker ps --filter "name=anythingllm"
看日志:
docker logs anythingllm --tail=100
看端口:
ss -tlnp | grep 3001
如果你用了 Caddy,继续看:
systemctl status caddy --no-pager -l
journalctl -u caddy -n 100 --no-pager
一般是 AnythingLLM 没起来,或者 Caddyfile 指向错了。
确认本机能访问:
curl -I http://127.0.0.1:3001
如果本机都访问不了,先修 Docker;如果本机可以访问,再修 Caddy。
先在宿主机测试:
curl http://127.0.0.1:11434/api/tags
如果宿主机正常,容器里不正常,大概率是地址写错。
AnythingLLM 在 Docker 里访问宿主机 Ollama,通常不要写:
http://localhost:11434
改成:
http://host.docker.internal:11434
并确保 Compose 里有:
extra_hosts:
- "host.docker.internal:host-gateway"
这通常不是服务器问题,而是知识库设计问题。
先检查:
- 文档是不是太旧
- 同一个 Workspace 里是不是混了不相关资料
- 问题是不是太宽泛
- Embedder 是否配置正确
- 文档切分后是否能检索到相关片段
别指望 RAG 自动理解一切。你给它一堆乱文件,它就会从乱文件里找答案。
看内存:
free -h
看 OOM:
journalctl -k | grep -i "out of memory"
如果你同时跑 AnythingLLM 和 Ollama,内存不够很正常。
短期可以加 swap:
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
但 swap 只能救急,不能让 2GB 小鸡变成 AI 服务器。
AnythingLLM 一旦放公网,至少做这些事:
- 只通过 HTTPS 域名访问
- 不直接开放 3001 端口
- 管理员密码用强密码
- 不要把 API Key 写进公开仓库
- 不同团队资料分 Workspace
- 定期备份
/opt/anythingllm - 离职账号及时禁用
- 敏感资料上传前先确认合规要求
如果你只是自己用,也可以再加一层 Cloudflare Access 或 Tailscale,只允许自己的设备访问。
这三个工具经常被一起问。
| 工具 | 更适合 |
|---|---|
| AnythingLLM | 文档问答、私有知识库、小团队 RAG |
| Dify | AI 应用、工作流、Agent、对外服务编排 |
| Open WebUI | 类 ChatGPT 聊天界面、本地模型聊天、多模型入口 |
我的选择很简单:
- 想“上传文档然后问问题”:AnythingLLM
- 想“做一个 AI 应用给别人用”:Dify
- 想“给 Ollama 做一个好用聊天前端”:Open WebUI
这三个不是谁完全替代谁,而是入口不同。
如果是给一个 3-5 人小团队做内部文档问答,我会这样配:
- VPS:2 核 4GB 起步
- 模型:先接 OpenAI / OpenRouter,不急着本地跑
- 部署:Docker Compose + Caddy HTTPS
- 端口:只开放 80/443,不开放 3001
- 文档:按部门或产品线建 Workspace
- 备份:每天备份
/opt/anythingllm到对象存储 - 权限:先单用户测试,流程稳定后再开多人
等真的确认资料不能出网,再考虑 Ollama、本地 embedding、GPU 服务器这些重方案。
AnythingLLM 的价值不是“装了一个 AI 工具”,而是让你把分散的文档变成一个能问、能查、能共享的知识库。VPS 只是载体,真正要长期维护的是资料边界、权限和备份。