ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Onyx Azure 部署实战:用 Terraform 模块在 Azure 上搭建生产级 AKS 基础设施

Onyx Azure 部署实战:用 Terraform 模块在 Azure 上搭建生产级 AKS 基础设施 Onyx Azure 部署实战用 Terraform 模块在 Azure 上搭建生产级 AKS 基础设施【免费下载链接】danswerOpen Source AI Platform - AI Chat with advanced features that works with every LLM项目地址: https://gitcode.com/GitHub_Trending/da/danswer本篇指南围绕 Onyx原 Danswer开源仓库中的deployment/terraform/modules/azure模块集展开系统讲解如何用 Terraform 在 Azure 上一次性编排虚拟网络、AKS 集群、PostgreSQL Flexible Server、Azure Managed Redis、文件存储与 WAF 策略并完成 Helm Chart 的衔接安装。读完本文你将掌握各模块的职责划分、T-shirt 规格选型、与 AWS 模块的差异对照以及从terraform apply到helm install的完整落地方案。模块状态与验证方式deployment/terraform/modules/azure/README.md明确指出这套 Azure 模块已针对azurermprovider 的 schema 完成校验且每个模块都附带一套terraform test测试套件通过 mock provider 进行 plan 验证。它们尚未被应用到真实订阅live subscription上因此文档作者提醒把第一次部署当成一次真正的“首次部署”来对待谨慎检查每一个参数。也就是说这是一套已通过单元级验证、尚未经过生产实践检验的模块使用时务必先阅读源码与测试再决定参数取值。模块总览六个原子模块与一个组合模块该目录提供七个 Terraform 模块按职责拆分如下模块职责vnet虚拟网络与按用途划分的子网为 AKS、NAT 网关、流日志预留提供稳定出口aksAKS 集群启用 workload identity包含系统池与文档索引池可选 GPU 与 sandbox 池postgres位于委托子网上的 PostgreSQL Flexible Server、私有 DNS 分区与五条指标告警redis仅通过私有端点可达的 Azure Managed Redis带四条指标告警默认关闭storageOnyx 文件存储所用的存储账户与容器含版本化、生命周期规则与网络规则waf面向 Application Gateway 的区域级 WAF 策略onyx把上述模块组装起来的高级组合模块推荐的用法是需要开箱即用的可用集群时使用onyx组合模块需要对某一资源做精细控制时使用单个模块。这套 Azure 模块与仓库中的deployment/terraform/modules/aws模块互为镜像在把现有 AWS 配置移植到 Azure 之前务必先阅读后文的与 AWS 模块的差异章节。从其他仓库消费这些模块快速开始示例使用的是本地路径./modules/azure/onyx。如果要在别的仓库中引用这套模块需要把source指向本仓库并锁定一个 refmodule vnet { source git::https://github.com/onyx-dot-app/onyx.git//deployment/terraform/modules/azure/vnet?reftf-azure/v1.0.0 resource_group_name onyx-prod location eastus }Azure 相关发版使用tf-azure/vX.Y.Z标签与 AWS 模块及 Onyx 产品版本彼此独立。对自动化消费方提交 SHAcommit sha比标签更可靠——SHA 不可移动而标签可能被重新指向。文档特别强调必须锁定版本Pin something。如果不带refTerraform 会跟踪默认分支一次无关的合并就可能悄悄改变你的基础设施。快速开始可直接复制与 AWS 组合模块不同onyx模块不声明provider块。azurermprovider 需要features块和订阅信息这些都属于你的根模块root modulelocals { location eastus # 在非临时环境中请从密钥库或 TF_VAR_ 注入该值 postgres_password your-postgres-password } provider azurerm { features {} subscription_id 00000000-0000-0000-0000-000000000000 # storage 模块默认关闭共享访问密钥因此 Terraform 必须用 # Entra 身份而非密钥访问存储账户。 storage_use_azuread true } module onyx { source ./modules/azure/onyx name onyx location local.location size medium postgres_password local.postgres_password # 必填项。不带任何网段的公共 API 服务器可从互联网任意地址访问 # 因此模块拒绝构建这样的集群除非你限制网段、启用私有集群、 # 或显式声明开放是预期行为。 api_server_authorized_ip_ranges [203.0.113.0/24] } # kubernetes provider 需要集群信息因此从模块输出中回读其凭据。 provider kubernetes { host module.onyx.cluster_host cluster_ca_certificate base64decode(module.onyx.cluster_ca_certificate) client_certificate base64decode(module.onyx.client_certificate) client_key base64decode(module.onyx.client_key) } output storage_account_name { value module.onyx.storage_account_name } output postgres_host { value module.onyx.postgres_host } output redis_host { value module.onyx.redis_host }然后执行terraform init terraform apply几点需要留意api_server_authorized_ip_ranges是必填的。从 onyx/variables.tf 的校验逻辑可见allow_unrestricted_api_server_access、private_cluster_enabled、api_server_authorized_ip_ranges三者必须满足其一否则 plan 直接失败——这是刻意设计的防止开放控制面护栏。storage_use_azuread true是硬性要求。storage 模块把共享密钥关闭后Terraform 只能以你的 Entra 身份访问存储账户否则 apply 会因无法读取/写入存储而失败。组合模块会创建 Kubernetes 资源命名空间、ServiceAccount、StorageClass因此根模块必须能用 onyx/outputs.tf 回读的cluster_host、cluster_ca_certificate、client_certificate、client_key配置 kubernetes provider。T-shirt 规格选型size参数会一次性设置所有计算与数据面旋钮。任何单独设置的规格变量非 null都会覆盖对应档位的默认值。源码中size_defaults的定义位于 onyx/main.tf各档位完整参数如下项smallmediumlargesystem pool VMStandard_D8ds_v5Standard_D16ds_v5Standard_D16ds_v5system pool 节点数1-31-52-8index pool VMStandard_E4ds_v5Standard_E8ds_v5Standard_E16ds_v5index pool 磁盘256 GiB512 GiB1024 GiB数据库 SKUGP_Standard_D2ds_v5GP_Standard_D2ds_v5GP_Standard_D4ds_v5数据库存储64 GiB128 GiB256 GiB缓存Balanced_B5约 5 GBBalanced_B10约 10 GBBalanced_B20约 20 GB从 onyx/variables.tf 中的描述可以推断各档位的适用规模small 适合试点pilot和小团队约 200 用户以内、少于约 50 万文档medium 适合部门级或公司级约 200–1000 用户、约 50 万–200 万文档large 面向组织级部署1000 用户、数百万文档。注意 index pool 在所有档位都是内存优化型 VME 系列。这是因为 Azure 没有托管的 OpenSearch 服务文档索引本身就跑在集群内详见下文 aks 模块内存才是索引的瓶颈。使用现有网络Bring Your Own Network如果不想让模块创建虚拟网络可以传入现有子网 IDmodule onyx { source ./modules/azure/onyx location eastus create_virtual_network false virtual_network_id /subscriptions/.../virtualNetworks/existing aks_subnet_id /subscriptions/.../subnets/aks postgres_subnet_id /subscriptions/.../subnets/postgres private_endpoint_subnet_id /subscriptions/.../subnets/private-endpoints postgres_password local.postgres_password api_server_authorized_ip_ranges [203.0.113.0/24] }对现有网络有以下硬性要求校验逻辑见 onyx/variables.tfpostgres 子网必须委托给Microsoft.DBforPostgreSQL/flexibleServersprivate endpoint 子网必须把private_endpoint_network_policies设为DisabledAKS 子网若没有 NAT 网关组合模块会回退到由 AKS 自行管理出口出口地址可能变化如果你的子网已挂 NAT 网关设置aks_outbound_type userAssignedNATGateway保留它。aks_outbound_type的可选值包括loadBalancer、userAssignedNATGateway、userDefinedRouting、managedNATGateway。默认null时由模块推导模块自建网络且启用 NAT 网关时为userAssignedNATGateway否则为loadBalancer。各模块详解onyx组合模块创建资源组然后按 T-shirt 规格把下方各模块接线。它的输出携带 Helm Chart 所需的全部信息。关键实现细节命名规约资源组名默认name-workspaceonyx/main.tf 中的resource_group_name_desired集群名name-workspacePostgresname-postgres-workspaceRedisname-redis-workspace存储账户名的全局唯一性处理Azure 存储账户名全局唯一且只允许 24 个字符的小写字母数字。模块先把可读前缀截断到 18 字符再追加对name-workspace-location-资源组做 SHA1 后取前 6 位的摘要保证低碰撞概率流日志专用账户则用 15 字符前缀 log 6 位摘要恰好 24 字符NAT 网关 IP 自动信任trust_nat_gateway_ip_on_api_server默认为true会把 NAT 网关的出口地址以/32形式自动追加进 API 服务器白名单——否则使用userAssignedNATGateway出站时集群自身通过公共端点访问 API 服务器会被拒节点引导、in-cluster 客户端都会失败。注意空列表保持为空否则会悄悄把无限制变成有限制。vnet虚拟网络一个虚拟网络和四个按用途划分的子网aks、private_endpoints、postgres委托与app_gateway。NAT 网关只挂接到选择加入的子网nat_gateway为 true 的子网从而让出口保持单一地址。实现要点vnet/main.tfNAT 网关使用 Standard SKU 的静态公共 IP并设置了idle_timeout_in_minutes子网 NAT 关联通过depends_on等待公共 IP 关联完成避免出现网关还没有公共 IP 就建立关联、出口静默回退到默认路径的隐患流日志enable_flow_logs写入指定存储账户版本为 v2并支持保留天数配置。aksAKS 集群启用 OIDC issuer 与 workload identity 的 AKS 集群包含系统池、文档索引池以及可选的 GPU 池和 Craft sandbox 池。给定存储账户列表后它会创建托管身份、联邦到 Kubernetes ServiceAccount、并授予 blob 数据访问权限。关键实现细节aks/main.tf系统池内联AKS 要求系统池内联在集群资源上且不可删除因此main池单独处理其余池作为azurerm_kubernetes_cluster_node_pool创建文档索引池默认启用与 AWS 模块相反因为 Azure 没有托管 OpenSearch带标签onyx.app/workload: document-index与污点document-indextrue:NoSchedulemin_count/max_count均为 1见 aks/variables.tf 中的默认node_poolsGPU 池enable_gpu_node_pool默认false开启后创建污点nvidia.com/gputrue:NoSchedule的池默认 VM 为Standard_NC4as_T4_v3单张 NVIDIA T4足够支撑 embedding 模型。AKS 会自行安装驱动与设备插件无需额外部署sandbox 池为 Craft sandbox 工作负载预留的污点池workloadsandbox:NoSchedule每个 sandbox Pod 约预留 5.5 GiB 临时存储OS 磁盘默认 200 GiB校验要求至少 30 GiB轮换名称机制AKS 在属性变更时通过备用名轮换节点池。模块用截断 6 字符键 SHA1 摘要 6 字符生成唯一轮换名并校验节点池名不能与任何池的生成轮换名冲突aks/variables.tf 中的 validation网络模式默认network_plugin_mode overlayPod 从pod_cidr默认192.168.0.0/16取地址子网只需容纳节点service_cidr默认172.16.0.0/16DNS 服务地址默认取 service 段的第 10 个地址cidrhost(service_cidr, 10)workload identitystorage_account_ids非空时创建azurerm_user_assigned_identity按 ServiceAccount 逐个创建联邦凭据subject 为system:serviceaccount:namespace:name与 AWS 模块 IRSA 信任策略中的 subject 一致联邦凭据名受 Azure 120 字符上限约束超长时用 SHA1 摘要收尾角色分配使用Storage Blob Data Contributor可读写删除 blob仅此而已角色并设置skip_service_principal_aad_check true规避 Entra 服务主体复制延迟导致的瞬时PrincipalNotFoundServiceAccount 与命名空间模块创建命名空间onyx与 ServiceAccountonyx-workload-access后者带有azure.workload.identity/client-id注解和azure.workload.identity/use标签——缺少该标签webhook 不会向 Pod 注入令牌集群 autoscaler 协调对node_count使用ignore_changes避免与 autoscaler 的每一次 apply 冲突可选 add-oncreate_premium_storage_class默认 true创建onyx-premium存储类Premium_LRS、WaitForFirstConsumer、可扩容log_analytics_workspace_id非空时发送控制面日志与容器洞察默认类别包括 kube-apiserver、kube-audit、kube-controller-manager、kube-scheduler、cluster-autoscaler。postgresPostgreSQL Flexible Server位于委托子网上的 Flexible Server无公共端点配私有 DNS 分区保证可解析。prevent_destroy守护服务器与数据库防止误删。实现要点postgres/main.tf私有 DNS 分区Azure 要求接入虚拟网络的服务器只能通过私有 DNS 分区解析且分区名必须以.private.postgres.database.azure.com结尾无公共端点显式设置public_network_access_enabled false并指定delegated_subnet_id不依赖 Azure 的默认行为内置数据库处理postgres、azure_maintenance、azure_sys是 Flexible Server 自带数据库模块对它们跳过创建动作create_database为 false避免 already exists 错误扩展白名单通过azure.extensions动态参数放行扩展无需重启服务器否则 Onyx 首次启动时的迁移CREATE EXTENSION会全部失败认证模式支持密码认证与 Entra IDAzure AD认证双轨。entra_authentication_only开启时要求同时设置enable_entra_database_authentication与database_administrator_object_id——否则密码关闭 无 Entra 管理员意味着任何人都无法登录引导角色五条指标告警CPUcpu_percent、内存memory_percent、存储storage_percent严重级 1、连接数active_connections、IOPSdisk_iops_consumed_percentage统一采样频率 5 分钟、窗口 15 分钟与 AWS 模块的评估形态保持一致prevent_destroy与ignore_changeszone 与 standby 可用区由 Azure 选择忽略这两项的变更避免未设置变量被解读为迁回去。redisAzure Managed Redis仅能通过私有端点访问的 Azure Managed Redis。Onyx 在其上运行但默认设置下并不适配所以enable_redis默认false。模块默认关闭托管 Redis 的原因是集群内自带的 Redis 无需任何额外配置见下文。两条必须理解的限制均针对真实运行中的缓存而非假设只存在数据库 0。在任意聚类策略下SELECT 1及以上都会返回DB index is out of range——这是 Redis Enterprise 的属性而非聚类策略的问题。Onyx 默认应用用数据库 0、Celery 结果用 14、Celery broker 用 15因此启用托管 Redis 时必须把REDIS_DB_NUMBER、REDIS_DB_NUMBER_CELERY、REDIS_DB_NUMBER_CELERY_RESULT_BACKEND全部设为0。三个键命名空间互不冲突Onyx 自己的键带租户前缀Celery 结果是celery-task-meta-*broker 用_kombu.binding.*与裸队列名。分片策略会破坏 Celery。EnterpriseCluster只呈现一个端点但底层仍分片kombu 的优先级步骤管道在首次发布时就会以CROSSSLOT失败OSSCluster需要集群感知客户端而 kombu 并不自带。因此模块默认clustering_policy NoCluster报告redis_modestandaloneCelery 无需改动即可运行。NoCluster上限 25 GB且不更改策略无法扩容。EnterpriseCluster仍可选择——前提是调用方设置带 hash tag 的 kombuglobal_keyprefix把所有 broker 键放进同一个 slot。集群内 Redis 之所以仍是默认选择正是因为它保留了数据库 0、14、15无需任何额外配置。关于服务更替的细节Azure 已停止接受新的Azure Cache for Redis实例创建时返回 Azure Cache for Redis is retiring, create Azure Managed Redis instance instead因此该模块供应托管服务。二者是不同的资源而非改名差异如下规格是单一 SKU 名如Balanced_B5约 5 GB而非层级 系列 容量三段式在10000端口上使用 TLS旧服务用 6380没有可关闭的明文端口也没有可设置的最低 TLS 版本逐出策略拼写为VolatileLRU而非volatile-lru除显式指定策略外每个实例都会分片所以模块请求NoCluster告警命名空间为Microsoft.Cache/redisEnterprise单线程服务器负载指标由处理器时间percentProcessorTime取代。模块默认创建四条告警redis/main.tf内存高usedmemorypercentage严重级 2、内存危急严重级 1写入可能被拒、CPU 处理器时间、逐出键数evictedkeys严重级 1因为对 Celery broker 而言逐出键等于丢弃任务。storage文件存储存储账户与私有容器。共享访问密钥默认关闭Onyx 用DefaultAzureCredential认证因此不需要也不应该存在任何密钥。实现要点storage/main.tf匿名访问双重保险allow_nested_items_to_be_public false与default_to_oauth_authentication true成对设置blob 永远不可能被匿名读取网络规则为 deny-firstallowed_subnet_ids或allowed_source_ips任一非空即切换到default_action Denyrestrict_storage_to_cluster true时仅放行 AKS 子网生命周期规则支持版本化 非当前版本过期删除noncurrent_expiration_days、对象过期expiration_days、冷却层转换transition_to_cool默认transition_to_cool_daysTLShttps_traffic_only_enabled truemin_tls_version可配置容器访问类型固定为private。wafWeb 应用防火墙区域级 WAF 策略承载 OWASP Core Rule Set、Microsoft bot manager 规则集、两条限流规则以及可选的 IP 白名单与地理封锁。必须挂到 Application Gateway 上Front Door 使用不同的资源azurerm_cdn_frontdoor_firewall_policy无法复用本策略。实现要点waf/main.tf托管规则集默认 OWASP版本可配可选 Microsoft_BotManagerRuleSet支持按规则集→规则组→规则 ID 的三级 override 重组IP 白名单allowed_ip_cidrs非空时通过negation_condition true的 IPMatch 自定义规则在白名单之外的所有请求先于托管规则被 Block优先级 1地理封锁geo_restriction_countries用两个字母国家代码通过 GeoMatch 规则 Block优先级 10两条限流API 路径限流BeginsWith匹配api_path_prefix默认 1000 次/5 分钟/地址优先级 20与全局限流默认 2000 次/5 分钟/地址优先级 30豁免网段通过取反的 IPMatch 实现match conditions 之间是 AND 关系防自锁设计waf_trust_nat_gateway_ip会把 NAT 网关出口地址同时加入白名单与限流豁免避免集群自身出口流量被自己的 WAF 限流默认 false按需开启。与 AWS 模块的差异大部分差异源于平台特性而非实现偏好。完整对照如下项AWSAzure文档索引托管 OpenSearch 域或集群内仅集群内Azure 无托管 OpenSearchAzure AI Search 是另一套 APIPod 身份IRSA从 OIDC subject 承担角色托管身份联邦到 ServiceAccountsubject 同为system:serviceaccount:...缓存凭据由你提供 auth tokenAzure 生成密钥以输出形式回读从数据库读取而非集群缓存服务ElastiCacheAzure Managed RedisAzure Cache for Redis 已停售不再接受新实例集群 autoscalerHelm release ClusterRole 补丁作为节点池的一部分GPU 设备插件Helm releaseAKS 随驱动一起安装数据库存储任意 GiB 且带增长上限固定阶梯尺寸自动增长是一个开关内存与存储告警以 bytes free 计以 percent used 计阈值方向相反流日志默认开启写入 CloudWatch可选写入存储账户且需要 Network WatcherWAF 日志模块创建日志组由策略挂接的 Application Gateway 发出provider 配置声明在组合模块内由你的根模块声明启用流日志Azure 把流日志写入存储账户且需要区域内的 Network Watcher。组合模块会为流日志单独创建一个存储账户让网络不依赖承载应用数据的账户module onyx { # ... enable_flow_logs true }Azure 在某个区域第一次出现虚拟网络时会创建名为NetworkWatcher_region的 Network Watcher位于NetworkWatcherRG资源组。如果订阅关闭了该自动创建行为需要先手动创建一个或把network_watcher_name指向你自己的 Network Watcher。该设置只对模块自建的网络生效。当create_virtual_network false时模块会拒绝该设置校验逻辑见 onyx/variables.tfenable_flow_logs为 true 时强制要求create_virtual_network而不是创建一个永远不会被写入的日志存储账户——请在你的自有网络上自行配置流日志。Terraform 之后安装 Onyx Helm Chart先获取集群凭据az aks get-credentials --resource-group $(terraform output -raw resource_group_name) \ --name $(terraform output -raw cluster_name)必须安装到onyx命名空间。Kubernetes ServiceAccount 属于且仅属于一个命名空间aks模块把联邦账户创建在onyx中。装到其他命名空间的 release 会引用一个不存在的账户API 与 Celery Pod 将永远无法启动。命名空间由 Terraform 创建ServiceAccount 必须先于它存在而 Helm 安装在 Terraform 之后所以 release 是加入该命名空间而不是自建helm install onyx onyx/onyx --namespace onyx -f values.yaml如果已有其他组件创建了该命名空间设置create_workload_namespace false。以下三块 Chart 配置是必需的且都没有可用的默认值——直接执行helm install不会用上 Terraform 刚建好的基础设施。1. 让工作负载使用联邦 ServiceAccountaks模块创建的 ServiceAccount 带有托管身份的 client ID 注解。Pod 只有在使用该账户运行且携带azure.workload.identity/use标签时才能获得令牌webhook 靠它识别。二者缺一DefaultAzureCredential就找不到令牌所有文件存储调用都会认证失败。serviceAccount: create: false name: onyx-workload-access # 与 aks 模块默认一致位于 onyx 命名空间 # 标签按 Pod 生效因此要加到所有触碰文件存储的组件上 # API 服务器与所有 Celery worker。 api: podLabels: azure.workload.identity/use: true celery_worker_primary: podLabels: azure.workload.identity/use: true celery_worker_heavy: podLabels: azure.workload.identity/use: true celery_worker_light: podLabels: azure.workload.identity/use: true celery_worker_docfetching: podLabels: azure.workload.identity/use: true celery_worker_docprocessing: podLabels: azure.workload.identity/use: true celery_worker_user_file_processing: podLabels: azure.workload.identity/use: true celery_worker_scheduled_tasks: podLabels: azure.workload.identity/use: true celery_worker_monitoring: podLabels: azure.workload.identity/use: true celery_beat: podLabels: azure.workload.identity/use: true2. 把文件存储指向存储账户模块输出与应用读取的环境变量一一对应环境变量输出FILE_STORE_BACKEND设为azureAZURE_STORAGE_ACCOUNT_NAMEstorage_account_nameAZURE_STORAGE_ACCOUNT_URLstorage_account_urlAZURE_FILE_STORE_CONTAINER_NAMEstorage_container_name不要设置AZURE_STORAGE_ACCOUNT_KEY。Onyx 用DefaultAzureCredential认证——它从第 1 步的 workload identity 取令牌——而存储账户的共享密钥本来也已关闭。3. 把文档索引调度到专用节点池aks模块给索引池打了document-indextrue:NoSchedule污点确保其他工作负载不会落上去。OpenSearch 子 chart 自身不带容忍若不配置它会调度到系统池上专用池反而闲置opensearch: nodeSelector: onyx.app/workload: document-index tolerations: - key: document-index operator: Equal value: true effect: NoSchedule如果想在系统池上运行索引并跳过这段配置设置index_node_pool_enabled false。测试套件每个模块都带一套terraform test套件对 mock provider 做 plan 验证因此不需要 Azure 订阅也不需要任何凭据cd deployment/terraform/modules/azure/vnet terraform init -backendfalse terraform test测试文件位于各模块的tests/目录例如 aks/tests/aks.tftest.hcl、onyx/tests/onyx.tftest.hcl覆盖接线逻辑与输入校验——错误的参数名或越界值如果不在这里暴露就只能在 apply 时才显现。但注意这些测试不能证明模块在 Azure 上真实可用只有一次真正的 apply 才能证明。安全基线总结综合 deployment/terraform/modules/azure/README.md 与各模块源码这套模块默认的安全姿态如下存储账户共享访问密钥关闭blob 永远不允许匿名读取default_to_oauth_authentication trueallow_nested_items_to_be_public false数据库与缓存均无公共端点Flexible Server 显式public_network_access_enabled falseManaged Redis 仅在开启私有端点时按需开放公共访问默认关闭缓存仅支持 TLSManaged Redis 根本没有明文端口数据库拒绝低于 1.2 的 TLSAPI 服务器不会被构建成开放状态必须显式设置api_server_authorized_ip_ranges、private_cluster_enabled或allow_unrestricted_api_server_access三者之一否则校验失败见 onyx/variables.tf 与 aks/variables.tf 的 validation 块数据库不会被建成无法登录必须提供postgres_password或开启entra_database_authentication_only并同时提供database_administrator_object_idrestrict_storage_to_cluster应在 Terraform 从网络内部运行时开启从外部运行时开启会把管理该容器的人锁在门外。这套 Azure 模块的设计哲学可以概括为一句话一切默认安全、一切危险操作必须显式声明、一切关键数据数据库/服务器都有prevent_destroy兜底。在把生产工作负载迁移到 Azure 之前建议先对照本文的与 AWS 模块的差异表逐项核对再在测试环境中完整执行一次terraform init、terraform test、terraform apply与helm install的链路验证。【免费下载链接】danswerOpen Source AI Platform - AI Chat with advanced features that works with every LLM项目地址: https://gitcode.com/GitHub_Trending/da/danswer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表