feat: Add Atuin and Kubernetes schema publisher applications, migrate to the new apps directory structure, and update Prometheus ingress hostnames.

This commit is contained in:
2026-02-27 07:07:56 +01:00
parent 5acb71604c
commit 091e7b78df
20 changed files with 662 additions and 7 deletions

View File

@@ -12,3 +12,22 @@ tasks:
- test -f {{.ROOT_DIR}}/.sops.yaml
- test -f {{.SCRIPTS_DIR}}/bootstrap-apps.sh
- test -f {{.SOPS_AGE_KEY_FILE}}
ping:
desc: Ping the available routes
dir: "{{.ROOT_DIR}}"
cmds:
- |
for route in $(kubectl get httproute -A -o jsonpath='{.items[*].spec.hostnames[*]}'); do
ip=$(nslookup $route 2>/dev/null | grep -A 1 "Name:" | grep "Address:" | head -n 1 | awk '{print $2}') || true
if [ -n "$ip" ]; then
echo "✔ $route ($ip)"
else
echo "✗ $route"
fi
done
true
preconditions:
- test -f {{.KUBECONFIG}}
- test -f {{.ROOT_DIR}}/.sops.yaml
- test -f {{.SCRIPTS_DIR}}/bootstrap-apps.sh
- test -f {{.SOPS_AGE_KEY_FILE}}

View File

@@ -0,0 +1,12 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: communication
components:
- ../../components/sops
- ../../components/repos/app-template
resources: []
#- ./namespace.yaml
#- ./publish-k8s-schemas

View File

@@ -0,0 +1,7 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: _
annotations:
kustomize.toolkit.fluxcd.io/prune: disabled

View File

@@ -0,0 +1,16 @@
---
# yaml-language-server: $schema=https://schemas.tholinka.dev/kustomize.toolkit.fluxcd.io/kustomization_v1.json
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: publish-k8s-schemas
namespace: &namespace communication
spec:
interval: 1h
path: ./kubernetes/apps/communication/publish-k8s-schemas/app
prune: true
sourceRef:
kind: GitRepository
name: flux-system
namespace: flux-system
targetNamespace: *namespace

View File

@@ -0,0 +1,21 @@
---
# yaml-language-server: $schema=https://schemas.tholinka.dev/external-secrets.io/externalsecret_v1.json
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: &secret publish-k8s-schemas
spec:
refreshInterval: 12h
secretStoreRef:
kind: ClusterSecretStore
name: bitwarden
target:
name: *secret
creationPolicy: Owner
template:
data:
CLOUDFLARE_ACCOUNT_ID: '{{ .CLOUDFLARE_ACCOUNT_ID }}'
CLOUDFLARE_API_TOKEN: '{{ .CLOUDFLARE_K8S_SCHEMAS }}'
dataFrom:
- extract:
key: cloudflare

View File

@@ -0,0 +1,130 @@
---
# yaml-language-server: $schema=https://raw.githubusercontent.com/bjw-s-labs/helm-charts/main/charts/other/app-template/schemas/helmrelease-helm-v2.schema.json
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: &app publish-k8s-schemas
spec:
interval: 1h
chartRef:
kind: OCIRepository
name: app-template
values:
controllers:
*app :
type: cronjob
cronjob:
backoffLimit: 3
concurrencyPolicy: 'Replace'
failedJobsHistory: 1
schedule: '0 */4 * * *'
successfulJobsHistory: 0
initContainers:
generate-schemas:
image:
repository: ghcr.io/bjw-s-labs/k8s-crd-extractor
tag: 2025.12.22@sha256:176cc556053abba6fda83eeb398531cd33c3092553cab8a49a736f68972c057b
command: [/usr/bin/catatonit, --, sh]
args:
- -c
- /app/crd-extractor.sh && exec sh /config/map/generate-index.sh
resources:
requests:
cpu: 10m
memory: 128Mi
limits:
memory: 2Gi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities: { drop: [ALL] }
containers:
app:
image:
repository: ghcr.io/bjw-s-labs/wrangler
tag: 4.68.1@sha256:6366b6eafbdf519d5391713ad247ab80bea7bcb3572387f5029aecb38570cc69
envFrom:
- secretRef:
name: *app
args:
- pages
- deploy
- /data/crdSchemas
- --project-name
- kubernetes-schemas
resources:
requests:
cpu: 10m
memory: 128Mi
limits:
memory: 1Gi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities: { drop: [ALL] }
defaultPodOptions:
restartPolicy: OnFailure
securityContext:
runAsGroup: 65534
runAsNonRoot: true
runAsUser: 65534
persistence:
tmpfs:
type: emptyDir
advancedMounts:
*app :
generate-schemas:
- path: /config/.datree
subPath: data
- path: /tmp
subPath: tmp
app:
- path: /config
subPath: config
- path: /data
subPath: data
config:
type: configMap
name: *app
advancedMounts:
*app :
generate-schemas:
- path: /config/map
readOnly: true
serviceAccount:
*app : {}
rbac:
roles:
*app :
type: ClusterRole
rules:
- apiGroups:
- apiextensions.k8s.io
resources:
- customresourcedefinitions
- customresourcedefinitions/status
verbs:
- get
- list
- watch
- apiGroups:
- apiregistration.k8s.io
resources:
- apiservices
- apiservices/status
verbs:
- get
- list
- watch
bindings:
*app :
type: ClusterRoleBinding
roleRef:
identifier: *app
subjects:
- identifier: *app

