Azure


使用Terraform将Flowise作为Azure应用服务与Postgres结合

先决条件

  1. Azure 账户:确保您拥有一个带有有效订阅的 Azure 账户。如果您没有,请在 Azure 门户 上注册。

  2. Terraform:在您的计算机上安装Terraform命令行界面(CLI)。您可以从Terraform的官方网站下载。

  3. Azure CLI:安装Azure CLI。相关说明可在Azure CLI文档页面上找到。

设置您的环境

  1. 登录Azure:打开终端或命令提示符,并使用以下命令登录Azure CLI:

使用 az login 命令,并指定租户为 <Your Subscription ID>,同时启用设备代码选项

按照提示完成登录流程。

  1. 设置订阅:登录后,使用以下步骤设置Azure订阅:

设置 Azure 帐户 --订阅 <你的订阅 ID>
  1. 初始化Terraform

若您的Terraform项目目录中尚未存在terraform.tfvars文件,请创建一个,并添加以下内容:

订阅名称 = "订阅名称"
订阅ID = "订阅ID"
项目名称 = "webapp名称"
数据库用户名 = "Postgres用户名"
数据库密码 = "strongPostgresPassword"
flowise_secretkey_overwrite = "longandStrongSecretKey"
webapp_ip_rules = [
  {
    名称 = "AllowedIP"
    ip_address = "X.X.X.X/32"
    头部信息 = null
    虚拟网络子网ID为空
    子网ID为空
    服务标签为空
    优先级 = 300
    操作 = “允许”
  }
]
postgres_ip_rules = {
  "ValbyOfficeIP" = "X.X.X.X"
  // 根据需要添加更多键值对
}
源镜像 = "flowiseai/flowise:latest"
标记图像 = "flow:v1"

将占位符替换为您设置中的实际值。

文件树结构如下:

流动
├─ database.tf
├─ main.tf
├─ network.tf
├─ output.tf
├─ providers.tf
├─ terraform.tfvars
├─ terraform.tfvars.example
├─ variables.tf
├─ webapp.tf
├─ .gitignore // 忽略你的 .tfvars、.lock.hcf 和 .terraform 文件

Terraform配置中的每个.tf文件都可能包含基础设施即代码的不同方面:

`database.tf` 将定义 Postgres 数据库的配置。

// database.tf

// 数据库实例
资源 "azurerm_postgresql_flexible_server" "postgres" {
  名称 = "postgresql-${var.project_name}"
  位置 = azurerm_resource_group.rg.位置
  资源组名称 = azurerm_resource_group.rg.名称
  sku_name = "GP_Standard_D2s_v3"
  存储空间(MB) = 32768
  版本 = "11"
  委托子网ID = Azure资源管理子网.dbsubnet.id
  私有DNS区域ID = Azure资源管理器私有DNS区域.postgres.id
  备份保留天数 = 7
  地理冗余备份已启用 = 否
  自动增长启用 = 否
  管理员登录名 = var.db_username
  管理员密码 = var.db_password
  区域 = "2"

  生命周期 {
    防止销毁 = 否
  }
}

// 防火墙
资源 "azurerm_postgresql_flexible_server_firewall_rule" "pg_firewall" {
  for_each = var.postgres_ip_rules
  name = 每个元素的键
  server_id = azurerm_postgresql_flexible_server.postgres.id
  起始IP地址 = 每个值的值
  end_ip_address = 每个元素的value
}

// 数据库
资源 "azurerm_postgresql_flexible_server_database" "生产环境" {
  名称 = "生产"
  server_id = azurerm_postgresql_flexible_server.postgres.id
  字符集 = "UTF8"
  排序规则 = "en_US.utf8"

  # 防止数据意外丢失的可能性
  生命周期 {
    防止销毁 = 否
  }
}

// 关闭传输
资源 "azurerm_postgresql_flexible_server_configuration" "postgres_config" {
  名称 = "require_secure_transport"
  server_id = azurerm_postgresql_flexible_server.postgres.id
  值 = "关闭"
}
`main.tf`可能是主配置文件,其中可能包含Azure提供程序配置,并定义了Azure资源组。

// main.tf
资源 "random_string" "resource_code" {
  长度 = 5
  特殊 = 否
  upper = false
}

