在 PAI-EAS 上部署 Dify 大模型应用平台

更新时间: 2025-11-05 09:42:39

与本地部署相比,通过 PAI-EAS 部署 Dify,可以利用其托管服务和弹性伸缩能力,使团队能够专注于应用逻辑开发,而无需自行维护底层环境,从而加速从原型到生产的迭代过程。

工作原理

本方案利用 PAI-EAS 作为 Dify 应用的托管平台,并通过挂载外部依赖的方式构建一个完整的服务。整体架构由 PAI-EAS 服务实例和外部云服务组成,它们通过 VPC 网络进行安全高效的通信。

架构核心组件包括:

  • PAI-EAS 服务:作为核心计算平台,EAS 以多容器的方式运行 Dify 的所有服务组件,包括 Web 界面、API 后端、异步任务 Worker 和插件沙箱等。EAS 负责服务的生命周期管理、资源调度和网络配置。

  • 云数据库 PostgreSQL 版 (RDS):存储用户、对话、知识库、工作流以及插件等配置的数据信息,将数据库与应用分离,确保了数据的持久性和独立性。

  • 云数据库 Redis 版:提供高性能缓存和消息队列功能。用于缓存热点数据、管理会话状态,并通过 Celery Broker 实现 Dify 各组件间的异步任务分发。

  • Elasticsearch:用作向量数据库和全文搜索引擎。在 RAG(检索增强生成)场景中,负责知识库文档的存储、索引和高效检索。

  • 对象存储 OSS:提供持久化文件存储。用于存放 Dify 应用的插件、上传的知识库文件以及其他需要持久化的数据,确保服务在更新或重启后数据不丢失。

工作流程如下:

用户通过 EAS 提供的 Web 服务地址访问 Dify 界面。所有请求首先由 Nginx 容器路由到 Dify-Web 或 Dify-API 容器。API 服务在处理业务逻辑时,会与后端的 PostgreSQL、Redis 和 Elasticsearch 进行数据交互。异步任务(如文档索引)则通过 Redis 投递给 Worker 容器执行。所有需要持久化的文件均读写至挂载的 OSS 路径。

一、准备依赖资源

部署 Dify 前,必须先准备好其运行所需的外部依赖服务。确保所有这些资源与将要部署的PAI-EAS 服务处于同一地域(Region)和同一 VPC 网络中,以避免网络连接问题。

重要

RDS PostgreSQL 和 Elasticsearch实例一旦创建,不支持切换 VPC。创建时必须选择与 PAI-EAS 服务相同的 VPC。

  1. 规划一个专有网络。如无,请创建专有网络与交换机

  2. 创建RDS PostgreSQL实例:创建成功后,需为其创建一个高权限账号,并使用该账号创建2个数据库分别用于存储Dify核心功能数据和插件数据。详情请参见创建账号和数据库

  3. 创建Redis实例:为确保 EAS 容器能够访问,必须将 PAI-EAS 服务所在交换机的 IP 网段添加到 Redis 实例的白名单中。该信息可以在 VPC 控制台的交换机详情页面获取。

  4. 创建阿里云Elasticsearch实例:用于知识库的向量存储和全文搜索引擎。同样,需确保其与EAS服务在同一VPC中。

二、部署Dify服务

  1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS

  2. 推理服务页签,单击部署服务,在场景化模型部署区域,单击Dify大模型应用平台

  3. 在部署页面,配置以下关键参数。

    • OSS:选择一个OSS Bucket并指定一个路径,用于持久化存储知识库文件、插件数据等。会分别在路径下生成dify和dify_plugin两个文件夹。

    • PostgreSQL数据库配置

      • 主机地址:填写RDS PostgreSQL实例的内网地址。可以前往云数据库RDS PostgreSQL控制台页面,在RDS PostgreSQL实例的数据库连接页面查看。

      • 端口:默认为5432,根据实际端口填写。

      • 数据库-核心数据:请填写已创建的数据库名称,用于持久化存储所有与应用、用户、对话、知识库、工作流、模型配置等核心功能相关的数据。

      • 数据库-插件:请填写已创建的数据库名称,用于持久化存储与plugin插件运行状态、配置和元数据等相关信息。

      • 账号密码:填写创建以上数据库时使用的高权限账号和密码。

    • Redis配置

      • 主机地址:填写Redis实例的内网地址。前往Redis控制台,在实例信息页面的连接信息区域获取。

      • 端口:默认为6379,根据实际端口填写。

      • 账号密码:填写Redis实例的账号密码。

    • Elasticsearch配置

      • 主机地址:填写Elasticsearch实例的内网地址。前往阿里云Elasticsearch控制台,进入实例详情页,在基本信息区域获取。

      • 端口:默认为9200,根据实际端口填写。

      • 账号密码:填写Elasticsearch实例的登录名(默认为elastic)和密码。若忘记密码,可重置

    • 资源规格:选择用于部署服务的 EAS 实例规格。推荐使用至少8CPU+16GB内存的规格以保证服务稳定运行。

  4. 确认所有配置无误后,单击部署。当服务状态变为运行中时,表示部署成功。