View File

@@ -0,0 +1,16 @@
---
# yaml-language-server: $schema=https://json.schemastore.org/kustomization
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- externalsecret.yaml
- helmrelease.yaml
configMapGenerator:
- name: publish-k8s-schemas
files:
- generate-index.sh=./resources/generate-index.sh
- index.html=./resources/index.html
generatorOptions:
disableNameSuffixHash: true
annotations:
kustomize.toolkit.fluxcd.io/substitute: disabled

View File

@@ -0,0 +1,37 @@
#!/usr/bin/env bash
cd /config/.datree/crdSchemas/
echo "creating index"
# Count stats
group_count=$(find . -maxdepth 1 -type d | wc -l)
group_count=$((group_count - 1))
schema_count=$(find . -name "*.json" | wc -l)
updated=$(date -u +"%Y-%m-%d")
echo "groups: $group_count - schemas: $schema_count"
# Generate schema cards HTML
schemas_html=""
for dir in */; do
dir_name="${dir%/}"
file_count=$(find "$dir" -maxdepth 1 -name "*.json" | wc -l)
files_html=""
for file in "$dir"*.json; do
if [ -f "$file" ]; then
filename=$(basename "$file")
files_html="${files_html}<a href=\"${file}\" class=\"file-link\">${filename}</a>"
fi
done
schemas_html="${schemas_html}<div class=\"group-card\"><div class=\"group-header\"><span class=\"group-name\">${dir_name}</span><span class=\"group-count\">${file_count}</span><svg class=\"chevron\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M4.427 5.427l3.396 3.396a.25.25 0 00.354 0l3.396-3.396A.25.25 0 0011.396 5H4.604a.25.25 0 00-.177.427z\"/></svg></div><div class=\"group-files\">${files_html}</div></div>"
done
# Copy template and inject data
cp /config/map/index.html index.html
sed -i "s|<!-- SCHEMAS_PLACEHOLDER -->|${schemas_html}|g" index.html
sed -i "s|<div class=\"stat-value\" id=\"group-count\">-</div>|<div class=\"stat-value\" id=\"group-count\">${group_count}</div>|g" index.html
sed -i "s|<div class=\"stat-value\" id=\"schema-count\">-</div>|<div class=\"stat-value\" id=\"schema-count\">${schema_count}</div>|g" index.html
sed -i "s|<div class=\"stat-value\" id=\"last-updated\">-</div>|<div class=\"stat-value\" id=\"last-updated\">${updated}</div>|g" index.html
echo "index created"

View File

