initialize repository with glance, litellm, openwebui, nas and pihole services
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
**/*secret*
|
||||
0
glance/assets/user.css
Normal file
0
glance/assets/user.css
Normal file
67
glance/config-map.yaml
Normal file
67
glance/config-map.yaml
Normal file
@@ -0,0 +1,67 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: glance-config
|
||||
data:
|
||||
glance.yml: |
|
||||
pages:
|
||||
# It's not necessary to create a new file for each page and include it, you can simply
|
||||
# put its contents here, though multiple pages are easier to manage when separated
|
||||
!include: home.yml
|
||||
home.yml: |
|
||||
- name: Home
|
||||
# Optionally, if you only have a single page you can hide the desktop navigation for a cleaner look
|
||||
# hide-desktop-navigation: true
|
||||
columns:
|
||||
- size: small
|
||||
widgets:
|
||||
- type: calendar
|
||||
first-day-of-week: monday
|
||||
- size: full
|
||||
widgets:
|
||||
- type: group
|
||||
widgets:
|
||||
- type: rss
|
||||
limit: 10
|
||||
collapse-after: 3
|
||||
cache: 12h
|
||||
feeds:
|
||||
- url: https://www.ruxu.dev/feed.xml
|
||||
title: Ruxu.dev
|
||||
- url: https://simonwillison.net/atom/everything/
|
||||
title: Simon Willison
|
||||
- url: https://www.gilesthomas.com/feed/rss.xml
|
||||
title: Giles Thomas
|
||||
- url: https://huggingface.co/blog/feed.xml
|
||||
title: HuggingFace Blog
|
||||
- url: https://www.philschmid.de/rss
|
||||
title: Phil Schmid
|
||||
- url: https://www.wheresyoured.at/rss/
|
||||
title: Ed Zitron
|
||||
- url: https://www.seangoedecke.com/rss.xml
|
||||
- type: hacker-news
|
||||
- type: lobsters
|
||||
- type: videos
|
||||
channels:
|
||||
- UCR-DXc1voovS8nhAvccRZhg # Jeff Geerling
|
||||
- UCsBjURrPoezykLs9EqgamOA # Fireship
|
||||
- UCHnyfMqiRRG1u-2MsSQLbXA # Veritasium
|
||||
- UCC-lyoTfSrcJzA1ab3APAgw # LangChain
|
||||
- UCkCGANrihzExmu9QiqZpPlQ # How Money Works
|
||||
- UC55ODQSvARtgSyc8ThfiepQ # Sam Witteveen
|
||||
- UCASM0cgfkJxQ1ICmRilfHLw # Patrick Boyle
|
||||
- UCFCEuCsyWP0YkP3CZ3Mr01Q # The Plain Bagel
|
||||
- UCDXTQ8nWmx_EhZ2v-kp7QxA # Ben Felix
|
||||
- UCCKpicnIwBP3VPxBAZWDeNA # Money & Macro
|
||||
- UCFQMnBA3CS502aghlcr0_aw # Coffeezilla
|
||||
- UCsXVk37bltHxD1rDPwtNM8Q # Kurzgesagt
|
||||
- UCHlNU7kIZhRgSbhHvFoy72w # HuggingFace
|
||||
- UCeRjipR4_SsCddq9VZ2AeKg # LlamaIndex
|
||||
- size: small
|
||||
widgets:
|
||||
- type: weather
|
||||
location: Barcelona, Spain
|
||||
units: metric # alternatively "imperial"
|
||||
hour-format: 24h # alternatively "24h"
|
||||
# Optionally hide the location from being displayed in the widget
|
||||
# hide-location: true
|
||||
12
glance/config/glance.yml
Normal file
12
glance/config/glance.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
server:
|
||||
assets-path: /app/assets
|
||||
|
||||
theme:
|
||||
# Note: assets are cached by the browser, changes to the CSS file
|
||||
# will not be reflected until the browser cache is cleared (Ctrl+F5)
|
||||
custom-css-file: /assets/user.css
|
||||
|
||||
pages:
|
||||
# It's not necessary to create a new file for each page and include it, you can simply
|
||||
# put its contents here, though multiple pages are easier to manage when separated
|
||||
!include: home.yml
|
||||
75
glance/config/home.yml
Normal file
75
glance/config/home.yml
Normal file
@@ -0,0 +1,75 @@
|
||||
- name: Home
|
||||
# Optionally, if you only have a single page you can hide the desktop navigation for a cleaner look
|
||||
# hide-desktop-navigation: true
|
||||
columns:
|
||||
- size: small
|
||||
widgets:
|
||||
- type: calendar
|
||||
first-day-of-week: monday
|
||||
|
||||
- size: full
|
||||
widgets:
|
||||
- type: group
|
||||
widgets:
|
||||
- type: rss
|
||||
limit: 10
|
||||
collapse-after: 3
|
||||
cache: 12h
|
||||
feeds:
|
||||
- url: https://www.ruxu.dev/feed.xml
|
||||
title: Ruxu.dev
|
||||
- url: https://simonwillison.net/atom/everything/
|
||||
title: Simon Willison
|
||||
- url: https://www.gilesthomas.com/feed/rss.xml
|
||||
title: Giles Thomas
|
||||
- url: https://huggingface.co/blog/feed.xml
|
||||
title: HuggingFace Blog
|
||||
- url: https://www.philschmid.de/rss
|
||||
title: Phil Schmid
|
||||
- url: https://www.wheresyoured.at/rss/
|
||||
title: Ed Zitron
|
||||
- url: https://www.seangoedecke.com/rss.xml
|
||||
- type: hacker-news
|
||||
- type: lobsters
|
||||
|
||||
- type: videos
|
||||
channels:
|
||||
- UCR-DXc1voovS8nhAvccRZhg # Jeff Geerling
|
||||
- UCsBjURrPoezykLs9EqgamOA # Fireship
|
||||
- UCHnyfMqiRRG1u-2MsSQLbXA # Veritasium
|
||||
- UCC-lyoTfSrcJzA1ab3APAgw # LangChain
|
||||
- UCkCGANrihzExmu9QiqZpPlQ # How Money Works
|
||||
- UC55ODQSvARtgSyc8ThfiepQ # Sam Witteveen
|
||||
- UCASM0cgfkJxQ1ICmRilfHLw # Patrick Boyle
|
||||
- UCFCEuCsyWP0YkP3CZ3Mr01Q # The Plain Bagel
|
||||
- UCDXTQ8nWmx_EhZ2v-kp7QxA # Ben Felix
|
||||
- UCCKpicnIwBP3VPxBAZWDeNA # Money & Macro
|
||||
- UCFQMnBA3CS502aghlcr0_aw # Coffeezilla
|
||||
- UCsXVk37bltHxD1rDPwtNM8Q # Kurzgesagt
|
||||
- UCHlNU7kIZhRgSbhHvFoy72w # HuggingFace
|
||||
- UCeRjipR4_SsCddq9VZ2AeKg # LlamaIndex
|
||||
|
||||
- size: small
|
||||
widgets:
|
||||
- type: weather
|
||||
location: Barcelona, Spain
|
||||
units: metric # alternatively "imperial"
|
||||
hour-format: 24h # alternatively "24h"
|
||||
# Optionally hide the location from being displayed in the widget
|
||||
# hide-location: true
|
||||
|
||||
- type: markets
|
||||
markets:
|
||||
- symbol: IE00B03HD191.IR
|
||||
name: Vanguard Global Stock Index
|
||||
- symbol: 0P00012I66.F
|
||||
name: Vanguard Global Small-Cap Index
|
||||
- symbol: 0P0001RCAQ.F
|
||||
name: Renta 4 Renta Fija
|
||||
- symbol: IWVL.L
|
||||
name: iShares Edge MSCI World Value Factor
|
||||
- symbol: XDEQ.DE
|
||||
name: Xtracker MSCI World Quality ETF
|
||||
- symbol: 0P000060MS.F
|
||||
name: Vanguard Emerging Markets Stock Index
|
||||
|
||||
40
glance/glance.yaml
Normal file
40
glance/glance.yaml
Normal file
@@ -0,0 +1,40 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: glance
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: glance
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: glance
|
||||
spec:
|
||||
containers:
|
||||
- name: glance
|
||||
image: glanceapp/glance
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
volumeMounts:
|
||||
- name: config-volume
|
||||
mountPath: /app/config
|
||||
volumes:
|
||||
- name: config-volume
|
||||
configMap:
|
||||
name: glance-config
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: glance-service
|
||||
namespace: default
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: glance
|
||||
ports:
|
||||
- name: http
|
||||
port: 80
|
||||
targetPort: 8080
|
||||
72
ingress.yaml
Normal file
72
ingress.yaml
Normal file
@@ -0,0 +1,72 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: rogicasa-ingress
|
||||
namespace: default # Change to your preferred namespace
|
||||
annotations:
|
||||
# Use Traefik as the ingress controller (default in k3s)
|
||||
kubernetes.io/ingress.class: "traefik"
|
||||
# Enable SSL redirect
|
||||
traefik.ingress.kubernetes.io/redirect-entry-point: https
|
||||
# Optional: enable compression
|
||||
traefik.ingress.kubernetes.io/compress: "true"
|
||||
cert-manager.io/issuer: prod-issuer
|
||||
cert-manager.io/issuer-kind: OriginIssuer
|
||||
cert-manager.io/issuer-group: cert-manager.k8s.cloudflare.com
|
||||
spec:
|
||||
tls:
|
||||
- hosts:
|
||||
- "*.rogi.casa"
|
||||
secretName: rogicasa-tls
|
||||
rules:
|
||||
- host: glance.rogi.casa
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: glance-service
|
||||
port:
|
||||
number: 80
|
||||
- host: pihole.rogi.casa
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: pihole-web
|
||||
port:
|
||||
number: 80
|
||||
- host: litellm.rogi.casa
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: litellm-service
|
||||
port:
|
||||
number: 80
|
||||
- host: openai.rogi.casa
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: open-webui-service
|
||||
port:
|
||||
number: 80
|
||||
- host: nas.rogi.casa
|
||||
http:
|
||||
paths:
|
||||
- pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: external-ip
|
||||
port:
|
||||
number: 80
|
||||
path: /
|
||||
|
||||
65
litellm/litellm.yaml
Normal file
65
litellm/litellm.yaml
Normal file
@@ -0,0 +1,65 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: litellm-config-file
|
||||
data:
|
||||
config.yaml: |
|
||||
model_list:
|
||||
- model_name: gpt-4.1-mini
|
||||
litellm_params:
|
||||
model: openai/gpt-4.1-mini
|
||||
api_key: "os.environ/OPENAI_API_KEY"
|
||||
- model_name: qwen3:32b
|
||||
litellm_params:
|
||||
model: ollama/qwen3:32b
|
||||
api_base: "http://10.88.88.236:11434"
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: litellm-deployment
|
||||
labels:
|
||||
app: litellm
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: litellm
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: litellm
|
||||
spec:
|
||||
containers:
|
||||
- name: litellm
|
||||
image: ghcr.io/berriai/litellm:main-stable # it is recommended to fix a version generally
|
||||
args:
|
||||
- "--config"
|
||||
- "/app/proxy_server_config.yaml"
|
||||
ports:
|
||||
- containerPort: 4000
|
||||
volumeMounts:
|
||||
- name: config-volume
|
||||
mountPath: /app/proxy_server_config.yaml
|
||||
subPath: config.yaml
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: litellm-secrets
|
||||
volumes:
|
||||
- name: config-volume
|
||||
configMap:
|
||||
name: litellm-config-file
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: litellm-service
|
||||
namespace: default
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: litellm
|
||||
ports:
|
||||
- name: http
|
||||
port: 80
|
||||
targetPort: 4000
|
||||
|
||||
73
litellm/postgres.yaml
Normal file
73
litellm/postgres.yaml
Normal file
@@ -0,0 +1,73 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: postgres-volume
|
||||
labels:
|
||||
type: local
|
||||
app: postgres
|
||||
spec:
|
||||
storageClassName: manual
|
||||
capacity:
|
||||
storage: 10Gi
|
||||
accessModes:
|
||||
- ReadWriteMany
|
||||
hostPath:
|
||||
path: /data/postgresql
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: postgres-volume-claim
|
||||
labels:
|
||||
app: postgres
|
||||
spec:
|
||||
storageClassName: manual
|
||||
accessModes:
|
||||
- ReadWriteMany
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: postgres
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: postgres
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: postgres
|
||||
spec:
|
||||
containers:
|
||||
- name: postgres
|
||||
image: 'postgres:16'
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 5432
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: postgres-secret
|
||||
volumeMounts:
|
||||
- mountPath: /var/lib/postgresql/data
|
||||
name: postgresdata
|
||||
volumes:
|
||||
- name: postgresdata
|
||||
persistentVolumeClaim:
|
||||
claimName: postgres-volume-claim
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: postgres
|
||||
labels:
|
||||
app: postgres
|
||||
spec:
|
||||
type: NodePort
|
||||
ports:
|
||||
- port: 5432
|
||||
selector:
|
||||
app: postgres
|
||||
45
nas.yaml
Normal file
45
nas.yaml
Normal file
@@ -0,0 +1,45 @@
|
||||
#apiVersion: networking.k8s.io/v1
|
||||
#kind: Ingress
|
||||
#metadata:
|
||||
# name: nas-redirect
|
||||
# annotations:
|
||||
# nginx.ingress.kubernetes.io/permanent-redirect: "http://10.88.88.238:5000"
|
||||
#spec:
|
||||
# rules:
|
||||
# - host: nas.rogi.casa
|
||||
# http:
|
||||
# paths:
|
||||
# - path: /
|
||||
# pathType: Prefix
|
||||
# backend:
|
||||
# service:
|
||||
# name: dummy-service
|
||||
# port:
|
||||
# number: 80
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: external-ip
|
||||
spec:
|
||||
ports:
|
||||
- name: app
|
||||
port: 80
|
||||
protocol: TCP
|
||||
targetPort: 5000
|
||||
clusterIP: None
|
||||
type: ClusterIP
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Endpoints
|
||||
metadata:
|
||||
name: external-ip
|
||||
subsets:
|
||||
- addresses:
|
||||
- ip: 10.88.88.238
|
||||
ports:
|
||||
- name: app
|
||||
port: 5000
|
||||
protocol: TCP
|
||||
|
||||
|
||||
|
||||
90
openwebui/openwebui.yaml
Normal file
90
openwebui/openwebui.yaml
Normal file
@@ -0,0 +1,90 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: openwebui-pvc
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app: open-webui
|
||||
name: open-webui
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: open-webui
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: open-webui
|
||||
spec:
|
||||
volumes:
|
||||
- name: webui-data
|
||||
persistentVolumeClaim:
|
||||
claimName: openwebui-pvc
|
||||
containers:
|
||||
- image: ghcr.io/open-webui/open-webui
|
||||
name: open-webui
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
volumeMounts:
|
||||
- name: webui-data
|
||||
mountPath: /app/backend/data
|
||||
resources:
|
||||
requests:
|
||||
cpu: 1000m
|
||||
memory: 128Mi
|
||||
limits:
|
||||
cpu: 2000m
|
||||
memory: 1Gi
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: 8080
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 5
|
||||
timeoutSeconds: 2
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
failureThreshold: 5
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: 8080
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 5
|
||||
timeoutSeconds: 2
|
||||
periodSeconds: 5
|
||||
successThreshold: 1
|
||||
failureThreshold: 3
|
||||
startupProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: 8080
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 5
|
||||
timeoutSeconds: 2
|
||||
periodSeconds: 5
|
||||
successThreshold: 1
|
||||
failureThreshold: 30
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
app: open-webui
|
||||
name: open-webui-service
|
||||
spec:
|
||||
ports:
|
||||
- name: http
|
||||
port: 80
|
||||
targetPort: 8080
|
||||
selector:
|
||||
app: open-webui
|
||||
130
pihole/pihole.yaml
Normal file
130
pihole/pihole.yaml
Normal file
@@ -0,0 +1,130 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: pihole-pvc
|
||||
namespace: default
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: pihole
|
||||
namespace: default
|
||||
labels:
|
||||
app: pihole
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: pihole
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: pihole
|
||||
spec:
|
||||
containers:
|
||||
- name: pihole
|
||||
image: pihole/pihole:latest
|
||||
ports:
|
||||
- containerPort: 80
|
||||
name: http
|
||||
- containerPort: 53
|
||||
name: dns-tcp
|
||||
protocol: TCP
|
||||
- containerPort: 53
|
||||
name: dns-udp
|
||||
protocol: UDP
|
||||
env:
|
||||
- name: TZ
|
||||
value: "Europe/Madrid"
|
||||
#- name: WEBPASSWORD
|
||||
#value: ""
|
||||
#- name: FTLCONF_webserver_api_password
|
||||
#value: ''
|
||||
- name: FTLCONF_REPLY_ADDR4
|
||||
value: pihole
|
||||
- name: FTLCONF_dns_upstreams
|
||||
value: "8.8.8.8;8.8.4.4"
|
||||
#- name: PIHOLE_DNS_
|
||||
#value: 127.0.0.1#5054
|
||||
#- name: PIHOLE_DNS_
|
||||
#value: "8.8.8.8;8.8.4.4"
|
||||
#- name: DNSMASQ_LISTENING
|
||||
#value: "all"
|
||||
- name: FTLCONF_dns_listeningMode
|
||||
value: "all"
|
||||
- name: WEB_PORT
|
||||
value: "80"
|
||||
#- name: VIRTUAL_HOST
|
||||
#value: "pihole"
|
||||
#- name: FTLCONF_LOCAL_IPV4
|
||||
#value: "0.0.0.0"
|
||||
- name: SKIPGRAVITYONBOOT
|
||||
value: "1"
|
||||
volumeMounts:
|
||||
- name: pihole-data
|
||||
mountPath: /etc/pihole
|
||||
#- name: pihole-dnsmasq
|
||||
#mountPath: /etc/dnsmasq.d
|
||||
resources:
|
||||
requests:
|
||||
memory: "256Mi"
|
||||
cpu: "100m"
|
||||
limits:
|
||||
memory: "512Mi"
|
||||
cpu: "500m"
|
||||
securityContext:
|
||||
capabilities:
|
||||
add:
|
||||
- NET_ADMIN
|
||||
- SYS_TIME
|
||||
- SYS_NICE
|
||||
volumes:
|
||||
- name: pihole-data
|
||||
persistentVolumeClaim:
|
||||
claimName: pihole-pvc
|
||||
#- name: pihole-dnsmasq
|
||||
#emptyDir: {}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: pihole-web
|
||||
namespace: default
|
||||
labels:
|
||||
app: pihole
|
||||
spec:
|
||||
type: ClusterIP
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 80
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
app: pihole
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: pihole-dns
|
||||
namespace: default
|
||||
labels:
|
||||
app: pihole
|
||||
spec:
|
||||
type: LoadBalancer # Change to NodePort or ClusterIP as needed
|
||||
ports:
|
||||
- port: 53
|
||||
targetPort: 53
|
||||
protocol: TCP
|
||||
name: dns-tcp
|
||||
- port: 53
|
||||
targetPort: 53
|
||||
protocol: UDP
|
||||
name: dns-udp
|
||||
selector:
|
||||
app: pihole
|
||||
Reference in New Issue
Block a user