Skip to content

Commit 2736e8c

Browse files
author
承虔
committed
Add PAI deployment for multi-form Stable Diffusion WebUI services
1 parent 3542ab3 commit 2736e8c

File tree

4 files changed

+293
-0
lines changed

4 files changed

+293
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<!-- BEGIN_TF_DOCS -->
2+
## Introduction
3+
4+
<!-- DOCS_DESCRIPTION_CN -->
5+
本示例用于实现解决方案[PAI 部署多形态的 Stable Diffusion WebUI 服务部署须知](https://www.aliyun.com/solution/tech-solution-deploy/2509703), 涉及到 PAI、NAS、NAT网关 等资源的创建/添加/挂载/关联/部署。
6+
<!-- DOCS_DESCRIPTION_CN -->
7+
8+
<!-- DOCS_DESCRIPTION_EN -->
9+
This example is used to implement solution [PAI deploys multi-form Stable Diffusion WebUI services](https://www.aliyun.com/solution/tech-solution-deploy/2509703), which involves the creation and deployment of resources such as PAI、NAS、NAT gateway.
10+
<!-- DOCS_DESCRIPTION_EN -->
11+
12+
13+
<!-- BEGIN_TF_DOCS -->
14+
## Providers
15+
16+
| Name | Version |
17+
|------|---------|
18+
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | n/a |
19+
| <a name="provider_random"></a> [random](#provider\_random) | n/a |
20+
21+
## Modules
22+
23+
No modules.
24+
25+
## Resources
26+
27+
| Name | Type |
28+
|------|------|
29+
| [alicloud_eip.eip](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/eip) | resource |
30+
| [alicloud_eip_association.eip_association](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/eip_association) | resource |
31+
| [alicloud_nas_access_group.nas_access_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/nas_access_group) | resource |
32+
| [alicloud_nas_access_rule.nas_access_rule](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/nas_access_rule) | resource |
33+
| [alicloud_nas_file_system.nas](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/nas_file_system) | resource |
34+
| [alicloud_nas_mount_target.nas_mount_target](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/nas_mount_target) | resource |
35+
| [alicloud_nat_gateway.nat_gateway](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/nat_gateway) | resource |
36+
| [alicloud_pai_service.pai_eas](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/pai_service) | resource |
37+
| [alicloud_security_group.security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
38+
| [alicloud_security_group_rule.allow_http](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
39+
| [alicloud_security_group_rule.allow_https](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
40+
| [alicloud_snat_entry.snat_entry](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/snat_entry) | resource |
41+
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
42+
| [alicloud_vswitch.vswitch](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
43+
| [random_string.random_string](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string) | resource |
44+
45+
## Inputs
46+
47+
| Name | Description | Type | Default | Required |
48+
|------|-------------|------|---------|:--------:|
49+
| <a name="input_instance_type"></a> [instance\_type](#input\_instance\_type) | PAI-EAS实例规格 | `string` | `"ecs.gn6i-c16g1.4xlarge"` | no |
50+
| <a name="input_zone_id"></a> [zone\_id](#input\_zone\_id) | 可用区ID | `string` | `"ap-southeast-1c"` | no |
51+
<!-- END_TF_DOCS -->
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
provider "alicloud" {
2+
}
3+
4+
# 生成随机字符串
5+
resource "random_string" "random_string" {
6+
length = 10
7+
special = false
8+
upper = false
9+
numeric = true
10+
lower = true
11+
}
12+
13+
# VPC
14+
resource "alicloud_vpc" "vpc" {
15+
vpc_name = "vpc_SDWebUI"
16+
cidr_block = "192.168.0.0/16"
17+
}
18+
19+
# VSwitch
20+
resource "alicloud_vswitch" "vswitch" {
21+
vpc_id = alicloud_vpc.vpc.id
22+
availability_zone = var.zone_id
23+
cidr_block = "192.168.0.0/18"
24+
vswitch_name = "vswitch_SDWebUI"
25+
}
26+
27+
# NAT网关
28+
resource "alicloud_nat_gateway" "nat_gateway" {
29+
vpc_id = alicloud_vpc.vpc.id
30+
vswitch_id = alicloud_vswitch.vswitch.id
31+
nat_gateway_name = "nat_SDWebUI"
32+
instance_charge_type = "PostPaid"
33+
internet_charge_type = "PayByLcu"
34+
nat_type = "Enhanced"
35+
network_type = "internet"
36+
37+
tags = {
38+
WebUI = "SD_WebUI"
39+
}
40+
}
41+
42+
# EIP
43+
resource "alicloud_eip" "eip" {
44+
name = "eip_SDWebUI"
45+
bandwidth = 200
46+
internet_charge_type = "PayByTraffic"
47+
}
48+
49+
# EIP关联到NAT网关
50+
resource "alicloud_eip_association" "eip_association" {
51+
allocation_id = alicloud_eip.eip.id
52+
instance_id = alicloud_nat_gateway.nat_gateway.id
53+
}
54+
55+
# SNAT条目
56+
resource "alicloud_snat_entry" "snat_entry" {
57+
snat_table_id = alicloud_nat_gateway.nat_gateway.snat_table_ids
58+
snat_ip = alicloud_eip.eip.ip_address
59+
source_cidr = "192.168.0.0/18"
60+
61+
depends_on = [alicloud_eip_association.eip_association]
62+
}
63+
64+
# 安全组
65+
resource "alicloud_security_group" "security_group" {
66+
vpc_id = alicloud_vpc.vpc.id
67+
security_group_name = "sg_SDWebUI"
68+
security_group_type = "normal"
69+
}
70+
71+
# 安全组入站规则 - 80端口
72+
resource "alicloud_security_group_rule" "allow_http" {
73+
type = "ingress"
74+
ip_protocol = "tcp"
75+
nic_type = "intranet"
76+
policy = "accept"
77+
port_range = "80/80"
78+
priority = 1
79+
security_group_id = alicloud_security_group.security_group.id
80+
cidr_ip = "0.0.0.0/0"
81+
}
82+
83+
# 安全组入站规则 - 443端口
84+
resource "alicloud_security_group_rule" "allow_https" {
85+
type = "ingress"
86+
ip_protocol = "tcp"
87+
nic_type = "intranet"
88+
policy = "accept"
89+
port_range = "443/443"
90+
priority = 1
91+
security_group_id = alicloud_security_group.security_group.id
92+
cidr_ip = "0.0.0.0/0"
93+
}
94+
95+
# NAS文件系统
96+
resource "alicloud_nas_file_system" "nas" {
97+
file_system_type = "standard"
98+
storage_type = "Performance"
99+
protocol_type = "NFS"
100+
encrypt_type = 0
101+
}
102+
103+
# NAS访问组
104+
resource "alicloud_nas_access_group" "nas_access_group" {
105+
access_group_type = "Vpc"
106+
access_group_name = "nas_accessgroup_SDWebUI"
107+
file_system_type = "standard"
108+
}
109+
110+
# NAS访问规则
111+
resource "alicloud_nas_access_rule" "nas_access_rule" {
112+
priority = 100
113+
user_access_type = "no_squash"
114+
access_group_name = alicloud_nas_access_group.nas_access_group.access_group_name
115+
source_cidr_ip = "0.0.0.0/0"
116+
rw_access_type = "RDWR"
117+
file_system_type = "standard"
118+
}
119+
120+
# NAS挂载点
121+
resource "alicloud_nas_mount_target" "nas_mount_target" {
122+
vpc_id = alicloud_vpc.vpc.id
123+
vswitch_id = alicloud_vswitch.vswitch.id
124+
security_group_id = alicloud_security_group.security_group.id
125+
status = "Active"
126+
file_system_id = alicloud_nas_file_system.nas.id
127+
network_type = "Vpc"
128+
access_group_name = alicloud_nas_access_group.nas_access_group.access_group_name
129+
130+
depends_on = [alicloud_nas_access_rule.nas_access_rule]
131+
}
132+
133+
# PAI-EAS服务
134+
resource "alicloud_pai_service" "pai_eas" {
135+
service_config = jsonencode({
136+
metadata = {
137+
name = "sdwebui_${random_string.random_string.result}"
138+
instance = 1
139+
type = "SDCluster"
140+
enable_webservice = "true"
141+
}
142+
cloud = {
143+
computing = {
144+
instance_type = var.instance_type
145+
instances = null
146+
}
147+
networking = {
148+
vpc_id = alicloud_vpc.vpc.id
149+
vswitch_id = alicloud_vswitch.vswitch.id
150+
security_group_id = alicloud_security_group.security_group.id
151+
}
152+
}
153+
storage = [
154+
{
155+
nfs = {
156+
path = "/"
157+
server = alicloud_nas_mount_target.nas_mount_target.mount_target_domain
158+
}
159+
properties = {
160+
resource_type = "model"
161+
}
162+
mount_path = "/code/stable-diffusion-webui/data-nas"
163+
}
164+
]
165+
containers = [
166+
{
167+
image = "eas-registry-vpc.ap-southeast-1.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:4.1"
168+
script = "./webui.sh --listen --port 8000 --skip-version-check --no-hashing --no-download-sd-model --skip-install --api --filebrowser --cluster-status --sd-dynamic-cache --data-dir /code/stable-diffusion-webui/data-nas"
169+
port = 8000
170+
}
171+
]
172+
meta = {
173+
type = "SDCluster"
174+
}
175+
options = {
176+
enableCache = true
177+
}
178+
})
179+
timeouts {
180+
create = "20m"
181+
}
182+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
output "vpc_id" {
2+
description = "VPC ID"
3+
value = alicloud_vpc.vpc.id
4+
}
5+
6+
output "vswitch_id" {
7+
description = "VSwitch ID"
8+
value = alicloud_vswitch.vswitch.id
9+
}
10+
11+
output "nat_gateway_id" {
12+
description = "NAT Gateway ID"
13+
value = alicloud_nat_gateway.nat_gateway.id
14+
}
15+
16+
output "eip_address" {
17+
description = "EIP地址"
18+
value = alicloud_eip.eip.ip_address
19+
}
20+
21+
output "security_group_id" {
22+
description = "安全组ID"
23+
value = alicloud_security_group.security_group.id
24+
}
25+
26+
output "nas_file_system_id" {
27+
description = "NAS文件系统ID"
28+
value = alicloud_nas_file_system.nas.id
29+
}
30+
31+
output "nas_mount_target_domain" {
32+
description = "NAS挂载点域名"
33+
value = alicloud_nas_mount_target.nas_mount_target.mount_target_domain
34+
}
35+
36+
output "pai_service_id" {
37+
description = "PAI-EAS服务ID"
38+
value = alicloud_pai_service.pai_eas.id
39+
}
40+
41+
output "service_name" {
42+
description = "PAI-EAS服务名称"
43+
value = "sdwebui_${random_string.random_string.result}"
44+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
variable "zone_id" {
2+
type = string
3+
description = "可用区ID"
4+
default = "ap-southeast-1c"
5+
}
6+
7+
variable "instance_type" {
8+
type = string
9+
description = "PAI-EAS实例规格"
10+
default = "ecs.gn6i-c16g1.4xlarge"
11+
12+
validation {
13+
condition = can(regex("(^ecs.*gn.*)|(^ml.*)|(^ecs.*gu.*)", var.instance_type))
14+
error_message = "实例类型必须匹配模式 (^ecs.*gn.*)|(^ml.*)|(^ecs.*gu.*)"
15+
}
16+
}

0 commit comments

Comments
 (0)