Compare commits
10 commits
730b2802f2
...
ed7eb2743e
Author | SHA1 | Date | |
---|---|---|---|
|
ed7eb2743e | ||
4f6874057f | |||
86cfe7561d | |||
1efbbcfd15 | |||
b3a05ca3d8 | |||
d70d75f6c9 | |||
df164a4678 | |||
2cb7749e48 | |||
89bc3aefac | |||
6a9a0659e5 |
22 changed files with 1531 additions and 25 deletions
|
@ -2,7 +2,7 @@ apiVersion: v2
|
|||
name: element-call
|
||||
description: Run Element-Call and his dependencies
|
||||
type: application
|
||||
version: "0.1.12"
|
||||
version: "0.1.13"
|
||||
# renovate: image=ghcr.io/element-hq/element-call
|
||||
appVersion: "0.9.0"
|
||||
maintainers:
|
||||
|
|
|
@ -7,7 +7,7 @@ description: "Run Element-Call and his dependencies"
|
|||
|
||||
# element-call
|
||||
|
||||
  
|
||||
  
|
||||
|
||||
Run Element-Call and his dependencies
|
||||
|
||||
|
@ -52,7 +52,7 @@ helm uninstall element-call-release
|
|||
| service.lkJWT.image.pullPolicy | string | `"IfNotPresent"` | This sets the pull policy for images. (could be overwritten by global.image.pullPolicy) |
|
||||
| service.lkJWT.image.registry | string | `"ghcr.io"` | image registry (could be overwritten by global.image.registry) |
|
||||
| service.lkJWT.image.repository | string | `"element-hq/lk-jwt-service"` | image repository |
|
||||
| service.lkJWT.image.tag | string | `"0.2.2"` | image tag |
|
||||
| service.lkJWT.image.tag | string | `"0.2.3"` | image tag |
|
||||
| service.lkJWT.networkPolicy.egress.enabled | bool | `false` | activate egress no networkpolicy |
|
||||
| service.lkJWT.networkPolicy.egress.extra | list | `[]` | egress rules |
|
||||
| service.lkJWT.networkPolicy.ingress.http | list | `[]` | ingress for http port (e.g. ingress-controller) |
|
||||
|
|
|
@ -107,7 +107,7 @@ service:
|
|||
pullPolicy: IfNotPresent
|
||||
# -- image tag
|
||||
# @section -- livekit JWT
|
||||
tag: 0.2.2
|
||||
tag: 0.2.3
|
||||
config:
|
||||
# -- url to livekit
|
||||
# @section -- livekit JWT
|
||||
|
|
|
@ -3,9 +3,9 @@ name: home-assistant
|
|||
description: Home Assistant with tooling to run on an k3s pi
|
||||
icon: https://www.home-assistant.io/images/favicon-192x192.png
|
||||
type: application
|
||||
version: "0.3.17"
|
||||
version: "0.3.18"
|
||||
# renovate: image=ghcr.io/home-assistant/home-assistant
|
||||
appVersion: "2025.3.4"
|
||||
appVersion: "2025.4.2"
|
||||
maintainers:
|
||||
- name: WrenIX
|
||||
url: https://wrenix.eu
|
||||
|
|
|
@ -7,7 +7,7 @@ description: "Home Assistant with tooling to run on an k3s pi"
|
|||
|
||||
# home-assistant
|
||||
|
||||
  
|
||||
  