@@ -0,0 +1,391 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kubernetes Schemas | tholinka.dev</title>
<link rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>☸️</text></svg>">
<style>
:root {
--bg-primary: #0d1117;
--bg-secondary: #161b22;
--bg-tertiary: #21262d;
--text-primary: #fff;
--text-secondary: #eee;
--text-muted: #999;
--accent: #58a6ff;
--accent-hover: #79c0ff;
--border: #30363d;
--success: #3fb950;
--gradient-start: #58a6ff;
--gradient-end: #a371f7;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
background: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
min-height: 100vh;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 2rem;
}
header {
text-align: center;
padding: 3rem 0;
border-bottom: 1px solid var(--border);
margin-bottom: 2rem;
}
.logo {
max-width: 5rem;
max-height: 5rem;
}
h1 {
font-size: 2.5rem;
font-weight: 600;
background: linear-gradient(135deg, var(--gradient-start), var(--gradient-end));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 0.5rem;
}
.subtitle {
color: var(--text-secondary);
font-size: 1.1rem;
}
.usage-card {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 12px;
padding: 1.5rem;
margin-bottom: 2rem;
}
.usage-card h2 {
font-size: 1rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.05em;
margin-bottom: 1rem;
}
.code-block {
background: var(--bg-tertiary);
border-radius: 8px;
padding: 1rem 1.25rem;
font-family: 'SF Mono', 'Fira Code', Consolas, monospace;
font-size: 0.9rem;
overflow-x: auto;
position: relative;
}
.code-block code {
color: var(--text-primary);
}
.code-block .comment {
color: var(--text-muted);
}
.code-block .string {
color: var(--success);
}
.search-container {
margin-bottom: 2rem;
}
.search-input {
width: 100%;
padding: 0.875rem 1.25rem;
font-size: 1rem;
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 8px;
color: var(--text-primary);
transition: border-color 0.2s, box-shadow 0.2s;
}
.search-input:focus {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(88, 166, 255, 0.15);
}
.search-input::placeholder {
color: var(--text-muted);
}
.stats {
display: flex;
gap: 2rem;
margin-bottom: 2rem;
flex-wrap: wrap;
}
.stat {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 8px;
padding: 1rem 1.5rem;
flex: 1;
min-width: 150px;
}
.stat-value {
font-size: 2rem;
font-weight: 600;
color: var(--accent);
}
.stat-label {
color: var(--text-secondary);
font-size: 0.875rem;
}
.schemas-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
gap: 1rem;
}
.group-card {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 12px;
overflow: hidden;
transition: border-color 0.2s, transform 0.2s;
}
.group-card:hover {
border-color: var(--accent);
transform: translateY(-2px);
}
.group-header {
padding: 1rem 1.25rem;
background: var(--bg-tertiary);
border-bottom: 1px solid var(--border);
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
}
.group-name {
font-weight: 600;
font-family: 'SF Mono', 'Fira Code', Consolas, monospace;
font-size: 0.9rem;
color: var(--accent);
}
.group-count {
background: var(--bg-primary);
padding: 0.25rem 0.75rem;
border-radius: 999px;
font-size: 0.8rem;
color: var(--text-secondary);
}
.group-files {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease-out;
}
.group-card.open .group-files {
max-height: 500px;
overflow-y: auto;
}
.file-link {
display: block;
padding: 0.625rem 1.25rem;
color: var(--text-primary);
text-decoration: none;
font-family: 'SF Mono', 'Fira Code', Consolas, monospace;
font-size: 0.85rem;
border-bottom: 1px solid var(--border);
transition: background 0.15s;
}
.file-link:last-child {
border-bottom: none;
}
.file-link:hover {
background: var(--bg-tertiary);
color: var(--accent);
}
.chevron {
transition: transform 0.2s;
}
.group-card.open .chevron {
transform: rotate(180deg);
}
footer {
margin-top: 3rem;
padding-top: 2rem;
border-top: 1px solid var(--border);
text-align: center;
color: var(--text-secondary);
font-size: 0.875rem;
}
footer a {
color: var(--accent);
text-decoration: none;
}
footer a:hover {
text-decoration: underline;
}
.hidden {
display: none !important;
}
@media (max-width: 768px) {
.container {
padding: 1rem;
}
header {
padding: 2rem 0;
}
h1 {
font-size: 1.75rem;
}
.schemas-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<div class="container">
<header>
<svg class="logo" width="800px" height="800px" viewBox="0 -10.44 722.846 722.846"
xmlns="http://www.w3.org/2000/svg">
<path
d="M358.986 10.06a46.725 46.342 0 00-17.906 4.531L96.736 131.341a46.725 46.342 0 00-25.28 31.438l-60.282 262.25a46.725 46.342 0 006.344 35.531 46.725 46.342 0 002.656 3.688l169.125 210.28a46.725 46.342 0 0036.531 17.438l271.219-.062a46.725 46.342 0 0036.531-17.406l169.063-210.313a46.725 46.342 0 009.03-39.219L651.3 162.716a46.725 46.342 0 00-25.281-31.437L381.643 14.59a46.725 46.342 0 00-22.657-4.53z"
fill="#326ce5" />
<path
d="M361.408 99.307c-8.077.001-14.626 7.276-14.625 16.25 0 .138.028.27.03.406-.011 1.22-.07 2.689-.03 3.75.192 5.176 1.32 9.138 2 13.907 1.23 10.206 2.26 18.667 1.625 26.531-.62 2.965-2.803 5.677-4.75 7.562l-.344 6.188a190.337 190.337 0 00-26.438 4.062c-37.974 8.623-70.67 28.184-95.562 54.594a245.167 245.167 0 01-5.281-3.75c-2.612.353-5.25 1.159-8.688-.844-6.545-4.405-12.506-10.486-19.719-17.812-3.305-3.504-5.698-6.841-9.625-10.219-.891-.767-2.252-1.804-3.25-2.594-3.07-2.447-6.69-3.724-10.187-3.843-4.496-.154-8.824 1.604-11.656 5.156-5.036 6.315-3.424 15.968 3.593 21.562.071.057.147.101.219.157.964.781 2.145 1.783 3.031 2.437 4.167 3.077 7.973 4.652 12.125 7.094 8.747 5.402 15.999 9.88 21.75 15.281 2.246 2.394 2.639 6.613 2.938 8.438l4.687 4.187c-25.093 37.764-36.707 84.41-29.843 131.938l-6.125 1.781c-1.615 2.085-3.896 5.365-6.282 6.344-7.525 2.37-15.994 3.24-26.218 4.312-4.8.4-8.943.161-14.032 1.125-1.12.212-2.68.619-3.906.906l-.125.032c-.067.015-.155.048-.219.062-8.62 2.083-14.157 10.006-12.375 17.813 1.783 7.808 10.203 12.556 18.875 10.687.063-.014.154-.017.219-.031.098-.022.184-.07.281-.094 1.21-.265 2.724-.56 3.782-.843 5.003-1.34 8.626-3.308 13.125-5.032 9.676-3.47 17.691-6.37 25.5-7.5 3.26-.255 6.697 2.012 8.406 2.969l6.375-1.094c14.67 45.483 45.414 82.245 84.344 105.313l-2.657 6.375c.958 2.475 2.014 5.824 1.3 8.27-2.838 7.36-7.7 15.13-13.237 23.792-2.681 4.002-5.425 7.108-7.844 11.688-.579 1.096-1.316 2.78-1.875 3.937-3.759 8.043-1.002 17.305 6.219 20.782 7.266 3.497 16.284-.192 20.187-8.25.006-.012.026-.02.031-.032.004-.009-.004-.022 0-.03.556-1.143 1.344-2.645 1.813-3.72 2.072-4.747 2.762-8.815 4.219-13.406 3.87-9.72 5.995-19.919 11.322-26.274 1.459-1.74 3.837-2.41 6.303-3.07l3.312-6c33.938 13.027 71.927 16.523 109.875 7.907a189.77 189.77 0 0025.094-7.563c.93 1.651 2.661 4.826 3.125 5.625 2.506.815 5.24 1.236 7.469 4.531 3.985 6.81 6.71 14.865 10.031 24.594 1.457 4.591 2.178 8.66 4.25 13.406.472 1.082 1.256 2.605 1.812 3.75 3.895 8.085 12.943 11.787 20.22 8.282 7.219-3.478 9.979-12.74 6.218-20.782-.559-1.158-1.327-2.841-1.906-3.937-2.42-4.58-5.163-7.655-7.844-11.656-5.537-8.662-10.13-15.858-12.969-23.22-1.187-3.796.2-6.157 1.125-8.624-.554-.635-1.739-4.22-2.437-5.906 40.457-23.889 70.298-62.022 84.312-106.063 1.893.298 5.182.88 6.25 1.094 2.2-1.45 4.222-3.344 8.188-3.031 7.808 1.129 15.823 4.03 25.5 7.5 4.498 1.723 8.121 3.723 13.125 5.062 1.057.283 2.572.547 3.781.813.097.023.183.071.281.093.066.015.156.017.219.032 8.672 1.866 17.094-2.88 18.875-10.688 1.78-7.807-3.754-15.732-12.375-17.812-1.254-.286-3.032-.77-4.25-1-5.09-.964-9.231-.727-14.031-1.125-10.225-1.072-18.694-1.943-26.219-4.313-3.068-1.19-5.251-4.841-6.313-6.344l-5.906-1.718c3.062-22.155 2.237-45.212-3.062-68.282-5.349-23.284-14.8-44.58-27.407-63.343 1.515-1.378 4.377-3.911 5.188-4.657.237-2.624.033-5.375 2.75-8.281 5.751-5.4 13.003-9.879 21.75-15.281 4.152-2.443 7.99-4.017 12.156-7.094.942-.696 2.23-1.798 3.219-2.594 7.015-5.596 8.63-15.248 3.594-21.562-5.037-6.314-14.797-6.91-21.813-1.313-.998.791-2.353 1.823-3.25 2.594-3.926 3.378-6.351 6.714-9.656 10.219-7.213 7.326-13.174 13.438-19.719 17.844-2.836 1.65-6.99 1.08-8.875.968l-5.562 3.969c-31.72-33.26-74.905-54.525-121.406-58.656-.13-1.949-.3-5.471-.344-6.532-1.904-1.821-4.204-3.376-4.781-7.312-.637-7.864.426-16.325 1.656-26.531.679-4.769 1.807-8.73 2-13.907.044-1.176-.027-2.884-.031-4.156-.001-8.974-6.548-16.25-14.625-16.25zm-18.313 113.438l-4.344 76.718-.312.157c-.292 6.863-5.94 12.343-12.875 12.343-2.841 0-5.463-.912-7.594-2.468l-.125.062-62.906-44.594c19.333-19.01 44.063-33.06 72.562-39.53a154.125 154.125 0 0115.594-2.688zm36.656 0c33.274 4.092 64.045 19.159 87.625 42.25l-62.5 44.312-.218-.093c-5.548 4.051-13.364 3.046-17.688-2.375a12.807 12.807 0 01-2.812-7.47l-.063-.03zM232.126 283.62l57.438 51.375-.063.312c5.185 4.507 5.95 12.328 1.625 17.75a12.892 12.892 0 01-6.687 4.406l-.063.25-73.625 21.25c-3.747-34.265 4.329-67.573 21.375-95.343zm258.157.03c8.534 13.833 14.996 29.283 18.843 46.032 3.801 16.548 4.755 33.067 3.188 49.031l-74-21.312-.063-.313c-6.626-1.81-10.699-8.551-9.156-15.312a12.786 12.786 0 014.094-6.844l-.031-.156 57.125-51.125zm-140.657 55.313h23.532l14.625 18.282-5.25 22.812-21.125 10.156-21.188-10.187-5.25-22.813zm75.438 62.563c1-.05 1.995.04 2.969.219l.125-.157 76.156 12.875c-11.146 31.314-32.473 58.44-60.969 76.594l-29.562-71.406.093-.125c-2.715-6.31.002-13.71 6.25-16.719 1.6-.77 3.271-1.197 4.938-1.281zm-127.906.312c5.811.082 11.024 4.116 12.375 10.032.632 2.77.324 5.513-.72 7.937l.22.281-29.25 70.688c-27.348-17.549-49.13-43.824-60.782-76.063l75.5-12.812.125.156c.845-.155 1.701-.23 2.532-.219zm63.78 30.97a12.764 12.764 0 016.032 1.28c2.56 1.233 4.537 3.174 5.781 5.5h.282l37.218 67.25a154.256 154.256 0 01-14.875 4.157c-28.464 6.463-56.838 4.504-82.53-4.25l37.124-67.125h.063a12.91 12.91 0 0110.906-6.813z"
style="text-indent:0;text-align:start;line-height:normal;text-transform:none;block-progression:tb;marker:none;-inkscape-font-specification:Sans"
font-weight="400" color="#000000" fill="#ffffff" stroke="#ffffff" stroke-width=".25"
overflow="visible" font-family="Sans" />
</svg>
<h1>Kubernetes Schemas</h1>
<p class="subtitle">CRD JSON schemas from the tholinka.dev cluster</p>
</header>
<div class="usage-card">
<h2>Usage</h2>
<div class="code-block">
<code><span class="comment"># yaml-language-server: </span><span class="string">$schema=https://schemas.tholinka.dev/{group}/{kind}_{version}.json</span></code>
</div>
</div>
<div class="search-container">
<input type="text" class="search-input" id="search"
placeholder="Search schemas... (e.g., helmrelease, certificate, gateway)">
</div>
<div class="stats">
<div class="stat">
<div class="stat-value" id="group-count">-</div>
<div class="stat-label">API Groups</div>
</div>
<div class="stat">
<div class="stat-value" id="schema-count">-</div>
<div class="stat-label">Schemas</div>
</div>
<div class="stat">
<div class="stat-value" id="last-updated">-</div>
<div class="stat-label">Last Updated</div>
</div>
</div>
<div class="schemas-grid" id="schemas-grid">
<!-- SCHEMAS_PLACEHOLDER -->
</div>
<footer>
<p>
Generated by <a href="https://github.com/datreeio/CRDs-catalog" target="_blank">crd-extractor</a>
Hosted on <a href="https://pages.cloudflare.com" target="_blank">Cloudflare Pages</a>
<a href="https://github.com/tholinka/home-ops" target="_blank">Source</a>
</p>
</footer>
</div>
<script>
// Search functionality
const searchInput = document.getElementById('search');
const grid = document.getElementById('schemas-grid');
searchInput.addEventListener('input', (e) => {
const query = e.target.value.toLowerCase();
const cards = grid.querySelectorAll('.group-card');
cards.forEach(card => {
const groupName = card.querySelector('.group-name').textContent.toLowerCase();
const files = card.querySelectorAll('.file-link');
let hasMatch = groupName.includes(query);
files.forEach(file => {
const fileName = file.textContent.toLowerCase();
if (fileName.includes(query)) {
hasMatch = true;
file.classList.remove('hidden');
} else if (query) {
file.classList.add('hidden');
} else {
file.classList.remove('hidden');
}
});
if (hasMatch) {
card.classList.remove('hidden');
if (query) card.classList.add('open');
} else {
card.classList.add('hidden');
}
});
});
// Toggle group expansion
grid.addEventListener('click', (e) => {
const header = e.target.closest('.group-header');
if (header) {
header.closest('.group-card').classList.toggle('open');
}
});
</script>
</body>
</html>

View File

@@ -0,0 +1,6 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./app.ks.yaml

View File

@@ -25,12 +25,12 @@ spec:
main:
enabled: true
hostnames:
- alertmanager.tholinka.dev
- alertmanager.laurivan.com
parentRefs:
- name: envoy-internal
namespace: network
annotations:
gethomepage.dev/enabled: 'true'
gethomepage.dev/enabled: "true"
gethomepage.dev/group: Observability
gethomepage.dev/name: Alertmanager
gethomepage.dev/icon: alertmanager.svg
@@ -40,7 +40,7 @@ spec:
name: alertmanager
global:
resolveTimeout: 5m
externalUrl: https://alertmanager.tholinka.dev
externalUrl: https://alertmanager.laurivan.com
resources:
requests:
cpu: 10m
@@ -68,20 +68,20 @@ spec:
main:
enabled: true
hostnames:
- prometheus.tholinka.dev
- prometheus.laurivan.com
parentRefs:
- name: envoy-internal
namespace: network
annotations:
gethomepage.dev/enabled: 'true'
gethomepage.dev/enabled: "true"
gethomepage.dev/group: Observability
gethomepage.dev/name: Prometheus
gethomepage.dev/icon: prometheus.svg
gethomepage.dev/pod-selector: operator.prometheus.io/name=kube-prometheus-stack
gethomepage.dev/widget.type: prometheus
gethomepage.dev/widget.url: 'http://kube-prometheus-stack-prometheus.observability.svc.cluster.local.:9090'
gethomepage.dev/widget.url: "http://kube-prometheus-stack-prometheus.observability.svc.cluster.local.:9090"
prometheusSpec:
externalUrl: https://prometheus.tholinka.dev
externalUrl: https://prometheus.laurivan.com
version: v2.55.1 # override 'unsupported Prometheus version' error for prompp
image:
registry: mirror.gcr.io