Ai工作流集成
简介
AI工作流集成了Claude Code、Gemini CLI和Cursor的规范驱动开发,从原型到生产。Slash命令强制执行结构化需求→设计→任务的工作流程,彻底改变您使用AI进行构建的方式。
Dify AI工作流
Dify 是一个开源的、可自托管的、功能丰富的 AI 应用平台,支持多种大模型和数据源,帮助用户快速构建和部署 AI 驱动的应用程序。它提供了一个直观的界面和强大的工具集,使开发者能够轻松地创建、管理和扩展 AI 应用。
安装
官方文档提供了多种安装方式,包括使用 Docker、Docker Compose 和直接在服务器上安装。下面以docker方式安装自己需要的组件。postgresql、redis等组件没有的需要自己安装。
Docker Compose 方式安装
访问github代码仓库进入docker目录下载docker目录下文件,建议全部下载:
- .env.example 环境变量模版
- docker-compose-template.yaml 服务配置文件模版
- generate_docker_compose 生成docker-compose.yaml脚本
- middleware.env.example 中间件配置文件模版
- docker-compose.middleware.yaml 中间件配置文件
- volumes目录 部分docker容器卷挂载目录,包含配置文件。
配置环境变量
将.env.example 重命名为.env, 并根据需要修改配置文件中的参数。配置参数说明文档
以下部分重要参数配置说明如下:
# ------------------------------
# 常用变量
# ------------------------------
# 控制台 API 的后端 URL,
# 用于连接授权回调。
# 如果为空,则表示是同一个域。
# 示例:https://api.console.dify.ai
CONSOLE_API_URL=
# 控制台网页的前端 URL,
# 用于连接一些前端地址并用于 CORS 配置。
# 如果为空,则表示是同一个域。
# 示例:https://console.dify.ai
CONSOLE_WEB_URL=
# 服务 API 网址,
# 用于向前端显示服务 API 基本 URL。
# 如果为空,则表示是同一个域。
# 示例:https://api.dify.ai
SERVICE_API_URL=
# WebApp API 后端 URL,
# 用于声明前端 API 的后端 URL。
# 如果为空,则表示是同一个域。
# 示例:https://api.app.dify.ai
APP_API_URL=
# WebApp 网址,
#用于向前端显示WebAPP API Base Url。
# 如果为空,则表示是同一个域。
# 示例:https://app.dify.ai
APP_WEB_URL=
# 文件预览或下载 Url 前缀。
# 用于显示文件预览或下载 Url 到前端或作为多模型输入;
# Url 已签名并具有过期时间。
# 文件处理插件需要设置FILES_URL。
# - 对于 https://example.com,使用 FILES_URL=https://example.com
# - 对于 http://example.com,使用 FILES_URL=http://example.com
# 建议:使用专用域名(例如,https://upload.example.com)。
# 或者,使用 http://<your-ip>:5001 或 http://api:5001,
# 确保端口 5001 可从外部访问(参见 docker-compose.yaml)。
FILES_URL=http://api:5001
# INTERNAL_FILES_URL 用于 Docker 网络内的插件守护进程通信。
# 将其设置为内部 Docker 服务 URL,以便正确访问插件文件。
# 示例:INTERNAL_FILES_URL=http://api:5001
INTERNAL_FILES_URL=
# ------------------------------
# 服务器配置
# ------------------------------
# 应用程序的日志级别。
# 支持的值有 `DEBUG`、`INFO`、`WARNING`、`ERROR`、`CRITICAL`
LOG_LEVEL=信息
# 日志文件路径
LOG_FILE=/app/logs/server.log
# 日志文件最大大小,单位为MB
日志文件最大大小=20
# 日志文件最大备份数
日志文件备份数量=5
# 记录日期格式
LOG_DATEFORMAT=%Y-%m-%d %H:%M:%S
# 记录时区
LOG_TZ=UTC
# 调试模式,默认为false。
# 建议本地开发时开启此配置
# 防止monkey patch引起的一些问题。
调试=false
# Flask 调试模式,开启后可以在界面输出trace信息,
#方便调试。
FLASK_DEBUG=false
# 启用请求日志记录,将记录请求和响应信息。
# 日志级别为 DEBUG
ENABLE_REQUEST_LOGGING=False
# 用于安全签署会话 cookie 的密钥
# 并加密数据库上的敏感信息。
# 您可以使用“openssl rand -base64 42”生成强密钥。
SECRET_KEY=sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U
# 管理员用户初始化的密码。
# 如果未设置,则不会提示管理员用户输入密码
# 创建初始管理员帐户时。
# 密码长度不能超过30个字符。
INIT_PASSWORD=
# 部署环境。
# 支持的值是 `PRODUCTION`、`TESTING`。默认为 `PRODUCTION`。
# 测试环境,前端页面会有明显的颜色标签,
# 表示该环境是测试环境。
DEPLOY_ENV=PRODUCTION
# 是否启用版本检查策略。
# 如果设置为空,将调用 https://updates.dify.ai 进行版本检查。
CHECK_UPDATE_URL=https://updates.dify.ai
# 用于更改 OpenAI 基地址,默认为 https://api.openai.com/v1。
# 当OpenAI在国内无法访问时,更换为国内镜像地址,
# 或者当本地模型提供OpenAI兼容的API时,它可以被替换。
OPENAI_API_BASE=https://api.openai.com/v1
# ------------------------------
# 数据库配置
# 数据库使用 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_DB=0
 # ------------------------------