|
||||
|
||||
Home Assistant with tooling to run on an k3s pi
|
||||
|
||||
|
@ -70,7 +70,7 @@ helm uninstall home-assistant-release
|
|||
| nats.image.pullPolicy | string | `"IfNotPresent"` | |
|
||||
| nats.image.registry | string | `"docker.io"` | |
|
||||
| nats.image.repository | string | `"library/nats"` | |
|
||||
| nats.image.tag | string | `"2.11.0-scratch"` | |
|
||||
| nats.image.tag | string | `"2.11.1-scratch"` | |
|
||||
| nats.livenessProbe.tcpSocket.port | string | `"nats"` | |
|
||||
| nats.readinessProbe.tcpSocket.port | string | `"nats"` | |
|
||||
| nats.resources.limits.cpu | string | `"100m"` | |
|
||||
|
@ -113,7 +113,7 @@ helm uninstall home-assistant-release
|
|||
| zigbee2mqtt.image.pullPolicy | string | `"IfNotPresent"` | |
|
||||
| zigbee2mqtt.image.registry | string | `"docker.io"` | |
|
||||
| zigbee2mqtt.image.repository | string | `"koenkk/zigbee2mqtt"` | |
|
||||
| zigbee2mqtt.image.tag | string | `"2.2.0"` | |
|
||||
| zigbee2mqtt.image.tag | string | `"2.2.1"` | |
|
||||
| zigbee2mqtt.ingress.hosts | list | `[]` | |
|
||||
| zigbee2mqtt.securityContext.privileged | bool | `true` | |
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ nats:
|
|||
registry: docker.io
|
||||
repository: library/nats
|
||||
pullPolicy: IfNotPresent
|
||||
tag: "2.11.0-scratch"
|
||||
tag: "2.11.1-scratch"
|
||||
service:
|
||||
port:
|
||||
nats: 4222
|
||||
|
@ -50,7 +50,7 @@ zigbee2mqtt:
|
|||
registry: docker.io
|
||||
repository: koenkk/zigbee2mqtt
|
||||
pullPolicy: IfNotPresent
|
||||
tag: 2.2.0
|
||||
tag: 2.2.1
|
||||
device: /dev/ttyACM0
|
||||
securityContext:
|
||||
privileged: true
|
||||
|
|
|
@ -3,9 +3,9 @@ name: jellyfin
|
|||
description: The Free Software Media System
|
||||
icon: https://raw.githubusercontent.com/jellyfin/jellyfin-ux/master/branding/SVG/icon-transparent.svg
|
||||
type: application
|
||||
version: "0.3.10"
|
||||
version: "0.3.11"
|
||||
# renovate: image=ghcr.io/jellyfin/jellyfin
|
||||
appVersion: "10.10.6"
|
||||
appVersion: "10.10.7"
|
||||
maintainers:
|
||||
- name: WrenIX
|
||||
url: https://wrenix.eu
|
||||
|
|
|
@ -7,7 +7,7 @@ description: "The Free Software Media System"
|
|||
|
||||
# jellyfin
|
||||
|
||||
  
|
||||
  
|
||||
|
||||
The Free Software Media System
|
||||
|
||||
|
|
|
@ -4,9 +4,9 @@ name: matrix-synapse
|
|||
description: Matrix reference homeserver
|
||||
icon: https://matrix.org/images/matrix-logo.svg
|
||||
type: application
|
||||
version: "1.0.23"
|
||||
version: "1.0.24"
|
||||
# renovate: image=ghcr.io/element-hq/synapse
|
||||
appVersion: 1.127.1
|
||||
appVersion: "1.128.0"
|
||||
maintainers:
|
||||
- name: WrenIX
|
||||
url: https://wrenix.eu
|
||||
|
|
|
@ -7,7 +7,7 @@ description: "Matrix reference homeserver"
|
|||
|
||||
# matrix-synapse
|
||||
|
||||
  
|
||||
  
|
||||
|
||||
Matrix reference homeserver
|
||||
|
||||
|
|
|
@ -4,9 +4,9 @@ description: A document management system that transforms your physical document
|
|||
type: application
|
||||
icon: https://github.com/paperless-ngx/paperless-ngx/raw/main/resources/logo/web/svg/square.svg
|
||||
home: https://wrenix.eu/docs/helm-charts/paperless-ngx/
|
||||
version: "0.1.6"
|
||||
version: "0.1.8"
|
||||
# renovate: image=ghcr.io/paperless-ngx/paperless-ngx
|
||||
appVersion: "2.14.7"
|
||||
appVersion: "2.15.1"
|
||||
keywords:
|
||||
- paperless
|
||||
- paperless-ng
|
||||
|
|
|
@ -7,7 +7,7 @@ description: "A document management system that transforms your physical documen
|
|||
|
||||
# paperless-ngx
|
||||
|
||||
  