三、验证服务状态与访问

服务部署成功后,可进行状态检查和功能验证。

  • 查看服务日志

    若服务启动失败或运行异常,可在服务详情页的实例列表中,找到对应的容器组件,单击其后的日志按钮,检查启动和运行日志以定位错误原因。 image

  • 访问 Dify Web 界面 

    在服务详情页,单击右上角的Web应用,进入 Dify 的初始化页面,完成管理员账号创建后即可开始使用。

  • 调用 API

    Dify应用创建完成后,访问API页面展示的基础URL为内部服务地址。image若要从公网调用 Dify API,需修改http://******.console.cn-hangzhou.eas.pai-ml.com为PAI-EAS服务调用信息中的公网调用地址。image

    如下创建API密钥之后,即可通过API 与应用交互。image

    以下是一个公网 API 调用示例,用于向聊天机器人应用发送消息:

    curl -X POST 'http://xxxx.your_aliyun_account_id.cn-hangzhou.pai-eas.aliyuncs.com/v1/chat-messages' \
    --header 'Authorization: Bearer app-xxxxxxxxxxxxx' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "inputs": {},
        "query": "介绍一下 Dify 的主要功能",
        "response_mode": "blocking",
        "user": "test-user-001"
    }'

四、通过 JSON 配置进行高级部署

对于需要自动化或深度自定义的部署场景,可使用 JSON 配置文件。在 EAS 服务部署页面,可切换到 JSON 部署,并填入以下模板。此模板完整定义了 Dify 所需的全部容器、环境变量、存储挂载和网络配置。

JSON配置模板

