Dify 自部署环境搭建(docker)
写在前面:
Dify 和 coze,n8n一样 同属“AI应用构建平台”:通过自带的模块组件 + 应用市场插件的方式,帮助我们快速的把AI 能力嵌入到工作和生活中去。
DIfy 和 n8n 都已经开源很久了,今天先分享下 Dify 平台在docker 环境下的部署方式。这两个平台对硬件需求都不高,倒是对网络需求有点高哈 ^^ 。以下是github 官方文档中提到的硬件要求——
Before installing Dify, make sure your machine meets the following minimum system requirements:
- CPU >= 2 Core
- RAM >= 4 GiB
所以,完全可以使用 docker工具 在window、linux 甚至是各种预装好了docker 的x86平台上运行。后者,如1panel、宝塔、NAS。
今天就通过一个 docker-compose.yml 配置文件,在群晖NAS 上,5分钟快速搭建自己的Dify平台。
话不多说,先看效果——
docker 配置文件如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
version: '3'
# 定义网络,确保所有服务都在同一个网络内,可以互相通信
networks:
dify-network:
driver: bridge
services:
# Dify API Server: 核心后端服务
api:
image: langgenius/dify-api:${DIFY_VERSION:-latest}
restart: always
ports:
# 将容器的 5015 端口映射到你电脑的 5015 端口
- "5015:5015"
depends_on:
- db
- redis
- weaviate
environment:
# 默认端口5001,如有冲突这里修改
- DIFY_PORT=5015
- MODE=api
# [已配置] URL 地址已根据本地测试环境配置好
- CONSOLE_WEB_URL=http://dify.host:3000
- APP_WEB_URL=http://dify.host:3000
- CONSOLE_API_URL=http://dify.host:5015
- SERVICE_API_URL=http://dify.host:5015
# [已配置] 数据库连接信息,与下面的 db 服务配置一致
- DB_USERNAME=dify
- DB_PASSWORD=ddiiffyy
- DB_HOST=db
- DB_PORT=5432
- DB_DATABASE=dify_db
# [已配置] Redis 连接信息
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_DB=0
# [已配置] Weaviate 向量数据库连接信息
- VECTOR_STORE=weaviate
- WEAVIATE_GRPC_ENABLED=true
- WEAVIATE_ENDPOINT=http://dify.host:8080
- WEAVIATE_GRPC_PORT=50051
- WEAVIATE_API_KEY= # 本地部署通常不需要 Key
- WEAVIATE_BATCH_SIZE=100
# [已配置] plugin_daemon 连接信息
- PLUGIN_REMOTE_INSTALL_HOST=plugin_daemon
- PLUGIN_REMOTE_INSTALL_PORT=5003
- INNER_API_KEY_FOR_PLUGIN=PwMc7L7YprSMkWQFPCtF
- PLUGIN_DAEMON_URL=http://plugin_daemon:5002
- PLUGIN_DAEMON_KEY=PoANGw2KsXrSAd6iztKT
- PLUGIN_MAX_PACKAGE_SIZE=52428800
# 其他配置
- EDITION=SELF_HOSTED
- LOG_LEVEL=INFO
- FILES_URL=/files
- OPENDAL_SCHEME=fs
- OPENDAL_FS_ROOT=/app/api/storage
- CELERY_BROKER_URL=redis://redis:6379/0
- CELERY_BACKEND=redis
volumes:
# [已修改] 数据持久化到本地 ./dify-data/api文件夹
- ./dify-data/api:/app/api/storage
networks:
- dify-network
worker:
image: langgenius/dify-api:${DIFY_VERSION:-latest}
restart: always
environment:
- MODE=worker
- SENTRY_TRACES_SAMPLE_RATE=1.0
- SENTRY_PROFILES_SAMPLE_RATE=1.0
- PLUGIN_MAX_PACKAGE_SIZE=52428800
- PLUGIN_DAEMON_URL=http://plugin_daemon:5002
- PLUGIN_DAEMON_KEY=PoANGw2KsXrSAd6iztKT
- INNER_API_KEY_FOR_PLUGIN=PwMc7L7YprSMkWQFPCtF
- OPENDAL_SCHEME=fs
- OPENDAL_FS_ROOT=/app/api/storage
- CELERY_BROKER_URL=redis://redis:6379/0
- CELERY_BACKEND=redis
- DB_USERNAME=dify
- DB_PASSWORD=ddiiffyy
- DB_HOST=db
- DB_PORT=5432
- DB_DATABASE=dify_db
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_DB=0
- VECTOR_STORE=weaviate
- WEAVIATE_ENDPOINT=http://dify.host:8080
- WEAVIATE_GRPC_ENABLED=true
- WEAVIATE_GRPC_PORT=50051
- WEAVIATE_API_KEY= # 本地部署通常不需要 Key
depends_on:
- db
- redis
volumes:
- ./dify-data/api:/app/api/storage
networks:
- dify-network
# Dify Web Client: 前端服务
web:
image: langgenius/dify-web:${DIFY_VERSION:-latest}
restart: always
ports:
# [已修改] 将容器的 3000 端口映射到你电脑的 3000 端口,避免 80 端口冲突
- "3000:3000"
depends_on:
- api
environment:
# [已配置] URL 地址已根据本地测试环境配置好
- CONSOLE_API_URL=http://dify.host:5015
- APP_API_URL=http://dify.host:5015
# 其他配置
- EDITION=SELF_HOSTED
- NEXT_PUBLIC_SITE_TITLE=Dify
networks:
- dify-network
# PostgreSQL Database: 关系型数据库
db:
image: postgres:15-alpine
restart: always
environment:
# [已配置] 设置数据库的用户名、密码和数据库名
- POSTGRES_USER=dify
- POSTGRES_PASSWORD=ddiiffyy
- POSTGRES_DB=dify_db
volumes:
# [已修改] 将数据库数据持久化到本地的 ./dify-data/postgres 文件夹
- ./dify-data/postgres:/var/lib/postgresql/data
healthcheck:
test: [ 'CMD', 'pg_isready', '-h', 'db', '-U', '${PGUSER:-postgres}', '-d', '${POSTGRES_DB:-dify}' ]
interval: 1s
timeout: 3s
retries: 60
networks:
- dify-network
# Redis Cache: 缓存服务
redis:
image: redis:6-alpine
restart: always
volumes:
- ./dify-data/redis:/data
healthcheck:
test: [ 'CMD', 'redis-cli', 'ping' ]
networks:
- dify-network
# Weaviate Vector Store: 向量数据库,用于 RAG
weaviate:
image: semitechnologies/weaviate:1.24.1
restart: on-failure:0
ports:
- "8080:8080"
- "50051:50051"
environment:
- QUERY_DEFAULTS_LIMIT=25
- AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true
- PERSISTENCE_DATA_PATH=/var/lib/weaviate
- DEFAULT_VECTORIZER_MODULE=none
- ENABLE_MODULES='text2vec-openai,reranker-cohere'
- CLUSTER_HOSTNAME=node1
volumes:
# [已修改] 将向量数据持久化到本地的 ./dify-data/weaviate 文件夹
- ./dify-data/weaviate:/var/lib/weaviate
networks:
- dify-network
# 插件模块:用于安装&调用插件
plugin_daemon:
image: langgenius/dify-plugin-daemon:0.2.0-local
restart: always
ports:
- "5003:5003"
- "5002:5002"
depends_on:
- db
environment:
- DIFY_INNER_API_URL=http://dify.host:5015
- DIFY_INNER_API_KEY=PwMc7L7YprSMkWQFPCtF
- SERVER_PORT=5002
- SERVER_KEY=PoANGw2KsXrSAd6iztKT
- PLUGIN_REMOTE_INSTALLING_HOST=0.0.0.0
- PLUGIN_REMOTE_INSTALLING_PORT=5003
- PLUGIN_WORKING_PATH=/app/storage/cwd
- MAX_PLUGIN_PACKAGE_SIZE=52428800
# [已配置] 数据库连接信息,与之前的 db 服务配置一致
- DB_USERNAME=dify
- DB_PASSWORD=ddiiffyy
- DB_HOST=db
- DB_PORT=5432
- DB_DATABASE=dify_db
# [已配置] redis连接信息
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_DB=0
volumes:
- ./dify-data/plugin:/app/storage
networks:
- dify-network
|
具体操作步骤
0. 确认docker 服务已启用,配置网络加速
确认,镜像仓库可以正常访问,以便后续顺利拉取 镜像。
1. 导入yaml 配置文件
这里新建一个项目叫“dify_pj”,路径放置在自己的docker存储空间中(我这里是 /docker/dify )。
注意:此时还没有创建持久化数据路径,不要勾选“立即启动”。
点击“完成”,完成初始项目集的导入。
2. 添加持久化存储路径
像数据库、配置文件、插件都需要持久化数据,所以上述配置文件中指定了 数据存放路径( /docker/dify/dify-data )。
在目录下创建这5个空文件夹即可——
或者使用 mkdir 命令 创建这5个空目录——
1
2
3
4
|
admin@NAS:~$ sudo mkdir -p /volume1/docker/dify/dify-data
admin@NAS:~$ cd /volume1/docker/dify/dify-data
admin@NAS:/volume1/docker/dify/dify-data$
admin@NAS:/volume1/docker/dify/dify-data$ mkdir api plugin redis postgres weaviate
|
3. 拉取镜像
回到,docker 管理界面,点击“操作” –> “构建”。开始拉取相关 docker 镜像,并生成docker-compose中指定配置(如,网络 启动命令 存储 环境变量等参数)。
等待全部拉取完成后,dify 组件就陆陆续续启动了。
启动成功——
4. 数据库 初始化
服务第一次启动(或升级)时, 数据库需要 更新下。步骤如下——
1) 找到dify_pj-api-1 这个应用,点击“操作” –> “打开终端机”
2) 新建终端,输入命令 “flask db upgrade",完成数据库升级操作。
或者 使用命令行操作:
1
|
sudo docker exec -it dify_pj-api-1 flask db upgrade
|
这一步完成,dify 相关组件就都启动好了。
5. 追加 Hosts/DNS 解析
配置文件中,使用了域名的方式访问 dify 应用。所以,需要在 路由器或内网DNS 服务器上追加一条记录,完成 域名到NAS IP 地址的映射。 这里 以路由器的“自定义 hosts”功能为例——
这样,后续在内网访问dify 应用时,使用 “域名:端口” 的形式就可以了。
6. 登录web 界面,完成初始化
使用 http://dify.host:3000 登录dify 完成初始化工作。
7. 应用市场中 安装LLM 大模型,并设置API key
最后,点击“插件” 中的“模型”,安装LLM 大模型。
等待安装完成后,在用户设置中“模型供应商” 启用对应模型 API key。
后续,就可以创建自己的工作流 和 知识库啦。
dify 各组件功能说明
官方图片:https://github.com/langgenius/dify/blob/main/docker/docker-compose.png
图片中,左侧是用户浏览器,中间是web 代理服务(nginx),右侧有 9 个组件。下面通过表格的形式,快速介绍下——
| 组件名 |
功能描述 |
必须 |
镜像版本 |
yaml文件已包含 |
端口 |
| api |
后端核心 |
是 |
latest (当前 v1.8.0) |
是 |
5001 |
| worker |
队列任务执行(知识库功能必安装) |
否 |
与api 使用相同镜像 |
是 |
|
| web |
前端核心 |
是 |
latest (当前 v1.8.0) |
是 |
3000 |
| database |
配置数据库 |
是 |
postgres:15-alpine |
是 |
5432 |
| plugin |
插件功能 |
是 |
dify-plugin-daemon:0.2.0-local |
是 |
5002-5003 |
| redis |
缓存服务 |
是 |
redis:6-alpine |
是 |
6379 |
| weaviate |
向量数据库 (知识库功能必安装) |
否 |
weaviate:1.24.1 |
是 |
8080,50051 |
| sandbox |
代码执行模块 (code 功能必安装) |
否 |
dify-sandbox:0.2.12 |
否 |
8194 |
| SSRF |
反向代理。给sandbox 访问互联网使用(非必需) |
否 |
- |
否 |
3128 |
|
|
|
|
|
|
| nginx |
web 代理服务(生产环境必安装) |
否 |
- |
否 |
80, 443 |
PS: 所以,如果后续需要在工作流中使用代码功能, 就还需要添加一个sandbox 组件。操作方法也是一样的,就是需要多导入一个conf.yml文件。 需要的朋友在公众号“AI 热气球”输入【827】 获取加强版 docker-compose 文件。
补充:常用docker 状态查看命令
当然,这些在有docker 管理界面的 图形化操作里也可以执行。放在这里以防备用。
1
2
3
4
5
6
7
8
9
10
11
|
# 重启指定容器
sudo docker restart dify_pj-api-1
# 查看当前dify项目相关容器
sudo docker ps | grep dify
# 查看指定容器的日志
sudo docker logs -f dify_pj-api-1
# 进入指定容器实例内部
sudo docker exec -it dify_pj-api-1 /bin/bash
|
写在最后
最后,有人会说 dify 明明提供免费的云服务版本——我为啥要费力气自己搭建?
这里同样放一张,官方的参数图。
我也体验了下dify 提供的云服务。
好处是功能组件都是全的(不用自己再初始化添加组件),用来熟悉dify功能和快速搭建工作流是不错的。
但是,执行过程中偶尔会抽风报个错(具体是啥报错 忘了截图了),而且知识库和 应用程序一旦多起来,升级的开销就比较贵了。
下期,可能分享n8n 平台的搭建,后续也会比较这三家低代码平台的差异。
感兴趣的小伙伴不妨关注、期待下 。