|
||||
  
|
||||
|
||||
A document management system that transforms your physical documents into a searchable online archive so you can keep, well, less paper.
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ name: "postgresql"
|
|||
description: "A Helm chart for running PostgreSQL (Postgres) database"
|
||||
icon: https://wiki.postgresql.org/images/a/a4/PostgreSQL_logo.3colors.svg
|
||||
type: "application"
|
||||
version: "0.2.6"
|
||||
version: "0.3.3"
|
||||
# renovate: image=docker.io/library/postgres
|
||||
appVersion: "17.4-alpine"
|
||||
maintainers:
|
||||
|
|
|
@ -7,7 +7,7 @@ description: "A Helm chart for running PostgreSQL (Postgres) database"
|
|||
|
||||
# postgresql
|
||||
|
||||
  
|
||||
  
|
||||
|
||||
A Helm chart for running PostgreSQL (Postgres) database
|
||||
|
||||
|
@ -41,6 +41,26 @@ helm uninstall postgresql-release
|
|||
|
||||
## Values
|
||||
|
||||
### Monitoring
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| grafana.dashboards.annotations | object | `{}` | label of configmap |
|
||||
| grafana.dashboards.enabled | bool | `false` | deploy grafana dashboard in configmap |
|
||||
| grafana.dashboards.labels | object | `{"grafana_dashboard":"1"}` | label of configmap |
|
||||
| prometheus.enabled | bool | `false` | add prometheus exporter sidecar |
|
||||
| prometheus.image.pullPolicy | string | `"IfNotPresent"` | This sets the pull policy for images. (could be overwritten by global.image.pullPolicy) |
|
||||
| prometheus.image.registry | string | `"docker.io"` | image registry (could be overwritten by global.image.registry) |
|
||||
| prometheus.image.repository | string | `"prometheuscommunity/postgres-exporter"` | image repository |
|
||||
| prometheus.image.tag | string | `"v0.17.1"` | image tag |
|
||||
| prometheus.rules.additionalRules | list | `[]` | add own rules to prometheusrules (current no default alertrules are provided) |
|
||||
| prometheus.rules.enabled | bool | `false` | deploy prometheusrules |
|
||||
| prometheus.rules.labels | object | `{}` | labels of prometheusrule |
|
||||
| prometheus.servicemonitor.enabled | bool | `false` | deploy servicemonitor |
|
||||
| prometheus.servicemonitor.labels | object | `{}` | label of servicemonitor |
|
||||
|
||||
### Other Values
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| affinity | object | `{}` | |
|
||||
|
|
1264
postgresql/grafana_dashboards/postgres-overview.json
Normal file
1264
postgresql/grafana_dashboards/postgres-overview.json
Normal file
File diff suppressed because it is too large
Load diff
14
postgresql/templates/configmap_grafana_dashboards.yaml
Normal file
14
postgresql/templates/configmap_grafana_dashboards.yaml
Normal file
|
@ -0,0 +1,14 @@
|
|||
{{- if .Values.grafana.dashboards.enabled }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ include "postgresql.fullname" . }}-grafana-dashboards
|
||||
labels:
|
||||
{{- include "postgresql.labels" . | nindent 4 }}
|
||||
{{- toYaml .Values.grafana.dashboards.labels | nindent 4 }}
|
||||
annotations:
|
||||
{{- toYaml .Values.grafana.dashboards.annotations | nindent 4 }}
|
||||
data:
|
||||
{{- (.Files.Glob "grafana_dashboards/*.json" ).AsConfig | nindent 2 }}
|
||||
{{- end }}
|
83
postgresql/templates/prometheus-rules.yaml
Normal file
83
postgresql/templates/prometheus-rules.yaml
Normal file
|
@ -0,0 +1,83 @@
|
|||
{{- if and .Values.prometheus.rules.enabled }}
|
||||
{{- $fullname := include "postgresql.fullname" . }}
|
||||
{{- $filter := printf `namespace="%s",job="%s"` .Release.Namespace $fullname }}
|
||||
---
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: PrometheusRule
|
||||
metadata:
|
||||
name: {{ $fullname }}
|
||||
labels:
|
||||
{{- include "postgresql.labels" . | nindent 4 }}
|
||||
{{- with .Values.prometheus.rules.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
groups:
|
||||
- name: {{ $fullname }}-Default
|
||||
rules:
|
||||
- alert: "PostgreSQLDown"
|
||||
expr: 'avg(pg_up{ {{ $filter }} }) by (job, service, namespace) != 1'
|
||||
for: 1m
|
||||
labels:
|
||||
severity: critical
|
||||
annotations:
|
||||
{{`
|
||||
summary: "PostgreSQL is not processing queries: {{ $labels.service }}.{{ $labels.namespace }}"
|
||||
description: "{{ $labels.service }}.{{ $labels.namespace }} is rejecting query requests from the exporter, and thus probably not allowing DNS requests to work either. User services should not be effected provided at least 1 node is still alive."
|
||||
`}}
|
||||
- alert: "PostgreSQLHighConnections"
|
||||
expr: 'sum(pg_stat_activity_count{ {{ $filter }} }) by (job, service, namespace) >= sum(pg_settings_max_connections{ {{ $filter }} }) by (job, service, namespace) - sum(pg_settings_superuser_reserved_connections{ {{ $filter }} }) by (job, service, namespace)'
|
||||
for: 1m
|
||||
labels:
|
||||
severity: critical
|
||||
annotations:
|
||||
{{`
|
||||
summary: "{{ $labels.service }}.{{ $labels.namespace }} has maxed out Postgres connections."
|
||||
description: "{{ $labels.service }}.{{ $labels.namespace }} is exceeding the currently configured maximum Postgres connection limit (current value: {{ $value }}s). Services may be degraded - please take immediate action (you probably need to increase max_connections in the Docker image and re-deploy."
|
||||
`}}
|
||||
- alert: "PostgreSQLHighConnections"
|
||||
expr: 'sum(pg_stat_activity_count{ {{ $filter }} }) by (job, service, namespace) >= (sum(pg_settings_max_connections{ {{ $filter }} }) by (job, service, namespace) - sum(pg_settings_superuser_reserved_connections{ {{ $filter }} }) by (job, service, namespace) ) * 0.8'
|
||||
for: 10m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
{{`
|
||||
summary: "{{ $labels.service }}.{{ $labels.namespace }} is over 80% of max Postgres connections."
|
||||
description: "{{ $labels.service }}.{{ $labels.namespace }} is exceeding 80% of the currently configured maximum Postgres connection limit (current value: {{ $value }}s). Please check utilization graphs and confirm if this is normal service growth, abuse or an otherwise temporary condition or if new resources need to be provisioned (or the limits increased, which is mostly likely)."
|
||||
`}}
|
||||
- alert: "PostgreSQLSlowQueries"
|
||||
expr: 'avg(rate(pg_stat_activity_max_tx_duration{ {{ $filter }},datname!~"template.*" }[2m])) by (job, service, namespace, datname) > 2 * 60'
|
||||
for: 2m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
{{`
|
||||
summary: "PostgreSQL high number of slow on {{ $labels.service }}.{{ $labels.namespace }} for database {{ $labels.datname }}"
|
||||
description: "PostgreSQL high number of slow queries {{ $labels.service }}.{{ $labels.namespace }} for database {{ $labels.datname }} with a value of {{ $value }}"
|
||||
`}}
|
||||
- alert: "PostgreSQLQPS"
|
||||
expr: 'avg(irate(pg_stat_database_xact_commit{ {{ $filter }},datname!~"template.*"}[5m])+irate(pg_stat_database_xact_rollback{ {{ $filter }},datname!~"template.*"}[5m])) by (job, service, namespace, datname) > 10000'
|
||||
for: 5m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
{{`
|
||||
description: "PostgreSQL high number of queries per second on {{ $labels.service }}.{{ $labels.namespace }} for database {{ $labels.datname }} with a value of {{ $value }}"
|
||||
summary: "PostgreSQL high number of queries per second {{ $labels.service }}.{{ $labels.namespace }} for database {{ $labels.datname }}"
|
||||
`}}
|
||||
- alert: "PostgreSQLCacheHitRatio"
|
||||
expr: 'avg(rate(pg_stat_database_blks_hit{ {{ $filter }},datname!~"template.*" }[5m])/(rate(pg_stat_database_blks_hit{ {{ $filter }},datname!~"template.*" }[5m])+rate(pg_stat_database_blks_read{ {{ $filter }},datname!~"template.*" }[5m]))) by (job,service, namespace, datname) < 0.98'
|
||||
for: 5m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
{{`
|
||||
summary: "PostgreSQL low cache hit rate on {{ $labels.service }}.{{ $labels.namespace }} for database {{ $labels.datname }}"
|
||||
description: "PostgreSQL low on cache hit rate on {{ $labels.service }}.{{ $labels.namespace }} for database {{ $labels.datname }} with a value of {{ $value }}"
|
||||
`}}
|
||||
{{- with .Values.prometheus.rules.additionalRules }}
|
||||
- name: {{ $fullname }}-Additional
|
||||
rules:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
10
postgresql/templates/secret.yaml
Normal file
10
postgresql/templates/secret.yaml
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
apiVersion: "v1"
|
||||
kind: "Secret"
|
||||
metadata:
|
||||
name: {{ include "postgresql.fullname" . }}
|
||||
labels:
|
||||
{{- include "postgresql.labels" . | nindent 4 }}
|
||||
data:
|
||||
user: {{ .Values.postgres.user | b64enc }}
|
||||
password: {{ .Values.postgres.password | b64enc }}
|
|
@ -11,5 +11,11 @@ spec:
|
|||
targetPort: postgresql
|
||||
protocol: TCP
|
||||
name: postgresql
|
||||
{{- if .Values.prometheus.enabled }}
|
||||
- port: 9187
|
||||
targetPort: metrics
|
||||
protocol: TCP
|
||||
name: metrics
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "postgresql.selectorLabels" . | nindent 4 }}
|
||||
|
|
27
postgresql/templates/servicemonitor.yaml
Normal file
27
postgresql/templates/servicemonitor.yaml
Normal file
|
@ -0,0 +1,27 @@
|
|||
{{- if and .Values.prometheus.servicemonitor.enabled }}
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: ServiceMonitor
|
||||
metadata:
|
||||
name: {{ include "postgresql.fullname" . }}
|
||||
labels:
|
||||
{{- include "postgresql.labels" . | nindent 4 }}
|
||||
{{- with .Values.prometheus.servicemonitor.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "postgresql.selectorLabels" . | nindent 6 }}
|
||||
endpoints:
|
||||
- port: metrics
|
||||
path: "/metrics"
|
||||
{{- with .Values.prometheus.servicemonitor }}
|
||||
{{- with .interval }}
|
||||
interval: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .scrapeTimeout }}
|
||||
scrapeTimeout: {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
|
@ -56,10 +56,16 @@ spec:
|
|||
imagePullPolicy: {{ coalesce $.Values.global.image.pullPolicy .pullPolicy }}
|
||||
{{- end }}
|
||||
env:
|
||||
- name: "POSTGRES_PASSWORD"
|
||||
value: {{ .Values.postgres.password | quote }}
|
||||
- name: "POSTGRES_USER"
|
||||
value: {{ .Values.postgres.user | quote }}
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "postgresql.fullname" . }}
|
||||
key: user
|
||||
- name: "POSTGRES_PASSWORD"
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "postgresql.fullname" . }}
|
||||
key: password
|
||||
- name: "PGPORT"
|
||||
value: {{ .Values.service.port | quote }}
|
||||
- name: "PGDATA"
|
||||
|
@ -85,6 +91,34 @@ spec:
|
|||
volumeMounts:
|
||||
- name: "data"
|
||||
mountPath: "/var/lib/postgresql/data"
|
||||
{{- if .Values.prometheus.enabled }}
|
||||
- name: "exporter"
|
||||
{{- with .Values.prometheus.image }}
|
||||
image: "{{ coalesce $.Values.global.image.registry .registry }}/{{ .repository }}:{{ .tag }}"
|
||||
imagePullPolicy: {{ coalesce $.Values.global.image.pullPolicy .pullPolicy }}
|
||||
{{- end }}
|
||||
args:
|
||||
- --collector.stat_activity_autovacuum
|
||||
- --collector.stat_statements
|
||||
- --collector.stat_wal_receiver
|
||||
env:
|
||||
- name: "DATA_SOURCE_USER"
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "postgresql.fullname" . }}
|
||||
key: user
|
||||
- name: "DATA_SOURCE_PASS"
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "postgresql.fullname" . }}
|
||||
key: password
|
||||
- name: "DATA_SOURCE_URI"
|
||||
value: {{ printf "127.0.0.1:%.0f/postgres?sslmode=disable" .Values.service.port }}
|
||||
ports:
|
||||
- name: metrics
|
||||
containerPort: 9187
|
||||
protocol: TCP
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
|
|
|
@ -137,3 +137,51 @@ autoupgrade:
|
|||
# readOnlyRootFilesystem: true
|
||||
# runAsNonRoot: true
|
||||
# runAsUser: 1000
|
||||
|
||||
prometheus:
|
||||
# -- add prometheus exporter sidecar
|
||||
# @section -- Monitoring
|
||||
enabled: false
|
||||
servicemonitor:
|
||||
# -- deploy servicemonitor
|
||||
# @section -- Monitoring
|
||||
enabled: false
|
||||
# -- label of servicemonitor
|
||||
# @section -- Monitoring
|
||||
labels: {}
|
||||
rules:
|
||||
# -- deploy prometheusrules
|
||||
# @section -- Monitoring
|
||||
enabled: false
|
||||
# -- labels of prometheusrule
|
||||
# @section -- Monitoring
|
||||
labels: {}
|
||||
# -- add own rules to prometheusrules (current no default alertrules are provided)
|
||||
# @section -- Monitoring
|
||||
additionalRules: []
|
||||
image:
|
||||
# -- image registry (could be overwritten by global.image.registry)
|
||||
# @section -- Monitoring
|
||||
registry: docker.io
|
||||
# -- image repository
|
||||
# @section -- Monitoring
|
||||
repository: prometheuscommunity/postgres-exporter
|
||||
# -- This sets the pull policy for images. (could be overwritten by global.image.pullPolicy)
|
||||
# @section -- Monitoring
|
||||
pullPolicy: IfNotPresent
|
||||
# -- image tag
|
||||
# @section -- Monitoring
|
||||
tag: v0.17.1
|
||||
|
||||
grafana:
|
||||
dashboards:
|
||||
# -- deploy grafana dashboard in configmap
|
||||
# @section -- Monitoring
|
||||
enabled: false
|
||||
# -- label of configmap
|
||||
# @section -- Monitoring
|
||||
labels:
|
||||
grafana_dashboard: "1"
|
||||
# -- label of configmap
|
||||
# @section -- Monitoring
|
||||
annotations: {}
|
||||
|
|
Loading…
Add table
Reference in a new issue