基于Docker Compose在腾讯云Ubuntu上快速部署Dify平台
1. 为什么选择Docker Compose在腾讯云上部署Dify?
如果你对AI应用开发感兴趣,但又觉得像LangChain这样的框架学习曲线有点陡,或者不想在本地环境折腾各种Python包版本冲突,那么Dify这个平台绝对值得你花时间了解一下。我自己在AI和智能硬件领域混了十多年,见过太多“想法很美好,环境配置很骨感”的案例。Dify的出现,很大程度上就是为了解决这个问题——它把构建AI应用需要的各种“零件”,比如工作流编排、RAG检索增强、模型管理,都打包成了一个开箱即用的平台。你不需要从零开始写代码去连接大模型、处理文档、设计对话逻辑,而是像搭积木一样,在可视化界面里拖拽几下,一个智能应用的原型就出来了。
那么,为什么我们要特意在腾讯云的Ubuntu服务器上,用Docker Compose来部署它呢?这里有几个很实在的理由,都是我踩过坑之后的经验之谈。首先,环境隔离与一致性。Dify依赖的后端服务不少,包括数据库、Redis、消息队列等。用Docker Compose,你可以用一个docker-compose.yml文件定义所有服务,一键启动。这意味着无论是在你的Mac笔记本上测试,还是在腾讯云的Ubuntu生产服务器上部署,所有服务的版本、配置都完全一致,彻底告别“在我机器上好好的,怎么到服务器就不行了”的噩梦。
其次,部署效率极高。对于个人开发者或小团队来说,时间是最宝贵的。传统的部署方式可能需要你手动安装Python、PostgreSQL、Redis,配置环境变量,处理服务启动脚本,一套流程下来半天就没了。而用Docker Compose,基本上就是“克隆代码、复制配置文件、一条命令启动”三步走。我自己在腾讯云的Ubuntu 22.04服务器上实测,从零到服务完全跑起来,10分钟左右搞定,大部分时间还是在等镜像下载。
最后,资源管理和维护方便。腾讯云提供了稳定可靠的云服务器,网络和存储性能都有保障。结合Docker,你可以轻松地限制每个容器的CPU和内存使用,避免某个服务“吃光”所有资源导致整个平台崩溃。后续的升级、备份、日志查看,都可以通过Docker和Docker Compose的标准命令来完成,学习成本低,操作也规范。对于国内用户还有一个隐藏福利:通过配置国内镜像源,可以极大加速Docker镜像的拉取速度,这个后面我会详细说。
2. 部署前的准备工作:云服务器与基础环境
万事开头难,但把准备工作做足了,后面的部署就会异常顺畅。这一部分,我会带你一步步搞定服务器和基础软件,确保你的“地基”打得牢。
2.1 选购与配置腾讯云Ubuntu服务器
首先,你得有一台腾讯云的Ubuntu服务器。如果你还没有,可以去腾讯云官网购买。对于部署Dify进行学习和中小规模使用,我建议的配置是:2核CPU、4GB内存、50GB SSD云硬盘。这个配置跑起Dify的核心服务加上一个轻量级模型(比如用Ollama部署的Qwen2.5-7B)是绰绰有余的。操作系统务必选择Ubuntu 22.04 LTS,这是一个长期支持版本,社区资源丰富,稳定性好,也是Dify官方文档主要测试的版本。
服务器买好之后,第一件事不是急着登录,而是配置安全组。这是很多新手容易忽略,但至关重要的一步。安全组相当于云服务器的虚拟防火墙。你需要在腾讯云控制台,找到你的服务器实例,进入其安全组配置页面,至少放行以下端口:
- 22端口:用于SSH远程连接管理服务器,这是必须的。
- 80端口:标准的HTTP端口,如果你后续想直接通过IP访问Dify的Web界面,需要开放。
- 443端口:HTTPS端口,如果你打算配置域名和SSL证书,就需要它。
- 3000端口:Dify前端服务默认的端口之一。
- 5001端口:Dify后端API服务默认的端口。
我的习惯是,在初期测试阶段,可以先将来源设置为0.0.0.0/0(即允许所有IP访问),以便快速验证服务。等一切调试完毕后,再根据实际情况收紧策略,比如只允许你自己的办公IP访问22端口。配置好后,你就可以使用SSH客户端(比如Mac/Linux的终端,或者Windows的PuTTY、Xshell)连接服务器了。连接命令通常是ssh ubuntu@你的服务器公网IP。
2.2 安装Docker与Docker Compose
连接到服务器后,我们就要安装核心工具了。Ubuntu 22.04的官方软件源里虽然有Docker,但版本可能不是最新的。我推荐使用Docker官方提供的安装脚本,一步到位安装最新稳定版。
先更新一下系统软件包列表,这是一个好习惯:
sudo apt update接下来,运行Docker官方的一键安装脚本。这个脚本会自动检测系统,并安装所有必要的依赖和Docker引擎。
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh安装完成后,运行下面的命令将当前用户(比如ubuntu)加入到docker用户组。这样以后运行Docker命令就不需要每次都加sudo了,方便很多。
sudo usermod -aG docker $USER重要提示:执行完上面的命令后,你需要完全退出当前的SSH会话,然后重新登录,这个用户组的变更才会生效。你可以直接输入exit退出,再重新连接一次。
重新登录后,验证Docker是否安装成功:
docker --version如果看到类似Docker version 26.x.x, build ...的输出,说明安装成功了。
接下来安装Docker Compose。现在Docker Compose V2已经是主流,它作为一个Docker CLI的插件形式存在,比旧的V1(独立的docker-compose二进制文件)更好用。安装命令如下:
sudo apt install docker-compose-plugin安装后,检查版本:
docker compose version你应该能看到Docker Compose version v2.x.x的字样。至此,最核心的基础环境就准备好了。
3. 加速部署:搞定代码与镜像拉取
基础环境搭好了,接下来就是获取Dify的“蓝图”和“建筑材料”。这里有个国内开发者普遍会遇到的大坑:从GitHub克隆代码和从Docker Hub拉取镜像速度慢如蜗牛,甚至直接超时失败。别担心,我有亲测有效的“加速套餐”。
3.1 从国内源克隆Dify代码
Dify的官方代码仓库在GitHub上。如果你在腾讯云服务器上直接git clone https://github.com/langgenius/dify.git,那个速度可能会让你怀疑人生。我的解决方案是使用国内镜像源,比如Gitee(码云)。
首先,我们直接克隆Dify在Gitee上的官方镜像仓库。这里有个关键点:指定版本分支。直接克隆主分支(main)可能会拿到最新的开发代码,可能不稳定。生产部署建议使用稳定的发布版本。假设当前最新稳定版是1.0.0(请以Dify官方发布的最新版本为准),命令如下:
git clone https://gitee.com/dify_ai/dify.git --branch 1.0.0这条命令会从Gitee拉取1.0.0版本标签对应的代码,速度飞快。克隆完成后,你会得到一个名为dify的目录。
3.2 配置Docker镜像加速器
代码下来了,但Dify的docker-compose.yml文件里定义的服务,比如PostgreSQL、Redis、以及Dify自身的后端和前端镜像,默认还是会从Docker Hub拉取。对于国内网络,这又是一道坎。
我们需要为Docker Daemon配置一个国内镜像加速器。腾讯云本身就提供了免费的镜像加速服务。具体操作如下:
- 编辑Docker的配置文件(如果不存在则会创建):
sudo nano /etc/docker/daemon.json - 在该文件中写入以下内容(你可以使用腾讯云、阿里云、中科大等任一加速器地址):
这里我添加了两个,腾讯云的和中科大的,作为备用。{ "registry-mirrors": [ "https://mirror.ccs.tencentyun.com", "https://docker.mirrors.ustc.edu.cn" ] } - 保存并退出编辑器(在nano中,按
Ctrl+X,然后按Y,最后按Enter)。 - 重新加载配置并重启Docker服务:
sudo systemctl daemon-reload sudo systemctl restart docker - 验证加速器是否生效:
在输出的信息中,你应该能看到docker infoRegistry Mirrors下面列出了你刚才配置的镜像地址。
完成这两步“加速”操作,后续的镜像拉取过程就会顺畅无比,能为你节省大量等待时间,避免因网络问题导致的部署失败。
4. 核心部署步骤:一键启动Dify服务
准备工作全部就绪,现在进入最激动人心的环节——启动Dify。整个过程非常清晰,就像执行一个安装向导。
4.1 配置环境变量文件
首先,进入Dify代码的docker目录,所有和部署相关的文件都在这里。
cd dify/docker这个目录下有一个非常重要的模板文件.env.example。它包含了运行Dify所需的所有环境变量的默认值。我们需要复制一份并命名为.env,这是Docker Compose会主动读取的配置文件。
cp .env.example .env现在,我们用文本编辑器打开这个.env文件看看:
nano .env你会看到很多配置项,对于初次部署,大部分保持默认即可。但有几个关键项我建议你检查或修改:
DB_PASSWORD:数据库密码。请务必修改为一个强密码,不要使用默认值。SECRET_KEY:用于加密会话的密钥。同样,建议生成一个随机字符串替换它。在Linux下可以用openssl rand -hex 32命令生成。API_BASE_URL:如果你的服务器有公网IP,并且你希望通过IP直接访问API,这里可以设置为http://你的服务器IP:5001。初期测试可以先保持默认的http://localhost:5001。CONSOLE_API_BASE_URL:前端访问后端的地址,需要和上面的API_BASE_URL对应。CONSOLE_WEB_URL:前端访问自身的地址,通常是http://localhost:3000或http://你的服务器IP:3000。
对于最简单的“先跑起来”的目标,你可以只修改DB_PASSWORD和SECRET_KEY,其他暂时不动。保存并退出编辑器。
4.2 启动所有服务
配置好环境变量后,启动服务就是一条命令的事。根据你安装的Docker Compose版本,命令稍有不同。我们之前安装的是V2插件版,所以使用以下命令:
docker compose up -d这个-d参数代表“detached”,意思是在后台运行。执行这条命令后,Docker Compose会做以下几件事:
- 根据
docker-compose.yml文件,依次拉取(如果本地没有)PostgreSQL、Redis、Dify后端、Dify前端等服务的镜像。 - 为这些服务创建独立的容器网络,让它们能相互通信。
- 按照依赖顺序启动容器(比如先启动数据库,再启动后端应用)。
- 将容器在后台运行起来。
第一次执行时,因为要拉取几个GB的镜像,需要一些时间。由于我们配置了镜像加速,这个过程应该比较快。你可以通过docker compose logs -f命令来实时跟踪所有容器的启动日志,观察进度。
4.3 验证服务状态与初始化
当docker compose up -d命令执行完毕,并且日志显示各个服务都已启动成功后,我们需要检查一下所有容器是否都在健康运行:
docker compose ps这个命令会列出由当前目录下docker-compose.yml管理的所有容器。你希望看到每个服务的“State”一栏都是“Up”。如果某个服务是“Exit”或“Restarting”,那就需要查看具体日志来排错了,通常可能是数据库连接失败或者端口冲突。
确认所有容器都运行正常后,Dify平台其实就已经部署完成了!现在你可以通过浏览器访问它。
- 如果你在服务器本地访问:打开浏览器,输入
http://localhost:3000。 - 如果你从你自己的电脑远程访问:在浏览器地址栏输入
http://你的腾讯云服务器公网IP:3000。
首次访问,你会进入Dify的初始化页面,系统会引导你创建一个管理员账户。按照提示输入邮箱、用户名和密码即可。这个账户就是你管理整个Dify平台、创建AI应用的超级管理员账号。
5. 连接AI大脑:配置模型与供应商
平台跑起来了,但它现在还是个“空壳”,没有AI模型就等于没有大脑。接下来我们要给Dify接上“大脑”。Dify支持非常多的模型供应商,包括OpenAI、Azure、 Anthropic、国内的通义千问、智谱AI等,也支持本地部署的模型,比如通过Ollama运行的各类开源模型。
5.1 通过Ollama使用本地开源模型
对于个人开发者或想完全私有化、控制成本的朋友,我强烈推荐Ollama这个方案。它能在你的服务器上本地运行诸如Llama 3、Qwen、Gemma等优秀的开源大模型,数据完全不出私域,且没有API调用费用。
首先,你需要在同一台腾讯云服务器上安装Ollama。这非常简单,一条命令:
curl -fsSL https://ollama.ai/install.sh | sh安装完成后,启动Ollama服务并拉取一个模型,比如7B参数的Qwen2.5模型:
ollama serve & # 后台启动服务 ollama pull qwen2.5:7b # 拉取模型,这会需要一些时间和磁盘空间模型拉取成功后,Ollama的API服务默认会在http://localhost:11434提供。
现在,回到Dify的管理界面。用刚才创建的管理员账号登录,进入“设置” -> “模型供应商”页面。点击“添加模型供应商”,在列表里找到“Ollama”。
在配置页面,关键就是填写“API Base URL”。因为Dify和Ollama都运行在同一台服务器的Docker容器内,它们通过Docker的内部网络通信。这里不能填http://localhost:11434,因为localhost在容器内指向的是容器自己。我们需要填写Docker Compose网络内,Ollama服务的主机名或IP。更简单可靠的方法是:如果你在服务器本机(宿主机)运行Ollama,可以填写你腾讯云服务器的内网IP加上端口,例如http://172.xx.xx.xx:11434(172.xx.xx.xx是你的CVM内网IP)。或者,更优雅的方式是将Ollama也容器化,并通过Docker Compose统一管理,这样可以直接使用服务名进行连接。
配置好后,点击测试连接,如果显示成功,就说明Dify已经能“看到”你的本地模型了。
5.2 配置在线模型API
如果你更倾向于使用能力更强的云端模型,比如GPT-4,配置过程也很直观。以OpenAI为例:
- 在Dify的“模型供应商”页面,选择“OpenAI”。
- 在“API Key”栏位,填入你在OpenAI官网申请的API密钥。
- “API Base URL”一般保持默认的
https://api.openai.com/v1即可,如果你使用某些代理服务,可能需要修改。 - 填写一个供应商名称,比如“My-OpenAI”。
保存后,你就可以在创建AI应用时,选择使用OpenAI提供的各种模型了。对于国内用户,也可以类似地配置阿里云灵积、百度千帆等平台的API,只需将对应的API Key和Base URL填入即可。
6. 进阶配置与优化指南
让服务跑起来只是第一步,要让它在生产环境中稳定、高效、安全地运行,还需要一些额外的打磨。这部分我分享几个实战中非常重要的进阶配置。
6.1 配置持久化存储与数据备份
Docker容器默认是无状态的,一旦容器被删除,里面的数据(比如数据库里的应用数据、上传的文件)也会随之消失。这绝对是灾难。我们必须把数据目录“映射”到宿主机上,实现持久化。
打开docker-compose.yml文件,你会看到每个服务(如db、redis)的配置里基本都已经定义好了volumes映射。例如PostgreSQL部分:
services: db: image: postgres:16-alpine volumes: - postgres_data:/var/lib/postgresql/data ... volumes: postgres_data:这个postgres_data就是一个Docker管理的命名卷(named volume),它实际存储在宿主机的/var/lib/docker/volumes/目录下。这已经实现了基础的数据持久化。但为了备份更方便,我更喜欢使用绑定挂载(bind mount),直接将数据目录映射到我指定的服务器路径,比如/home/ubuntu/dify-data/postgres。这样我一眼就知道数据在哪,备份时直接打包这个目录就行。修改方法是将volumes部分改成:
volumes: - /home/ubuntu/dify-data/postgres:/var/lib/postgresql/data重要提示:修改存储方式前,务必先docker compose down停止并删除旧容器,确保数据已经备份,然后再修改yml文件并重新docker compose up -d。
6.2 设置域名与HTTPS访问
长期通过IP和端口号访问既不安全也不专业。你需要一个域名和SSL证书。假设你有一个域名ai.yourdomain.com解析到了你的腾讯云服务器IP。
最省事的方案是使用Nginx Proxy Manager或Caddy这类工具来反向代理和自动管理SSL证书。这里以Nginx Proxy Manager(NPM)为例,你可以同样用Docker Compose来部署它。在服务器上新建一个目录,创建docker-compose.yml:
version: '3.8' services: app: image: 'jc21/nginx-proxy-manager:latest' ports: - '80:80' - '443:443' - '81:81' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt启动NPM后,访问http://你的服务器IP:81,初始账号密码为admin@example.com/changeme。登录后:
- 在“Proxy Hosts”中添加一个代理主机。
- 域名填写
ai.yourdomain.com。 - 转发地址填写
http://你的服务器内网IP:3000(Dify前端)。 - 在SSL选项卡中,申请Let‘s Encrypt免费证书,并强制开启HTTPS。
这样,你就能通过https://ai.yourdomain.com安全地访问Dify了。别忘了在Dify的.env配置文件中,将CONSOLE_WEB_URL和API_BASE_URL等地址也更新为你的域名。
6.3 日常维护与故障排查
部署不是终点,日常维护同样重要。这里有几个常用的命令和技巧:
- 查看实时日志:
docker compose logs -f service_name(例如docker compose logs -f api只看后端日志)。这是排查问题的一大利器。 - 进入容器内部:
docker compose exec service_name sh(例如docker compose exec db bash进入数据库容器),方便你执行一些内部命令。 - 备份数据库:虽然数据卷持久化了,但定期的逻辑备份更安全。可以写一个定时任务(cron job),定期执行
docker compose exec db pg_dump -U postgres dify > backup.sql。 - 更新Dify版本:关注Dify官方Release。更新时,先拉取最新代码(注意备份你的
.env和任何自定义配置),然后重新运行docker compose up -d,Docker Compose会自动拉取新镜像并重启服务。务必先在测试环境操作! - 资源监控:使用
docker stats命令可以实时查看各个容器的CPU、内存使用情况。如果发现内存占用过高,可能需要调整模型配置或升级服务器。
最后,关于性能,对于个人使用或小团队,前面推荐的2核4G配置是起点。如果你需要同时服务多个用户,或者运行参数更大的模型,就需要提升服务器配置,特别是内存。另外,将数据库(PostgreSQL)的数据目录放在SSD磁盘上,对整体性能提升会有显著帮助。