// 资源组
资源 "azurerm_resource_group" "rg" {
  位置 = var.resource_group_location
  名称 = "rg-${var.project_name}"
}

// 存储账户
资源 "azurerm_storage_account" "sa" {
  名称 = “${var.subscription_name}${random_string.resource_code.result}”
  资源组名称 = azurerm_resource_group.rg.name
  位置 = azurerm_resource_group.rg.位置
  账户等级 = "标准"
  账户复制类型 = "LRS"

  blob_properties {
    版本控制已启用 = true
  }

}

// 文件共享
资源 "azurerm_storage_share" "flowise-share" {
  名称 = "flowise"
  存储账户名称 = azurerm_storage_account.sa.name
  配额 = 50
}
`network.tf` 将包含网络资源,如虚拟网络、子网和网络安全组。

// network.tf

// Vnet
资源 "azurerm_virtual_network" "vnet" {
  名称 = "vn-${var.project_name}"
  位置 = azurerm_resource_group.rg.位置
  资源组名称 = azurerm_resource_group.rg.name
  地址空间 = ["10.3.0.0/16"]
}

资源 "azurerm_subnet" "dbsubnet" {
  名称 = "db-subnet-${var.project_name}"
  资源组名称 = azurerm_resource_group.rg.name
  虚拟网络名称 = Azure资源管理器虚拟网络.vnet.名称
  地址前缀 = ["10.3.1.0/24"]
  私有端点网络策略已启用 = true
  委托(或代表团)
    名称 = "代表团"
    服务委托(service_delegation)
      名称 = "Microsoft.DBforPostgreSQL/灵活服务器"
    }
  }
  生命周期 {
    ignore_changes = [
      服务端点,
授权
    ]
  }
}

资源 "azurerm_subnet" "webappsubnet" {

  名称 = "web-app-subnet-${var.project_name}"
  资源组名称 = azurerm_resource_group.rg.name
  虚拟网络名称 = Azure资源管理器虚拟网络.vnet.名称
  地址前缀 = ["10.3.8.0/24"]

  委托(或代表团)
    名称 = "委托"
    服务委托(或服务委托机制)
      名称 = "Microsoft.Web/serverFarms"
    }
  }
  生命周期 {
    ignore_changes = [
授权
    ]
  }
}

资源 "azurerm_private_dns_zone" "postgres" {
  名称 = "private.postgres.database.azure.com"
  资源组名称 = azurerm_resource_group.rg.name
}

资源 "azurerm_private_dns_zone_virtual_network_link" "postgres" {
  名称 = "private-postgres-vnet-link"
  资源组名称 = azurerm_resource_group.rg.name
  私有DNS区域名称 = Azure RM私有DNS区域.postgres.名称
  virtual_network_id = azurerm_virtual_network.vnet.id
}
`providers.tf` 将定义Terraform的提供程序,例如Azure。


// providers.tf
Terraform {
  所需版本 = ">=0.12"

  required_providers {
    azurerm = {
      源 = "hashicorp/azurerm"
      版本 = "=3.87.0"
    }
    random = {
      source = "hashicorp/random"
      版本 = "~>3.0"
    }
  }
}

提供程序 "azurerm" {
  订阅ID = var.订阅ID
  特性 {}
}
`variables.tf` 会声明在所有 `.tf` 文件中使用的变量。


// variables.tf
变量 "resource_group_location" {
  默认值 = "westeurope"
  描述 = "资源组的位置。"
}

变量 "container_rg_name" {
  默认值 = "acrllm"
  description = "容器回归量名称。"
}

变量 "subscription_id" {
  类型 = 字符串
  敏感 = true
  描述 = "服务订阅ID"
}

变量 "subscription_name" {
  类型 = 字符串
  描述 = "服务订阅名称"
}


变量 "project_name" {
  类型 = 字符串
  描述 = “项目名称”
}

变量 "db_username" {
  类型 = 字符串
  描述 = "数据库用户名"
}

变量 "db_password" {
  类型 = 字符串
  敏感 = true
  描述 = "数据库密码"
}

变量 "flowise_secretkey_overwrite" {
  类型 = 字符串
  敏感 = true
  描述 = "Flowise 秘密密钥"
}

