Compare commits

..

1 Commits

Author SHA1 Message Date
Gitea Actions Bot 9a1f3d6209 Auto-update README with current k8s applications
Terraform / Terraform (pull_request) Successful in 20s
Generated by CI/CD workflow on 2026-02-05 17:43:27

This PR updates the README.md file with the current list of applications found in the k8s/ directory structure.
2026-02-05 17:43:27 +00:00
12 changed files with 35 additions and 421 deletions
+4 -40
View File
@@ -19,35 +19,6 @@ spec:
component: main component: main
spec: spec:
serviceAccountName: n8n serviceAccountName: n8n
initContainers:
- name: install-tools
image: alpine:3.22
command:
- /bin/sh
- -c
- |
set -e
if [ -x /tools/kubectl ]; then
echo "kubectl already exists, skipping download"
/tools/kubectl version --client
exit 0
fi
echo "Downloading kubectl..."
ARCH=$(uname -m)
case $ARCH in
x86_64) ARCH="amd64" ;;
aarch64) ARCH="arm64" ;;
esac
wget -O /tools/kubectl "https://dl.k8s.io/release/$(wget -qO- https://dl.k8s.io/release/stable.txt)/bin/linux/${ARCH}/kubectl"
chmod +x /tools/kubectl
/tools/kubectl version --client
volumeMounts:
- name: tools
mountPath: /tools
securityContext:
runAsUser: 1000
runAsGroup: 1000
runAsNonRoot: true
containers: containers:
- name: n8n - name: n8n
image: docker.n8n.io/n8nio/n8n:latest image: docker.n8n.io/n8nio/n8n:latest
@@ -55,8 +26,6 @@ spec:
- containerPort: 5678 - containerPort: 5678
name: http name: http
env: env:
- name: PATH
value: "/opt/tools:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- name: HOME - name: HOME
value: "/home/node" value: "/home/node"
- name: N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS - name: N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS
@@ -114,15 +83,13 @@ spec:
volumeMounts: volumeMounts:
- name: n8n-data - name: n8n-data
mountPath: /home/node/.n8n mountPath: /home/node/.n8n
- name: tools
mountPath: /opt/tools
resources: resources:
requests: requests:
cpu: 2000m cpu: 100m
memory: 512Mi memory: 128Mi
limits: limits:
cpu: 4000m cpu: 512m
memory: 2048Gi memory: 512Mi
livenessProbe: livenessProbe:
httpGet: httpGet:
path: /healthz path: /healthz
@@ -143,9 +110,6 @@ spec:
- name: n8n-data - name: n8n-data
persistentVolumeClaim: persistentVolumeClaim:
claimName: n8n-data claimName: n8n-data
- name: tools
persistentVolumeClaim:
claimName: n8n-tools
securityContext: securityContext:
runAsUser: 1000 runAsUser: 1000
runAsGroup: 1000 runAsGroup: 1000
+5 -14
View File
@@ -7,7 +7,7 @@ metadata:
app: n8n app: n8n
component: worker component: worker
spec: spec:
replicas: 2 replicas: 1
selector: selector:
matchLabels: matchLabels:
app: n8n app: n8n
@@ -24,12 +24,8 @@ spec:
image: docker.n8n.io/n8nio/n8n:latest image: docker.n8n.io/n8nio/n8n:latest
command: ["n8n", "worker"] command: ["n8n", "worker"]
env: env:
- name: PATH
value: "/opt/tools:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- name: HOME - name: HOME
value: "/home/node" value: "/home/node"
- name: NODES_EXCLUDE
value: "[]"
- name: N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS - name: N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS
value: "true" value: "true"
- name: N8N_RUNNERS_ENABLED - name: N8N_RUNNERS_ENABLED
@@ -79,15 +75,13 @@ spec:
volumeMounts: volumeMounts:
- name: n8n-data - name: n8n-data
mountPath: /home/node/.n8n mountPath: /home/node/.n8n
- name: tools
mountPath: /opt/tools
resources: resources:
requests: requests:
cpu: 2000m cpu: 100m
memory: 512Mi memory: 256Mi
limits: limits:
cpu: 4000m cpu: 1000m
memory: 2048Gi memory: 1Gi
livenessProbe: livenessProbe:
exec: exec:
command: command:
@@ -102,9 +96,6 @@ spec:
- name: n8n-data - name: n8n-data
persistentVolumeClaim: persistentVolumeClaim:
claimName: n8n-data claimName: n8n-data
- name: tools
persistentVolumeClaim:
claimName: n8n-tools
securityContext: securityContext:
runAsUser: 1000 runAsUser: 1000
runAsGroup: 1000 runAsGroup: 1000
+1 -10
View File
@@ -2,7 +2,6 @@ apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization kind: Kustomization
resources: resources:
- external-secrets.yaml
- storage.yaml - storage.yaml
- rbac.yaml - rbac.yaml
- redis-deployment.yaml - redis-deployment.yaml
@@ -12,14 +11,6 @@ resources:
- service.yaml - service.yaml
- ingress.yaml - ingress.yaml
helmCharts:
- name: yacy
repo: https://gt.hexor.cy/api/packages/ab/helm
version: 0.1.2
releaseName: yacy
namespace: n8n
valuesFile: values-yacy.yaml
includeCRDs: true
commonLabels: commonLabels:
app.kubernetes.io/name: n8n app.kubernetes.io/name: n8n
app.kubernetes.io/instance: n8n-plain
+13 -21
View File
@@ -9,27 +9,19 @@ kind: ClusterRole
metadata: metadata:
name: n8n-clusterrole name: n8n-clusterrole
rules: rules:
# Core API group ("") - apiGroups:
- apiGroups: [""] - ""
resources: ["*"] resources:
verbs: ["get", "list", "watch"] - pods
- jobs
# Common built-in API groups - cronjobs
- apiGroups: ["apps", "batch", "autoscaling", "extensions", "policy"] - deployments
resources: ["*"] - statefulsets
verbs: ["get", "list", "watch"] verbs:
- get
- apiGroups: ["networking.k8s.io", "rbac.authorization.k8s.io", "apiextensions.k8s.io"] - list
resources: ["*"] - watch
verbs: ["get", "list", "watch"] - create
- apiGroups: ["coordination.k8s.io", "discovery.k8s.io", "events.k8s.io"]
resources: ["*"]
verbs: ["get", "list", "watch"]
- apiGroups: ["storage.k8s.io", "admissionregistration.k8s.io", "authentication.k8s.io", "authorization.k8s.io"]
resources: ["*"]
verbs: ["get", "list", "watch"]
--- ---
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding kind: ClusterRoleBinding
+1 -13
View File
@@ -6,19 +6,7 @@ metadata:
spec: spec:
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
storageClassName: longhorn storageClassName: nfs-csi
resources: resources:
requests: requests:
storage: 10Gi storage: 10Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: n8n-tools
spec:
accessModes:
- ReadWriteMany
storageClassName: longhorn
resources:
requests:
storage: 20Gi
-2
View File
@@ -1,4 +1,2 @@
longhornUI: longhornUI:
replicas: 1 replicas: 1
persistence:
reclaimPolicy: "Retain"
@@ -1,46 +0,0 @@
apiVersion: monitoring.coreos.com/v1alpha1
kind: AlertmanagerConfig
metadata:
name: telegram-notifications
namespace: prometheus
labels:
app: kube-prometheus-stack-alertmanager
release: prometheus
spec:
route:
groupBy: ['alertname', 'cluster', 'service']
groupWait: 10s
groupInterval: 5m
repeatInterval: 12h
receiver: telegram
routes:
- matchers:
- name: alertname
value: Watchdog
matchType: "="
receiver: 'null'
receivers:
- name: telegram
telegramConfigs:
- botToken:
name: alertmanager-telegram-secret
key: TELEGRAM_BOT_TOKEN
chatID: 124317807
parseMode: HTML
sendResolved: true
disableNotifications: false
message: |
{{ if eq .Status "firing" }}🔥 FIRING{{ else }}✅ RESOLVED{{ end }}
{{ range .Alerts }}
📊 <b>{{ .Labels.alertname }}</b>
{{ .Annotations.summary }}
{{ if .Annotations.node }}🖥 <b>Node:</b> <code>{{ .Annotations.node }}</code>{{ end }}
{{ if .Annotations.pod }}📦 <b>Pod:</b> <code>{{ .Annotations.pod }}</code>{{ end }}
{{ if .Annotations.namespace }}📁 <b>Namespace:</b> <code>{{ .Annotations.namespace }}</code>{{ end }}
{{ if .Annotations.throttle_rate }}⚠️ <b>Throttling rate:</b> {{ .Annotations.throttle_rate }}{{ end }}
🔗 <a href="{{ .GeneratorURL }}">View in Grafana</a>
{{ end }}
- name: 'null'
@@ -45,7 +45,7 @@ data:
type: __expr__ type: __expr__
uid: __expr__ uid: __expr__
expression: A expression: A
reducer: min reducer: last
refId: B refId: B
type: reduce type: reduce
noDataState: NoData noDataState: NoData
@@ -63,7 +63,7 @@ data:
- orgId: 1 - orgId: 1
name: kubernetes_alerts name: kubernetes_alerts
folder: Kubernetes folder: Kubernetes
interval: 2m interval: 30s
rules: rules:
- uid: node_not_ready - uid: node_not_ready
title: Kubernetes Node Not Ready title: Kubernetes Node Not Ready
@@ -71,17 +71,17 @@ data:
data: data:
- refId: A - refId: A
relativeTimeRange: relativeTimeRange:
from: 600 from: 300
to: 0 to: 0
datasourceUid: P76F38748CEC837F0 datasourceUid: P76F38748CEC837F0
model: model:
expr: 'kube_node_status_condition{condition="Ready",status="false"}' expr: 'kube_node_status_condition{condition="Ready",status="true"} == 0'
refId: A refId: A
intervalMs: 1000 intervalMs: 1000
maxDataPoints: 43200 maxDataPoints: 43200
- refId: B - refId: B
relativeTimeRange: relativeTimeRange:
from: 600 from: 300
to: 0 to: 0
datasourceUid: __expr__ datasourceUid: __expr__
model: model:
@@ -98,12 +98,12 @@ data:
type: __expr__ type: __expr__
uid: __expr__ uid: __expr__
expression: A expression: A
reducer: min reducer: last
refId: B refId: B
type: reduce type: reduce
noDataState: NoData noDataState: Alerting
execErrState: Alerting execErrState: Alerting
for: 10m for: 0s
annotations: annotations:
node: '{{ $labels.node }}' node: '{{ $labels.node }}'
condition: '{{ $labels.condition }}' condition: '{{ $labels.condition }}'
@@ -111,236 +111,6 @@ data:
labels: labels:
severity: critical severity: critical
- uid: node_high_memory_usage
title: High Node Memory Usage
condition: B
data:
- refId: A
relativeTimeRange:
from: 300
to: 0
datasourceUid: P76F38748CEC837F0
model:
expr: '(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100'
refId: A
intervalMs: 1000
maxDataPoints: 43200
- refId: B
relativeTimeRange:
from: 300
to: 0
datasourceUid: __expr__
model:
conditions:
- evaluator:
params:
- 80
type: gt
operator:
type: and
query:
params: []
datasource:
type: __expr__
uid: __expr__
expression: A
reducer: max
refId: B
type: reduce
noDataState: NoData
execErrState: Alerting
for: 5m
annotations:
node: '{{ $labels.instance }}'
memory_usage: '{{ printf "%.1f%%" $values.A }}'
summary: 'Node memory usage is critically high'
labels:
severity: warning
- uid: node_high_cpu_usage
title: High Node CPU Usage
condition: B
data:
- refId: A
relativeTimeRange:
from: 300
to: 0
datasourceUid: P76F38748CEC837F0
model:
expr: '100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)'
refId: A
intervalMs: 1000
maxDataPoints: 43200
- refId: B
relativeTimeRange:
from: 300
to: 0
datasourceUid: __expr__
model:
conditions:
- evaluator:
params:
- 80
type: gt
operator:
type: and
query:
params: []
datasource:
type: __expr__
uid: __expr__
expression: A
reducer: max
refId: B
type: reduce
noDataState: NoData
execErrState: Alerting
for: 10m
annotations:
node: '{{ $labels.instance }}'
cpu_usage: '{{ printf "%.1f%%" $values.A }}'
summary: 'Node CPU usage is critically high'
labels:
severity: warning
- uid: node_high_disk_usage
title: High Node Disk Usage
condition: B
data:
- refId: A
relativeTimeRange:
from: 300
to: 0
datasourceUid: P76F38748CEC837F0
model:
expr: '(1 - (node_filesystem_avail_bytes{fstype=~"ext[234]|xfs|zfs|btrfs"} / node_filesystem_size_bytes)) * 100'
refId: A
intervalMs: 1000
maxDataPoints: 43200
- refId: B
relativeTimeRange:
from: 300
to: 0
datasourceUid: __expr__
model:
conditions:
- evaluator:
params:
- 85
type: gt
operator:
type: and
query:
params: []
datasource:
type: __expr__
uid: __expr__
expression: A
reducer: max
refId: B
type: reduce
noDataState: NoData
execErrState: Alerting
for: 5m
annotations:
node: '{{ $labels.instance }}'
filesystem: '{{ $labels.mountpoint }}'
disk_usage: '{{ printf "%.1f%%" $values.A }}'
summary: 'Node disk usage is critically high'
labels:
severity: critical
- uid: node_load_average_high
title: High Node Load Average
condition: B
data:
- refId: A
relativeTimeRange:
from: 300
to: 0
datasourceUid: P76F38748CEC837F0
model:
expr: 'node_load5 / on(instance) group_left count by(instance)(node_cpu_seconds_total{mode="idle"})'
refId: A
intervalMs: 1000
maxDataPoints: 43200
- refId: B
relativeTimeRange:
from: 300
to: 0
datasourceUid: __expr__
model:
conditions:
- evaluator:
params:
- 0.8
type: gt
operator:
type: and
query:
params: []
datasource:
type: __expr__
uid: __expr__
expression: A
reducer: max
refId: B
type: reduce
noDataState: NoData
execErrState: Alerting
for: 5m
annotations:
node: '{{ $labels.instance }}'
load_average: '{{ printf "%.2f" $values.A }}'
summary: 'Node load average is high relative to CPU count'
labels:
severity: warning
- uid: node_exporter_down
title: Node Exporter Down
condition: B
data:
- refId: A
relativeTimeRange:
from: 300
to: 0
datasourceUid: P76F38748CEC837F0
model:
expr: 'up{job="node-exporter"}'
refId: A
intervalMs: 1000
maxDataPoints: 43200
- refId: B
relativeTimeRange:
from: 300
to: 0
datasourceUid: __expr__
model:
conditions:
- evaluator:
params:
- 1
type: lt
operator:
type: and
query:
params: []
datasource:
type: __expr__
uid: __expr__
expression: A
reducer: min
refId: B
type: reduce
noDataState: NoData
execErrState: Alerting
for: 2m
annotations:
node: '{{ $labels.instance }}'
summary: 'Node exporter is down - unable to collect metrics'
labels:
severity: critical
contactpoints.yaml: | contactpoints.yaml: |
apiVersion: 1 apiVersion: 1
contactPoints: contactPoints:
@@ -379,4 +149,4 @@ data:
- alertname - alertname
group_wait: 10s group_wait: 10s
group_interval: 5m group_interval: 5m
repeat_interval: 12h repeat_interval: 4h
-1
View File
@@ -5,7 +5,6 @@ resources:
- persistentVolume.yaml - persistentVolume.yaml
- external-secrets.yaml - external-secrets.yaml
- grafana-alerting-configmap.yaml - grafana-alerting-configmap.yaml
- alertmanager-config.yaml
helmCharts: helmCharts:
- name: kube-prometheus-stack - name: kube-prometheus-stack
-30
View File
@@ -26,41 +26,11 @@ alertmanager:
{{ if .Annotations.description }}<b>Description:</b> {{ .Annotations.description }}{{ end }} {{ if .Annotations.description }}<b>Description:</b> {{ .Annotations.description }}{{ end }}
{{ end }} {{ end }}
ingress:
enabled: true
ingressClassName: traefik
annotations:
cert-manager.io/cluster-issuer: letsencrypt
traefik.ingress.kubernetes.io/router.middlewares: kube-system-https-redirect@kubernetescrd
hosts:
- prom.hexor.cy
paths:
- /alertmanager
tls:
- secretName: alertmanager-tls
hosts:
- prom.hexor.cy
alertmanagerSpec: alertmanagerSpec:
secrets: secrets:
- alertmanager-telegram-secret - alertmanager-telegram-secret
externalUrl: https://prom.hexor.cy/alertmanager
routePrefix: /alertmanager
prometheus: prometheus:
ingress:
enabled: true
ingressClassName: traefik
annotations:
cert-manager.io/cluster-issuer: letsencrypt
traefik.ingress.kubernetes.io/router.middlewares: kube-system-https-redirect@kubernetescrd
hosts:
- prom.hexor.cy
paths:
- /
tls:
- secretName: prometheus-tls
hosts:
- prom.hexor.cy
prometheusSpec: prometheusSpec:
enableRemoteWriteReceiver: true enableRemoteWriteReceiver: true
additionalScrapeConfigs: additionalScrapeConfigs:
+1 -1
View File
@@ -46,7 +46,7 @@ data:
sub_filter 'Minecraft Dynamic Map' "Hexor's MC server"; sub_filter 'Minecraft Dynamic Map' "Hexor's MC server";
# Inject all custom content before closing body tag (single replacement) # Inject all custom content before closing body tag (single replacement)
sub_filter "</body>" '<script>function getUsername(){var headers=document.querySelectorAll("meta");for(var i=0;i<headers.length;i++){if(headers[i].getAttribute("name")==="remote-user"){return headers[i].getAttribute("content");}}var jwt=document.cookie.split("; ").find(row=>row.startsWith("authentik_session="));if(jwt){try{var token=jwt.split("=")[1];var payload=JSON.parse(atob(token.split(".")[1]));return payload.sub||payload.username||"web-user";}catch(e){}}return "web-user";}var username=getUsername();console.log("Username found:", username);if(username && username!=="web-user" && window.location.search.indexOf("playername=")===-1){var currentUrl=new URL(window.location.href);currentUrl.searchParams.set("playername",username);console.log("Redirecting to:", currentUrl.href);window.location.href=currentUrl.href;}document.addEventListener("DOMContentLoaded",function(){var userBlock=document.createElement("div");userBlock.style.cssText="background-color: #CEC6CB; color: black; padding: 8px; text-align: center; font-size: medium; border-radius: 4px; position: absolute; top: 10px; right: 150px; max-width: 200px;";userBlock.innerHTML="Logged in as: <b>"+username+"</b>";document.body.appendChild(userBlock);});</script><p style="background-color: #CEC6CB; color: black; padding: 10px 10px; text-align: center; font-size: large; text-decoration: none; display: inline-block; border-radius: 4px; position: absolute; top: 10px; left: 150px;">GEYMERSKIY SOYUZ Server <br>Get <a href="https://github.com/PrismLauncher/PrismLauncher/releases/tag/8.4" >Prism Launcher</a> and <a href="/clients/1.12.2.zip" >client.zip</a> for this server. Server address <b>minecraft.hexor.cy:30565</b><br>Requires <a href="https://www.java.com/en/download/manual.jsp">Java 8</a><br><br><a href="#" onclick="showInstallModal(); return false;" style="color: black; text-decoration: underline;">Windows Install Script</a></p><div id="installModal" style="display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5);"><div style="background-color: #CEC6CB; margin: 15% auto; padding: 10px; border-radius: 4px; width: 70%; max-width: 500px; text-align: center; color: black; font-size: large;"><h3 style="margin-top: 0; color: black;">Windows Installation</h3><p style="color: black;">Copy and paste this command into PowerShell:</p><textarea id="scriptCommand" readonly style="width: 90%; height: 60px; font-family: monospace; padding: 8px; border: 1px solid #888; border-radius: 4px; resize: none; background-color: white; color: black;">iwr -useb https://minecraft.hexor.cy/clients/win-install.ps1 | iex</textarea><br><br><button id="copyButton" onclick="copyToClipboard()" style="background-color: #CEC6CB; color: black; padding: 10px 15px; border: 1px solid #888; border-radius: 4px; cursor: pointer; margin-right: 10px; font-size: large; text-decoration: none;">Copy</button><button onclick="closeInstallModal()" style="background-color: #CEC6CB; color: black; padding: 10px 15px; border: 1px solid #888; border-radius: 4px; cursor: pointer; font-size: large; text-decoration: none;">Close</button></div></div><script>function showInstallModal() { document.getElementById("installModal").style.display = "block"; } function closeInstallModal() { document.getElementById("installModal").style.display = "none"; } function copyToClipboard() { var textarea = document.getElementById("scriptCommand"); textarea.select(); textarea.setSelectionRange(0, 99999); if (document.execCommand("copy")) { var button = document.getElementById("copyButton"); button.style.borderColor = "#4CAF50"; setTimeout(function() { button.style.borderColor = "#888"; }, 2000); } } window.onclick = function(event) { var modal = document.getElementById("installModal"); if (event.target == modal) { closeInstallModal(); } }</script></body>'; sub_filter "</body>" '<script>function getUsername(){var headers=document.querySelectorAll("meta");for(var i=0;i<headers.length;i++){if(headers[i].getAttribute("name")==="remote-user"){return headers[i].getAttribute("content");}}var jwt=document.cookie.split("; ").find(row=>row.startsWith("authentik_session="));if(jwt){try{var token=jwt.split("=")[1];var payload=JSON.parse(atob(token.split(".")[1]));return payload.sub||payload.username||"web-user";}catch(e){}}return "web-user";}var username=getUsername();console.log("Username found:", username);if(username && username!=="web-user" && window.location.search.indexOf("playername=")===-1){var currentUrl=new URL(window.location.href);currentUrl.searchParams.set("playername",username);console.log("Redirecting to:", currentUrl.href);window.location.href=currentUrl.href;}document.addEventListener("DOMContentLoaded",function(){var userBlock=document.createElement("div");userBlock.style.cssText="background-color: #CEC6CB; color: black; padding: 8px; text-align: center; font-size: medium; border-radius: 4px; position: absolute; top: 10px; right: 150px; max-width: 200px;";userBlock.innerHTML="Logged in as: <b>"+username+"</b>";document.body.appendChild(userBlock);});</script><p style="background-color: #CEC6CB; color: black; padding: 10px 10px; text-align: center; font-size: large; text-decoration: none; display: inline-block; border-radius: 4px; position: absolute; top: 10px; left: 150px;">GEYMERSKIY SOYUZ Server <br>Get <a href="https://github.com/PrismLauncher/PrismLauncher/releases/tag/8.4" >Prism Launcher</a> and <a href="/clients/1.12.2.zip" >client.zip</a> for this server. Server address <b>minecraft.hexor.cy:30565</b><br><br><a href="#" onclick="showInstallModal(); return false;" style="color: black; text-decoration: underline;">Windows Install Script</a></p><div id="installModal" style="display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5);"><div style="background-color: #CEC6CB; margin: 15% auto; padding: 10px; border-radius: 4px; width: 70%; max-width: 500px; text-align: center; color: black; font-size: large;"><h3 style="margin-top: 0; color: black;">Windows Installation</h3><p style="color: black;">Copy and paste this command into PowerShell:</p><textarea id="scriptCommand" readonly style="width: 90%; height: 60px; font-family: monospace; padding: 8px; border: 1px solid #888; border-radius: 4px; resize: none; background-color: white; color: black;">iwr -useb https://minecraft.hexor.cy/clients/win-install.ps1 | iex</textarea><br><br><button id="copyButton" onclick="copyToClipboard()" style="background-color: #CEC6CB; color: black; padding: 10px 15px; border: 1px solid #888; border-radius: 4px; cursor: pointer; margin-right: 10px; font-size: large; text-decoration: none;">Copy</button><button onclick="closeInstallModal()" style="background-color: #CEC6CB; color: black; padding: 10px 15px; border: 1px solid #888; border-radius: 4px; cursor: pointer; font-size: large; text-decoration: none;">Close</button></div></div><script>function showInstallModal() { document.getElementById("installModal").style.display = "block"; } function closeInstallModal() { document.getElementById("installModal").style.display = "none"; } function copyToClipboard() { var textarea = document.getElementById("scriptCommand"); textarea.select(); textarea.setSelectionRange(0, 99999); if (document.execCommand("copy")) { var button = document.getElementById("copyButton"); button.style.borderColor = "#4CAF50"; setTimeout(function() { button.style.borderColor = "#888"; }, 2000); } } window.onclick = function(event) { var modal = document.getElementById("installModal"); if (event.target == modal) { closeInstallModal(); } }</script></body>';
# Apply sub_filter replacements globally (not just once) # Apply sub_filter replacements globally (not just once)
sub_filter_once off; sub_filter_once off;
-3
View File
@@ -189,9 +189,6 @@ EOT
meta_icon = "https://img.icons8.com/color/48/minecraft-grass-cube.png" meta_icon = "https://img.icons8.com/color/48/minecraft-grass-cube.png"
mode = "proxy" mode = "proxy"
outpost = "kubernetes-outpost" outpost = "kubernetes-outpost"
skip_path_regex = <<-EOT
/clients
EOT
} }
"pasarguard" = { "pasarguard" = {
name = "PasarGuard" name = "PasarGuard"