{
    "cloud": {
        "computing": {
            "instances": [
                {
                    "type": "$instance_type"
                }
            ]
        },
        "networking": {
            "security_group_id": "$security_group_id",
            "vpc_id": "$vpc_id",
            "vswitch_id": "$vswitch_id"
        }
    },
    "containers": [
        {
            "image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/dify:nginx-0.2",
            "port": 80,
            "script": "sh /docker-entrypoint.sh"
        },
        {
            "env": [
                {
                    "name": "MODE",
                    "value": "api"
                },
                {
                    "name": "SECRET_KEY",
                    "value": "$secret_key"
                },
                {
                    "name": "PLUGIN_DIFY_INNER_API_KEY",
                    "value": "$api_key"
                },
                {
                    "name": "PLUGIN_DAEMON_KEY",
                    "value": "$plugin_daemon_key"
                },
                {
                    "name": "STORAGE_TYPE",
                    "value": "local"
                },
                {
                    "name": "STORAGE_LOCAL_PATH",
                    "value": "/mnt/dify/dify"
                },
                {
                    "name": "DB_HOST",
                    "value": "$db_host"
                },
                {
                    "name": "DB_PORT",
                    "value": "$db_port"
                },
                {
                    "name": "DB_DATABASE",
                    "value": "$api_db"
                },
                {
                    "name": "DB_USERNAME",
                    "value": "$db_username"
                },
                {
                    "name": "DB_PASSWORD",
                    "value": "$db_password"
                },
                {
                    "name": "REDIS_HOST",
                    "value": "$redis_host"
                },
                {
                    "name": "REDIS_PORT",
                    "value": "$redis_port"
                },
                {
                    "name": "REDIS_USERNAME",
                    "value": ""
                },
                {
                    "name": "REDIS_PASSWORD",
                    "value": "$redis_password"
                },
                {
                    "name": "REDIS_DB",
                    "value": "0"
                },
                {
                    "name": "CELERY_BROKER_URL",
                    "value": "redis://:$redis_password@$redis_host:$redis_port/1"
                },
                {
                    "name": "VECTOR_STORE",
                    "value": "elasticsearch"
                },
                {
                    "name": "ELASTICSEARCH_HOST",
                    "value": "$elasticsearch_host"
                },
                {
                    "name": "ELASTICSEARCH_PORT",
                    "value": "$elasticsearch_port"
                },
                {
                    "name": "ELASTICSEARCH_USERNAME",
                    "value": "$elasticsearch_username"
                },
                {
                    "name": "ELASTICSEARCH_PASSWORD",
                    "value": "$elasticsearch_password"
                }
            ],
            "image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/dify:api-0.2",
            "port": 5001,
            "script": "/bin/bash /entrypoint.sh"
        },
        {
            "env": [
                {
                    "name": "MODE",
                    "value": "worker"
                },
                {
                    "name": "SECRET_KEY",
                    "value": "$secret_key"
                },
                {
                    "name": "PLUGIN_DIFY_INNER_API_KEY",
                    "value": "$api_key"
                },
                {
                    "name": "PLUGIN_DAEMON_KEY",
                    "value": "$plugin_daemon_key"
                },
                {
                    "name": "STORAGE_TYPE",
                    "value": "local"
                },
                {
                    "name": "STORAGE_LOCAL_PATH",
                    "value": "/mnt/dify/dify"
                },
                {
                    "name": "DB_HOST",
                    "value": "$db_host"
                },
                {
                    "name": "DB_PORT",
                    "value": "$db_port"
                },
                {
                    "name": "DB_DATABASE",
                    "value": "$api_db"
                },
                {
                    "name": "DB_USERNAME",
                    "value": "$db_username"
                },
                {
                    "name": "DB_PASSWORD",
                    "value": "$db_password"
                },
                {
                    "name": "REDIS_HOST",
                    "value": "$redis_host"
                },
                {
                    "name": "REDIS_PORT",
                    "value": "$redis_port"
                },
                {
                    "name": "REDIS_USERNAME",
                    "value": ""
                },
                {
                    "name": "REDIS_PASSWORD",
                    "value": "$redis_password"
                },
                {
                    "name": "REDIS_DB",
                    "value": "0"
                },
                {
                    "name": "CELERY_BROKER_URL",
                    "value": "redis://:$redis_password@$redis_host:$redis_port/1"
                },
                {
                    "name": "VECTOR_STORE",
                    "value": "elasticsearch"
                },
                {
                    "name": "ELASTICSEARCH_HOST",
                    "value": "$elasticsearch_host"
                },
                {
                    "name": "ELASTICSEARCH_PORT",
                    "value": "$elasticsearch_port"
                },
                {
                    "name": "ELASTICSEARCH_USERNAME",
                    "value": "$elasticsearch_username"
                },
                {
                    "name": "ELASTICSEARCH_PASSWORD",
                    "value": "$elasticsearch_password"
                }
            ],
            "image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/dify:api-0.2",
            "script": "/bin/bash /entrypoint.sh"
        },
        {
            "env": [
                {
                    "name": "SERVER_KEY",
                    "value": "$plugin_daemon_key"
                },
                {
                    "name": "DIFY_INNER_API_KEY",
                    "value": "$api_key"
                },
                {
                    "name": "PLUGIN_STORAGE_TYPE",
                    "value": "local"
                },
                {
                    "name": "PLUGIN_STORAGE_LOCAL_ROOT",
                    "value": "/mnt/dify/dify_plugin"
                },
                {
                    "name": "DB_HOST",
                    "value": "$db_host"
                },
                {
                    "name": "DB_PORT",
                    "value": "$db_port"
                },
                {
                    "name": "DB_DATABASE",
                    "value": "$plugin_daemon_db"
                },
                {
                    "name": "DB_USERNAME",
                    "value": "$db_username"
                },
                {
                    "name": "DB_PASSWORD",
                    "value": "$db_password"
                },
                {
                    "name": "REDIS_HOST",
                    "value": "$redis_host"
                },
                {
                    "name": "REDIS_USERNAME",
                    "value": ""
                },
                {
                    "name": "REDIS_PASSWORD",
                    "value": "$redis_password"
                },
                {
                    "name": "REDIS_DB",
                    "value": "0"
                },
                {
                    "name": "REDIS_PORT",
                    "value": "$redis_port"
                }
            ],
            "image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/dify:plugin-daemon-0.2",
            "port": 5002,
            "script": "/bin/sh /app/entrypoint.sh"
        },
        {
            "image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/dify:web-0.2",
            "port": 3000,
            "script": "/bin/sh /app/web/entrypoint.sh"
        },
        {
            "image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/dify:sandbox-0.2",
            "port": 8194,
            "script": "/main"
        },
        {
            "image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/dify:squid-0.2",
            "port": 3128,
            "script": "sh /docker-entrypoint.sh"
        }
    ],
    "generate_token": false,
    "labels": {
        "EnableTrace": "true"
    },
    "metadata": {
        "cpu": 8,
        "enable_webservice": true,
        "instance": 1,
        "memory": 16000,
        "name": "dify_test",
        "workspace_id": "$workspace_id"
    },
    "storage": [
        {
            "mount_path": "/mnt/dify",
            "oss": {
                "path": "$oss_path",
                "readOnly": false
            }
        }
    ]
}