变量 "webapp_ip_rules" {
  type = list(object({
    名称 = 字符串
    ip_address = 字符串
    headers = 字符串
    虚拟网络子网ID = 字符串
    子网ID = 字符串
    service_tag = 字符串
    优先级 = 数字
    动作 = 字符串
  }))
}

变量 "postgres_ip_rules" {
  描述 = "一张用于防火墙规则的IP地址及其对应名称的映射图"
  类型 = 映射(字符串)
  默认值 = {}
}

变量 "flowise_image" {
  类型 = 字符串
  描述 = "来自Docker Hub的Flowise镜像"
}

变量 "tagged_image" {
  类型 = 字符串
  描述 = "flowise图像版本的标签"
}
`webapp.tf` Azure 应用服务,包含服务计划和 Linux Web 应用


// webapp.tf
#创建Linux应用服务计划
资源 "azurerm_service_plan" "webappsp" {
  名称 = "asp${var.project_name}"
  资源组名称 = azurerm_resource_group.rg.name
  位置 = azurerm_resource_group.rg.位置
  操作系统类型 = "Linux"
  sku_name = "P3v3"
}

资源 "azurerm_linux_web_app" "webapp" {
  名称 = var.project_name
  资源组名称 = azurerm_resource_group.rg.name
  位置 = azurerm_resource_group.rg.位置
  服务计划ID = azurerm_service_plan.webappsp.id

  应用设置 = {
    DOCKER_ENABLE_CI = true
    网站容器启动时间限制 = 1800
    网站启用应用服务存储 = 否
    数据库类型 = "postgresql"
    数据库主机 = azurerm_postgresql_flexible_server.postgres.fqdn
    数据库名称 = azurerm_postgresql_flexible_server_database.production.name
    数据库用户名 = azurerm_postgresql_flexible_server.postgres.administrator_login
    数据库密码 = azurerm_postgresql_flexible_server.postgres.administrator_password
    数据库端口 = 5432
    FLOWISE_SECRETKEY_OVERWRITE = var.flowise_secretkey_overwrite
    端口 = 3000
    SECRETKEY_PATH = "/root"
    DOCKER_IMAGE_TAG = var.tagged_image
  }

  存储账户 {
    名称 = “${var.project_name}_mount”
    access_key = azurerm_storage_account.sa.primary_access_key
    账户名称 = azurerm_storage_account.sa.name
    共享名称 = azurerm_storage_share.flowise-share.name
    类型 = "AzureFiles"
    挂载路径 = "/root"
  }


  仅限https = true

  站点配置 {
    始终开启 = true
    vnet_route_all_enabled = true
    动态配置项 "ip_restriction" {
      for_each = var.webapp_ip_rules
      内容 {
        名称 = ip_restriction.value.name
        ip_address = ip_restriction.value.ip_address
      }
    }
    应用堆栈 {
      docker镜像名称 = var.flowise镜像
      docker_registry_url = "https://${azurerm_container_registry.acr.login_server}"
      docker_registry_username = azurerm_container_registry.acr.admin_username
      docker_registry_password = azurerm_container_registry.acr.admin_password
    }
  }

  日志文件 {
    http_logs {
      文件系统 {
        保留天数 = 7
        保留内存(以MB为单位)= 35
      }

    }
  }

  标识符 {
    类型 = "系统分配"
  }

  生命周期 {
    在销毁之前创建 = 否

    ignore_changes = [
      虚拟网络子网ID
    ]
  }

}

资源 "azurerm_app_service_virtual_network_swift_connection" "webappvnetintegrationconnection" {
  应用服务ID = AzureRM Linux Web应用的ID
  子网ID = azurerm_subnet.webappsubnet.id

  依赖项 = [azurerm_linux_web_app.webapp, azurerm_subnet.webappsubnet]
}

注意:.terraform目录是在初始化项目(terraform init)时由Terraform创建的,其中包含Terraform运行所需的插件和二进制文件。.terraform.lock.hcl文件用于记录正在使用的确切提供程序版本,以确保在不同机器上的安装保持一致。

导航至您的Terraform项目目录并运行:

初始化Terraform

这将初始化Terraform并下载所需的提供程序。

配置Terraform变量