# Celery Configuration
# ------------------------------
# 使用独立 redis 作为 broker,redis db 1 作为 celery broker。(redis_username 通常默认为空)
# 格式如下:`redis://<redis_username>:<redis_password>@<redis_host>:<redis_port>/<redis_database>`。
# 示例:redis://:difyai123456@redis:6379/1
# 如果使用 Redis Sentinel,格式如下:`sentinel://<redis_username>:<redis_password>@<sentinel_host1>:<sentinel_port>/<redis_database>`
# 为了实现高可用性,您可以配置多个 Sentinel 节点(如果提供),并以分号分隔,如下例所示:
# 示例:sentinel://:difyai123456@localhost:26379/1;sentinel://:difyai12345@localhost:26379/1;sentinel://:difyai12345@localhost:26379/1
CELERY_BROKER_URL=redis://:difyai123456@redis:6379/1
CELERY_BACKEND=redis
# ------------------------------
# 文件存储配置
# ------------------------------
# 用于存储用户文件的存储类型。
STORAGE_TYPE=opendal
# Apache OpenDAL 配置
# OpenDAL 的配置由以下格式组成:OPENDAL_<SCHEME_NAME>_<CONFIG_NAME>。
# 您可以在以下存储库中找到所有服务配置(CONFIG_NAME):https://github.com/apache/opendal/tree/main/core/src/services。
# Dify 将扫描以 OPENDAL_<SCHEME_NAME> 开头的配置并自动应用它们。
# OpenDAL 存储的方案名称。
OPENDAL_SCHEME=fs
# OpenDAL 本地文件系统的配置。
OPENDAL_FS_ROOT=storage
# ClickZetta 卷配置(用于存储后端)
# 要使用 ClickZetta Volume 作为存储后端,请设置 STORAGE_TYPE=clickzetta-volume
# 注意:ClickZetta Volume 将重用现有的 CLICKZETTA_* 连接参数
# 卷类型选择(三种类型可用):
# - 用户:个人/小团队使用,简单配置,用户级权限
# - 表:企业多租户,智能路由,表级+用户级权限
# - 外部:数据湖集成、外部存储连接、卷级 + 存储级权限
CLICKZETTA_VOLUME_TYPE=user
# aws/aliyun/s3等等配置根据需要进行配置
# ------------------------------
# 向量数据库配置
# ------------------------------
# 要使用的向量存储类型。
# 支持的值有:`weaviate`、`qdrant`、`milvus`、`myscale`、`relyt`、`pgvector`、`pgvecto-rs`、`chroma`、`opensearch`、`oracle`、`tencent`、`elasticsearch`、`elasticsearch-ja`、`analyticdb`、`couchbase`、`vikingdb`、`oceanbase`、`opengauss`、`tablestore`、`vastbase`、`tidb`、`tidb_on_qdrant`、`baidu`、`lindorm`、`huawei_cloud`、`upstash`、`matrixone`、`clickzetta`。
VECTOR_STORE=weaviate
# 用于在矢量数据库中创建集合名称的前缀
VECTOR_INDEX_NAME_PREFIX=Vector_index
# tidb、oracle...根据选择的存储库进行配置
# ------------------------------
# 知识库配置
# ------------------------------
# 上传文件大小限制,默认15M。
UPLOAD_FILE_SIZE_LIMIT=15
# 一次最多可以上传的文件数,默认5。
UPLOAD_FILE_BATCH_LIMIT=5
# ETL 类型,支持:`dify`、`Unstructured`
# `dify` Dify 专有的文件提取方案
# `Unstructured` Unstructured.io 文件提取方案
ETL_TYPE=dify
# 非结构化 API 路径和 API 密钥,ETL_TYPE 为非结构化时需要配置
# 或者使用非结构化作为 pptx 的文档提取器节点。
# 例如:http://unstructured:8000/general/v0/general
UNSTRUCTURED_API_URL=
UNSTRUCTURED_API_KEY=
SCARF_NO_ANALYTICS=true
# ------------------------------
# 模型配置
# ------------------------------
# 提示生成允许的最大令牌数。
# 此设置控制 LLM 可以使用的令牌的上限
# 在提示生成工具中生成提示时。
# 默认值:512 个令牌。
PROMPT_GENERATION_MAX_TOKENS=512
# 代码生成允许的最大令牌数。
# 此设置控制 LLM 可以使用的令牌的上限
# 在代码生成工具中生成代码时。
# 默认值:1024 个令牌。
CODE_GENERATION_MAX_TOKENS=1024
# 启用或禁用基于插件的令牌计数。如果禁用,令牌计数将返回 0。
# 这可以通过跳过令牌计数操作来提高性能。
# 默认值:false(禁用)。
PLUGIN_BASED_TOKEN_COUNTING_ENABLED=false
# ------------------------------
# 数据库服务的环境变量,如果不创建数据库实例可以忽略
# ------------------------------
# 默认 postgres 用户的名称。
POSTGRES_USER=${DB_USERNAME}
# 默认 postgres 用户的密码。
POSTGRES_PASSWORD=${DB_PASSWORD}
# 默认 postgres 数据库的名称。
POSTGRES_DB=${DB_DATABASE}
# postgres 数据目录
PGDATA=/var/lib/postgresql/data/pgdata生成 docker-compose.yaml
通过以下命令生成 docker-compose.yaml 文件,注意根据自己需要的组件进行修改脚本内容。比如使用已有的postgresql、redis服务可以删除相关内容。
python3 generate_docker_compose注意:生成的docker-compose.yaml 文件中根据自己的需要进行修改,比如端口映射、卷挂载等。可以将不需要的组件比如postgresql、redis、nginx等任务注释掉。
启动服务
# 启动项目
docker compose up -d
# 停止项目
docker compose down
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f编辑 .env 文件中的环境变量值后需要重启服务。
访问应用
# 本地访问地址
http://localhost/install
# 单边访问,如果设置了域名通过nginx反向代理访问,输入域名
http://localhost:3000问题:1.访问页面报错404
由于将docker-compose.yaml 中的nginx服务注释掉了,导致访问3000端口报错404。解决方法:将docker目录下的nginx目录中conf.d/default.conf.template 文件中的路由配置copy到自己的nginx配置文件中,修改域名等配置,然后重启nginx服务。
注意:如果自建nginx服务,需要将docker-compose.yaml中api服务的端口映射修改为3000:3000, 否则无法通过域名访问。
问题:2.plugin_daemon启动失败
plugin_daemon 服务环境变量DB_DATABASE默认配置dify_plugin,而实际数据库中没有这个库,导致启动失败。解决方法:修改.env中DB_PLUGIN_DATABASE变量值为dify(推荐), 或新建数据库dify_plugin。
问题:3.下载插件报错
将docker-compose.yaml中ssrf_proxy服务注释掉,导致下载插件报错。解决方法:取消注释ssrf_proxy服务。
原因是ssrf_proxy服务负责处理所有外网访问代理请求。如果没有这个服务,插件下载请求将无法正确路由到外部网络,从而导致下载失败。
参考资料:https://blog.csdn.net/zhyhang/article/details/146140019
问题:4.sandbox启动、执行任务失败
启动失败:缺少配置文件,导致sandbox无法正常启动。解决方法:下载docker/volumes/sandbox目录到和.env文件同级目录。如果修改了docker-compse.yaml文件sandbox服务的挂在路径,需要将docker/volumes/sandbox目录中的内容复制到新的挂载路径。
执行任务失败:修改.env文件中SANDBOX_API_KEY没有同步修改volumes/sandbox/conf/config.yaml
n8n AI工作流
n8n 是一个开源的工作流自动化工具,允许用户通过可视化界面创建和管理复杂的工作流。它支持多种集成,包括各种应用程序和服务,使用户能够轻松地自动化任务和业务流程。n8n 提供了丰富的节点库,用户可以通过拖放操作来构建工作流,而无需编写代码。
安装
docker 安装参考官方文档。下面用docker compose方式安装。并实现中文化语言。
- 先访问n8n 中文国际化 下载中文语言包到本地目录,比如:/home/Francis/docker/volume/n8n-ui-i18n 
- 创建docker-compose.yaml 文件,内容如下: 
version: '3.8'
services:
  n8n: # n8n 工作流自动化工具
    container_name: n8n
    image: n8nio/n8n
    restart: always
    network_mode: bridge
    ports:
      - 5678:5678
    environment:
      - N8N_DEFAULT_LOCALE=zh-CN
      - N8N_SECURE_COOKIE=false
      - N8N_HOST=n8n.kdaiyu.com
      - WEBHOOK_URL=https://n8n.kdaiyu.com/
    volumes:
      - /home/Francis/docker/volume/n8n:/home/node/.n8n
      # 挂载中文语言包
      - /home/Francis/docker/volume/n8n-ui-i18n:/usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist
      # 共享host的时间环境
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro- 启动服务
docker compose -f n8n-compose.yaml -p n8n up -d- 升级n8n
docker compose -f n8n-compose.yaml -p n8n pull- 使用PostgreSQL数据库【可选】
使用 PostgreSQL 时,n8n 不需要使用 .n8n SQLite 数据库文件的目录。但是,该目录仍包含其他重要数据,例如加密密钥、实例日志和源代码管理功能资产。虽然您可以解决其中一些要求(例如,通过将 N8N_ENCRYPTION_KEY 环境变量 ),最好继续为目录映射持久卷,以避免潜在问题。
version: '3.8'
services:
  n8n: # n8n 工作流自动化工具
    container_name: n8n
    image: n8nio/n8n
    restart: always
    network_mode: bridge
    ports:
      - 5678:5678
    environment:
      - N8N_DEFAULT_LOCALE=zh-CN
      - N8N_SECURE_COOKIE=false
      - N8N_HOST=n8n.kdaiyu.com
      - WEBHOOK_URL=https://n8n.kdaiyu.com/
      -e DB_TYPE=postgresdb
      -e DB_POSTGRESDB_DATABASE=<POSTGRES_DATABASE>
      -e DB_POSTGRESDB_HOST=<POSTGRES_HOST>
      -e DB_POSTGRESDB_PORT=<POSTGRES_PORT>
      -e DB_POSTGRESDB_USER=<POSTGRES_USER>
      -e DB_POSTGRESDB_SCHEMA=<POSTGRES_SCHEMA>
      -e DB_POSTGRESDB_PASSWORD=<POSTGRES_PASSWORD>
    volumes:
      - /home/Francis/docker/volume/n8n:/home/node/.n8n
      # 挂载中文语言包
      - /home/Francis/docker/volume/n8n-ui-i18n:/usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist
      # 共享host的时间环境
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro- 工作流备份
生成环境建议使用postgresql存储数据,定期将工作流导出到json文件,然后提交到git等版本管理工具中,防止数据丢失。
常见错误
- 提示Connection lost错误,一般是nginx代理配置问题。添加websocket支持,参考n8n 文档
location / {
    proxy_pass http://localhost:5678;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}- 浏览器控制台报错,代理服务telemetry/proxy/v1/track,telemetry/proxy/v1/page访问异常。通常是环境变量WEBHOOK_URL配置错误,参考n8n 文档
N8N_HOST=n8n.yourdomain.com
WEBHOOK_URL=https://n8n.yourdomain.com/
# docker 执行是可配置到环境变量中