Generér fra kode
Kopiér de færdige kodeeksempler på denne side og indsæt dem i letdraws Generate from Code-værktøj for at producere et diagram på sekunder. Værktøjet auto-detekterer formatet; for detaljer, se siden Generér fra kode.
Sådan bruger du det: åbn More tools (⋯) -> Generate from Code i den nederste værktøjslinje, kopiér kodeblokken fra et af eksemplerne nedenfor, indsæt den, og tryk på Add. Det lille skema over hvert eksempel er en forhåndsvisning af den struktur, koden producerer; når du kopierer, skal du kun kopiere kodeblokken under det.
Alle eksemplerne er bygget op omkring det samme e-handels (shopping)-scenarie.
SQL (PostgreSQL-skema)
Sektion kaldt “SQL (PostgreSQL-skema)”Forvandler CREATE TABLE-sætninger og deres foreign key-relationer til et ER
(entity-relationship)-diagram.
Den struktur, denne kode producerer:
Customers └─< Orders ├─< Payments └─< OrderDetails >─ Products >─ Categories
( ─< one-to-many relationship (1 → N) ; >─ foreign key (N → 1) )-- ===========================================-- E-COMMERCE DATABASE SCHEMA-- PostgreSQL-- ===========================================
-- ===========================-- CATEGORIES-- ===========================CREATE TABLE categories ( category_id SERIAL PRIMARY KEY, category_name VARCHAR(100) NOT NULL, description TEXT);
-- ===========================-- PRODUCTS-- ===========================CREATE TABLE products ( product_id SERIAL PRIMARY KEY, category_id INT NOT NULL, product_name VARCHAR(200) NOT NULL, description TEXT, price NUMERIC(10,2) NOT NULL, stock INT NOT NULL DEFAULT 0,
CONSTRAINT fk_products_category FOREIGN KEY (category_id) REFERENCES categories(category_id));
-- ===========================-- CUSTOMERS-- ===========================CREATE TABLE customers ( customer_id SERIAL PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, email VARCHAR(150) UNIQUE NOT NULL, phone VARCHAR(20), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
-- ===========================-- ORDERS-- ===========================CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, customer_id INT NOT NULL, order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, total_amount NUMERIC(10,2) DEFAULT 0, status VARCHAR(30) DEFAULT 'Pending',
CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id));
-- ===========================-- ORDER DETAILS-- ===========================CREATE TABLE order_details ( detail_id SERIAL PRIMARY KEY, order_id INT NOT NULL, product_id INT NOT NULL, quantity INT NOT NULL, unit_price NUMERIC(10,2) NOT NULL,
CONSTRAINT fk_orderdetails_order FOREIGN KEY (order_id) REFERENCES orders(order_id),
CONSTRAINT fk_orderdetails_product FOREIGN KEY (product_id) REFERENCES products(product_id));
-- ===========================-- PAYMENTS-- ===========================CREATE TABLE payments ( payment_id SERIAL PRIMARY KEY, order_id INT NOT NULL, payment_method VARCHAR(50) NOT NULL, payment_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, amount NUMERIC(10,2) NOT NULL, status VARCHAR(30) DEFAULT 'Completed',
CONSTRAINT fk_payments_order FOREIGN KEY (order_id) REFERENCES orders(order_id));Kubernetes (manifest)
Sektion kaldt “Kubernetes (manifest)”Forvandler objekter såsom Deployment, Service, Ingress og PVC, og forbindelserne mellem dem (label / selector / reference), til et arkitekturdiagram.
Den struktur, denne kode producerer:
Internet └─ Ingress ├─ frontend-svc ── frontend Pods ├─ api-svc ─────── api Pods ── postgres-svc ── postgres Pod ── PVC → PV └─ admin-svc ───── admin Pods
ServiceAccount → Role → RoleBinding############################################################ Namespace###########################################################
apiVersion: v1kind: Namespacemetadata: name: shopping
---
############################################################ Service Account###########################################################
apiVersion: v1kind: ServiceAccountmetadata: name: shopping-sa namespace: shopping
---
############################################################ Role###########################################################
apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: name: shopping-role namespace: shopping
rules:
- apiGroups: [""] resources: - pods - services - configmaps verbs: - get - list - watch
---
############################################################ RoleBinding###########################################################
apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: shopping-rolebinding namespace: shopping
subjects:- kind: ServiceAccount name: shopping-sa
roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: shopping-role
---
############################################################ Persistent Volume###########################################################
apiVersion: v1kind: PersistentVolume
metadata: name: postgres-pv
spec:
capacity: storage: 20Gi
accessModes: - ReadWriteOnce
storageClassName: manual
hostPath: path: /data/postgres
---
############################################################ PVC###########################################################
apiVersion: v1kind: PersistentVolumeClaim
metadata: name: postgres-pvc namespace: shopping
spec:
storageClassName: manual
accessModes: - ReadWriteOnce
resources: requests: storage: 20Gi
---
############################################################ PostgreSQL Deployment###########################################################
apiVersion: apps/v1kind: Deployment
metadata: name: postgres
spec:
replicas: 1
selector: matchLabels: app: postgres
template:
metadata: labels: app: postgres
spec:
serviceAccountName: shopping-sa
nodeSelector: workload: database
containers:
- name: postgres
image: postgres:16
env:
- name: POSTGRES_DB value: shopping
- name: POSTGRES_USER value: admin
- name: POSTGRES_PASSWORD value: password
volumeMounts:
- mountPath: /var/lib/postgresql/data name: postgres-storage
volumes:
- name: postgres-storage
persistentVolumeClaim: claimName: postgres-pvc
---
############################################################ PostgreSQL Service###########################################################
apiVersion: v1kind: Service
metadata: name: postgres-service
spec:
selector: app: postgres
ports:
- port: 5432 targetPort: 5432
---
############################################################ Backend Deployment###########################################################
apiVersion: apps/v1kind: Deployment
metadata: name: shopping-api
spec:
replicas: 3
selector:
matchLabels:
app: shopping-api
template:
metadata:
labels:
app: shopping-api
spec:
serviceAccountName: shopping-sa
nodeSelector: workload: application
containers:
- name: api
image: company/shopping-api:v1
env:
- name: DB_HOST value: postgres-service
- name: DB_PORT value: "5432"
ports:
- containerPort: 8080
---
############################################################ Backend Service###########################################################
apiVersion: v1kind: Service
metadata: name: api-service
spec:
selector:
app: shopping-api
ports:
- port: 80
targetPort: 8080
---
############################################################ Frontend Deployment###########################################################
apiVersion: apps/v1kind: Deployment
metadata: name: shopping-web
spec:
replicas: 2
selector:
matchLabels:
app: shopping-web
template:
metadata:
labels:
app: shopping-web
spec:
serviceAccountName: shopping-sa
nodeSelector: workload: frontend
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
############################################################ Frontend Service###########################################################
apiVersion: v1kind: Service
metadata: name: frontend-service
spec:
selector:
app: shopping-web
ports:
- port: 80
targetPort: 80
---
############################################################ Admin Deployment###########################################################
apiVersion: apps/v1kind: Deployment
metadata: name: admin-panel
spec:
replicas: 1
selector:
matchLabels:
app: admin
template:
metadata:
labels:
app: admin
spec:
serviceAccountName: shopping-sa
containers:
- name: admin
image: company/admin-panel:v1
ports:
- containerPort: 8081
---
############################################################ Admin Service###########################################################
apiVersion: v1kind: Service
metadata: name: admin-service
spec:
selector:
app: admin
ports:
- port: 80
targetPort: 8081
---
############################################################ Ingress###########################################################
apiVersion: networking.k8s.io/v1kind: Ingress
metadata: name: shopping-ingress
spec:
ingressClassName: nginx
rules:
- host: shop.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port: number: 80
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port: number: 80
- path: /admin
pathType: Prefix
backend:
service:
name: admin-service
port: number: 80Docker Compose
Sektion kaldt “Docker Compose”Forvandler services og deres afhængigheder (depends_on, netværk, environment) til
et servicediagram.
Den struktur, denne kode producerer:
Browser └─ Frontend (Nginx) └─ API Service ├─ Authentication ├─ Payment ── RabbitMQ ├─ Redis ├─ PostgreSQL ├─ MinIO └─ Elasticsearch ── Kibanaversion: "3.9"
services:
##################################################### Frontend####################################################
frontend: image: shopping/frontend:1.0 container_name: frontend
ports: - "80:80"
depends_on: - api
environment: API_URL: http://api:8080
networks: - shopping-network
##################################################### Backend API####################################################
api: image: shopping/api:1.0 container_name: api
ports: - "8080:8080"
depends_on: - postgres - redis - rabbitmq - auth
environment:
DB_HOST: postgres DB_PORT: 5432 DB_NAME: shopping DB_USER: admin DB_PASSWORD: password
REDIS_HOST: redis
AUTH_URL: http://auth:8081
PAYMENT_URL: http://payment:8082
RABBITMQ_HOST: rabbitmq
STORAGE_ENDPOINT: http://minio:9000
networks: - shopping-network
##################################################### Authentication Service####################################################
auth: image: shopping/auth-service:1.0 container_name: auth
ports: - "8081:8081"
depends_on: - postgres - redis
environment:
DB_HOST: postgres
REDIS_HOST: redis
networks: - shopping-network
##################################################### Payment Service####################################################
payment: image: shopping/payment-service:1.0 container_name: payment
ports: - "8082:8082"
depends_on: - rabbitmq
environment:
RABBITMQ_HOST: rabbitmq
networks: - shopping-network
##################################################### PostgreSQL####################################################
postgres:
image: postgres:16
container_name: postgres
restart: always
environment:
POSTGRES_DB: shopping
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
ports: - "5432:5432"
volumes: - postgres-data:/var/lib/postgresql/data
networks: - shopping-network
##################################################### Redis####################################################
redis:
image: redis:7
container_name: redis
ports: - "6379:6379"
networks: - shopping-network
##################################################### RabbitMQ####################################################
rabbitmq:
image: rabbitmq:3-management
container_name: rabbitmq
ports:
- "5672:5672"
- "15672:15672"
networks: - shopping-network
##################################################### MinIO####################################################
minio:
image: minio/minio
container_name: minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: password123
ports:
- "9000:9000"
- "9001:9001"
volumes: - minio-data:/data
networks: - shopping-network
##################################################### Elasticsearch####################################################
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
container_name: elasticsearch
environment:
discovery.type: single-node
xpack.security.enabled: "false"
ports:
- "9200:9200"
volumes: - elastic-data:/usr/share/elasticsearch/data
networks: - shopping-network
##################################################### Kibana####################################################
kibana:
image: docker.elastic.co/kibana/kibana:8.15.0
container_name: kibana
depends_on: - elasticsearch
environment:
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
ports:
- "5601:5601"
networks: - shopping-network
##################################################### Networks####################################################
networks:
shopping-network:
driver: bridge
##################################################### Volumes####################################################
volumes:
postgres-data:
minio-data:
elastic-data:Helm (template + values)
Sektion kaldt “Helm (template + values)”Forvandler et Helm Charts resurser og forbindelserne mellem values.yaml og
templaterne til et resursediagram.
Den struktur, denne kode producerer:
values.yaml └─ Helm Template Engine └─ shopping-release ├─ ConfigMap ────┐ ├─ Secret ───────┼─ shopping-api Deployment ── api-service ── Ingress (/api) ├─ ServiceAccount ┘ ├─ shopping-web Deployment ── frontend-service ── Ingress (/) └─ postgres Deployment ── postgres-pvc ── PV{{- $app := .Values.app.name }}
############################################################### ServiceAccount##############################################################
apiVersion: v1kind: ServiceAccountmetadata: name: {{ $app }}-sa
---
############################################################### ConfigMap##############################################################
apiVersion: v1kind: ConfigMapmetadata: name: {{ $app }}-config
data:
DB_HOST: postgres-service
DB_PORT: "5432"
REDIS_HOST: redis-service
---
############################################################### Secret##############################################################
apiVersion: v1kind: Secret
metadata: name: {{ $app }}-secret
type: Opaque
stringData:
DB_USER: admin
DB_PASSWORD: password
---
############################################################### PVC##############################################################
apiVersion: v1kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
############################################################### PostgreSQL Deployment##############################################################
apiVersion: apps/v1kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
serviceAccountName: {{ $app }}-sa
containers:
- name: postgres
image: postgres:16
env:
- name: POSTGRES_USER valueFrom:
secretKeyRef:
name: {{ $app }}-secret
key: DB_USER
- name: POSTGRES_PASSWORD valueFrom:
secretKeyRef:
name: {{ $app }}-secret
key: DB_PASSWORD
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: postgres-pvc
---
############################################################### PostgreSQL Service##############################################################
apiVersion: v1kind: Service
metadata:
name: postgres-service
spec:
selector:
app: postgres
ports:
- port: 5432
---
############################################################### Backend Deployment##############################################################
apiVersion: apps/v1kind: Deployment
metadata:
name: shopping-api
spec:
replicas: {{ .Values.api.replicaCount }}
selector:
matchLabels:
app: shopping-api
template:
metadata:
labels:
app: shopping-api
spec:
serviceAccountName: {{ $app }}-sa
containers:
- name: api
image: "{{ .Values.api.image }}:{{ .Values.api.tag }}"
envFrom:
- configMapRef:
name: {{ $app }}-config
- secretRef:
name: {{ $app }}-secret
ports:
- containerPort: 8080
---
############################################################### Backend Service##############################################################
apiVersion: v1kind: Service
metadata:
name: api-service
spec:
selector:
app: shopping-api
ports:
- port: 80
targetPort: 8080
---
############################################################### Frontend Deployment##############################################################
apiVersion: apps/v1kind: Deployment
metadata:
name: shopping-web
spec:
replicas: {{ .Values.web.replicaCount }}
selector:
matchLabels:
app: shopping-web
template:
metadata:
labels:
app: shopping-web
spec:
serviceAccountName: {{ $app }}-sa
containers:
- name: nginx
image: "{{ .Values.web.image }}:{{ .Values.web.tag }}"
env:
- name: API_URL
value: http://api-service
---
############################################################### Frontend Service##############################################################
apiVersion: v1kind: Service
metadata:
name: frontend-service
spec:
selector:
app: shopping-web
ports:
- port: 80
---
############################################################### Ingress##############################################################
apiVersion: networking.k8s.io/v1kind: Ingress
metadata:
name: shopping-ingress
spec:
ingressClassName: nginx
rules:
- host: {{ .Values.ingress.host }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
values.yaml:
app: name: shopping
api: image: company/shopping-api tag: v1.4.2 replicaCount: 3
web: image: company/shopping-web tag: v2.1.0 replicaCount: 2
ingress: host: shop.example.comTerraform (Azure)
Sektion kaldt “Terraform (Azure)”Forvandler resurser og afhængighederne mellem dem (implicitte afhængigheder) til et resursediagram.
Den struktur, denne kode producerer:
Resource Group ├─ Virtual Network │ └─ Subnet │ ├─ Network Security Group ── NSG Association │ ├─ Public IP │ └─ Network Interface ── Linux VM └─ Storage Accountterraform { required_version = ">=1.6"
required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>4.0" } }}
provider "azurerm" { features {}}
########################################## Resource Group#########################################
resource "azurerm_resource_group" "rg" { name = "rg-demo-prod" location = "West Europe"}
########################################## Virtual Network#########################################
resource "azurerm_virtual_network" "vnet" { name = "demo-vnet"
location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name
address_space = ["10.10.0.0/16"]}
########################################## Subnet#########################################
resource "azurerm_subnet" "subnet" { name = "application-subnet"
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = ["10.10.1.0/24"]}
########################################## Network Security Group#########################################
resource "azurerm_network_security_group" "nsg" {
name = "application-nsg"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
security_rule {
name = "SSH"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*" }
security_rule {
name = "HTTP"
priority = 110
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "80"
source_address_prefix = "*"
destination_address_prefix = "*" }}
########################################## NSG Association#########################################
resource "azurerm_subnet_network_security_group_association" "assoc" {
subnet_id = azurerm_subnet.subnet.id
network_security_group_id = azurerm_network_security_group.nsg.id}
########################################## Public IP#########################################
resource "azurerm_public_ip" "pip" {
name = "vm-public-ip"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
allocation_method = "Static"
sku = "Standard"}
########################################## Network Interface#########################################
resource "azurerm_network_interface" "nic" {
name = "vm-nic"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
ip_configuration {
name = "internal"
subnet_id = azurerm_subnet.subnet.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.pip.id }}
########################################## Linux VM#########################################
resource "azurerm_linux_virtual_machine" "vm" {
name = "demo-vm"
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
size = "Standard_B2s"
admin_username = "azureuser"
disable_password_authentication = false
admin_password = "Password123!"
network_interface_ids = [ azurerm_network_interface.nic.id ]
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS" }
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts"
version = "latest" }}
########################################## Storage Account#########################################
resource "azurerm_storage_account" "storage" {
name = "demostorage123456"
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
account_tier = "Standard"
account_replication_type = "LRS"}