新增docker和K8S一键部署脚本
parent
1f5a827ba9
commit
4925cc8479
|
@ -1,23 +0,0 @@
|
||||||
version: "3.2"
|
|
||||||
services:
|
|
||||||
flask-consul:
|
|
||||||
image: swr.cn-south-1.myhuaweicloud.com/starsl.cn/flask-consul:latest
|
|
||||||
container_name: flask-consul
|
|
||||||
hostname: flask-consul
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- /usr/share/zoneinfo/PRC:/etc/localtime
|
|
||||||
environment:
|
|
||||||
consul_token: xxxxx-xxxxx-xxxxx
|
|
||||||
consul_url: http://x.x.x.x:8500/v1
|
|
||||||
admin_passwd: xxxxxxxx
|
|
||||||
log_level: INFO
|
|
||||||
nginx-consul:
|
|
||||||
image: swr.cn-south-1.myhuaweicloud.com/starsl.cn/nginx-consul:latest
|
|
||||||
container_name: nginx-consul
|
|
||||||
hostname: nginx-consul
|
|
||||||
restart: always
|
|
||||||
ports:
|
|
||||||
- "1026:1026"
|
|
||||||
volumes:
|
|
||||||
- /usr/share/zoneinfo/PRC:/etc/localtime
|
|
Binary file not shown.
|
@ -0,0 +1,98 @@
|
||||||
|
#!/bin/bash
|
||||||
|
tsspath="/opt/tensuns"
|
||||||
|
uuid=`uuidgen`
|
||||||
|
adminpwd=`uuidgen|awk -F- '{print $1}'`
|
||||||
|
mkdir -p $tsspath/consul/config
|
||||||
|
cat <<EOF > $tsspath/consul/config/consul.hcl
|
||||||
|
log_level = "error"
|
||||||
|
data_dir = "/consul/data"
|
||||||
|
client_addr = "0.0.0.0"
|
||||||
|
ui_config{
|
||||||
|
enabled = true
|
||||||
|
}
|
||||||
|
ports = {
|
||||||
|
grpc = -1
|
||||||
|
https = -1
|
||||||
|
dns = -1
|
||||||
|
grpc_tls = -1
|
||||||
|
serf_wan = -1
|
||||||
|
}
|
||||||
|
peering {
|
||||||
|
enabled = false
|
||||||
|
}
|
||||||
|
connect {
|
||||||
|
enabled = false
|
||||||
|
}
|
||||||
|
server = true
|
||||||
|
bootstrap_expect=1
|
||||||
|
acl = {
|
||||||
|
enabled = true
|
||||||
|
default_policy = "deny"
|
||||||
|
enable_token_persistence = true
|
||||||
|
tokens {
|
||||||
|
initial_management = "$uuid"
|
||||||
|
agent = "$uuid"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF > $tsspath/docker-compose.yaml
|
||||||
|
version: '3.6'
|
||||||
|
services:
|
||||||
|
consul:
|
||||||
|
image: hashicorp/consul:1.16
|
||||||
|
container_name: consul
|
||||||
|
hostname: consul
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- $tsspath/consul/data:/consul/data
|
||||||
|
- $tsspath/consul/config:/consul/config
|
||||||
|
- /usr/share/zoneinfo/PRC:/etc/localtime
|
||||||
|
command: "agent"
|
||||||
|
networks:
|
||||||
|
- TenSunS
|
||||||
|
|
||||||
|
flask-consul:
|
||||||
|
image: swr.cn-south-1.myhuaweicloud.com/starsl.cn/flask-consul:latest
|
||||||
|
container_name: flask-consul
|
||||||
|
hostname: flask-consul
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- /usr/share/zoneinfo/PRC:/etc/localtime
|
||||||
|
environment:
|
||||||
|
consul_token: $uuid
|
||||||
|
consul_url: http://consul:8500/v1
|
||||||
|
admin_passwd: $adminpwd
|
||||||
|
log_level: INFO
|
||||||
|
depends_on:
|
||||||
|
- consul
|
||||||
|
networks:
|
||||||
|
- TenSunS
|
||||||
|
|
||||||
|
nginx-consul:
|
||||||
|
image: swr.cn-south-1.myhuaweicloud.com/starsl.cn/nginx-consul:latest
|
||||||
|
container_name: nginx-consul
|
||||||
|
hostname: nginx-consul
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "1026:1026"
|
||||||
|
volumes:
|
||||||
|
- /usr/share/zoneinfo/PRC:/etc/localtime
|
||||||
|
depends_on:
|
||||||
|
- flask-consul
|
||||||
|
networks:
|
||||||
|
- TenSunS
|
||||||
|
|
||||||
|
networks:
|
||||||
|
TenSunS:
|
||||||
|
name: TenSunS
|
||||||
|
driver: bridge
|
||||||
|
ipam:
|
||||||
|
driver: default
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo -e "\n后羿运维平台默认的admin密码是:\033[31;1m$adminpwd\033[0m\n修改密码请编辑 $tsspath/docker-compose.yaml 查找并修改变量 admin_passwd 的值\n"
|
||||||
|
echo "正在启动后羿运维平台..."
|
||||||
|
cd $tsspath && docker-compose up -d
|
||||||
|
echo -e "\n请使用浏览器访问 http://{你的IP}:1026 并登录使用\n"
|
||||||
|
echo -e "\033[31;1mhttp://`ip route get 1.2.3.4 | awk '{print $NF}'|head -1`:1026\033[0m\n"
|
|
@ -0,0 +1,64 @@
|
||||||
|
#!/bin/bash
|
||||||
|
uuid=`uuidgen`
|
||||||
|
mkdir -p /opt/consul/config
|
||||||
|
cat <<EOF > /opt/consul/config/consul.hcl
|
||||||
|
log_level = "error"
|
||||||
|
data_dir = "/consul/data"
|
||||||
|
client_addr = "0.0.0.0"
|
||||||
|
ui_config{
|
||||||
|
enabled = true
|
||||||
|
}
|
||||||
|
ports = {
|
||||||
|
grpc = -1
|
||||||
|
https = -1
|
||||||
|
dns = -1
|
||||||
|
grpc_tls = -1
|
||||||
|
serf_wan = -1
|
||||||
|
}
|
||||||
|
peering {
|
||||||
|
enabled = false
|
||||||
|
}
|
||||||
|
connect {
|
||||||
|
enabled = false
|
||||||
|
}
|
||||||
|
server = true
|
||||||
|
bootstrap_expect=1
|
||||||
|
acl = {
|
||||||
|
enabled = true
|
||||||
|
default_policy = "deny"
|
||||||
|
enable_token_persistence = true
|
||||||
|
tokens {
|
||||||
|
initial_management = "$uuid"
|
||||||
|
agent = "$uuid"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF > /opt/consul/docker-compose.yaml
|
||||||
|
version: '3.6'
|
||||||
|
services:
|
||||||
|
consul:
|
||||||
|
image: hashicorp/consul:1.16
|
||||||
|
hostname: consul
|
||||||
|
container_name: consul
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- /opt/consul/data:/consul/data
|
||||||
|
- /opt/consul/config:/consul/config
|
||||||
|
- /usr/share/zoneinfo/PRC:/etc/localtime
|
||||||
|
ports:
|
||||||
|
- "8500:8500"
|
||||||
|
command: "agent"
|
||||||
|
networks:
|
||||||
|
- TenSunS
|
||||||
|
|
||||||
|
networks:
|
||||||
|
TenSunS:
|
||||||
|
name: TenSunS
|
||||||
|
driver: bridge
|
||||||
|
ipam:
|
||||||
|
driver: default
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "请进入/opt/consul目录执行 docker-compose up -d 启动consul"
|
||||||
|
echo "consul的管理员token是: $uuid"
|
|
@ -0,0 +1,49 @@
|
||||||
|
#!/bin/bash
|
||||||
|
tsspath="/opt/tensuns"
|
||||||
|
mkdir -p $tsspath
|
||||||
|
|
||||||
|
cat <<EOF > $tsspath/docker-compose.yaml
|
||||||
|
version: '3.6'
|
||||||
|
services:
|
||||||
|
flask-consul:
|
||||||
|
image: swr.cn-south-1.myhuaweicloud.com/starsl.cn/flask-consul:latest
|
||||||
|
container_name: flask-consul
|
||||||
|
hostname: flask-consul
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- /usr/share/zoneinfo/PRC:/etc/localtime
|
||||||
|
environment:
|
||||||
|
consul_token: xxxxx-xxxxx-xxxxx
|
||||||
|
consul_url: http://x.x.x.x:8500/v1
|
||||||
|
admin_passwd: xxxxxxxx
|
||||||
|
log_level: INFO
|
||||||
|
networks:
|
||||||
|
- TenSunS
|
||||||
|
|
||||||
|
nginx-consul:
|
||||||
|
image: swr.cn-south-1.myhuaweicloud.com/starsl.cn/nginx-consul:latest
|
||||||
|
container_name: nginx-consul
|
||||||
|
hostname: nginx-consul
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "1026:1026"
|
||||||
|
volumes:
|
||||||
|
- /usr/share/zoneinfo/PRC:/etc/localtime
|
||||||
|
depends_on:
|
||||||
|
- flask-consul
|
||||||
|
networks:
|
||||||
|
- TenSunS
|
||||||
|
|
||||||
|
networks:
|
||||||
|
TenSunS:
|
||||||
|
name: TenSunS
|
||||||
|
driver: bridge
|
||||||
|
ipam:
|
||||||
|
driver: default
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
echo -e "\n编辑:$tsspath/docker-compose.yaml,修改3个环境变量:\n\033[31;1mconsul_token\033[0m:consul的登录token(安装consul时生成的UUID)\n\033[31;1mconsul_url\033[0m:consul的URL(http开头,/v1要保留)\n\033[31;1madmin_passwd\033[0m:登录后羿运维平台admin用户的密码\n"
|
||||||
|
echo "启动:cd $tsspath && docker-compose up -d"
|
||||||
|
echo -e "\n请使用浏览器访问 http://{你的IP}:1026 并登录使用\n"
|
||||||
|
echo -e "\033[31;1mhttp://`ip route get 1.2.3.4 | awk '{print $NF}'|head -1`:1026\033[0m\n"
|
|
@ -0,0 +1,247 @@
|
||||||
|
#!/bin/bash
|
||||||
|
uuid=`uuidgen`
|
||||||
|
passwd="tensuns"
|
||||||
|
read -p "请设置登录后羿运维平台的admin密码:" passwd
|
||||||
|
|
||||||
|
cat <<EOF > 1.consul-deploy.yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: tensuns
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: consul-config
|
||||||
|
namespace: tensuns
|
||||||
|
labels:
|
||||||
|
app: consul
|
||||||
|
data:
|
||||||
|
consul.hcl: |+
|
||||||
|
log_level = "error"
|
||||||
|
data_dir = "/consul/data"
|
||||||
|
client_addr = "0.0.0.0"
|
||||||
|
ui_config {
|
||||||
|
enabled = true
|
||||||
|
}
|
||||||
|
ports = {
|
||||||
|
grpc = -1
|
||||||
|
https = -1
|
||||||
|
dns = -1
|
||||||
|
grpc_tls = -1
|
||||||
|
serf_wan = -1
|
||||||
|
}
|
||||||
|
peering {
|
||||||
|
enabled = false
|
||||||
|
}
|
||||||
|
connect {
|
||||||
|
enabled = false
|
||||||
|
}
|
||||||
|
acl = {
|
||||||
|
enabled = true
|
||||||
|
default_policy = "deny"
|
||||||
|
enable_token_persistence = true
|
||||||
|
tokens {
|
||||||
|
initial_management = "$uuid"
|
||||||
|
agent = "$uuid"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
server = true
|
||||||
|
bootstrap_expect = 1
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: consul
|
||||||
|
namespace: tensuns
|
||||||
|
labels:
|
||||||
|
app: consul
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: consul
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: consul
|
||||||
|
spec:
|
||||||
|
volumes:
|
||||||
|
- name: consul-config
|
||||||
|
configMap:
|
||||||
|
name: consul-config
|
||||||
|
containers:
|
||||||
|
- name: consul
|
||||||
|
image: hashicorp/consul:1.16
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 8500
|
||||||
|
protocol: TCP
|
||||||
|
env:
|
||||||
|
- name: TZ
|
||||||
|
value: Asia/Shanghai
|
||||||
|
volumeMounts:
|
||||||
|
- name: consul-data
|
||||||
|
mountPath: /consul/data
|
||||||
|
- name: consul-config
|
||||||
|
mountPath: /consul/config/consul.hcl
|
||||||
|
subPath: consul.hcl
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
restartPolicy: Always
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- kind: PersistentVolumeClaim
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: consul-data
|
||||||
|
namespace: tensuns
|
||||||
|
annotations:
|
||||||
|
everest.io/disk-volume-type: SAS
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 10Gi
|
||||||
|
storageClassName: csi-disk
|
||||||
|
volumeMode: Filesystem
|
||||||
|
serviceName: consul
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: consul
|
||||||
|
namespace: tensuns
|
||||||
|
labels:
|
||||||
|
app: consul
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
protocol: TCP
|
||||||
|
port: 8500
|
||||||
|
targetPort: 8500
|
||||||
|
selector:
|
||||||
|
app: consul
|
||||||
|
type: ClusterIP
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF > 2.tensuns-deploy.yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: tensuns
|
||||||
|
---
|
||||||
|
kind: Deployment
|
||||||
|
apiVersion: apps/v1
|
||||||
|
metadata:
|
||||||
|
name: flask-consul
|
||||||
|
namespace: tensuns
|
||||||
|
labels:
|
||||||
|
app: flask-consul
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: flask-consul
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: flask-consul
|
||||||
|
spec:
|
||||||
|
initContainers:
|
||||||
|
- name: wait-for-consul
|
||||||
|
image: busybox
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- '-c'
|
||||||
|
- >-
|
||||||
|
for i in \$(seq 1 60); do nc -z -w3 consul 8500 && exit 0 ||
|
||||||
|
sleep 5; done; exit 1
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
containers:
|
||||||
|
- name: flask-consul
|
||||||
|
image: 'swr.cn-south-1.myhuaweicloud.com/starsl.cn/flask-consul:latest'
|
||||||
|
ports:
|
||||||
|
- name: http-2026
|
||||||
|
containerPort: 2026
|
||||||
|
protocol: TCP
|
||||||
|
env:
|
||||||
|
- name: admin_passwd
|
||||||
|
value: '$passwd'
|
||||||
|
- name: consul_token
|
||||||
|
value: '$uuid'
|
||||||
|
- name: consul_url
|
||||||
|
value: 'http://consul:8500/v1'
|
||||||
|
- name: log_level
|
||||||
|
value: INFO
|
||||||
|
- name: TZ
|
||||||
|
value: Asia/Shanghai
|
||||||
|
imagePullPolicy: Always
|
||||||
|
restartPolicy: Always
|
||||||
|
---
|
||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: flask-consul
|
||||||
|
namespace: tensuns
|
||||||
|
labels:
|
||||||
|
app: flask-consul
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: http-2026
|
||||||
|
protocol: TCP
|
||||||
|
port: 2026
|
||||||
|
targetPort: 2026
|
||||||
|
selector:
|
||||||
|
app: flask-consul
|
||||||
|
type: ClusterIP
|
||||||
|
---
|
||||||
|
kind: Deployment
|
||||||
|
apiVersion: apps/v1
|
||||||
|
metadata:
|
||||||
|
name: nginx-consul
|
||||||
|
namespace: tensuns
|
||||||
|
labels:
|
||||||
|
app: nginx-consul
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx-consul
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx-consul
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx-consul
|
||||||
|
image: 'swr.cn-south-1.myhuaweicloud.com/starsl.cn/nginx-consul:latest'
|
||||||
|
ports:
|
||||||
|
- name: http-1026
|
||||||
|
containerPort: 1026
|
||||||
|
protocol: TCP
|
||||||
|
env:
|
||||||
|
- name: TZ
|
||||||
|
value: Asia/Shanghai
|
||||||
|
imagePullPolicy: Always
|
||||||
|
restartPolicy: Always
|
||||||
|
---
|
||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: tensuns
|
||||||
|
namespace: tensuns
|
||||||
|
labels:
|
||||||
|
app: tensuns
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: nginx-consul
|
||||||
|
protocol: TCP
|
||||||
|
port: 1026
|
||||||
|
targetPort: 1026
|
||||||
|
nodePort: 31026
|
||||||
|
selector:
|
||||||
|
app: nginx-consul
|
||||||
|
type: NodePort
|
||||||
|
externalTrafficPolicy: Cluster
|
||||||
|
EOF
|
108
k8s-deploy.yaml
108
k8s-deploy.yaml
|
@ -1,108 +0,0 @@
|
||||||
kind: Deployment
|
|
||||||
apiVersion: apps/v1
|
|
||||||
metadata:
|
|
||||||
name: flask-consul
|
|
||||||
labels:
|
|
||||||
app: flask-consul
|
|
||||||
spec:
|
|
||||||
replicas: 1
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: flask-consul
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: flask-consul
|
|
||||||
spec:
|
|
||||||
initContainers:
|
|
||||||
- name: wait-for-consul
|
|
||||||
image: busybox
|
|
||||||
command:
|
|
||||||
- sh
|
|
||||||
- '-c'
|
|
||||||
- >-
|
|
||||||
for i in $(seq 1 60); do nc -z -w3 x.x.x.x 8500 && exit 0 ||
|
|
||||||
sleep 5; done; exit 1
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
containers:
|
|
||||||
- name: flask-consul
|
|
||||||
image: 'swr.cn-south-1.myhuaweicloud.com/starsl.cn/flask-consul:latest'
|
|
||||||
ports:
|
|
||||||
- name: http-2026
|
|
||||||
containerPort: 2026
|
|
||||||
protocol: TCP
|
|
||||||
env:
|
|
||||||
- name: admin_passwd
|
|
||||||
value: 'xxxxxxxx'
|
|
||||||
- name: consul_token
|
|
||||||
value: xxxx-xxxx-xxxx-xxxx
|
|
||||||
- name: consul_url
|
|
||||||
value: 'http://x.x.x.x:8500/v1'
|
|
||||||
- name: log_level
|
|
||||||
value: INFO
|
|
||||||
- name: TZ
|
|
||||||
value: Asia/Shanghai
|
|
||||||
imagePullPolicy: Always
|
|
||||||
restartPolicy: Always
|
|
||||||
---
|
|
||||||
kind: Service
|
|
||||||
apiVersion: v1
|
|
||||||
metadata:
|
|
||||||
name: flask-consul
|
|
||||||
labels:
|
|
||||||
app: flask-consul
|
|
||||||
spec:
|
|
||||||
ports:
|
|
||||||
- name: http-2026
|
|
||||||
protocol: TCP
|
|
||||||
port: 2026
|
|
||||||
targetPort: 2026
|
|
||||||
selector:
|
|
||||||
app: flask-consul
|
|
||||||
type: ClusterIP
|
|
||||||
---
|
|
||||||
kind: Deployment
|
|
||||||
apiVersion: apps/v1
|
|
||||||
metadata:
|
|
||||||
name: nginx-consul
|
|
||||||
labels:
|
|
||||||
app: nginx-consul
|
|
||||||
spec:
|
|
||||||
replicas: 1
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx-consul
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx-consul
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: nginx-consul
|
|
||||||
image: 'swr.cn-south-1.myhuaweicloud.com/starsl.cn/nginx-consul:latest'
|
|
||||||
ports:
|
|
||||||
- name: http-1026
|
|
||||||
containerPort: 1026
|
|
||||||
protocol: TCP
|
|
||||||
env:
|
|
||||||
- name: TZ
|
|
||||||
value: Asia/Shanghai
|
|
||||||
imagePullPolicy: Always
|
|
||||||
restartPolicy: Always
|
|
||||||
---
|
|
||||||
kind: Service
|
|
||||||
apiVersion: v1
|
|
||||||
metadata:
|
|
||||||
name: consulmanager
|
|
||||||
labels:
|
|
||||||
service: consulmanager
|
|
||||||
spec:
|
|
||||||
ports:
|
|
||||||
- name: nginx-consul
|
|
||||||
protocol: TCP
|
|
||||||
port: 1026
|
|
||||||
targetPort: 1026
|
|
||||||
nodePort: 31026
|
|
||||||
selector:
|
|
||||||
app: nginx-consul
|
|
||||||
type: NodePort
|
|
Loading…
Reference in New Issue