部署时,需将JSON模板中的占位符(以`$`开头)替换为实际值。详细参数说明请参见JSON部署

  • metadata部分,必须设置 "enable_webservice": true以开放 Web 访问端口。

  • storage部分,将$oss_path替换为实际的OSS路径,例如 "oss://your-bucket-name/dify-data/"这是Dify API和插件使用的路径,会分别在下面生成dify和dify_plugin两个文件夹。

  • containers部分,部分需替换值的环境变量说明如下,更多参见Dify环境变量说明

    PostgreSQL数据库配置

    • db_host:PostgreSQL数据库实例地址。

    • db_port:默认5432。

    • api_db:Dify 核心功能数据库。持久化存储所有与应用、用户、对话、知识库、工作流、模型配置等核心功能相关的数据。

    • plugin_daemon_db:Dify插件数据库。持久化存储与plugin运行状态、配置和元数据相关的信息。

    • db_usernamedb_password:两个数据库共用一个用户名和密码。

    Redis 配置

    用户与 AI 进行实时对话时,Redis 能够帮助不同服务组件之间进行实时消息传递和通信。

    • redis_host:Redis实例的连接地址。

    • redis_port:默认6379。

    • redis_password:创建Redis实例时设置的密码。

    Elasticsearch 配置

    用于存储向量数据库和全文搜索引擎。

    • elasticsearch_host:Elasticsearch实例的连接地址

    • elasticsearch_port:默认9200。

    • elasticsearch_username:默认 elastic。

    • elasticsearch_password:创建Elasticsearch实例时配置的密码。密码如忘记,可重置实例访问密码

    安全密钥

    Dify 运行需多个密钥以保障内部通信和数据安全。可使用 openssl rand -base64 42 命令生成这些密钥。

    • secret_key:用于安全地签名会话 Cookie 并在数据库上加密敏感信息的密钥。

    • api_key:内部访问API需要使用的key,防止外部恶意攻击。

    • plugin_daemon_key:内部访问plugin_daemon需要使用的key,防止外部恶意攻击。

常见问题

数据库实例连不上

[2025-09-13 00:46:28] [/bin/sh]: 2025/09/12 16:46:28 /app/internal/db/pg/pg.go:34
[2025-09-13 00:46:28] [/bin/sh]: [error] failed to initialize database, got error failed to connect to `host=pgm-xxxxxxxxxx.pg.rds.aliyuncs.com user=dify database=postgres`: dial error (timeout: dial tcp 10.0.0.230:5432: connect: connection timed out)
[2025-09-13 00:46:28] [/bin/sh]: 2025/09/12 16:46:28 init.go:95: [PANIC]failed to init dify plugin db: failed to connect to `host=pgm-xxxxxxxxxx.pg.rds.aliyuncs.com user=dify database=postgres`: dial error (timeout: dial tcp 10.0.0.230:5432: connect: connection timed out)
[2025-09-13 00:46:28] [/bin/sh]: panic: [PANIC]failed to init dify plugin db: failed to connect to `host=pgm-xxxxxxxxxx.pg.rds.aliyuncs.com user=dify database=postgres`: dial error (timeout: dial tcp 10.0.0.230:5432: connect: connection timed out)

需要确认RDS是否和EAS处在同一个VPC网络之中。RDS PostgreSQL不支持切换VPC,只能重建实例。

image

Redis连不上

dify-api中的redis client连不上redis server

