在 VPS 上自托管 Dify
Dify 是一个自托管的 LLM 应用平台,会保存您的 API 密钥和数据。用 Docker Compose 把它装到 VPS 上,并做好完整的安全加固。
Dify 是什么,以及您要运行的到底是什么
Dify 是一个可自托管的平台,用来在大语言模型(LLM)之上构建应用。您会得到一个用于设计聊天应用、智能体和检索流程的网页界面,一个可以从自己代码里调用它们的 API,以及一个集中管理提示词、数据集和模型密钥的地方。这类工具通常由小团队搭建起来,让所有人都基于同一个共享的私有底座去开发,而不是把 API 密钥零散地散布在各个脚本里。
自己运行它,意味着要运行好几个组成部分。Dify 以一组 Docker 容器的形式发布:一个 API 服务器、一个后台 worker、一个网页前端、一个 Postgres 数据库、一个 Redis 缓存,以及一个向量数据库,全部通过 Docker Compose 连接在一起。这比单个二进制文件要复杂,但 Compose 会处理好这些连接,一台有几 GB 空闲内存的 VPS 就能轻松跑起来。
因为 Dify 会保存您的模型 API 密钥,而且往往还保存您为检索而加载的私有文档,所以从第一分钟起,就要把运行它的这台机器当作敏感对象来对待。本指南先把它装好,然后像加固任何保存机密的服务那样对它做加固。
前置条件
您需要一台运行 Ubuntu 24.04 的 VPS,已安装 Docker 和 Docker Compose 插件,以及一个拥有 sudo 权限或属于 docker 组的用户。如果您刚接触 Docker,VPS 上 Docker Compose 的基础知识涵盖了安装以及本指南默认您已掌握的核心命令。有一个指向服务器的域名很值得,因为您会想在 Dify 前面用上 TLS,而不是直接暴露一个裸 IP 地址。
第 1 步:获取 Dify 及其 Compose 文件
Dify 把它的 Docker 配置放在主仓库里。克隆下来并进入 docker 目录:
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env.env 文件就是全部配置。开始运行任何东西之前,先读一遍它。最先要关注的是设置密码和密钥的那些值:SECRET_KEY、Postgres 密码和 Redis 密码。示例文件里带的是占位值,原样保留这些值,正是自托管 Dify 被攻破最常见的一个原因。生成一个真正的密钥:
openssl rand -base64 42把它粘贴进 SECRET_KEY,并为文件中每一个密码字段都设置一个强而唯一的值。
第 2 步:把它启动起来
把整套服务拉起来:
docker compose up -d第一次运行会拉取好几个镜像并初始化数据库,所以给它一分钟。检查容器是否健康:
docker compose ps每个服务都应显示 running。Dify 默认通过一个内置的 nginx 容器在 80 端口上提供网页界面。第一次访问 http://YOUR_SERVER/install 时,您会创建管理员账户。请立刻完成这一步,赶在任何其他人能访问到这个端口之前,因为在该账户存在之前,任何加载到这个页面的人都可以把它占为己有,从而掌控您的实例。
第 3 步:不要裸露地暴露它。在前面加上 TLS 和防火墙
大多数图快的安装到这里就停了,而大多数安全事故就从这里开始。Dify 自带的 nginx 在所有网络接口上、以明文方式监听 80 端口。您不会希望自己的管理员登录和模型密钥通过明文 HTTP 传输,也不会希望内部服务能从外部访问到。
用一个默认拒绝的防火墙把这台机器锁起来,只放行 SSH 和网页流量:
sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable记住,一个只覆盖 IPv4 的防火墙,可能在 IPv6 上把同样的端口留着敞开,这就是坑了很多自托管用户的IPv6 防火墙漏洞。请确认两套协议栈都被过滤了。
关于 TLS,最干净的做法是把 Dify 的网页端口绑定到回环地址(loopback),并在前面运行一个带 Let's Encrypt 证书的反向代理,这样暴露在公网上的就只有那个说 HTTPS 的代理。Dify 的 .env 允许您更改对外暴露的端口;把它设置成绑定在 127.0.0.1 上,再让您的代理指向那里。在 VPS 上安全运行 AI 智能体里的智能体加固思路在这里同样适用:把各个组成部分留在回环地址上,只暴露必须公开的部分,让一个加固过的前门去负责 TLS。
第 4 步:保持及时打补丁
Dify 迭代很快,更新里包含安全修复。更新就是在 docker 目录下拉取并重启:
git pull
docker compose pull
docker compose up -d在跳跃到大版本之前,先读发行说明,因为 Dify 偶尔会在不同版本之间更改 .env 的结构,一个您还没设置的新变量可能会导致某个容器无法启动。
第 5 步:备份那些无法重新生成的东西
Dify 机器上有两样东西是不可替代的:Postgres 数据库,它保存着您的应用、用户和设置;以及存放上传文档和向量索引的那个卷。两者都位于 docker 目录下的 Docker 卷中。按计划为它们做快照,并把快照复制到服务器之外。一个模型 API 密钥可以重新签发,但您花一周时间搭建出来的应用没法重来。
如果想要一个更自主、能运行代码的智能体,参见自托管 Agent Zero,而在 VPS 上构建您自己的 AI 智能体则讲解了它们背后共同的基础。
FAQ
自托管 Dify 的系统要求是什么?
Dify 以大约半打容器组成的 Docker Compose 服务栈运行,所以请按至少 2 GB 空闲内存来规划,理想是 4 GB,外加几个 CPU 核心,以及足够存放您上传文档和向量索引的磁盘空间。内存压力来自数据库和向量存储,而不是 Dify 本身。
直接把 Dify 暴露在 80 端口上安全吗?
不安全。Dify 自带的网页服务器以明文 HTTP 监听,而它前面挂着您的管理员登录和模型 API 密钥。请在前面放一个带 Let's Encrypt 证书的反向代理,把 Dify 自己的端口绑定到回环地址,只让那个 HTTPS 代理面向公网。再配上一个同时覆盖 IPv4 和 IPv6 的默认拒绝防火墙。
如何更新自托管的 Dify?
在 docker 目录下运行 git pull,然后用 docker compose pull 和 docker compose up -d 拉取新镜像并重启。先读发行说明,因为 Dify 有时会在版本之间新增 .env 变量,缺了某一个就可能让容器起不来。
装好 Dify 之后第一件要做的事是什么?
访问 /install 并立刻创建管理员账户。在该账户存在之前,任何能访问到这个页面的人都可以把它占为己有。请在容器一恢复健康、且在您向全世界开放防火墙之前,就把它设置好。