使用Terraform进行部署

  1. 规划部署:运行Terraform的plan命令,查看将创建哪些资源:

    Terraform 计划
  2. 应用部署:如果您对计划感到满意,请应用更改:

    执行 terraform 应用

    在提示时确认操作,Terraform将开始创建资源。

  3. 验证部署情况:Terraform执行完毕后,将输出所有已定义的输出内容,如IP地址或域名。请在Azure门户中验证资源是否已正确部署。


Azure容器实例:使用Azure门户用户界面或Azure CLI

先决条件

  1. (可选) 如果您想按照基于命令行界面(CLI)的指令操作,请安装Azure CLI

创建无持久存储的容器实例

如果没有持久化存储,数据将保存在内存中。这意味着容器重启时,您存储的所有数据都将消失。

在Portal中

  1. 在 Marketplace 中搜索容器实例,然后点击“创建”:

Azure Marketplace 中的容器实例条目
  1. 选择或创建一个资源组、容器名称、区域、镜像源“其他注册表”、镜像类型、镜像“flowiseai/flowise”、操作系统类型和大小。然后单击“下一步:网络”以配置Flowise端口:

容器实例创建向导的第一页
  1. 在默认的“80 (TCP)”端口旁边添加一个新的端口“3000 (TCP)”。然后选择“下一步:高级”:

容器实例创建向导中的第二页。它会询问网络类型和端口。
  1. 将“重启策略”设置为“失败时”。添加命令覆盖["/bin/sh", "-c", "flowise start"]。最后点击“审核+创建”:

容器实例创建向导中的第三页。该页询问重启策略、环境变量以及容器启动时运行的命令。
  1. 审查最终设置并点击“创建”:

容器实例的最终审核和创建页面。
  1. 创建完成后,点击“前往资源”

Azure 中的资源创建结果页面。
  1. 通过复制IP地址并添加:3000作为端口来访问您的Flowise实例:

容器实例概览页面
Flowise应用程序作为容器实例部署

使用 Azure CLI 创建

  1. 创建一个资源组(如果你还没有的话)

使用az命令创建组 --name flowise-rg --location "West US"
  1. 创建容器实例

使用az命令创建容器,参数为-g flowise-rg
--name flowise \
--image flowiseai/flowise \
--命令行 "/bin/sh -c 'flowise start'" \
--ip-address public \
--端口 80 3000 \
--重启策略 OnFailure
  1. 访问上述命令输出中打印出的IP地址(包括端口:3000)。

创建带有持久存储的容器实例

仅可通过命令行界面(CLI)创建带有持久存储的容器实例:

  1. 创建一个资源组(如果你还没有的话)

使用az命令创建组 --name flowise-rg --location "West US"
  1. 在上述资源组中创建存储账户资源(或使用已有的)。你可以在此处查看具体操作方法:https://learn.microsoft.com/en-us/azure/storage/files/storage-how-to-use-files-portal?tabs=azure-portal。

  2. 在Azure存储中创建新的文件共享。你可以在此处查看具体操作方法https://learn.microsoft.com/en-us/azure/storage/files/storage-how-to-use-files-portal?tabs=azure-portal。

  3. 创建容器实例

使用 az 命令创建容器 -g flowise-rg \
--name flowise \
--image flowiseai/flowise \
--命令行 "/bin/sh -c 'flowise start'" \
--环境变量 DATABASE_PATH=/opt/flowise/.flowise SECRETKEY_PATH=/opt/flowise/.flowise LOG_PATH=/opt/flowise/.flowise/logs BLOB_STORAGE_PATH=/opt/flowise/.flowise/storage \
--ip-address public \
--端口 80 3000 \
--restart-policy OnFailure \
--azure-file-volume-share-name 这里填写你的文件共享名称
--azure-file-volume-account-name 这里填写你的存储账户名称
--azure-file-volume-account-key 这里填写的是您存储账户的访问密钥
--azure-file-volume-mount-path /opt/flowise/.flowise
  1. 访问上述命令输出中打印出的IP地址(包括端口:3000)。

  2. 从现在起,您的数据将存储在SQLite数据库中,您可以在文件共享中找到该数据库。

观看关于部署到Azure容器实例的视频教程:

Last updated