使用 CDK 在 AWS 上部署 Dify 企业版。

AWS CDK 架构图

组件

测试部署

组件Helm Chart 值数量vCPU内存 (GB)存储 (GB)备注
S3persistence1
Redis DBexternalRedis126.38
RDS Postgres DBexternalPostgres228
K8S Worker Node1416100
OpenSearchvectorDB1216100

生产部署

组件Helm Chart 值数量vCPU内存 (GB)存储 (GB)备注
S3persistence1
Redis DBexternalRedis1212.93
RDS Postgres DBexternalPostgres1432
K8S Worker Node6832100
OpenSearchvectorDB2864100

部署

整个过程预计需要 60 分钟。

  1. 配置 AWS CLI:

    安装并配置 AWS CLI

    aws configure
    
  2. 克隆此仓库:

    git clone https://github.com/langgenius/aws-cdk-for-dify.git
    
  3. 安装 NodeJS 依赖:

    npm install
    
  4. 配置环境变量:

    cp .env.example .env
    

    修改 .env 文件中的环境变量值。

    • ENVIRONMENT:指定部署环境;必须是 testprod

    • CDK_DEFAULT_REGION:Dify 企业版将部署的 AWS 区域。

    • CDK_DEFAULT_ACCOUNT:您的 AWS 账户 ID。

    • DEPLOY_VPC_ID:用于部署的现有 VPC 的 ID。如果未设置,CDK 将为您创建一个。

    • 注意: 如果使用现有 VPC

      • 确保您有 2 个或更多的公共子网用于应用负载均衡器,以及 2 个或更多的私有子网可以访问互联网(与 NAT 关联)以从互联网拉取 docker 镜像。

      • 为子网添加标签否则,步骤 6 将显示关于自动标记失败的警告,这将导致应用负载均衡器创建失败):

        子网类型标签键标签值
        公共kubernetes.io/role/elb1
        私有kubernetes.io/role/internal-elb1
    • 子网配置(需要 DEPLOY_VPC_ID,用逗号分隔且不带空格,根据 AWS 安全最佳实践建议使用私有子网):

      • EKS_CLUSTER_SUBNETS:EKS 控制平面的子网 ID。需要至少 2 个不同可用区 (AZs) 的子网。
      • EKS_NODES_SUBNETS:EKS 工作节点的子网 ID。需要至少 2 个不同可用区的子网。
      • REDIS_SUBNETS:Redis 部署的子网 ID。
      • RDS_SUBNETS:RDS 数据库的子网 ID。(至少需要 2 个不同可用区)
      • OPENSEARCH_SUBNETS:OpenSearch 部署的子网 ID。
      • OPENSEARCH_ADMINNAME:OpenSearch 域管理员名称。
      • OPENSEARCH_PASSWORD:OpenSearch 域管理员密码。
    • AWS_EKS_CHART_REPO_URL:(仅适用于 AWS 中国区域)AWS EKS Helm chart 仓库 URL。

    • RDS_PUBLIC_ACCESSIBLE:设置为 true 使 RDS 可公开访问(不推荐)。

    注意:

    • 如果您使用的是 AWS 中国区域,必须配置 AWS_EKS_CHART_REPO_URL 以确保功能正常。请联系 Dify 团队获取 URL。
    • 建议使用现有 VPC 以便更容易访问资源。
  5. CDK 引导:

    初始化 CDK 环境:

    npm run init
    
  6. CDK 部署:

    • 部署 Dify 企业版:

      npm run deploy
      
  7. 更新 AWS EKS 访问权限:

    1. 导航到 EKS 集群面板,选择”访问”菜单,然后点击”管理访问”:

      EKS 集群访问管理

    2. 在”管理访问”对话框中,选择”EKS API 和 ConfigMap”,然后点击”保存更改”。
    3. 在 IAM 访问条目面板中,点击”创建访问条目”:

      IAM 访问条目

    4. 添加您的 IAM 用户并分配以下权限:
      • AmazonEKSAdminPolicy
      • AmazonEKSAdminViewPolicy
      • AmazonEKSClusterAdminPolicy
  8. 配置 kubeconfig 以本地访问 Kubernetes (K8S) 集群:

    aws eks update-kubeconfig --region <cn-northwest-1> --name <Dify-Testing-DifyStackTest-EKS>
    

    根据您的部署调整 regionname 参数:

    • region: 您的集群部署的 AWS 区域。
    • name: EKS 集群名称。
  9. 数据持久化配置:

    修改 Helm values.yaml 文件。要启用它,按如下方式修改 persistence 部分,将 {your-region-name}{your-s3-bucket-name} 替换为 CDK 创建的资源名称,确保已启用 useAwsManagedIam

    persistence:
      type: "s3"
      s3:
        endpoint: "https://s3.{your-region-name}.amazonaws.com"
        region: "{your-region-name}"
        bucketName: "{your-s3-bucket-name}"
        useAwsManagedIam: true
    
  10. 数据库配置:

    修改 Helm values.yaml 文件,删除 postgre 部分,并按如下方式修改 externalPostgres 部分,用 AWS Secret Manager 中存储的数据替换 {your-postgres-endpoint}{your-postgres-password}

    postgre:
      enabled: false
    externalPostgres:
      enabled: true
      address: "{your-postgres-endpoint}"
      port: 5432
      credentials:
        dify:
          database: "postgres"
          username: "clusteradmin"
          password: "{your-postgres-password}"
          sslmode: "disable"
        enterprise:
          database: "postgres"
          username: "clusteradmin"
          password: "{your-postgres-password}"
          sslmode: "disable"
    
  11. Redis 配置:

    修改 Helm values.yaml 文件,删除 redis 部分,并按如下方式修改 externalRedis 部分,用 ElastiCache-Redis OSS caches 控制台中的 Primary endpoint 替换 {your-redis-host}

    注意: 删除 Primary endpoint 中的端口号

    redis:
      enabled: false
    externalRedis:
      enabled: true
      host: "{your-redis-host}"
      port: 6379
      username: ""
      password: ""
      useSSL: false
    
  12. 向量数据库配置:

    修改 Helm values.yaml 文件,按如下方式修改 externalType 部分:

    1. 用 AWS Opensearch 实例的 Domain endpoint 替换 {openSearch_endpont},删除 https:// 并使用剩余部分。
    2. 用您在 .env 中设置的值替换 <OPENSEARCH_ADMINNAME><OPENSEARCH_PASSWORD>
    vectorDB:
      useExternal: true
      externalType: "opensearch"
      externalOpenSearch:
        host: "{openSearch_endpont}"
        port: 443
        user: "<OPENSEARCH_ADMINNAME>"
        password: "<OPENSEARCH_PASSWORD>"
        useTLS: true
    
  13. 设置 docker 镜像拉取密钥

    在安装 Dify 企业版之前,您需要设置 docker 镜像拉取密钥。

    注意: 如果您还没有获得用户名和密码,请联系我们,邮箱地址:Support@dify.ai

  14. TLS 配置

    测试环境:

    如果您只是在测试部署过程,可以忽略此步骤直接继续。

    生产环境:

    前往 AWS ACM 为您在 helm chart 配置文件 values.yaml 中声明的域名申请证书:

      consoleApiDomain: "console.xxxx.com"
      consoleWebDomain: "console.xxxx.com"
      serviceApiDomain: "api.xxxx.com"
      appApiDomain: "app.xxxx.com"
      appWebDomain: "app.xxxx.com"
      filesDomain: "upload.xxxx.com"
      enterpriseDomain: "enterprise.xxxx.com"
    

    需要的域名包括:

    console.xxxx.com
    api.xxxx.com
    app.xxxx.com
    upload.xxxx.com
    enterprise.xxxx.com
    

    前往您的域名服务提供商(如 cloud flare、aws route53 等)设置 cname 以证明您对这些域名的所有权。

    修改 values.yaml 参数:global.useTLS

      useTLS: true
    
  15. AWS 负载均衡器配置

    建议在 Helm values.yaml 文件中使用 AWS 应用负载均衡器(ALB)进行入口配置。要启用它,按如下方式修改 ingress 部分:

    测试环境:

    ingress:
        enabled: true
        className: "alb"
        annotations: {
            # 现有注解
            ...
            # 添加以下注解
            alb.ingress.kubernetes.io/target-type: "ip",
            alb.ingress.kubernetes.io/scheme: "internet-facing",
        }
    

    生产环境:

    参考:AWS load balancer controller 设置

    ingress:
      enabled: true
      className: "alb"
      annotations: {
        # 设置文件上传大小限制
            alb.ingress.kubernetes.io/target-type: "ip",
            alb.ingress.kubernetes.io/scheme: "internet-facing",
            alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
      }
    
  16. 安装 Dify 企业版

    Dify 企业版使用 Helm 进行部署。

    helm repo add dify https://langgenius.github.io/dify-helm
    helm repo update
    
    helm upgrade -i dify -f values.yaml dify/dify
    
  17. 访问 Dify 企业版

    测试环境:

    设置完成后,获取 ALB 的临时外部 IP。

    ping {aws_alb_dns}
    

    然后将以下行添加到您的 /etc/hosts 文件中。

    4.152.1.216 console.dify.local
    4.152.1.216 app.dify.local
    4.152.1.216 api.dify.local
    4.152.1.216 upload.dify.local
    4.152.1.216 enterprise.dify.local
    

    生产环境

    前往您的域名服务提供商,将 DNS 设置为 ALB 地址(在 AWS-EC2-Load Balancer 中获取 alb 的 dns):

    域名cname
    api.xxxx.com<alb_dns>
    app.xxxx.com<alb_dns>
    upload.xxxx.com<alb_dns>
    enterprise.xxxx.com<alb_dns>
    console.xxxx.com<alb_dns>
  18. 验证安装

    警告:在登录 Dify Enterprise Dashboard http://enterprise.dify.local 之前,您必须先设置 Dify Console http://console.dify.local

    • Dify Console:访问 http://console.dify.local 并完成安装。

    • Enterprise Dashboard:访问 http://enterprise.dify.local,使用默认邮箱和密码登录。登录后可以更改密码。

      email: dashboard@dify.ai
      password: difyai123456
      

销毁

此过程可能需要 20 分钟。

销毁 .env 文件中 ENVIRONMENT 下指定环境的部署。

npm run destroy

注意:登录 AWS 控制台,检查 VPC,确保 CDK 创建的 VPC 已被销毁,如果没有,请检查 Cloudformation 并执行删除操作。

高级配置

要自定义部署配置,请修改测试环境的 test.ts 文件或生产环境的 prod.ts 文件。