本文适用对象:中级水平
目标:部署Dify为公网服务的AI应用
上一篇我们聊了如何让基于Dify的AI应用能更好的融合到公司的信息系统中,今天我们来学习一下如何将Dify部署到公网,通过域名的HTTPS来访问。
今天的话题,是之前一位粉丝朋友要求的,也因为很多事情拖延至今。不过好饭不怕晚,可以继续学一波啦。
01.
准备工作
如果要让自己的Dify能在公网上访问,首先需要一个域名,麦金叔假设你已经购买好了。
其次,需要一台有公网IP的主机,最低2核4G吧。优先选择非大陆地区的主机。
关于主机再多说几句,也不一定需要带公网IP的主机。但是如果没有,就需要通过内网穿透的方法来实现,而内网穿透也是需要至少有一台公网IP的机器来建通道,如果这也没有,只能使用赛博大善人Cloudflare家的免费Tunnel服务来达成了。(这里要展开就收不住了,有空再写)
至于为啥要非大陆地区主机,是因为选大陆IP的主机,需要网站域名备案。这已经超出技术范畴太多,不可控因素太多。当然,假设你购买的域名已经做过备案了,那就随便买主机了。
为了节约费用,我们选择不购买SSL证书,下面会详细说明如何操作,并且能自动定期续约得到SSL证书。
硬件条件准备完毕,接下来是软件环境的准备。最好在购买主机的时候,将OS也选择好。优先选择Debian 13(系统精简),其次是同系的Ubuntu24.04(长期支持版本)。
进入系统之后,第一步就是安装Docker环境。如果上面选择的是非大陆主机,那这里会比较简单,不会因为网络的原因而安装软件头大,包括安装Docker本身,和后面使用docker拉取镜像,都会无比丝滑。
不过,国内主机关系也不大,只要去修改一下/etc/apt/下面的source,改成国内源即可。咱们一般使用较多的还是清华源
https://mirrors.tuna.tsinghua.edu.cn/debian
国内机器在Docker安装之后,需测试一下拉取镜像是否可行。假设报错,或者速度特别慢,就需要通过修改/etc/docker/daemon.json,添加国内的镜像源来改善了。如果这里搞不定,可以联系“小助手 gangnam2000”。或者找前面文章末尾的二维码,进行扫描添加好友。
好了,已经艰难的走到了这里,恭喜你成功就在眼前。
02.
安装NPM
为了降低运维配置的难度,在正式配置Dify之前,麦金叔要给大家介绍一款开源的可视化Nginx软件 -- NPM(Nginx Proxy Manager),不是node.js的那个包管理器哈。
因为有了Docker,一切都变得非常简单了。只要创建一个专门的目录,并执行下述命令行:
mkdir -p ~/npm/{data,letsencrypt} && cd ~/npm
之后新建一个docker-compose.yml 文件,将内容设置如下:
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # HTTP 端口(用于 ACME 证书验证)
- '81:81' # NPM 管理后台端口
- '443:443' # HTTPS 端口
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
environment:
# 时区配置(可选,建议设置)
TZ: 'Asia/Shanghai'
再在终端执行docker compose up -d,就好了。
启动成功后,先访问http://服务器IP:81 进入管理后台。使用默认账号登录
Email: admin@example.com
Password: changeme
一定需要修改后才能使用,这也是为了安全。你也不希望被别人偷家吧。
上述完成之后,可以暂时放一下NPM,我们再把Dify处理一下。主要是端口冲突的问题需要解决,因为NPM会把80和443都占用掉。如果Dify也在同一台机器上,那么默认启动会报错。
03.
Dify安装和配置
克隆Dify项目之后,进入dify/docker目录,复制.env.example文件为.env。
Dify默认的前端服务端口是80和443,这个和上面NPM服务的端口冲突了,所以如果Dify运行在NPM这台机器上的话,需要修改Dify的暴露端口。如下图找到EXPOSE\_NGINX开头的两个变量,视自己主机情况修改为可用的。
等待Dify服务启动(拉取对应的镜像)后,找到实例名为docker-nginx-1这行,看IP地址(172.开头的内部地址),得到内部访问网关地址,如麦金叔的是172.20.0.1(注意,是网关地址172.xx.0.1不是Nginx那个地址),后面需要用到。
04.
SSL设置
好了,我们继续回来配置我们网站的SSL,现在免费证书的时间越来越短(从1年,变成3个月,马上要变成47天),这不就是逼人去买动辄几千上万的高级版么,而且一般就算是高级版也是只有一年有效期,到期还是要去更新。
所以我们当然希望既能用免费证书,还能自动续期,免去经常更新的麻烦。
登录进NPM,选择头部菜单栏“SSL Certificates”。点右上角的“Add SSL Certificate”,选择“Let's Encrypt”。
在新增对话框输入泛域名(省的一个一个子域名添加)和邮箱,勾选同意,打开DNS challenge,选择自己的域名提供商,并填入对应的APIkey(不同的域名服务商,获取的方式不同,但其实原理是一样的),见下图。
最后,点击“Save”之后,等待一会儿。刷新网页,可以看到有一条记录了。但是状态还不对,没有关系。因为还没有被使用,等下添加代理转发之后,这里的状态会变成“In use”,就正常了。
05.
代理配置
接下来就是正式配置网站代理了。但是,在配置反向代理前,我们还是先去域名服务商那里,添加一条A记录。指向的IP填NPM机器所在公网IP,当然如果就只有一台机器,那自然不会填错。
切换到NPM管理后台,选择头部菜单栏“Hosts”->“Proxy Hosts”,然后选择右上角的“Add Proxy Host”。
在弹出的对话框,如下图所示,“Details”这里依次填入Dify服务访问的二级域名,Schema保留http不变,IP填入上面让你们记住的那个内部网关地址,最后Port是Dify修改配置后的端口号。
先不点“Save”,切换到“SSL”,选择证书(第4步生成),打开强制SSL和HTTP/2,下面两个视自己情况是否打开,然后点击保存。
上述都成功的话,在这个代理页面,直接点击,应该就会跳转到公网二级域名,也就是访问Dify所在的服务。
终于完成所有步骤了,长舒一口气!
总结
今天介绍了Dify的公网HTTPS部署过程,稍微有点长,可以收藏一波,等需要的时候,再来依葫芦画瓢。
如果你对AI的发展感兴趣,欢迎一键三连。有任何问题可以添加小助手(二维码在往期文章),我们共同探讨。
