微信扫码
与创始人交个朋友
我要投稿
什么是 Dify ?
Dify(Do it for you)
是一个高精度的LLMOps
平台,基于不同的大型语言模型能力,让更多人可以简单地创建可持续操作的原生AI
应用。Dify
提供多种类型应用的可视化编排,应用可开箱即用,也能以“云端即服务”的API
提供服务。其直观的界面结合了AI
工作流程、RAG
管道、代理功能、模型管理、可观察性功能等,让您快速从原型转向生产。
通过 Dify
创建的应用包含了:
Web
站点,支持表单模式和聊天对话模式API
即可包含插件、上下文增强等能力,代替你省下底层的编写工作在群晖上以 Docker 方式安装。
在安装 Dify
之前,请确保您的计算机满足以下最低系统要求:
CPU
>= 2
核4GB
第一步需要我们建好目录,为了方便起见,全程都是通过 SSH
客户端登录到群晖,在命令行进行操作
# 新建文件夹 dify 和 子目录
mkdir -p /volume1/docker/dify/{db,nginx/conf.d,redis,storage,weaviate}
# 进入 dify 目录
cd /volume1/docker/dify
下一步就是准备好相关的文件,这些文件老苏已打包好了,https://github.com/wbsu2003/synology/raw/main/Dify/dify.zip
官方的示例 docker-compose.yaml
中包含的容器比较多,例如:
沙盒服务,它会确保恶意代码不会被执行,具体说明:https://docs.dify.ai/v/zh-hans/guides/workflow/node/code#ben-di-bu-shu
SSRF_PROXY
则能避免 SSRF
攻击,具体说明:https://docs.dify.ai/v/zh-hans/learn-more/faq/install-faq#id-18.-wei-shi-mo-xu-yao-ssrfproxy
因为老苏并不打算部署到公网,所以做了些精简。将下面的内容保存为 docker-compose.yml
文件即可
kimi
及 chatgpt
翻译;UTF-8
格式version: '3'
services:
# API 服务
api:
image: langgenius/dify-api:0.6.8
container_name: dify-api
restart: always
environment:
# 启动模式,'api' 指启动为 API 服务器。
MODE: api
# 应用的日志级别。支持的值有 `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`
LOG_LEVEL: INFO
# 用于安全签名会话 cookie 和加密数据库上敏感信息的密钥。你可以使用 `openssl rand -base64 42` 生成一个强密钥。
SECRET_KEY: sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U
# 控制台应用程序 Web 前端的基础 URL,如果控制台域与 API 或 Web 应用程序域不同,则指的是 WEB 服务的控制台基础 URL。
# 示例:http://cloud.dify.ai
CONSOLE_WEB_URL: 'http://192.168.0.197:8848'
# 用于管理员用户初始化的密码。
# # 如果未设置,创建初始管理员帐户时管理员用户将不会提示输入密码。
INIT_PASSWORD: ''
# 控制台应用程序 API 服务器的基础 URL,如果控制台域与 API 或 Web 应用程序域不同,则指的是 WEB 服务的控制台基础 URL。
# 示例: http://cloud.dify.ai
CONSOLE_API_URL: 'http://192.168.0.197:8848'
# 服务 API 端点的 URL 前缀,如果 API 域与控制台域不同,则指的是当前 API 服务的基础 URL。
# 示例: http://api.dify.ai
SERVICE_API_URL: 'http://192.168.0.197:8848'
# # Web 应用程序前端的 URL 前缀,如果 Web 应用程序域与控制台或 API 域不同,则指的是 WEB 服务的 Web 应用程序基础 URL。
# 示例: http://udify.app
APP_WEB_URL: 'http://192.168.0.197:8848'
# 文件预览或下载的 URL 前缀。
# 用于将文件预览或下载的 URL 显示给前端或作为多模型输入;
# URL 是签名的,并且具有过期时间。
FILES_URL: 'http://192.168.0.197:8848'
# 当启用时,应用程序启动之前将执行迁移,并在迁移完成后启动应用程序。
MIGRATION_ENABLED: 'true'
# PostgreSQL 数据库连接的配置。它与下面的 'db' 服务中的配置保持一致。
DB_USERNAME: postgres
DB_PASSWORD: difyai123456
DB_HOST: db
DB_PORT: 5432
DB_DATABASE: dify
# Redis 连接的配置。它与下面的 'redis' 服务中的配置保持一致。
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_USERNAME: ''
REDIS_PASSWORD: difyai123456
REDIS_USE_SSL: 'false'
# 使用 Redis 数据库 0 作为 Redis 缓存。
REDIS_DB: 0
# Celery 代理的配置。使用 Redis 作为代理,并使用 Redis 数据库 1 作为 Celery 代理。
CELERY_BROKER_URL: redis://:difyai123456@redis:6379/1
# 指定允许进行跨域请求的 Web API 的源,例如 https://dify.app 或 * 表示所有源都允许。
WEB_API_CORS_ALLOW_ORIGINS: '*'
# 指定允许对控制台 API 进行跨域请求的源,例如 https://cloud.dify.ai 或 * 表示所有源都允许。
CONSOLE_CORS_ALLOW_ORIGINS: '*'
# CSRF Cookie 设置
# 控制是否在跨站点请求中发送 cookie,以提供一定程度的跨站点请求伪造攻击防护。
#
# 默认值:`SameSite=Lax, Secure=false, HttpOnly=true`
# 此默认配置支持使用 HTTP 或 HTTPS 的同源请求,
# 但不支持跨源请求。它适用于本地调试目的。
#
# 如果您想启用跨源支持,
# 您必须使用 HTTPS 协议,并将配置设置为 `SameSite=None, Secure=true, HttpOnly=true`。
#
# 用于存储用户文件的存储类型。支持的值有 `local` 和 `s3` 和 `azure-blob` 和 `google-storage`,默认值:`local`
STORAGE_TYPE: local
# 本地存储目录的路径,相对于 API 服务代码的根路径或绝对路径。默认值为 storage 或 /home/john/storage。
# 仅当 STORAGE_TYPE 为 local 时可用。
STORAGE_LOCAL_PATH: storage
# 要使用的向量存储类型。支持的值有 `weaviate`, `qdrant`, `milvus`, `relyt`。
VECTOR_STORE: weaviate
# Weaviate 端点 URL。只有在 VECTOR_STORE 为 `weaviate` 时才可用。
WEAVIATE_ENDPOINT: http://weaviate:8080
# TWeaviate API 密钥。
WEAVIATE_API_KEY: WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih
# Sentry 错误报告的 DSN。如果未设置,则将禁用 Sentry 错误报告。
SENTRY_DSN: ''
# Sentry 事件的采样率。默认值:`1.0`
SENTRY_TRACES_SAMPLE_RATE: 1.0
# Sentry 配置文件的采样率。默认值:`1.0`
SENTRY_PROFILES_SAMPLE_RATE: 1.0
depends_on:
- db
- redis
volumes:
# 将存储目录挂载到容器上,用于存储用户文件。
- ./storage:/app/api/storage
# 注释掉以暴露 dify-api 端口到主机
# ports:
# - "5001:5001"
# worker 服务
# 用于处理队列的 Celery 工作器。
worker:
image: langgenius/dify-api:0.6.8
container_name: dify-worker
restart: always
environment:
CONSOLE_WEB_URL: 'http://192.168.0.197:8848'
# 启动模式,设置为 'worker' 以启动用于处理队列的 Celery 工作器。
MODE: worker
# --- 下面的所有配置都与'api'服务中的相同。 ---
# 应用的日志级别。支持的值有 `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`
LOG_LEVEL: INFO
# 用于安全签名会话 cookie 和加密数据库上敏感信息的密钥。你可以使用 `openssl rand -base64 42` 生成一个强密钥。
# 与 API 服务相同
SECRET_KEY: sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U
# postgres 数据库连接的配置。它与下面的'db'服务中的配置一致。
DB_USERNAME: postgres
DB_PASSWORD: difyai123456
DB_HOST: db
DB_PORT: 5432
DB_DATABASE: dify
# redis 缓存连接的配置。
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_USERNAME: ''
REDIS_PASSWORD: difyai123456
REDIS_DB: 0
REDIS_USE_SSL: 'false'
# celery 代理的配置。
CELERY_BROKER_URL: redis://:difyai123456@redis:6379/1
# 用于存储用户文件的存储类型。支持的值有 `local` 和 `s3` 和 `azure-blob` 和 `google-storage`,默认值:`local`
STORAGE_TYPE: local
STORAGE_LOCAL_PATH: storage
# 要使用的向量存储类型。支持的值有 `weaviate`, `qdrant`, `milvus`, `relyt`, `pgvector`。
VECTOR_STORE: weaviate
# Weaviate 端点 URL。只有在 VECTOR_STORE 为 `weaviate` 时才可用。
WEAVIATE_ENDPOINT: http://weaviate:8080
# Weaviate API 密钥。
WEAVIATE_API_KEY: WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih
depends_on:
- db
- redis
volumes:
# 将存储目录挂载到容器上,用于存储用户文件。
- ./storage:/app/api/storage
# 前端 web 应用程序。
web:
image: langgenius/dify-web:0.6.8
container_name: dify-web
restart: always
environment:
# 控制台应用程序 API 服务器的基础 URL,如果控制台域与 api 或 web 应用程序域不同,指的是 WEB 服务的控制台基础 URL。
# 示例: http://cloud.dify.ai
CONSOLE_API_URL: 'http://192.168.0.197:8848'
# Web APP api 服务器的 URL,如果 web 应用程序域与控制台或 api 域不同,指的是 WEB 服务的 Web 应用程序基础 URL。
# 示例: http://udify.app
APP_API_URL: 'http://192.168.0.197:8848'
# Sentry 错误报告的 DSN。如果未设置,Sentry 错误报告将被禁用。
SENTRY_DSN: ''
# 注释掉以暴露 dify-web 端口到主机
# ports:
# - "3000:3000"
# postgres数据库。
db:
image: postgres:15-alpine
container_name: dify-db
restart: always
environment:
PGUSER: postgres
# 默认 postgres 用户的密码。
POSTGRES_PASSWORD: difyai123456
# 默认 postgres 数据库的名称。
POSTGRES_DB: dify
TZ: Asia/Shanghai
# postgres 数据目录
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- ./db:/var/lib/postgresql/data
# 注释掉以暴露 db(postgresql) 端口到主机
# ports:
# - "5432:5432"
healthcheck:
test: [ "CMD", "pg_isready" ]
interval: 1s
timeout: 3s
retries: 30
# redis 缓存。
redis:
image: redis:6-alpine
container_name: dify-redis
restart: always
volumes:
# 将 redis 数据目录挂载到容器上。
- ./redis:/data
# Set the redis password when startup redis server.
command: redis-server --requirepass difyai123456
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
# 注释掉以暴露 redis 端口到主机
# ports:
# - "6379:6379"
# Weaviate 向量存储。
weaviate:
image: semitechnologies/weaviate:1.19.0
container_name: dify-weaviate
restart: always
volumes:
# 将 Weaviate 数据目录挂载到容器上。
- ./weaviate:/var/lib/weaviate
environment:
# Weaviate 配置
# 你可以查阅 [Weaviate](https://weaviate.io/developers/weaviate/config-refs/env-vars) 文档以获取更多信息。
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'none'
CLUSTER_HOSTNAME: 'node1'
AUTHENTICATION_APIKEY_ENABLED: 'true'
AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih'
AUTHENTICATION_APIKEY_USERS: 'hello@dify.ai'
AUTHORIZATION_ADMINLIST_ENABLED: 'true'
AUTHORIZATION_ADMINLIST_USERS: 'hello@dify.ai'
# 注释掉以暴露 weaviate 端口到主机
# ports:
# - "8080:8080"
# nginx 反向代理
# 用于 API 服务和 Web 服务的反向代理。
nginx:
image: nginx:latest
container_name: dify-nginx
restart: always
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/proxy.conf:/etc/nginx/proxy.conf
- ./nginx/conf.d:/etc/nginx/conf.d
#- ./nginx/ssl:/etc/ssl
depends_on:
- api
- web
ports:
- "8848:80"
#- "443:443"
因为涉及的容器比较多,请务必仔细检查各个参数、环境变量,以免填错。老苏为了节省篇幅,将 kimi
对照翻译的版本放在了这里:https://github.com/wbsu2003/synology/blob/main/Dify/docker-compose.yml
dify-api
:提供 API
服务,使用 API
模式启动dify-worker
:使用 worker
模式启动,是 Celery
分布式任务队列系统的一部分,用于处理任务队列中的工作dify-web
:前端 Web
应用dify-db
:Postgres
数据库dify-redis
:缓存 Redis
dify-weaviate
:向量数据库 weaviate
-容器 dify-nginx
:反向代理服务器,代理 API
和 Web
服务关于 CONSOLE_WEB_URL
、CONSOLE_API_URL
、SERVICE_API_URL
、APP_WEB_URL
、FILES_URL
,在局域网使用的情况下,如果 nginx
的容器端口设置的是 80
,可以设置为 ''
,但如果不是的话,需要设置为 IP + 端口,否则发布的时候会截端口,上面的示例中,192.168.0.197
是群晖主机的 IP
,8848
则是 nginx
中的容器端口,你可以根据需要进行修改
将 docker-compose.yml
放入 dify
根目录
nginx
的配置文件来自官方,文件地址:https://github.com/langgenius/dify/tree/main/docker/nginx,老苏未做任何修改
其中 nginx.conf
是 Nginx
的主配置文件
usernginx;
worker_processesauto;
error_log/var/log/nginx/error.log notice;
pid/var/run/nginx.pid;
events {
worker_connections1024;
}
http {
include /etc/nginx/mime.types;
default_typeapplication/octet-stream;
log_formatmain'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log/var/log/nginx/access.logmain;
sendfileon;
#tcp_nopush on;
keepalive_timeout65;
#gzipon;
client_max_body_size 15M;
include /etc/nginx/conf.d/*.conf;
}
proxy.conf
用于定义反向代理的具体行为
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
以上两个文件放在 /dify/nginx
目录中
default.conf
提供了默认的服务器配置
server {
listen 80;
server_name _;
location /console/api {
proxy_pass http://api:5001;
include proxy.conf;
}
location /api {
proxy_pass http://api:5001;
include proxy.conf;
}
location /v1 {
proxy_pass http://api:5001;
include proxy.conf;
}
location /files {
proxy_pass http://api:5001;
include proxy.conf;
}
location / {
proxy_pass http://web:3000;
include proxy.conf;
}
# If you want to support HTTPS, please uncomment the code snippet below
#listen 443 ssl;
#ssl_certificate ./../ssl/your_cert_file.cer;
#ssl_certificate_key ./../ssl/your_cert_key.key;
#ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
#ssl_prefer_server_ciphers on;
#ssl_session_cache shared:SSL:10m;
#ssl_session_timeout 10m;
}
该文件在 /dify/nginx/conf.d
目录中
当文件准备好之后,就可以开始启动了
# 进入 dify 目录
cd /volume1/docker/dify
# 如果出现超时,可以设置大一点的值,例如下面?这样
export COMPOSE_HTTP_TIMEOUT=1200
# 一键启动
docker-compose up -d
稍等一会儿,如果设置没问题的话,你会看到 7
个容器启动了
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-04-25
2024-04-24
2024-07-20
2024-07-16
2024-05-08
2024-05-07
2024-05-09
2024-06-21
2024-04-25
2024-08-06