[2025-09-13 00:28:21] [/bin/sh]:   File "/app/api/.venv/lib/python3.12/site-packages/redis/utils.py", line 188, in wrapper
[2025-09-13 00:28:21] [/bin/sh]:     return func(*args, **kwargs)
[2025-09-13 00:28:21] [/bin/sh]:            ^^^^^^^^^^^^^^^^^^^^^
[2025-09-13 00:28:21] [/bin/sh]:   File "/app/api/.venv/lib/python3.12/site-packages/redis/connection.py", line 1530, in get_connection
[2025-09-13 00:28:21] [/bin/sh]:     connection.connect()
[2025-09-13 00:28:21] [/bin/sh]:   File "/app/api/.venv/lib/python3.12/site-packages/redis/connection.py", line 379, in connect
[2025-09-13 00:28:21] [/bin/sh]:     self.connect_check_health(check_health=True)
[2025-09-13 00:28:21] [/bin/sh]:   File "/app/api/.venv/lib/python3.12/site-packages/redis/connection.py", line 389, in connect_check_health
[2025-09-13 00:28:21] [/bin/sh]:     raise TimeoutError("Timeout connecting to server")
[2025-09-13 00:28:21] [/bin/sh]: redis.exceptions.TimeoutError: Timeout connecting to server
[2025-09-13 00:28:22] time="2025-09-12T16:28:22Z" level=info msg="program stopped with status:exit status 1" program=/bin/sh

可能原因:

  1. VPC网络问题:请确认redis所在的网络与EAS的一致。

    image.jpeg

  2. 白名单设置问题:确认redis是否增加了白名单配置。需要添加EAS所在交换机的IP组。IP网段可从交换机页面查找。

    image.jpeg

    image.jpeg

Elasticsearch连不上

可能原因:VPC网络问题。需要确认Elasticsearch是否和EAS处在同一个VPC网络之中。

image.jpeg

dify-api所需要的数据库不存在

dify启动时会连接两张表,dify-api所需要的核心数据库以及dify-plugin所需要的插件库。

[2025-09-13 01:33:20] [/bin/sh]:   File "/app/api/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 625, in connect
[2025-09-13 01:33:20] [/bin/sh]:     return self.loaded_dbapi.connect(*cargs, **cparams)  # type: ignore[no-any-return]  # NOQA: E501
[2025-09-13 01:33:20] [/bin/sh]:            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[2025-09-13 01:33:20] [/bin/sh]:   File "/app/api/.venv/lib/python3.12/site-packages/psycopg2/__init__.py", line 122, in connect
[2025-09-13 01:33:20] [/bin/sh]:     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
[2025-09-13 01:33:20] [/bin/sh]:            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[2025-09-13 01:33:20] [/bin/sh]:   File "/app/api/.venv/lib/python3.12/site-packages/psycogreen/gevent.py", line 32, in gevent_wait_callback
[2025-09-13 01:33:20] [/bin/sh]:     state = conn.poll()
[2025-09-13 01:33:20] [/bin/sh]:             ^^^^^^^^^^^
[2025-09-13 01:33:20] [/bin/sh]: sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL:  database "dify_core" does not exist
[2025-09-13 01:33:20] [/bin/sh]:

目前部署使用的Dify社区版1.7.1中,插件库会被自动创建;但核心数据库不会被自动创建,需要手动创建。

marketplace.dify.ai连不上

原因是EAS容器默认无法访问公网,需要网络配置

[2025-09-13 00:00:00] [/bin/sh]: 2025-09-12 16:00:00,847.847 WARNING [Dummy-1] [ssrf_proxy.py:81] - Request to URL https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/tongyi:0.0.46@8e73008929dbc3934936493d442fab4c34ef016ae817b144b45da278ba76580e failed on attempt 1: timed out
[2025-09-13 00:00:02] [/bin/sh]: 2025-09-12 16:00:02,046.046 WARNING [Dummy-2] [ssrf_proxy.py:81] - Request to URL https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/tongyi:0.0.46@8e73008929dbc3934936493d442fab4c34ef016ae817b144b45da278ba76580e failed on attempt 1: timed out
[2025-09-13 00:00:06] [/bin/sh]: 2025-09-12 16:00:06,416.416 WARNING [Dummy-1] [ssrf_proxy.py:81] - Request to URL https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/tongyi:0.0.46@8e73008929dbc3934936493d442fab4c34ef016ae817b144b45da278ba76580e failed on attempt 2: timed out
[2025-09-13 00:00:07] [/bin/sh]: 2025-09-12 16:00:07,614.614 WARNING [Dummy-2] [ssrf_proxy.py:81] - Request to URL https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/tongyi:0.0.
上一篇: 大模型RAG对话系统(v0.3.4) 下一篇: Triton Inference Server镜像部署
阿里云首页 人工智能平台 PAI 相关技术圈