|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+# Docker Compose for Dify Self-Hosted
|
|
|
2
|
+# 西安云美电子科技有限公司 - 企业知识库
|
|
|
3
|
+# 版本:基于 Dify v1.x 社区版
|
|
|
4
|
+#
|
|
|
5
|
+# 使用方法:
|
|
|
6
|
+# cp .env.example .env
|
|
|
7
|
+# 编辑 .env 填写实际值
|
|
|
8
|
+# docker compose up -d
|
|
|
9
|
+
|
|
|
10
|
+services:
|
|
|
11
|
+
|
|
|
12
|
+ ### ======================== 基础设施 ========================
|
|
|
13
|
+
|
|
|
14
|
+ # PostgreSQL 数据库
|
|
|
15
|
+ db:
|
|
|
16
|
+ image: postgres:15-alpine
|
|
|
17
|
+ restart: always
|
|
|
18
|
+ environment:
|
|
|
19
|
+ POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
|
20
|
+ POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
|
21
|
+ POSTGRES_DB: ${POSTGRES_DB:-dify}
|
|
|
22
|
+ volumes:
|
|
|
23
|
+ - db_data:/var/lib/postgresql/data
|
|
|
24
|
+ healthcheck:
|
|
|
25
|
+ test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}"]
|
|
|
26
|
+ interval: 10s
|
|
|
27
|
+ timeout: 5s
|
|
|
28
|
+ retries: 5
|
|
|
29
|
+ networks:
|
|
|
30
|
+ - dify-network
|
|
|
31
|
+
|
|
|
32
|
+ # Redis 缓存
|
|
|
33
|
+ redis:
|
|
|
34
|
+ image: redis:7-alpine
|
|
|
35
|
+ restart: always
|
|
|
36
|
+ command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
|
|
|
37
|
+ volumes:
|
|
|
38
|
+ - redis_data:/data
|
|
|
39
|
+ healthcheck:
|
|
|
40
|
+ test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
|
|
|
41
|
+ interval: 10s
|
|
|
42
|
+ timeout: 5s
|
|
|
43
|
+ retries: 5
|
|
|
44
|
+ networks:
|
|
|
45
|
+ - dify-network
|
|
|
46
|
+
|
|
|
47
|
+ ### ======================== Dify 核心服务 ========================
|
|
|
48
|
+
|
|
|
49
|
+ # Dify API 后端
|
|
|
50
|
+ api:
|
|
|
51
|
+ image: langgenius/dify-api:latest
|
|
|
52
|
+ restart: always
|
|
|
53
|
+ env_file:
|
|
|
54
|
+ - .env.docker
|
|
|
55
|
+ environment:
|
|
|
56
|
+ # 基础配置
|
|
|
57
|
+ - MODE=${DIFY_MODE:-api}
|
|
|
58
|
+ - LOG_LEVEL=${LOG_LEVEL:-INFO}
|
|
|
59
|
+ - LOG_FILE=${LOG_FILE:-}
|
|
|
60
|
+ - SECRET_KEY=${SECRET_KEY}
|
|
|
61
|
+ # 数据库配置
|
|
|
62
|
+ - DB_USERNAME=${POSTGRES_USER:-postgres}
|
|
|
63
|
+ - DB_PASSWORD=${POSTGRES_PASSWORD}
|
|
|
64
|
+ - DB_HOST=db
|
|
|
65
|
+ - DB_PORT=5432
|
|
|
66
|
+ - DB_DATABASE=${POSTGRES_DB:-dify}
|
|
|
67
|
+ # Redis 配置
|
|
|
68
|
+ - REDIS_HOST=redis
|
|
|
69
|
+ - REDIS_PORT=6379
|
|
|
70
|
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
|
|
|
71
|
+ - REDIS_DB=${REDIS_DB:-0}
|
|
|
72
|
+ # 存储配置
|
|
|
73
|
+ - STORAGE_TYPE=${STORAGE_TYPE:-local}
|
|
|
74
|
+ - STORAGE_LOCAL_PATH=/app/api/storage
|
|
|
75
|
+ # 向量数据库
|
|
|
76
|
+ - VECTOR_STORE=${VECTOR_STORE:-qdrant}
|
|
|
77
|
+ - QDRANT_URL=http://qdrant:6333
|
|
|
78
|
+ - QDRANT_API_KEY=${QDRANT_API_KEY:-}
|
|
|
79
|
+ # S3 配置(可选)
|
|
|
80
|
+ - S3_USE_CUSTOM_DOMAIN=${S3_USE_CUSTOM_DOMAIN:-true}
|
|
|
81
|
+ - S3_ENDPOINT=${S3_ENDPOINT:-}
|
|
|
82
|
+ - S3_BUCKET_NAME=${S3_BUCKET_NAME:-}
|
|
|
83
|
+ - S3_ACCESS_KEY=${S3_ACCESS_KEY:-}
|
|
|
84
|
+ - S3_SECRET_KEY=${S3_SECRET_KEY:-}
|
|
|
85
|
+ - S3_REGION=${S3_REGION:-}
|
|
|
86
|
+ # SandBox 配置
|
|
|
87
|
+ - CODE_EXECUTION_API_KEY=${SANDBOX_API_KEY:-}
|
|
|
88
|
+ - CODE_EXECUTION_API_URL=${SANDBOX_URL:-}
|
|
|
89
|
+ # 模型配置(DeepSeek)
|
|
|
90
|
+ - DEEPSEEK_API_BASE=${DEEPSEEK_API_BASE:-https://api.deepseek.com}
|
|
|
91
|
+ - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-}
|
|
|
92
|
+ # 其他
|
|
|
93
|
+ - HTTP_APP_PORT=5001
|
|
|
94
|
+ - CELERY_BROKER_URL=redis://:${REDIS_PASSWORD}@redis:6379/1
|
|
|
95
|
+ - CELERY_RESULT_BACKEND=redis://:${REDIS_PASSWORD}@redis:6379/1
|
|
|
96
|
+ volumes:
|
|
|
97
|
+ - api_storage:/app/api/storage
|
|
|
98
|
+ - app_data:/app/data
|
|
|
99
|
+ depends_on:
|
|
|
100
|
+ db:
|
|
|
101
|
+ condition: service_healthy
|
|
|
102
|
+ redis:
|
|
|
103
|
+ condition: service_healthy
|
|
|
104
|
+ networks:
|
|
|
105
|
+ - dify-network
|
|
|
106
|
+
|
|
|
107
|
+ # Dify Web 前端
|
|
|
108
|
+ web:
|
|
|
109
|
+ image: langgenius/dify-web:latest
|
|
|
110
|
+ restart: always
|
|
|
111
|
+ environment:
|
|
|
112
|
+ - NEXT_PUBLIC_API_BASE_URL=${NEXT_PUBLIC_API_BASE_URL:-}
|
|
|
113
|
+ - NEXT_PUBLIC_DEPLOY_ENV=${NEXT_PUBLIC_DEPLOY_ENV:-PRODUCTION}
|
|
|
114
|
+ volumes:
|
|
|
115
|
+ - web_config:/app/config
|
|
|
116
|
+ depends_on:
|
|
|
117
|
+ - api
|
|
|
118
|
+ networks:
|
|
|
119
|
+ - dify-network
|
|
|
120
|
+
|
|
|
121
|
+ # Dify Worker(异步任务处理)
|
|
|
122
|
+ worker:
|
|
|
123
|
+ image: langgenius/dify-api:latest
|
|
|
124
|
+ restart: always
|
|
|
125
|
+ env_file:
|
|
|
126
|
+ - .env.docker
|
|
|
127
|
+ environment:
|
|
|
128
|
+ # 基础配置
|
|
|
129
|
+ - MODE=${DIFY_MODE:-worker}
|
|
|
130
|
+ - LOG_LEVEL=${LOG_LEVEL:-INFO}
|
|
|
131
|
+ - SECRET_KEY=${SECRET_KEY}
|
|
|
132
|
+ # 数据库配置
|
|
|
133
|
+ - DB_USERNAME=${POSTGRES_USER:-postgres}
|
|
|
134
|
+ - DB_PASSWORD=${POSTGRES_PASSWORD}
|
|
|
135
|
+ - DB_HOST=db
|
|
|
136
|
+ - DB_PORT=5432
|
|
|
137
|
+ - DB_DATABASE=${POSTGRES_DB:-dify}
|
|
|
138
|
+ # Redis 配置
|
|
|
139
|
+ - REDIS_HOST=redis
|
|
|
140
|
+ - REDIS_PORT=6379
|
|
|
141
|
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
|
|
|
142
|
+ - REDIS_DB=${REDIS_DB:-0}
|
|
|
143
|
+ # 存储配置
|
|
|
144
|
+ - STORAGE_TYPE=${STORAGE_TYPE:-local}
|
|
|
145
|
+ - STORAGE_LOCAL_PATH=/app/api/storage
|
|
|
146
|
+ # 向量数据库
|
|
|
147
|
+ - VECTOR_STORE=${VECTOR_STORE:-qdrant}
|
|
|
148
|
+ - QDRANT_URL=http://qdrant:6333
|
|
|
149
|
+ - QDRANT_API_KEY=${QDRANT_API_KEY:-}
|
|
|
150
|
+ # 模型配置(DeepSeek)
|
|
|
151
|
+ - DEEPSEEK_API_BASE=${DEEPSEEK_API_BASE:-https://api.deepseek.com}
|
|
|
152
|
+ - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-}
|
|
|
153
|
+ # Celery
|
|
|
154
|
+ - CELERY_BROKER_URL=redis://:${REDIS_PASSWORD}@redis:6379/1
|
|
|
155
|
+ - CELERY_RESULT_BACKEND=redis://:${REDIS_PASSWORD}@redis:6379/1
|
|
|
156
|
+ volumes:
|
|
|
157
|
+ - api_storage:/app/api/storage
|
|
|
158
|
+ - app_data:/app/data
|
|
|
159
|
+ depends_on:
|
|
|
160
|
+ db:
|
|
|
161
|
+ condition: service_healthy
|
|
|
162
|
+ redis:
|
|
|
163
|
+ condition: service_healthy
|
|
|
164
|
+ networks:
|
|
|
165
|
+ - dify-network
|
|
|
166
|
+
|
|
|
167
|
+ ### ======================== 向量数据库 ========================
|
|
|
168
|
+
|
|
|
169
|
+ # Qdrant 向量数据库(默认)
|
|
|
170
|
+ qdrant:
|
|
|
171
|
+ image: qdrant/qdrant:latest
|
|
|
172
|
+ restart: always
|
|
|
173
|
+ volumes:
|
|
|
174
|
+ - qdrant_data:/qdrant/storage
|
|
|
175
|
+ environment:
|
|
|
176
|
+ - QDRANT_API_KEY=${QDRANT_API_KEY:-}
|
|
|
177
|
+ ports:
|
|
|
178
|
+ - "${QDRANT_PORT:-6333}:6333"
|
|
|
179
|
+ networks:
|
|
|
180
|
+ - dify-network
|
|
|
181
|
+
|
|
|
182
|
+ ### ======================== 安全与代理 ========================
|
|
|
183
|
+
|
|
|
184
|
+ # Nginx 反向代理
|
|
|
185
|
+ nginx:
|
|
|
186
|
+ image: nginx:alpine
|
|
|
187
|
+ restart: always
|
|
|
188
|
+ ports:
|
|
|
189
|
+ - "${NGINX_PORT:-80}:80"
|
|
|
190
|
+ - "${NGINX_SSL_PORT:-443}:443"
|
|
|
191
|
+ volumes:
|
|
|
192
|
+ - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
|
|
193
|
+ - ./nginx/ssl:/etc/nginx/ssl:ro
|
|
|
194
|
+ - nginx_logs:/var/log/nginx
|
|
|
195
|
+ depends_on:
|
|
|
196
|
+ - api
|
|
|
197
|
+ - web
|
|
|
198
|
+ networks:
|
|
|
199
|
+ - dify-network
|
|
|
200
|
+
|
|
|
201
|
+ # SSRF 代理(安全防护)
|
|
|
202
|
+ ssrf-proxy:
|
|
|
203
|
+ image: ubuntu/squid:latest
|
|
|
204
|
+ restart: always
|
|
|
205
|
+ volumes:
|
|
|
206
|
+ - ./ssrf-proxy/squid.conf.template:/etc/squid/squid.conf.template:ro
|
|
|
207
|
+ environment:
|
|
|
208
|
+ - HTTP_PROXY_PORT=${SSRF_PROXY_PORT:-3128}
|
|
|
209
|
+ ports:
|
|
|
210
|
+ - "${SSRF_PROXY_PORT:-3128}:3128"
|
|
|
211
|
+ networks:
|
|
|
212
|
+ - dify-network
|
|
|
213
|
+
|
|
|
214
|
+ ### ======================== 可选服务 ========================
|
|
|
215
|
+
|
|
|
216
|
+ # Sandbox 代码执行环境(可选,按需启用)
|
|
|
217
|
+ # sandbox:
|
|
|
218
|
+ # image: langgenius/dify-sandbox:latest
|
|
|
219
|
+ # restart: always
|
|
|
220
|
+ # environment:
|
|
|
221
|
+ # - API_KEY=${SANDBOX_API_KEY}
|
|
|
222
|
+ # - GIN_MODE=release
|
|
|
223
|
+ # - WORKER_TIMEOUT=${SANDBOX_WORKER_TIMEOUT:-15}
|
|
|
224
|
+ # - ENABLE_NETWORK=${SANDBOX_ENABLE_NETWORK:-true}
|
|
|
225
|
+ # volumes:
|
|
|
226
|
+ # - sandbox_data:/data
|
|
|
227
|
+ # networks:
|
|
|
228
|
+ # - dify-network
|
|
|
229
|
+
|
|
|
230
|
+ # Elasticsearch(可选,替代 Qdrant)
|
|
|
231
|
+ # elasticsearch:
|
|
|
232
|
+ # image: elasticsearch:8.11.0
|
|
|
233
|
+ # restart: always
|
|
|
234
|
+ # volumes:
|
|
|
235
|
+ # - es_data:/usr/share/elasticsearch/data
|
|
|
236
|
+ # environment:
|
|
|
237
|
+ # - discovery.type=single-node
|
|
|
238
|
+ # - xpack.security.enabled=false
|
|
|
239
|
+ # - ES_JAVA_OPTS=-Xms512m -Xmx512m
|
|
|
240
|
+ # networks:
|
|
|
241
|
+ # - dify-network
|
|
|
242
|
+
|
|
|
243
|
+ # Weaviate(可选,替代 Qdrant)
|
|
|
244
|
+ # weaviate:
|
|
|
245
|
+ # image: semitechnologies/weaviate:latest
|
|
|
246
|
+ # restart: always
|
|
|
247
|
+ # volumes:
|
|
|
248
|
+ # - weaviate_data:/var/lib/weaviate
|
|
|
249
|
+ # environment:
|
|
|
250
|
+ # - QUERY_DEFAULTS_LIMIT=25
|
|
|
251
|
+ # - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true
|
|
|
252
|
+ # - PERSISTENCE_DATA_PATH=/var/lib/weaviate
|
|
|
253
|
+ # ports:
|
|
|
254
|
+ # - "8080:8080"
|
|
|
255
|
+ # networks:
|
|
|
256
|
+ # - dify-network
|
|
|
257
|
+
|
|
|
258
|
+volumes:
|
|
|
259
|
+ db_data:
|
|
|
260
|
+ redis_data:
|
|
|
261
|
+ api_storage:
|
|
|
262
|
+ app_data:
|
|
|
263
|
+ qdrant_data:
|
|
|
264
|
+ nginx_logs:
|
|
|
265
|
+ # sandbox_data:
|
|
|
266
|
+ # es_data:
|
|
|
267
|
+ # weaviate_data:
|
|
|
268
|
+
|
|
|
269
|
+networks:
|
|
|
270
|
+ dify-network:
|
|
|
271
|
+ driver: bridge
|