This commit is contained in:
Mike McFetridge
2026-07-20 09:23:17 -04:00
parent c1315882da
commit 72272e4006
3179 changed files with 562960 additions and 14 deletions
@@ -0,0 +1,15 @@
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
secretName: << secret_name >>
issuerRef:
name: << certmanager_issuer >>
kind: << certmanager_issuer_kind >>
dnsNames:
<%- for dns_name in dns_names.split(',') %>
- << dns_name.strip() >>
<%- endfor %>
@@ -0,0 +1,207 @@
{
"slug": "certmanager-certificate",
"kind": "kubernetes",
"metadata": {
"name": "Cert-Manager Certificate",
"description": "Cert-manager Certificate resource for requesting TLS certificates from an Issuer or ClusterIssuer. The certificate is stored in a Kubernetes Secret.",
"tags": [],
"icon": {
"provider": "mdi",
"id": "certificate-outline"
},
"draft": true,
"version": {
"name": "1.16.2",
"source_dep_name": "manual/certmanager-certificate"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "tls-certificate",
"config": {
"placeholder": "tls-certificate"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "secret_name",
"type": "str",
"title": "Secret Name",
"required": false,
"default": "tls-secret",
"config": {
"placeholder": "tls-secret"
}
},
{
"name": "dns_name",
"type": "str",
"title": "Dns Name",
"required": false,
"default": ""
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
},
{
"title": "DNS Settings",
"name": "dns",
"items": [
{
"name": "dns_names",
"type": "str",
"title": "DNS Names",
"required": false,
"description": "DNS names for certificate (comma-separated, e.g., home.arpa,*.home.arpa)"
}
]
},
{
"title": "Cert-Manager Settings",
"name": "certmanager",
"items": [
{
"name": "certmanager_issuer",
"type": "str",
"title": "Issuer",
"required": false,
"default": "letsencrypt-prod",
"description": "Cert-manager Issuer or ClusterIssuer name",
"config": {
"placeholder": "letsencrypt-prod"
}
},
{
"name": "certmanager_issuer_kind",
"type": "enum",
"title": "Issuer type",
"required": false,
"default": "ClusterIssuer",
"config": {
"options": [
"Issuer",
"ClusterIssuer"
]
}
}
]
}
]
}
@@ -0,0 +1,17 @@
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: << resource_name >>
spec:
acme:
email: << acme_email >>
server: << acme_server >>
privateKeySecretRef:
name: << privatekey_secret_name >>
solvers:
- dns01:
cloudflare:
apiTokenSecretRef:
name: << api_token_secret_name >>
key: << api_token_secret_key >>
@@ -0,0 +1,196 @@
{
"slug": "certmanager-clusterissuer",
"kind": "kubernetes",
"metadata": {
"name": "Cert-Manager ClusterIssuer (Cloudflare)",
"description": "Cert-manager ClusterIssuer for automatic TLS certificate management using Let's Encrypt with Cloudflare DNS-01 challenge validation. Cluster-scoped resource available to all namespaces.",
"tags": [],
"icon": {
"provider": "mdi",
"id": "certificate-outline"
},
"draft": true,
"version": {
"name": "1.16.2",
"source_dep_name": "manual/certmanager-clusterissuer"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "cloudflare-clusterissuer",
"config": {
"placeholder": "cloudflare-clusterissuer"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "cert-manager",
"description": "Namespace (ClusterIssuer is cluster-scoped, but needed for schema)",
"config": {
"placeholder": "cert-manager"
}
},
{
"name": "acme_email",
"type": "str",
"title": "ACME Email",
"required": true,
"description": "Email address for ACME account registration"
},
{
"name": "acme_server",
"type": "str",
"title": "ACME server URL",
"required": false,
"default": "https://acme-v02.api.letsencrypt.org/directory",
"config": {
"placeholder": "https://acme-v02.api.letsencrypt.org/directory"
}
},
{
"name": "privatekey_secret_name",
"type": "str",
"title": "Private Key Secret",
"required": false,
"default": "cloudflare-clusterissuer-account-key",
"config": {
"placeholder": "cloudflare-clusterissuer-account-key"
}
},
{
"name": "api_token_secret_name",
"type": "str",
"title": "API Token Secret",
"required": false,
"default": "cloudflare-api-token-secret",
"config": {
"placeholder": "cloudflare-api-token-secret"
}
},
{
"name": "api_token_secret_key",
"type": "str",
"title": "API Token Key",
"required": false,
"default": "api-token",
"description": "Key name in secret containing Cloudflare API token",
"config": {
"placeholder": "api-token"
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
@@ -0,0 +1,18 @@
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
acme:
email: << acme_email >>
server: << acme_server >>
privateKeySecretRef:
name: << privatekey_secret_name >>
solvers:
- dns01:
cloudflare:
apiTokenSecretRef:
name: << api_token_secret_name >>
key: << api_token_secret_key >>
+195
View File
@@ -0,0 +1,195 @@
{
"slug": "certmanager-issuer",
"kind": "kubernetes",
"metadata": {
"name": "Cert-Manager Issuer (Cloudflare)",
"description": "Cert-manager Issuer for automatic TLS certificate management using Let's Encrypt with Cloudflare DNS-01 challenge validation. Namespace-scoped (unlike ClusterIssuer).",
"tags": [],
"icon": {
"provider": "mdi",
"id": "certificate-outline"
},
"draft": true,
"version": {
"name": "1.16.2",
"source_dep_name": "manual/certmanager-issuer"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "cloudflare-issuer",
"config": {
"placeholder": "cloudflare-issuer"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "acme_email",
"type": "str",
"title": "ACME Email",
"required": true,
"description": "Email address for ACME account registration"
},
{
"name": "acme_server",
"type": "str",
"title": "ACME server URL",
"required": false,
"default": "https://acme-v02.api.letsencrypt.org/directory",
"config": {
"placeholder": "https://acme-v02.api.letsencrypt.org/directory"
}
},
{
"name": "privatekey_secret_name",
"type": "str",
"title": "Private Key Secret",
"required": false,
"default": "cloudflare-issuer-account-key",
"config": {
"placeholder": "cloudflare-issuer-account-key"
}
},
{
"name": "api_token_secret_name",
"type": "str",
"title": "API Token Secret",
"required": false,
"default": "cloudflare-api-token-secret",
"config": {
"placeholder": "cloudflare-api-token-secret"
}
},
{
"name": "api_token_secret_key",
"type": "str",
"title": "API Token Key",
"required": false,
"default": "api-token",
"description": "Key name in secret containing Cloudflare API token",
"config": {
"placeholder": "api-token"
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
@@ -0,0 +1,14 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: << resource_name >>
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: << role_kind >>
name: << role_name >>
subjects:
- kind: << subject_kind >>
name: << subject_name >>
<%- if subject_kind == "ServiceAccount" and subject_namespace %>
namespace: << subject_namespace >>
<%- endif %>
@@ -0,0 +1,100 @@
{
"slug": "core-clusterrolebinding",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes ClusterRoleBinding",
"description": "Creates a Kubernetes ClusterRoleBinding that binds one subject to a Role or ClusterRole.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-clusterrolebinding"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "ClusterRoleBinding name",
"required": false,
"default": "app-crb",
"config": {
"placeholder": "app-crb"
}
},
{
"name": "role_kind",
"type": "enum",
"title": "Role Kind",
"required": false,
"default": "ClusterRole",
"config": {
"options": [
"ClusterRole",
"Role"
]
}
},
{
"name": "role_name",
"type": "str",
"title": "Referenced role name",
"required": false,
"default": "cluster-admin",
"config": {
"placeholder": "cluster-admin"
}
}
]
},
{
"title": "Subject",
"name": "subject",
"items": [
{
"name": "subject_kind",
"type": "enum",
"title": "Subject kind",
"required": false,
"default": "ServiceAccount",
"config": {
"options": [
"ServiceAccount",
"User",
"Group"
]
}
},
{
"name": "subject_name",
"type": "str",
"title": "Subject name",
"required": false,
"default": "app-serviceaccount",
"config": {
"placeholder": "app-serviceaccount"
}
},
{
"name": "subject_namespace",
"type": "str",
"title": "Subject Namespace",
"required": false,
"default": "default",
"description": "Subject namespace for ServiceAccount subjects",
"config": {
"placeholder": "default"
}
}
]
}
]
}
+12
View File
@@ -0,0 +1,12 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: << resource_name >>
namespace: << namespace >>
data:
# Add your configuration key-value pairs here
# Example:
# app.properties: |
# color.good=green
# color.bad=red
+147
View File
@@ -0,0 +1,147 @@
{
"slug": "core-configmap",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes ConfigMap",
"description": "Kubernetes ConfigMap for storing non-sensitive configuration data as key-value pairs. Decouples configuration from container images.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-configmap"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "app-config",
"config": {
"placeholder": "app-config"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
+76
View File
@@ -0,0 +1,76 @@
apiVersion: batch/v1
kind: CronJob
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
schedule: "<< schedule >>"
suspend: << suspend | lower >>
concurrencyPolicy: << concurrency_policy >>
successfulJobsHistoryLimit: << successful_jobs_history_limit >>
failedJobsHistoryLimit: << failed_jobs_history_limit >>
jobTemplate:
spec:
backoffLimit: << backoff_limit >>
<%- if ttl_seconds_after_finished_enabled %>
ttlSecondsAfterFinished: << ttl_seconds_after_finished >>
<%- endif %>
template:
metadata:
labels:
app: << app_label >>
spec:
<%- if service_account_name %>
serviceAccountName: << service_account_name >>
<%- endif %>
restartPolicy: << restart_policy >>
containers:
- name: << container_name >>
image: << image >>
imagePullPolicy: << image_pull_policy >>
<%- if command_enabled %>
command:
<%- for command_item in command_items.split(',') %>
- "<< command_item.strip() >>"
<%- endfor %>
<%- endif %>
<%- if args_enabled %>
args:
<%- for args_item in args_items.split(',') %>
- "<< args_item.strip() >>"
<%- endfor %>
<%- endif %>
<%- if env_literal_enabled or env_secret_enabled %>
env:
<%- if env_literal_enabled %>
- name: << env_literal_name >>
value: "<< env_literal_value >>"
<%- endif %>
<%- if env_secret_enabled %>
- name: << env_secret_name >>
valueFrom:
secretKeyRef:
name: << env_secret_secret_name >>
key: << env_secret_secret_key >>
<%- endif %>
<%- endif %>
<%- if pvc_mount_enabled %>
volumeMounts:
- name: app-storage
mountPath: << pvc_mount_path >>
<%- endif %>
<%- if resources_enabled %>
resources:
limits:
cpu: << resources_cpu_limit >>
memory: << resources_memory_limit >>
requests:
cpu: << resources_cpu_request >>
memory: << resources_memory_request >>
<%- endif %>
<%- if pvc_mount_enabled %>
volumes:
- name: app-storage
persistentVolumeClaim:
claimName: << pvc_claim_name >>
<%- endif %>
+405
View File
@@ -0,0 +1,405 @@
{
"slug": "core-cronjob",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes CronJob",
"description": "Creates a Kubernetes CronJob with configurable schedule, image, command and args lists, simple environment variables, optional PVC mounting, and optional resource requests and limits.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-cronjob"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "CronJob name",
"required": false,
"default": "app-cronjob",
"config": {
"placeholder": "app-cronjob"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "app_label",
"type": "str",
"title": "App Label",
"required": false,
"default": "app",
"config": {
"placeholder": "app"
}
},
{
"name": "schedule",
"type": "str",
"title": "Schedule",
"required": false,
"default": "0 3 * * *",
"description": "Cron expression used by the CronJob.",
"config": {
"placeholder": "0 3 * * *"
}
},
{
"name": "suspend",
"type": "bool",
"title": "Suspend",
"required": false,
"default": false,
"description": "Suspend future scheduled runs."
},
{
"name": "concurrency_policy",
"type": "enum",
"title": "Concurrency policy",
"required": false,
"default": "Forbid",
"description": "Policy used when a scheduled run overlaps with a previous run.",
"config": {
"options": [
"Allow",
"Forbid",
"Replace"
]
}
},
{
"name": "successful_jobs_history_limit",
"type": "int",
"title": "Successful jobs history limit",
"required": false,
"default": 3,
"description": "Number of successful Job resources to retain.",
"config": {
"placeholder": "3"
}
},
{
"name": "failed_jobs_history_limit",
"type": "int",
"title": "Failed jobs history limit",
"required": false,
"default": 1,
"description": "Number of failed Job resources to retain.",
"config": {
"placeholder": "1"
}
},
{
"name": "backoff_limit",
"type": "int",
"title": "Backoff limit",
"required": false,
"default": 1,
"description": "Number of retries before the Job is marked failed.",
"config": {
"placeholder": "1"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart policy",
"required": false,
"default": "OnFailure",
"description": "Restart policy used for Job Pods.",
"config": {
"options": [
"Never",
"OnFailure"
]
}
},
{
"name": "service_account_name",
"type": "str",
"title": "ServiceAccount Name",
"required": false,
"config": {
"placeholder": "backup-serviceaccount"
}
},
{
"name": "ttl_seconds_after_finished_enabled",
"type": "bool",
"title": "Job TTL",
"required": false,
"default": false,
"description": "Set a TTL for finished Jobs."
},
{
"name": "ttl_seconds_after_finished",
"type": "int",
"title": "TTL seconds after finished",
"required": false,
"default": 86400,
"description": "TTL in seconds for finished Jobs.",
"config": {
"placeholder": "86400"
}
}
]
},
{
"title": "Container",
"name": "container",
"items": [
{
"name": "container_name",
"type": "str",
"title": "Container name",
"required": false,
"default": "job",
"config": {
"placeholder": "job"
}
},
{
"name": "image",
"type": "str",
"title": "Container image reference",
"required": true,
"description": "Container image used by the CronJob.",
"config": {
"placeholder": "alpine:3.21"
}
},
{
"name": "image_pull_policy",
"type": "enum",
"title": "Image pull policy",
"required": false,
"default": "IfNotPresent",
"config": {
"options": [
"Always",
"IfNotPresent",
"Never"
]
}
},
{
"name": "command_enabled",
"type": "bool",
"title": "Command",
"required": false,
"default": false,
"description": "Render a custom command list."
},
{
"name": "command_items",
"type": "str",
"title": "Command items",
"required": false,
"default": "sh,-c,echo hello from cronjob",
"description": "Comma-separated command list rendered as the container command array.",
"config": {
"placeholder": "sh,-c,echo hello from cronjob"
}
},
{
"name": "args_enabled",
"type": "bool",
"title": "Args",
"required": false,
"default": false,
"description": "Render a custom args list."
},
{
"name": "args_items",
"type": "str",
"title": "Args items",
"required": false,
"default": "--verbose,--all",
"description": "Comma-separated args list rendered as the container args array.",
"config": {
"placeholder": "--verbose,--all"
}
}
]
},
{
"title": "Environment",
"name": "environment",
"items": [
{
"name": "env_literal_enabled",
"type": "bool",
"title": "Literal Env Var",
"required": false,
"default": false,
"description": "Add one literal environment variable."
},
{
"name": "env_literal_name",
"type": "str",
"title": "Literal Env Name",
"required": false,
"default": "APP_ENV",
"description": "Literal environment variable name.",
"config": {
"placeholder": "APP_ENV"
}
},
{
"name": "env_literal_value",
"type": "str",
"title": "Literal Env Value",
"required": false,
"default": "production",
"description": "Literal environment variable value.",
"config": {
"placeholder": "production"
}
},
{
"name": "env_secret_enabled",
"type": "bool",
"title": "Secret Env Var",
"required": false,
"default": false,
"description": "Add one secret-backed environment variable."
},
{
"name": "env_secret_name",
"type": "str",
"title": "Secret Env Name",
"required": false,
"default": "APP_SECRET",
"config": {
"placeholder": "APP_SECRET"
}
},
{
"name": "env_secret_secret_name",
"type": "str",
"title": "Secret resource name",
"required": false,
"default": "app-secret",
"config": {
"placeholder": "app-secret"
}
},
{
"name": "env_secret_secret_key",
"type": "str",
"title": "Secret key",
"required": false,
"default": "password",
"config": {
"placeholder": "password"
}
}
]
},
{
"title": "Storage",
"name": "storage",
"items": [
{
"name": "pvc_mount_enabled",
"type": "bool",
"title": "PersistentVolumeClaim mount",
"required": false,
"default": false,
"description": "Mount an existing PersistentVolumeClaim into the Job Pod."
},
{
"name": "pvc_claim_name",
"type": "str",
"title": "PersistentVolumeClaim name",
"required": false,
"default": "app-pvc",
"description": "Existing claim name to mount.",
"config": {
"placeholder": "app-pvc"
}
},
{
"name": "pvc_mount_path",
"type": "str",
"title": "Mount path",
"required": false,
"default": "/data",
"config": {
"placeholder": "/data"
}
}
]
},
{
"title": "Resources",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "500m",
"config": {
"placeholder": "500m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "512Mi",
"config": {
"placeholder": "512Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
}
]
}
]
}
+79
View File
@@ -0,0 +1,79 @@
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
selector:
matchLabels:
app: << app_label >>
updateStrategy:
type: << update_strategy >>
template:
metadata:
labels:
app: << app_label >>
spec:
<%- if host_network_enabled %>
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
<%- endif %>
<%- if service_account_name %>
serviceAccountName: << service_account_name >>
<%- endif %>
<%- if control_plane_toleration_enabled %>
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
<%- endif %>
containers:
- name: << container_name >>
image: << image >>
imagePullPolicy: << image_pull_policy >>
<%- if ports_enabled %>
ports:
- containerPort: << container_port >>
protocol: << container_port_protocol >>
<%- if container_port_name %>
name: << container_port_name >>
<%- endif %>
<%- endif %>
<%- if env_literal_enabled or env_fieldref_enabled %>
env:
<%- if env_literal_enabled %>
- name: << env_literal_name >>
value: "<< env_literal_value >>"
<%- endif %>
<%- if env_fieldref_enabled %>
- name: << env_fieldref_name >>
valueFrom:
fieldRef:
fieldPath: << env_fieldref_field_path >>
<%- endif %>
<%- endif %>
<%- if host_path_enabled %>
volumeMounts:
- name: host-path
mountPath: << mount_path >>
readOnly: << host_path_read_only | lower >>
<%- endif %>
<%- if resources_enabled %>
resources:
limits:
cpu: << resources_cpu_limit >>
memory: << resources_memory_limit >>
requests:
cpu: << resources_cpu_request >>
memory: << resources_memory_request >>
<%- endif %>
<%- if host_path_enabled %>
volumes:
- name: host-path
hostPath:
path: << host_path >>
type: DirectoryOrCreate
<%- endif %>
+337
View File
@@ -0,0 +1,337 @@
{
"slug": "core-daemonset",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes DaemonSet",
"description": "Creates a Kubernetes DaemonSet with configurable image, optional host networking, one container port, simple environment variables, an optional hostPath mount, optional control-plane tolerations, and optional resource requests and limits.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-daemonset"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "DaemonSet name",
"required": false,
"default": "app-daemonset",
"config": {
"placeholder": "app-daemonset"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "app_label",
"type": "str",
"title": "App Label",
"required": false,
"default": "app",
"config": {
"placeholder": "app"
}
},
{
"name": "update_strategy",
"type": "enum",
"title": "Update strategy",
"required": false,
"default": "RollingUpdate",
"config": {
"options": [
"RollingUpdate",
"OnDelete"
]
}
},
{
"name": "service_account_name",
"type": "str",
"title": "ServiceAccount Name",
"required": false,
"config": {
"placeholder": "agent-serviceaccount"
}
},
{
"name": "host_network_enabled",
"type": "bool",
"title": "Host network",
"required": false,
"default": false,
"description": "Run Pods on the host network namespace."
},
{
"name": "control_plane_toleration_enabled",
"type": "bool",
"title": "Control-plane toleration",
"required": false,
"default": false,
"description": "Allow scheduling on control-plane nodes."
}
]
},
{
"title": "Container",
"name": "container",
"items": [
{
"name": "container_name",
"type": "str",
"title": "Container name",
"required": false,
"default": "agent",
"config": {
"placeholder": "agent"
}
},
{
"name": "image",
"type": "str",
"title": "Container image reference",
"required": true,
"description": "Container image used by the DaemonSet.",
"config": {
"placeholder": "prom/node-exporter:v1.9.1"
}
},
{
"name": "image_pull_policy",
"type": "enum",
"title": "Image pull policy",
"required": false,
"default": "IfNotPresent",
"config": {
"options": [
"Always",
"IfNotPresent",
"Never"
]
}
},
{
"name": "ports_enabled",
"type": "bool",
"title": "Container Port",
"required": false,
"default": false
},
{
"name": "container_port",
"type": "int",
"title": "Container port number",
"required": false,
"default": 9100,
"config": {
"placeholder": "9100"
}
},
{
"name": "container_port_name",
"type": "str",
"title": "Port name",
"required": false,
"default": "metrics",
"config": {
"placeholder": "metrics"
}
},
{
"name": "container_port_protocol",
"type": "enum",
"title": "Port protocol",
"required": false,
"default": "TCP",
"config": {
"options": [
"TCP",
"UDP",
"SCTP"
]
}
}
]
},
{
"title": "Environment",
"name": "environment",
"items": [
{
"name": "env_literal_enabled",
"type": "bool",
"title": "Literal Env Var",
"required": false,
"default": false,
"description": "Add one literal environment variable."
},
{
"name": "env_literal_name",
"type": "str",
"title": "Literal Env Name",
"required": false,
"default": "APP_ENV",
"description": "Literal environment variable name.",
"config": {
"placeholder": "APP_ENV"
}
},
{
"name": "env_literal_value",
"type": "str",
"title": "Literal Env Value",
"required": false,
"default": "production",
"description": "Literal environment variable value.",
"config": {
"placeholder": "production"
}
},
{
"name": "env_fieldref_enabled",
"type": "bool",
"title": "FieldRef Var",
"required": false,
"default": false,
"description": "Add one fieldRef environment variable."
},
{
"name": "env_fieldref_name",
"type": "str",
"title": "FieldRef Name",
"required": false,
"default": "NODE_NAME",
"description": "FieldRef environment variable name.",
"config": {
"placeholder": "NODE_NAME"
}
},
{
"name": "env_fieldref_field_path",
"type": "str",
"title": "FieldRef field path",
"required": false,
"default": "spec.nodeName",
"description": "Field path used for the fieldRef.",
"config": {
"placeholder": "spec.nodeName"
}
}
]
},
{
"title": "Storage",
"name": "storage",
"items": [
{
"name": "host_path_enabled",
"type": "bool",
"title": "HostPath mount",
"required": false,
"default": false,
"description": "Mount a hostPath into the container."
},
{
"name": "host_path",
"type": "str",
"title": "Host path",
"required": false,
"default": "/var/log",
"description": "Host path mounted into the container.",
"config": {
"placeholder": "/var/log"
}
},
{
"name": "mount_path",
"type": "str",
"title": "Mount path",
"required": false,
"default": "/var/log/host",
"config": {
"placeholder": "/var/log/host"
}
},
{
"name": "host_path_read_only",
"type": "bool",
"title": "Read-only mount",
"required": false,
"default": true,
"description": "Mount the hostPath read-only inside the container."
}
]
},
{
"title": "Resources",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "200m",
"config": {
"placeholder": "200m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "256Mi",
"config": {
"placeholder": "256Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
}
]
}
@@ -0,0 +1,52 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
replicas: << replicas >>
selector:
matchLabels:
app: << app_label >>
template:
metadata:
labels:
app: << app_label >>
spec:
<%- if service_account_name %>
serviceAccountName: << service_account_name >>
<%- endif %>
containers:
- name: << container_name >>
image: << image >>
imagePullPolicy: << image_pull_policy >>
<%- if ports_enabled %>
ports:
- containerPort: << container_port >>
protocol: << container_port_protocol >>
<%- if container_port_name %>
name: << container_port_name >>
<%- endif %>
<%- endif %>
<%- if env_literal_enabled or env_fieldref_enabled %>
env:
<%- if env_literal_enabled %>
- name: << env_literal_name >>
value: "<< env_literal_value >>"
<%- endif %>
<%- if env_fieldref_enabled %>
- name: << env_fieldref_name >>
valueFrom:
fieldRef:
fieldPath: << env_fieldref_field_path >>
<%- endif %>
<%- endif %>
<%- if resources_enabled %>
resources:
limits:
cpu: << resources_cpu_limit >>
memory: << resources_memory_limit >>
requests:
cpu: << resources_cpu_request >>
memory: << resources_memory_request >>
<%- endif %>
+276
View File
@@ -0,0 +1,276 @@
{
"slug": "core-deployment",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes Deployment",
"description": "Creates a Kubernetes Deployment with configurable image, replicas, service account, container port, simple environment variables, and optional resource requests and limits.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-deployment"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Deployment name",
"required": false,
"default": "app-deployment",
"config": {
"placeholder": "app-deployment"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "app_label",
"type": "str",
"title": "App Label",
"required": false,
"default": "app",
"config": {
"placeholder": "app"
}
},
{
"name": "replicas",
"type": "int",
"title": "Replicas",
"required": false,
"default": 1,
"config": {
"slider": true,
"min": 1,
"max": 20,
"step": 1,
"placeholder": "1"
}
},
{
"name": "service_account_name",
"type": "str",
"title": "ServiceAccount Name",
"required": false,
"config": {
"placeholder": "app-serviceaccount"
}
}
]
},
{
"title": "Container",
"name": "container",
"items": [
{
"name": "container_name",
"type": "str",
"title": "Container name",
"required": false,
"default": "app",
"config": {
"placeholder": "app"
}
},
{
"name": "image",
"type": "str",
"title": "Container image reference",
"required": true,
"config": {
"placeholder": "nginx:stable"
}
},
{
"name": "image_pull_policy",
"type": "enum",
"title": "Image pull policy",
"required": false,
"default": "IfNotPresent",
"config": {
"options": [
"Always",
"IfNotPresent",
"Never"
]
}
},
{
"name": "ports_enabled",
"type": "bool",
"title": "Container Port",
"required": false,
"default": true
},
{
"name": "container_port",
"type": "int",
"title": "Container port number",
"required": false,
"default": 8080,
"config": {
"placeholder": "8080"
}
},
{
"name": "container_port_name",
"type": "str",
"title": "Port name",
"required": false,
"default": "http",
"config": {
"placeholder": "http"
}
},
{
"name": "container_port_protocol",
"type": "enum",
"title": "Port protocol",
"required": false,
"default": "TCP",
"config": {
"options": [
"TCP",
"UDP",
"SCTP"
]
}
}
]
},
{
"title": "Environment",
"name": "environment",
"items": [
{
"name": "env_literal_enabled",
"type": "bool",
"title": "Env Var",
"required": false,
"default": false,
"description": "Add one literal environment variable"
},
{
"name": "env_literal_name",
"type": "str",
"title": "Env Name",
"required": false,
"default": "APP_ENV",
"config": {
"placeholder": "APP_ENV"
}
},
{
"name": "env_literal_value",
"type": "str",
"title": "Env Value",
"required": false,
"default": "production",
"config": {
"placeholder": "production"
}
},
{
"name": "env_fieldref_enabled",
"type": "bool",
"title": "FieldRef Var",
"required": false,
"default": false,
"description": "Add one fieldRef environment variable"
},
{
"name": "env_fieldref_name",
"type": "str",
"title": "FieldRef Name",
"required": false,
"default": "POD_IP",
"config": {
"placeholder": "POD_IP"
}
},
{
"name": "env_fieldref_field_path",
"type": "str",
"title": "Field Path",
"required": false,
"default": "status.podIP",
"description": "Kubernetes field path for the fieldRef environment variable",
"config": {
"placeholder": "status.podIP"
}
}
]
},
{
"title": "Resources",
"toggle": "resources_enabled",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "500m",
"config": {
"placeholder": "500m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "512Mi",
"config": {
"placeholder": "512Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
}
]
}
]
}
+19
View File
@@ -0,0 +1,19 @@
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
ingressClassName: << ingress_class >>
rules:
- host: << ingress_host >>
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: << service_name >>
port:
number: << service_port >>
+179
View File
@@ -0,0 +1,179 @@
{
"slug": "core-ingress",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes Ingress",
"description": "Kubernetes Ingress resource for HTTP/HTTPS routing to backend services.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-ingress"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "app-ingress",
"config": {
"placeholder": "app-ingress"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "ingress_class",
"type": "str",
"title": "Ingress class name",
"required": false,
"default": "nginx",
"config": {
"placeholder": "nginx"
}
},
{
"name": "ingress_host",
"type": "str",
"title": "Ingress Host",
"required": true
},
{
"name": "service_name",
"type": "str",
"title": "Backend service name",
"required": true
},
{
"name": "service_port",
"type": "int",
"title": "Backend service port",
"required": false,
"default": 80,
"config": {
"placeholder": "80"
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
@@ -0,0 +1,11 @@
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: << resource_name >>
<%- if is_default %>
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
<%- endif %>
spec:
controller: << controller >>
+155
View File
@@ -0,0 +1,155 @@
{
"slug": "core-ingressclass",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes IngressClass",
"description": "Kubernetes IngressClass for specifying which Ingress controller handles Ingress resources. Cluster-scoped resource.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-ingressclass"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "nginx",
"config": {
"placeholder": "nginx"
}
},
{
"name": "controller",
"type": "str",
"title": "Controller",
"required": false,
"default": "k8s.io/ingress-nginx",
"description": "Ingress controller identifier (e.g., k8s.io/ingress-nginx)",
"config": {
"placeholder": "k8s.io/ingress-nginx"
}
},
{
"name": "is_default",
"type": "bool",
"title": "Default Class",
"required": false,
"default": false
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
+12
View File
@@ -0,0 +1,12 @@
apiVersion: v1
kind: Namespace
metadata:
name: << namespace_name >>
<%- if labels_enabled %>
labels:
"<< label_key >>": "<< label_value >>"
<%- endif %>
<%- if annotations_enabled %>
annotations:
"<< annotation_key >>": "<< annotation_value >>"
<%- endif %>
+104
View File
@@ -0,0 +1,104 @@
{
"slug": "core-namespace",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes Namespace",
"description": "Creates a Kubernetes Namespace with optional single label and annotation entries for basic environment scoping.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-namespace"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "namespace_name",
"type": "str",
"title": "Namespace name",
"required": false,
"default": "app",
"config": {
"placeholder": "app"
}
}
]
},
{
"title": "Labels",
"name": "labels",
"items": [
{
"name": "labels_enabled",
"type": "bool",
"title": "Label",
"required": false,
"default": false,
"description": "Add a label entry to the namespace"
},
{
"name": "label_key",
"type": "str",
"title": "Label key",
"required": false,
"default": "app.kubernetes.io/name",
"config": {
"placeholder": "app.kubernetes.io/name"
}
},
{
"name": "label_value",
"type": "str",
"title": "Label value",
"required": false,
"default": "app",
"config": {
"placeholder": "app"
}
}
]
},
{
"title": "Annotations",
"name": "annotations",
"items": [
{
"name": "annotations_enabled",
"type": "bool",
"title": "Annotation",
"required": false,
"default": false,
"description": "Add an annotation entry to the namespace"
},
{
"name": "annotation_key",
"type": "str",
"title": "Annotation key",
"required": false,
"default": "app.kubernetes.io/part-of",
"config": {
"placeholder": "app.kubernetes.io/part-of"
}
},
{
"name": "annotation_value",
"type": "str",
"title": "Annotation value",
"required": false,
"default": "platform",
"config": {
"placeholder": "platform"
}
}
]
}
]
}
@@ -0,0 +1,78 @@
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
<%- if apply_to_all_pods %>
podSelector: {}
<%- else %>
podSelector:
matchLabels:
<< pod_selector_label_key >>: << pod_selector_label_value >>
<%- endif %>
<%- if ingress_enabled or egress_enabled %>
policyTypes:
<%- if ingress_enabled %>
- Ingress
<%- endif %>
<%- if egress_enabled %>
- Egress
<%- endif %>
<%- endif %>
<%- if ingress_enabled %>
<%- if ingress_allow_same_namespace or ingress_namespace_selector_enabled or ingress_ipblock_enabled or ingress_port_enabled %>
ingress:
-
<%- if ingress_allow_same_namespace or ingress_namespace_selector_enabled or ingress_ipblock_enabled %>
from:
<%- if ingress_allow_same_namespace %>
- podSelector: {}
<%- endif %>
<%- if ingress_namespace_selector_enabled %>
- namespaceSelector:
matchLabels:
<< ingress_namespace_selector_label_key >>: << ingress_namespace_selector_label_value >>
<%- endif %>
<%- if ingress_ipblock_enabled %>
- ipBlock:
cidr: << ingress_ipblock_cidr >>
<%- endif %>
<%- endif %>
<%- if ingress_port_enabled %>
ports:
- port: << ingress_port >>
protocol: << ingress_port_protocol >>
<%- endif %>
<%- else %>
ingress: []
<%- endif %>
<%- endif %>
<%- if egress_enabled %>
<%- if egress_allow_same_namespace or egress_namespace_selector_enabled or egress_ipblock_enabled or egress_port_enabled %>
egress:
-
<%- if egress_allow_same_namespace or egress_namespace_selector_enabled or egress_ipblock_enabled %>
to:
<%- if egress_allow_same_namespace %>
- podSelector: {}
<%- endif %>
<%- if egress_namespace_selector_enabled %>
- namespaceSelector:
matchLabels:
<< egress_namespace_selector_label_key >>: << egress_namespace_selector_label_value >>
<%- endif %>
<%- if egress_ipblock_enabled %>
- ipBlock:
cidr: << egress_ipblock_cidr >>
<%- endif %>
<%- endif %>
<%- if egress_port_enabled %>
ports:
- port: << egress_port >>
protocol: << egress_port_protocol >>
<%- endif %>
<%- else %>
egress: []
<%- endif %>
<%- endif %>
+288
View File
@@ -0,0 +1,288 @@
{
"slug": "core-networkpolicy",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes NetworkPolicy",
"description": "Creates a Kubernetes NetworkPolicy with targeted pod selection, optional ingress and egress policy types, and simple peer and port controls for common isolation patterns.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-networkpolicy"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "NetworkPolicy name",
"required": false,
"default": "app-networkpolicy",
"config": {
"placeholder": "app-networkpolicy"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
}
]
},
{
"title": "Target Pods",
"name": "target",
"items": [
{
"name": "apply_to_all_pods",
"type": "bool",
"title": "Apply to all Pods",
"required": false,
"default": false,
"description": "Target all Pods in the namespace instead of a specific label selector."
},
{
"name": "pod_selector_label_key",
"type": "str",
"title": "Pod selector label key",
"required": false,
"default": "app",
"description": "Label key used to select target Pods.",
"config": {
"placeholder": "app"
}
},
{
"name": "pod_selector_label_value",
"type": "str",
"title": "Pod selector label value",
"required": false,
"default": "app",
"description": "Label value used to select target Pods.",
"config": {
"placeholder": "app"
}
}
]
},
{
"title": "Ingress",
"name": "ingress",
"items": [
{
"name": "ingress_enabled",
"type": "bool",
"title": "Ingress policy",
"required": false,
"default": true
},
{
"name": "ingress_allow_same_namespace",
"type": "bool",
"title": "Allow same-namespace ingress",
"required": false,
"default": true,
"description": "Allow ingress from any Pod in the same namespace."
},
{
"name": "ingress_namespace_selector_enabled",
"type": "bool",
"title": "Namespace selector",
"required": false,
"default": false,
"description": "Allow ingress from namespaces matching one label selector."
},
{
"name": "ingress_namespace_selector_label_key",
"type": "str",
"title": "Namespace selector label key",
"required": false,
"default": "kubernetes.io/metadata.name",
"description": "Namespace label key used for the ingress namespace selector.",
"config": {
"placeholder": "kubernetes.io/metadata.name"
}
},
{
"name": "ingress_namespace_selector_label_value",
"type": "str",
"title": "Namespace selector label value",
"required": false,
"default": "ingress",
"description": "Namespace label value used for the ingress namespace selector.",
"config": {
"placeholder": "ingress"
}
},
{
"name": "ingress_ipblock_enabled",
"type": "bool",
"title": "IPBlock source",
"required": false,
"default": false,
"description": "Allow ingress from one CIDR block."
},
{
"name": "ingress_ipblock_cidr",
"type": "str",
"title": "Ingress CIDR",
"required": false,
"default": "10.0.0.0/8",
"description": "CIDR block allowed for ingress traffic.",
"config": {
"placeholder": "10.0.0.0/8"
}
},
{
"name": "ingress_port_enabled",
"type": "bool",
"title": "Port restriction",
"required": false,
"default": false,
"description": "Restrict ingress to one port."
},
{
"name": "ingress_port",
"type": "int",
"title": "Ingress port",
"required": false,
"default": 80,
"description": "Port allowed for ingress traffic.",
"config": {
"placeholder": "80"
}
},
{
"name": "ingress_port_protocol",
"type": "enum",
"title": "Ingress port protocol",
"required": false,
"default": "TCP",
"config": {
"options": [
"TCP",
"UDP",
"SCTP"
]
}
}
]
},
{
"title": "Egress",
"name": "egress",
"items": [
{
"name": "egress_enabled",
"type": "bool",
"title": "Egress policy",
"required": false,
"default": false
},
{
"name": "egress_allow_same_namespace",
"type": "bool",
"title": "Allow same-namespace egress",
"required": false,
"default": false,
"description": "Allow egress to any Pod in the same namespace."
},
{
"name": "egress_namespace_selector_enabled",
"type": "bool",
"title": "Namespace selector",
"required": false,
"default": false,
"description": "Allow egress to namespaces matching one label selector."
},
{
"name": "egress_namespace_selector_label_key",
"type": "str",
"title": "Namespace selector label key",
"required": false,
"default": "kubernetes.io/metadata.name",
"description": "Namespace label key used for the egress namespace selector.",
"config": {
"placeholder": "kubernetes.io/metadata.name"
}
},
{
"name": "egress_namespace_selector_label_value",
"type": "str",
"title": "Namespace selector label value",
"required": false,
"default": "database",
"description": "Namespace label value used for the egress namespace selector.",
"config": {
"placeholder": "database"
}
},
{
"name": "egress_ipblock_enabled",
"type": "bool",
"title": "IPBlock destination",
"required": false,
"default": false,
"description": "Allow egress to one CIDR block."
},
{
"name": "egress_ipblock_cidr",
"type": "str",
"title": "Egress CIDR",
"required": false,
"default": "0.0.0.0/0",
"description": "CIDR block allowed for egress traffic.",
"config": {
"placeholder": "0.0.0.0/0"
}
},
{
"name": "egress_port_enabled",
"type": "bool",
"title": "Port restriction",
"required": false,
"default": false,
"description": "Restrict egress to one port."
},
{
"name": "egress_port",
"type": "int",
"title": "Egress port",
"required": false,
"default": 443,
"description": "Port allowed for egress traffic.",
"config": {
"placeholder": "443"
}
},
{
"name": "egress_port_protocol",
"type": "enum",
"title": "Egress port protocol",
"required": false,
"default": "TCP",
"config": {
"options": [
"TCP",
"UDP",
"SCTP"
]
}
}
]
}
]
}
@@ -0,0 +1,16 @@
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: << resource_name >>
spec:
capacity:
storage: << storage_size >>
<%- if storage_class %>
storageClassName: << storage_class >>
<%- endif %>
accessModes:
- << access_mode >>
persistentVolumeReclaimPolicy: << reclaim_policy >>
hostPath:
path: << host_path >>
@@ -0,0 +1,195 @@
{
"slug": "core-persistentvolume",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes PersistentVolume",
"description": "Kubernetes PersistentVolume for provisioning cluster-wide storage resources. Cluster-scoped, typically created by administrators.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-persistentvolume"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "pv-nfs",
"config": {
"placeholder": "pv-nfs"
}
},
{
"name": "storage_class",
"type": "str",
"title": "Storage class name",
"required": false,
"default": ""
},
{
"name": "storage_size",
"type": "str",
"title": "Storage Size",
"required": false,
"default": "10Gi",
"description": "Storage capacity (e.g., 10Gi, 1Ti)",
"config": {
"placeholder": "10Gi"
}
},
{
"name": "access_mode",
"type": "enum",
"title": "Access mode",
"required": false,
"default": "ReadWriteMany",
"config": {
"options": [
"ReadWriteOnce",
"ReadOnlyMany",
"ReadWriteMany",
"ReadWriteOncePod"
]
}
},
{
"name": "reclaim_policy",
"type": "enum",
"title": "Reclaim policy",
"required": false,
"default": "Retain",
"config": {
"options": [
"Retain",
"Recycle",
"Delete"
]
}
},
{
"name": "host_path",
"type": "str",
"title": "Host Path",
"required": false,
"default": "/data",
"description": "Host path for local storage (e.g., /path/to/data)",
"config": {
"placeholder": "/data"
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
@@ -0,0 +1,15 @@
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
<%- if storage_class %>
storageClassName: << storage_class >>
<%- endif %>
accessModes:
- << access_mode >>
resources:
requests:
storage: << storage_size >>
@@ -0,0 +1,181 @@
{
"slug": "core-persistentvolumeclaim",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes PersistentVolumeClaim",
"description": "Kubernetes PersistentVolumeClaim for requesting persistent storage. Used by Pods to claim durable storage from available PersistentVolumes.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-persistentvolumeclaim"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "app-pvc",
"config": {
"placeholder": "app-pvc"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "storage_class",
"type": "str",
"title": "Storage Class",
"required": false,
"default": "",
"description": "Storage class name (leave empty for default)"
},
{
"name": "storage_size",
"type": "str",
"title": "Storage Size",
"required": false,
"default": "10Gi",
"description": "Storage size (e.g., 10Gi, 1Ti)",
"config": {
"placeholder": "10Gi"
}
},
{
"name": "access_mode",
"type": "enum",
"title": "Access mode",
"required": false,
"default": "ReadWriteOnce",
"config": {
"options": [
"ReadWriteOnce",
"ReadOnlyMany",
"ReadWriteMany",
"ReadWriteOncePod"
]
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
+9
View File
@@ -0,0 +1,9 @@
---
apiVersion: v1
kind: Secret
metadata:
name: << resource_name >>
namespace: << namespace >>
type: << secret_type >>
stringData:
api-token: << api_token >>
+169
View File
@@ -0,0 +1,169 @@
{
"slug": "core-secret",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes Secret (Opaque)",
"description": "Kubernetes Secret (Opaque type) for storing sensitive data like API tokens, passwords, or keys.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-secret"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "api-token-secret",
"config": {
"placeholder": "api-token-secret"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "secret_type",
"type": "str",
"title": "Secret type",
"required": false,
"default": "Opaque",
"config": {
"placeholder": "Opaque"
}
},
{
"name": "api_token",
"type": "secret",
"title": "API Token",
"required": false,
"description": "API token value (plain text, Kubernetes will encode it)",
"config": {
"autogenerated": {
"length": 40
}
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
+15
View File
@@ -0,0 +1,15 @@
---
apiVersion: v1
kind: Service
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
type: << service_type >>
selector:
app.kubernetes.io/name: << app_selector >>
ports:
- name: << protocol | lower >>
protocol: << protocol >>
port: << service_port >>
targetPort: << target_port >>
+203
View File
@@ -0,0 +1,203 @@
{
"slug": "core-service",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes Service",
"description": "Kubernetes Service for exposing applications running on a set of Pods. Provides stable network endpoints and load balancing.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-service"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "app-service",
"config": {
"placeholder": "app-service"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "service_type",
"type": "enum",
"title": "Service type",
"required": false,
"default": "ClusterIP",
"config": {
"options": [
"ClusterIP",
"NodePort",
"LoadBalancer",
"ExternalName"
]
}
},
{
"name": "service_port",
"type": "int",
"title": "Service port",
"required": false,
"default": 80,
"config": {
"placeholder": "80"
}
},
{
"name": "target_port",
"type": "int",
"title": "Target Port",
"required": false,
"default": 8080,
"config": {
"placeholder": "8080"
}
},
{
"name": "protocol",
"type": "enum",
"title": "Protocol",
"required": false,
"default": "TCP",
"config": {
"options": [
"TCP",
"UDP",
"SCTP"
]
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
},
{
"name": "app_selector",
"type": "str",
"title": "App Selector",
"required": true,
"description": "App label selector (e.g., app.kubernetes.io/name value)"
}
]
}
]
}
@@ -0,0 +1,6 @@
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: << resource_name >>
namespace: << namespace >>
@@ -0,0 +1,147 @@
{
"slug": "core-serviceaccount",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes ServiceAccount",
"description": "Kubernetes ServiceAccount for providing an identity to processes running in Pods. Controls access permissions to the Kubernetes API.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-serviceaccount"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "app-serviceaccount",
"config": {
"placeholder": "app-serviceaccount"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
@@ -0,0 +1,76 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
serviceName: << service_name >>
replicas: << replicas >>
podManagementPolicy: << pod_management_policy >>
updateStrategy:
type: << update_strategy >>
selector:
matchLabels:
app: << app_label >>
template:
metadata:
labels:
app: << app_label >>
spec:
<%- if service_account_name %>
serviceAccountName: << service_account_name >>
<%- endif %>
containers:
- name: << container_name >>
image: << image >>
imagePullPolicy: << image_pull_policy >>
<%- if ports_enabled %>
ports:
- containerPort: << container_port >>
protocol: << container_port_protocol >>
<%- if container_port_name %>
name: << container_port_name >>
<%- endif %>
<%- endif %>
<%- if env_literal_enabled or env_secret_enabled %>
env:
<%- if env_literal_enabled %>
- name: << env_literal_name >>
value: "<< env_literal_value >>"
<%- endif %>
<%- if env_secret_enabled %>
- name: << env_secret_name >>
valueFrom:
secretKeyRef:
name: << env_secret_secret_name >>
key: << env_secret_secret_key >>
<%- endif %>
<%- endif %>
<%- if persistence_enabled %>
volumeMounts:
- name: << volume_claim_name >>
mountPath: << mount_path >>
<%- endif %>
<%- if resources_enabled %>
resources:
limits:
cpu: << resources_cpu_limit >>
memory: << resources_memory_limit >>
requests:
cpu: << resources_cpu_request >>
memory: << resources_memory_request >>
<%- endif %>
<%- if persistence_enabled %>
volumeClaimTemplates:
- metadata:
name: << volume_claim_name >>
spec:
<%- if storage_class %>
storageClassName: << storage_class >>
<%- endif %>
accessModes:
- << access_mode >>
resources:
requests:
storage: << storage_size >>
<%- endif %>
+398
View File
@@ -0,0 +1,398 @@
{
"slug": "core-statefulset",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes StatefulSet",
"description": "Creates a Kubernetes StatefulSet with configurable image, replicas, optional service account, one container port, simple environment variables, optional resource requests and limits, and an optional volumeClaimTemplate for persistent storage.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-statefulset"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "StatefulSet name",
"required": false,
"default": "app-statefulset",
"config": {
"placeholder": "app-statefulset"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "app_label",
"type": "str",
"title": "App Label",
"required": false,
"default": "app",
"config": {
"placeholder": "app"
}
},
{
"name": "service_name",
"type": "str",
"title": "Service name",
"required": false,
"default": "app",
"description": "Service name referenced by the StatefulSet for stable network identity.",
"config": {
"placeholder": "app"
}
},
{
"name": "replicas",
"type": "int",
"title": "Replicas",
"required": false,
"default": 1,
"description": "Number of Pod replicas.",
"config": {
"slider": true,
"min": 1,
"max": 20,
"step": 1,
"placeholder": "1"
}
},
{
"name": "pod_management_policy",
"type": "enum",
"title": "Pod management policy",
"required": false,
"default": "OrderedReady",
"config": {
"options": [
"OrderedReady",
"Parallel"
]
}
},
{
"name": "update_strategy",
"type": "enum",
"title": "Update strategy",
"required": false,
"default": "RollingUpdate",
"config": {
"options": [
"RollingUpdate",
"OnDelete"
]
}
},
{
"name": "service_account_name",
"type": "str",
"title": "ServiceAccount Name",
"required": false,
"config": {
"placeholder": "app-serviceaccount"
}
}
]
},
{
"title": "Container",
"name": "container",
"items": [
{
"name": "container_name",
"type": "str",
"title": "Container name",
"required": false,
"default": "app",
"config": {
"placeholder": "app"
}
},
{
"name": "image",
"type": "str",
"title": "Container image reference",
"required": true,
"description": "Container image used by the StatefulSet.",
"config": {
"placeholder": "nginx:stable"
}
},
{
"name": "image_pull_policy",
"type": "enum",
"title": "Image pull policy",
"required": false,
"default": "IfNotPresent",
"config": {
"options": [
"Always",
"IfNotPresent",
"Never"
]
}
},
{
"name": "ports_enabled",
"type": "bool",
"title": "Container Port",
"required": false,
"default": true
},
{
"name": "container_port",
"type": "int",
"title": "Container port number",
"required": false,
"default": 8080,
"config": {
"placeholder": "8080"
}
},
{
"name": "container_port_name",
"type": "str",
"title": "Port name",
"required": false,
"default": "http",
"config": {
"placeholder": "http"
}
},
{
"name": "container_port_protocol",
"type": "enum",
"title": "Port protocol",
"required": false,
"default": "TCP",
"config": {
"options": [
"TCP",
"UDP",
"SCTP"
]
}
}
]
},
{
"title": "Environment",
"name": "environment",
"items": [
{
"name": "env_literal_enabled",
"type": "bool",
"title": "Literal Env Var",
"required": false,
"default": false,
"description": "Add one literal environment variable."
},
{
"name": "env_literal_name",
"type": "str",
"title": "Literal Env Name",
"required": false,
"default": "APP_ENV",
"description": "Literal environment variable name.",
"config": {
"placeholder": "APP_ENV"
}
},
{
"name": "env_literal_value",
"type": "str",
"title": "Literal Env Value",
"required": false,
"default": "production",
"description": "Literal environment variable value.",
"config": {
"placeholder": "production"
}
},
{
"name": "env_secret_enabled",
"type": "bool",
"title": "Secret Env Var",
"required": false,
"default": false,
"description": "Add one secret-backed environment variable."
},
{
"name": "env_secret_name",
"type": "str",
"title": "Secret Env Name",
"required": false,
"default": "APP_SECRET",
"config": {
"placeholder": "APP_SECRET"
}
},
{
"name": "env_secret_secret_name",
"type": "str",
"title": "Secret resource name",
"required": false,
"default": "app-secret",
"config": {
"placeholder": "app-secret"
}
},
{
"name": "env_secret_secret_key",
"type": "str",
"title": "Secret key",
"required": false,
"default": "password",
"config": {
"placeholder": "password"
}
}
]
},
{
"title": "Storage",
"name": "storage",
"items": [
{
"name": "persistence_enabled",
"type": "bool",
"title": "Persistent storage",
"required": false,
"default": true,
"description": "Create a volumeClaimTemplate and mount it into the container."
},
{
"name": "volume_claim_name",
"type": "str",
"title": "Volume claim template name",
"required": false,
"default": "data",
"description": "Name used for the generated volumeClaimTemplate.",
"config": {
"placeholder": "data"
}
},
{
"name": "mount_path",
"type": "str",
"title": "Mount path",
"required": false,
"default": "/data",
"config": {
"placeholder": "/data"
}
},
{
"name": "storage_class",
"type": "str",
"title": "Storage Class",
"required": false,
"default": "",
"description": "Storage class name. Leave empty to use the cluster default.",
"config": {
"placeholder": "longhorn"
}
},
{
"name": "storage_size",
"type": "str",
"title": "Storage Size",
"required": false,
"default": "10Gi",
"description": "Requested storage size.",
"config": {
"placeholder": "10Gi"
}
},
{
"name": "access_mode",
"type": "enum",
"title": "Access mode",
"required": false,
"default": "ReadWriteOnce",
"description": "Access mode used for the claim.",
"config": {
"options": [
"ReadWriteOnce",
"ReadOnlyMany",
"ReadWriteMany",
"ReadWriteOncePod"
]
}
}
]
},
{
"title": "Resources",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "1000m",
"config": {
"placeholder": "1000m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "250m",
"config": {
"placeholder": "250m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "1Gi",
"config": {
"placeholder": "1Gi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "256Mi",
"config": {
"placeholder": "256Mi"
}
}
]
}
]
}
@@ -0,0 +1,8 @@
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: << resource_name >>
provisioner: << provisioner >>
volumeBindingMode: << volume_binding_mode >>
reclaimPolicy: << reclaim_policy >>
+174
View File
@@ -0,0 +1,174 @@
{
"slug": "core-storageclass",
"kind": "kubernetes",
"metadata": {
"name": "Kubernetes StorageClass",
"description": "Kubernetes StorageClass for defining storage types that can be dynamically provisioned.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": false,
"version": {
"name": "1.31.0",
"source_dep_name": "manual/core-storageclass"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "standard",
"config": {
"placeholder": "standard"
}
},
{
"name": "provisioner",
"type": "str",
"title": "Provisioner",
"required": false,
"default": "kubernetes.io/no-provisioner",
"description": "Storage provisioner (e.g., kubernetes.io/no-provisioner, longhorn)",
"config": {
"placeholder": "kubernetes.io/no-provisioner"
}
},
{
"name": "volume_binding_mode",
"type": "enum",
"title": "Volume binding mode",
"required": false,
"default": "WaitForFirstConsumer",
"config": {
"options": [
"Immediate",
"WaitForFirstConsumer"
]
}
},
{
"name": "reclaim_policy",
"type": "enum",
"title": "Reclaim Policy",
"required": false,
"default": "Delete",
"config": {
"options": [
"Retain",
"Delete"
]
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
+86
View File
@@ -0,0 +1,86 @@
<%- if create_namespace %>
---
apiVersion: v1
kind: Namespace
metadata:
name: << namespace >>
<%- endif %>
---
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: << git_repository_name >>
namespace: << namespace >>
spec:
interval: << git_interval >>
timeout: << git_timeout >>
url: << git_repository_url >>
ref:
branch: << git_branch >>
<%- if git_secret_ref_enabled %>
secretRef:
name: << git_secret_ref_name >>
<%- endif %>
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: << kustomization_name >>
namespace: << namespace >>
spec:
interval: << kustomization_interval >>
timeout: << kustomization_timeout >>
force: << kustomization_force | lower >>
path: << kustomization_path >>
prune: << kustomization_prune | lower >>
wait: << kustomization_wait | lower >>
sourceRef:
kind: GitRepository
name: << git_repository_name >>
<%- if target_namespace_enabled %>
targetNamespace: << target_namespace >>
<%- endif %>
<%- if depends_on_enabled %>
dependsOn:
- name: << depends_on_name >>
<%- endif %>
<%- if decryption_enabled %>
decryption:
provider: sops
secretRef:
name: << decryption_secret_name >>
<%- endif %>
<%- if helm_repository_enabled %>
---
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: << helm_repository_name >>
namespace: << namespace >>
spec:
interval: << helm_repository_interval >>
url: << helm_repository_url >>
<%- endif %>
<%- if helm_release_enabled %>
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: << helm_release_name >>
namespace: << helm_release_namespace >>
spec:
interval: << helm_release_interval >>
chart:
spec:
chart: << helm_chart_name >>
version: "<< helm_chart_version >>"
sourceRef:
kind: HelmRepository
name: << helm_repository_name >>
namespace: << namespace >>
<%- if helm_target_namespace_enabled %>
install:
createNamespace: true
targetNamespace: << helm_target_namespace >>
<%- endif %>
<%- endif %>
+377
View File
@@ -0,0 +1,377 @@
{
"slug": "flux-bootstrap",
"kind": "kubernetes",
"metadata": {
"name": "Flux Bootstrap",
"description": "Draft Flux bootstrap manifests for wiring an already-installed Flux control plane to a Git repository and root Kustomization, with optional Helm source and release resources.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "flux"
},
"draft": true,
"version": {
"name": "2.7.5",
"source_dep_name": "manual/flux-bootstrap"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "namespace",
"type": "str",
"title": "Flux namespace",
"required": false,
"default": "flux-system",
"description": "Namespace where Flux source and Kustomization resources live.",
"config": {
"placeholder": "flux-system"
}
},
{
"name": "create_namespace",
"type": "bool",
"title": "Create namespace",
"required": false,
"default": false,
"description": "Render the Flux namespace manifest as part of this file."
},
{
"name": "git_repository_name",
"type": "str",
"title": "GitRepository name",
"required": false,
"default": "homelab-cluster",
"config": {
"placeholder": "homelab-cluster"
}
},
{
"name": "git_repository_url",
"type": "str",
"title": "Git repository URL",
"required": false,
"default": "https://github.com/example/homelab-gitops",
"description": "HTTPS or SSH URL for the GitOps repository.",
"config": {
"placeholder": "https://github.com/example/homelab-gitops"
}
},
{
"name": "git_branch",
"type": "str",
"title": "Git branch",
"required": false,
"default": "main",
"description": "Branch Flux should reconcile from.",
"config": {
"placeholder": "main"
}
},
{
"name": "git_interval",
"type": "str",
"title": "Git interval",
"required": false,
"default": "5m0s",
"description": "How often Flux fetches the Git repository.",
"config": {
"placeholder": "5m0s"
}
},
{
"name": "git_timeout",
"type": "str",
"title": "Git timeout",
"required": false,
"default": "60s",
"description": "Timeout for Git clone and fetch operations.",
"config": {
"placeholder": "60s"
}
},
{
"name": "kustomization_name",
"type": "str",
"title": "Kustomization name",
"required": false,
"default": "cluster-root",
"config": {
"placeholder": "cluster-root"
}
},
{
"name": "kustomization_path",
"type": "str",
"title": "Kustomization path",
"required": false,
"default": "./clusters/production",
"description": "Path inside the Git repository that contains the root kustomization.",
"config": {
"placeholder": "./clusters/production"
}
},
{
"name": "kustomization_interval",
"type": "str",
"title": "Kustomization interval",
"required": false,
"default": "10m0s",
"description": "How often Flux reconciles the root Kustomization.",
"config": {
"placeholder": "10m0s"
}
},
{
"name": "kustomization_timeout",
"type": "str",
"title": "Kustomization timeout",
"required": false,
"default": "5m0s",
"description": "Timeout for apply and health-check operations.",
"config": {
"placeholder": "5m0s"
}
}
]
},
{
"title": "Reconciliation",
"name": "reconciliation",
"items": [
{
"name": "kustomization_prune",
"type": "bool",
"title": "Prune",
"required": false,
"default": true,
"description": "Remove resources from the cluster when they disappear from Git."
},
{
"name": "kustomization_wait",
"type": "bool",
"title": "Wait",
"required": false,
"default": true,
"description": "Wait for reconciled resources to become healthy."
},
{
"name": "kustomization_force",
"type": "bool",
"title": "Force",
"required": false,
"default": false,
"description": "Force apply resources when immutable field changes require replacement."
},
{
"name": "target_namespace_enabled",
"type": "bool",
"title": "Target namespace",
"required": false,
"default": false,
"description": "Override the namespace for resources reconciled by this Kustomization."
},
{
"name": "target_namespace",
"type": "str",
"title": "Target namespace value",
"required": false,
"default": "platform",
"description": "Namespace applied to resources when target namespace is enabled.",
"config": {
"placeholder": "platform"
}
},
{
"name": "depends_on_enabled",
"type": "bool",
"title": "Depends on",
"required": false,
"default": false,
"description": "Add a single Flux Kustomization dependency before this root applies."
},
{
"name": "depends_on_name",
"type": "str",
"title": "Dependency name",
"required": false,
"default": "cluster-prereqs",
"config": {
"placeholder": "cluster-prereqs"
}
}
]
},
{
"title": "Authentication and Decryption",
"name": "security",
"items": [
{
"name": "git_secret_ref_enabled",
"type": "bool",
"title": "Git secretRef",
"required": false,
"default": false,
"description": "Reference a Kubernetes secret for Git authentication."
},
{
"name": "git_secret_ref_name",
"type": "str",
"title": "Git secret name",
"required": false,
"default": "flux-system",
"config": {
"placeholder": "flux-system"
}
},
{
"name": "decryption_enabled",
"type": "bool",
"title": "SOPS decryption",
"required": false,
"default": false
},
{
"name": "decryption_secret_name",
"type": "str",
"title": "Decryption secret",
"required": false,
"default": "sops-age",
"config": {
"placeholder": "sops-age"
}
}
]
},
{
"title": "Optional Helm Release",
"name": "helm",
"items": [
{
"name": "helm_repository_enabled",
"type": "bool",
"title": "HelmRepository",
"required": false,
"default": false,
"description": "Render a HelmRepository resource alongside the bootstrap objects."
},
{
"name": "helm_repository_name",
"type": "str",
"title": "HelmRepository name",
"required": false,
"default": "podinfo",
"config": {
"placeholder": "podinfo"
}
},
{
"name": "helm_repository_url",
"type": "str",
"title": "HelmRepository URL",
"required": false,
"default": "https://stefanprodan.github.io/podinfo",
"description": "Chart repository URL used by the optional Helm source.",
"config": {
"placeholder": "https://stefanprodan.github.io/podinfo"
}
},
{
"name": "helm_repository_interval",
"type": "str",
"title": "HelmRepository interval",
"required": false,
"default": "15m0s",
"description": "How often Flux refreshes the Helm repository index.",
"config": {
"placeholder": "15m0s"
}
},
{
"name": "helm_release_enabled",
"type": "bool",
"title": "HelmRelease",
"required": false,
"default": false,
"description": "Render a starter HelmRelease managed by Flux."
},
{
"name": "helm_release_name",
"type": "str",
"title": "HelmRelease name",
"required": false,
"default": "podinfo",
"config": {
"placeholder": "podinfo"
}
},
{
"name": "helm_release_namespace",
"type": "str",
"title": "HelmRelease namespace",
"required": false,
"default": "flux-system",
"description": "Namespace where the HelmRelease custom resource should live.",
"config": {
"placeholder": "flux-system"
}
},
{
"name": "helm_release_interval",
"type": "str",
"title": "HelmRelease interval",
"required": false,
"default": "15m0s",
"description": "How often Flux reconciles the optional Helm release.",
"config": {
"placeholder": "15m0s"
}
},
{
"name": "helm_chart_name",
"type": "str",
"title": "Chart name",
"required": false,
"default": "podinfo",
"description": "Chart name inside the optional Helm repository.",
"config": {
"placeholder": "podinfo"
}
},
{
"name": "helm_chart_version",
"type": "str",
"title": "Chart version",
"required": false,
"default": "6.9.3",
"description": "Chart version for the optional HelmRelease.",
"config": {
"placeholder": "6.9.3"
}
},
{
"name": "helm_target_namespace_enabled",
"type": "bool",
"title": "Release target namespace",
"required": false,
"default": true,
"description": "Install the optional Helm chart into a different namespace."
},
{
"name": "helm_target_namespace",
"type": "str",
"title": "Release target namespace value",
"required": false,
"default": "apps",
"description": "Namespace where the Helm release should be deployed.",
"config": {
"placeholder": "apps"
}
}
]
}
]
}
+147
View File
@@ -0,0 +1,147 @@
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: << service_account_name >>
namespace: << namespace >>
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: << service_account_name >>
rules:
- apiGroups:
- ""
resources:
- services
- services/status
- nodes
- endpoints
- pods
verbs:
- list
- get
- watch
- update
- patch
- apiGroups:
- discovery.k8s.io
resources:
- endpointslices
verbs:
- list
- get
- watch
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- list
- get
- watch
- update
- create
- patch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: << service_account_name >>
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: << service_account_name >>
subjects:
- kind: ServiceAccount
name: << service_account_name >>
namespace: << namespace >>
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: << daemonset_name >>
namespace: << namespace >>
spec:
selector:
matchLabels:
app.kubernetes.io/name: kube-vip
app.kubernetes.io/instance: << daemonset_name >>
template:
metadata:
labels:
app.kubernetes.io/name: kube-vip
app.kubernetes.io/instance: << daemonset_name >>
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
serviceAccountName: << service_account_name >>
<%- if control_plane_only %>
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/master
operator: Exists
- matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: Exists
<%- endif %>
tolerations:
- operator: Exists
effect: NoSchedule
- operator: Exists
effect: NoExecute
containers:
- name: kube-vip
image: << image >>
imagePullPolicy: IfNotPresent
args:
- manager
env:
- name: vip_arp
value: "true"
- name: port
value: "<< control_plane_port >>"
- name: vip_interface
value: "<< interface >>"
- name: vip_subnet
value: "<< vip_subnet >>"
- name: cp_enable
value: "<< control_plane_enabled | lower >>"
- name: cp_namespace
value: "<< namespace >>"
- name: vip_ddns
value: "false"
- name: svc_enable
value: "<< services_enabled | lower >>"
- name: svc_election
value: "<< service_election_enabled | lower >>"
- name: vip_leaderelection
value: "<< leader_election_enabled | lower >>"
- name: vip_leaseduration
value: "<< lease_duration >>"
- name: vip_renewdeadline
value: "<< renew_deadline >>"
- name: vip_retryperiod
value: "<< retry_period >>"
<%- if control_plane_enabled %>
- name: address
value: "<< vip_address >>"
<%- endif %>
<%- if services_interface_enabled %>
- name: vip_servicesinterface
value: "<< services_interface >>"
<%- endif %>
<%- if watch_services_namespace_enabled %>
- name: svc_namespace
value: "<< watch_services_namespace >>"
<%- endif %>
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_RAW
- SYS_TIME
resources: {}
+246
View File
@@ -0,0 +1,246 @@
{
"slug": "kube-vip",
"kind": "kubernetes",
"metadata": {
"name": "kube-vip DaemonSet",
"description": "Practical kube-vip DaemonSet bootstrap with RBAC for control-plane virtual IPs and optional Service LoadBalancer handling in bare-metal clusters.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": true,
"version": {
"name": "1.0.1",
"source_dep_name": "manual/kube-vip"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "kube-system",
"description": "Namespace where kube-vip should run.",
"config": {
"placeholder": "kube-system"
}
},
{
"name": "service_account_name",
"type": "str",
"title": "Service account",
"required": false,
"default": "kube-vip",
"description": "Service account name used by the kube-vip DaemonSet.",
"config": {
"placeholder": "kube-vip"
}
},
{
"name": "daemonset_name",
"type": "str",
"title": "DaemonSet name",
"required": false,
"default": "kube-vip-ds",
"config": {
"placeholder": "kube-vip-ds"
}
},
{
"name": "image",
"type": "str",
"title": "Image",
"required": false,
"default": "ghcr.io/kube-vip/kube-vip:v1.0.1",
"description": "Container image for kube-vip.",
"config": {
"placeholder": "ghcr.io/kube-vip/kube-vip:v1.0.1"
}
}
]
},
{
"title": "Networking",
"name": "networking",
"items": [
{
"name": "interface",
"type": "str",
"title": "Primary interface",
"required": false,
"default": "eth0",
"description": "Host interface used by kube-vip for ARP announcements and VIP binding.",
"config": {
"placeholder": "eth0"
}
},
{
"name": "services_interface_enabled",
"type": "bool",
"title": "Services interface",
"required": false,
"default": false
},
{
"name": "services_interface",
"type": "str",
"title": "Services interface name",
"required": false,
"default": "eth1",
"description": "Interface used for service advertisements when a dedicated interface is required.",
"config": {
"placeholder": "eth1"
}
},
{
"name": "vip_address",
"type": "str",
"title": "Control-plane VIP",
"required": false,
"default": "192.168.1.30",
"description": "Virtual IP for the Kubernetes API when control-plane mode is enabled.",
"config": {
"placeholder": "192.168.1.30"
}
},
{
"name": "vip_subnet",
"type": "str",
"title": "VIP subnet mask",
"required": false,
"default": "32",
"description": "Subnet mask used for the advertised VIP.",
"config": {
"placeholder": "32"
}
},
{
"name": "control_plane_port",
"type": "int",
"title": "API port",
"required": false,
"default": 6443,
"description": "Kubernetes API port exposed by the control-plane VIP.",
"config": {
"placeholder": "6443"
}
}
]
},
{
"title": "Features",
"name": "features",
"items": [
{
"name": "control_plane_enabled",
"type": "bool",
"title": "Control-plane VIP",
"required": false,
"default": true,
"description": "Advertise a floating VIP for the Kubernetes API."
},
{
"name": "services_enabled",
"type": "bool",
"title": "Service LoadBalancer",
"required": false,
"default": false,
"description": "Watch and advertise Kubernetes Services of type LoadBalancer."
},
{
"name": "service_election_enabled",
"type": "bool",
"title": "Per-service election",
"required": false,
"default": false,
"description": "Use a separate leader election for each service when service mode is enabled."
},
{
"name": "leader_election_enabled",
"type": "bool",
"title": "Leader election",
"required": false,
"default": true
},
{
"name": "watch_services_namespace_enabled",
"type": "bool",
"title": "Watch one namespace",
"required": false,
"default": false,
"description": "Restrict service mode to a specific namespace instead of the whole cluster."
},
{
"name": "watch_services_namespace",
"type": "str",
"title": "Watched namespace",
"required": false,
"default": "apps",
"description": "Namespace watched by kube-vip when scoped service mode is enabled.",
"config": {
"placeholder": "apps"
}
}
]
},
{
"title": "Leader Election Timing",
"name": "timing",
"items": [
{
"name": "lease_duration",
"type": "int",
"title": "Lease duration",
"required": false,
"default": 5,
"description": "Lease duration in seconds for leader election.",
"config": {
"placeholder": "5"
}
},
{
"name": "renew_deadline",
"type": "int",
"title": "Renew deadline",
"required": false,
"default": 3,
"description": "Renew deadline in seconds for leader election.",
"config": {
"placeholder": "3"
}
},
{
"name": "retry_period",
"type": "int",
"title": "Retry period",
"required": false,
"default": 1,
"description": "Retry period in seconds for leader election.",
"config": {
"placeholder": "1"
}
}
]
},
{
"title": "Scheduling",
"name": "scheduling",
"items": [
{
"name": "control_plane_only",
"type": "bool",
"title": "Control-plane nodes only",
"required": false,
"default": true,
"description": "Schedule kube-vip only on nodes labeled as control-plane or master."
}
]
}
]
}
+36
View File
@@ -0,0 +1,36 @@
<%- if create_namespace %>
---
apiVersion: v1
kind: Namespace
metadata:
name: << namespace >>
<%- endif %>
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: << pool_name >>
namespace: << namespace >>
spec:
addresses:
- << address_range >>
autoAssign: << auto_assign | lower >>
avoidBuggyIPs: << avoid_buggy_ips | lower >>
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: << advertisement_name >>
namespace: << namespace >>
spec:
ipAddressPools:
- << pool_name >>
<%- if node_selector_enabled %>
nodeSelectors:
- matchLabels:
<< node_selector_key >>: << node_selector_value >>
<%- endif %>
<%- if bind_interfaces_enabled %>
interfaces:
- << bind_interface >>
<%- endif %>
+153
View File
@@ -0,0 +1,153 @@
{
"slug": "metallb",
"kind": "kubernetes",
"metadata": {
"name": "MetalLB Layer2 Bootstrap",
"description": "Practical MetalLB bootstrap manifests for the common homelab path: an IPAddressPool plus L2Advertisement for bare-metal LoadBalancer services.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "kubernetes"
},
"draft": true,
"version": {
"name": "0.15.2",
"source_dep_name": "manual/metallb"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "namespace",
"type": "str",
"title": "MetalLB namespace",
"required": false,
"default": "metallb-system",
"description": "Namespace where MetalLB custom resources live.",
"config": {
"placeholder": "metallb-system"
}
},
{
"name": "create_namespace",
"type": "bool",
"title": "Create namespace",
"required": false,
"default": false,
"description": "Render the MetalLB namespace manifest before the pool configuration."
},
{
"name": "pool_name",
"type": "str",
"title": "Pool name",
"required": false,
"default": "homelab-pool",
"config": {
"placeholder": "homelab-pool"
}
},
{
"name": "advertisement_name",
"type": "str",
"title": "Advertisement name",
"required": false,
"default": "homelab-l2",
"config": {
"placeholder": "homelab-l2"
}
}
]
},
{
"title": "Address Pool",
"name": "pool",
"items": [
{
"name": "address_range",
"type": "str",
"title": "Address range",
"required": false,
"default": "192.168.1.240-192.168.1.250",
"description": "Single IP, CIDR, or start-end range reserved for LoadBalancer services.",
"config": {
"placeholder": "192.168.1.240-192.168.1.250"
}
},
{
"name": "auto_assign",
"type": "bool",
"title": "Auto assign",
"required": false,
"default": true,
"description": "Allow MetalLB to assign IPs automatically from this pool."
},
{
"name": "avoid_buggy_ips",
"type": "bool",
"title": "Avoid buggy IPs",
"required": false,
"default": false,
"description": "Skip .0 and .255 style addresses for networks with broken consumer gear."
}
]
},
{
"title": "Layer2 Advertisement",
"name": "layer2",
"items": [
{
"name": "bind_interfaces_enabled",
"type": "bool",
"title": "Bind interfaces",
"required": false,
"default": false,
"description": "Restrict ARP announcements to a specific host interface."
},
{
"name": "bind_interface",
"type": "str",
"title": "Interface name",
"required": false,
"default": "eth0",
"description": "Interface used for Layer2 announcements when interface binding is enabled.",
"config": {
"placeholder": "eth0"
}
},
{
"name": "node_selector_enabled",
"type": "bool",
"title": "Node selector",
"required": false,
"default": false,
"description": "Limit announcements to nodes with a specific label."
},
{
"name": "node_selector_key",
"type": "str",
"title": "Node selector key",
"required": false,
"default": "kubernetes.io/hostname",
"description": "Node label key used when node selection is enabled.",
"config": {
"placeholder": "kubernetes.io/hostname"
}
},
{
"name": "node_selector_value",
"type": "str",
"title": "Node selector value",
"required": false,
"default": "k3s-server-1",
"description": "Node label value used when node selection is enabled.",
"config": {
"placeholder": "k3s-server-1"
}
}
]
}
]
}
@@ -0,0 +1,14 @@
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
basicAuth:
secret: << secret_name >>
realm: "<< realm >>"
removeHeader: << remove_header | lower >>
<%- if header_field_enabled %>
headerField: << header_field >>
<%- endif %>
+100
View File
@@ -0,0 +1,100 @@
{
"slug": "traefik-basicauth",
"kind": "kubernetes",
"metadata": {
"name": "Traefik BasicAuth Middleware",
"description": "Traefik Middleware CRD for HTTP basic authentication using an htpasswd-formatted Kubernetes Secret.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"draft": true,
"version": {
"name": "3.5.3",
"source_dep_name": "manual/traefik-basicauth"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Middleware name",
"required": false,
"default": "basic-auth",
"config": {
"placeholder": "basic-auth"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
}
]
},
{
"title": "BasicAuth",
"name": "basicauth",
"items": [
{
"name": "secret_name",
"type": "str",
"title": "Secret name",
"required": true,
"description": "Kubernetes Secret containing htpasswd-formatted credentials.",
"config": {
"placeholder": "basic-auth-users"
}
},
{
"name": "realm",
"type": "str",
"title": "Realm",
"required": false,
"default": "Protected Area",
"description": "Realm string presented in the browser authentication prompt.",
"config": {
"placeholder": "Protected Area"
}
},
{
"name": "remove_header",
"type": "bool",
"title": "Remove Authorization header",
"required": false,
"default": true,
"description": "Strip the Authorization header before forwarding the request upstream."
},
{
"name": "header_field_enabled",
"type": "bool",
"title": "Header field",
"required": false,
"default": false,
"description": "Write the authenticated username into a custom request header."
},
{
"name": "header_field",
"type": "str",
"title": "Header field name",
"required": false,
"default": "X-WebAuth-User",
"description": "Request header name used for the authenticated username.",
"config": {
"placeholder": "X-WebAuth-User"
}
}
]
}
]
}
@@ -0,0 +1,12 @@
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
buffering:
maxRequestBodyBytes: << max_request_body_bytes >>
memRequestBodyBytes: << mem_request_body_bytes >>
maxResponseBodyBytes: << max_response_body_bytes >>
memResponseBodyBytes: << mem_response_body_bytes >>
@@ -0,0 +1,96 @@
{
"slug": "traefik-buffering",
"kind": "kubernetes",
"metadata": {
"name": "Traefik Buffering Middleware",
"description": "Traefik Middleware CRD for buffering request and response bodies so uploads, downloads, and upstream size controls behave more predictably.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"draft": true,
"version": {
"name": "3.5.3",
"source_dep_name": "manual/traefik-buffering"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Middleware name",
"required": false,
"default": "body-buffering",
"config": {
"placeholder": "body-buffering"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
}
]
},
{
"title": "Buffering",
"name": "buffering",
"items": [
{
"name": "max_request_body_bytes",
"type": "int",
"title": "Max request body bytes",
"required": false,
"default": 10485760,
"description": "Maximum allowed request body size in bytes.",
"config": {
"placeholder": "10485760"
}
},
{
"name": "mem_request_body_bytes",
"type": "int",
"title": "In-memory request body bytes",
"required": false,
"default": 2097152,
"description": "Maximum request body size held in memory before Traefik uses disk buffering.",
"config": {
"placeholder": "2097152"
}
},
{
"name": "max_response_body_bytes",
"type": "int",
"title": "Max response body bytes",
"required": false,
"default": 10485760,
"description": "Maximum allowed response body size in bytes.",
"config": {
"placeholder": "10485760"
}
},
{
"name": "mem_response_body_bytes",
"type": "int",
"title": "In-memory response body bytes",
"required": false,
"default": 2097152,
"description": "Maximum response body size held in memory before Traefik uses disk buffering.",
"config": {
"placeholder": "2097152"
}
}
]
}
]
}
@@ -0,0 +1,9 @@
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
circuitBreaker:
expression: "<< expression >>"
@@ -0,0 +1,63 @@
{
"slug": "traefik-circuitbreaker",
"kind": "kubernetes",
"metadata": {
"name": "Traefik CircuitBreaker Middleware",
"description": "Traefik Middleware CRD for tripping a circuit breaker when an upstream meets a configured failure expression.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"draft": true,
"version": {
"name": "3.5.3",
"source_dep_name": "manual/traefik-circuitbreaker"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Middleware name",
"required": false,
"default": "protect-upstream",
"config": {
"placeholder": "protect-upstream"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
}
]
},
{
"title": "Circuit Breaker",
"name": "circuitbreaker",
"items": [
{
"name": "expression",
"type": "str",
"title": "Expression",
"required": false,
"default": "NetworkErrorRatio() > 0.50",
"description": "Circuit-breaker expression evaluated by Traefik.",
"config": {
"placeholder": "NetworkErrorRatio() > 0.50"
}
}
]
}
]
}
@@ -0,0 +1,26 @@
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
forwardAuth:
address: "<< address >>"
trustForwardHeader: << trust_forward_header | lower >>
<%- if auth_response_headers_enabled %>
authResponseHeaders:
<%- for header in auth_response_headers.split(',') %>
- << header.strip() >>
<%- endfor %>
<%- endif %>
<%- if auth_request_headers_enabled %>
authRequestHeaders:
<%- for header in auth_request_headers.split(',') %>
- << header.strip() >>
<%- endfor %>
<%- endif %>
<%- if tls_insecure_skip_verify %>
tls:
insecureSkipVerify: true
<%- endif %>
@@ -0,0 +1,116 @@
{
"slug": "traefik-forwardauth-middleware",
"kind": "kubernetes",
"metadata": {
"name": "Traefik ForwardAuth Middleware",
"description": "Traefik Middleware CRD for delegating request authentication to an external forward-auth endpoint such as Authentik, Authelia, or a custom identity proxy.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"draft": true,
"version": {
"name": "3.5.3",
"source_dep_name": "manual/traefik-forwardauth-middleware"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Middleware name",
"required": false,
"default": "forwardauth",
"config": {
"placeholder": "forwardauth"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
}
]
},
{
"title": "ForwardAuth",
"name": "forwardauth",
"items": [
{
"name": "address",
"type": "str",
"title": "ForwardAuth address",
"required": true,
"description": "HTTP or HTTPS endpoint Traefik should call for authentication decisions.",
"config": {
"placeholder": "https://auth.example.com/outpost.goauthentik.io/auth/traefik"
}
},
{
"name": "trust_forward_header",
"type": "bool",
"title": "Trust forwarded headers",
"required": false,
"default": true,
"description": "Trust X-Forwarded-* headers sent by the previous hop."
},
{
"name": "auth_response_headers_enabled",
"type": "bool",
"title": "Auth response headers",
"required": false,
"default": true,
"description": "Forward selected headers from the auth response to the upstream service."
},
{
"name": "auth_response_headers",
"type": "str",
"title": "Auth response headers list",
"required": false,
"default": "X-authentik-username,X-authentik-groups,X-authentik-email",
"description": "Comma-separated list of response headers Traefik should pass to the upstream service.",
"config": {
"placeholder": "X-authentik-username,X-authentik-groups,X-authentik-email"
}
},
{
"name": "auth_request_headers_enabled",
"type": "bool",
"title": "Auth request headers",
"required": false,
"default": false,
"description": "Restrict which request headers Traefik forwards to the auth service."
},
{
"name": "auth_request_headers",
"type": "str",
"title": "Auth request headers list",
"required": false,
"default": "Accept,X-Forwarded-Host,X-Forwarded-Method,X-Forwarded-Proto,X-Forwarded-Uri",
"description": "Comma-separated list of request headers Traefik should forward to the auth service.",
"config": {
"placeholder": "Accept,X-Forwarded-Host,X-Forwarded-Method,X-Forwarded-Proto,X-Forwarded-Uri"
}
},
{
"name": "tls_insecure_skip_verify",
"type": "bool",
"title": "Skip TLS verification",
"required": false,
"default": false,
"description": "Disable TLS certificate verification for the auth endpoint."
}
]
}
]
}
@@ -0,0 +1,23 @@
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
entryPoints:
<%- if traefik_tls_enabled %>
- << traefik_tls_entrypoint >>
<%- else %>
- << traefik_entrypoint >>
<%- endif %>
routes:
- match: Host(`<< traefik_host >>`)
kind: Rule
services:
- name: << traefik_service_name >>
port: << traefik_service_port >>
<%- if traefik_tls_enabled %>
tls:
certResolver: << traefik_tls_certresolver >>
<%- endif %>
@@ -0,0 +1,187 @@
{
"slug": "traefik-ingressroute",
"kind": "kubernetes",
"metadata": {
"name": "Traefik IngressRoute",
"description": "Traefik IngressRoute CRD for HTTP/HTTPS routing with advanced features like middleware chains, weighted round-robin, and header-based routing.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"draft": true,
"version": {
"name": "3.5.3",
"source_dep_name": "manual/traefik-ingressroute"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "app-ingressroute",
"config": {
"placeholder": "app-ingressroute"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "HTTP Entrypoint",
"required": false,
"default": "web",
"description": "Traefik entrypoint for HTTP (e.g., web)",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "HTTPS Entrypoint",
"required": false,
"default": "websecure",
"description": "Traefik entrypoint for HTTPS (e.g., websecure)",
"config": {
"placeholder": "websecure"
}
},
{
"name": "traefik_service_name",
"type": "str",
"title": "Service Name",
"required": true,
"description": "Kubernetes service name to route traffic to"
},
{
"name": "traefik_service_port",
"type": "int",
"title": "Service Port",
"required": false,
"default": 80,
"config": {
"placeholder": "80"
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Configuration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": true
},
{
"name": "traefik_host",
"type": "str",
"title": "Ingress Host",
"required": true,
"description": "Domain name for the IngressRoute",
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
@@ -0,0 +1,18 @@
---
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
entryPoints:
- << traefik_entrypoint >>
routes:
- match: HostSNI(`*`)
services:
- name: << traefik_service_name >>
port: << traefik_service_port >>
<%- if traefik_tls_enabled %>
tls:
passthrough: true
<%- endif %>
@@ -0,0 +1,176 @@
{
"slug": "traefik-ingressroutetcp",
"kind": "kubernetes",
"metadata": {
"name": "Traefik IngressRouteTCP",
"description": "Traefik IngressRouteTCP CRD for TCP routing of non-HTTP protocols like databases, SSH, or any TCP-based service.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"draft": true,
"version": {
"name": "3.5.3",
"source_dep_name": "manual/traefik-ingressroutetcp"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "app-tcp-route",
"config": {
"placeholder": "app-tcp-route"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Configuration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": true
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": false,
"default": "tcp",
"description": "Traefik entrypoint for TCP routing",
"config": {
"placeholder": "tcp"
}
},
{
"name": "traefik_service_name",
"type": "str",
"title": "Service Name",
"required": true,
"description": "Backend service name for TCP routing"
},
{
"name": "traefik_service_port",
"type": "int",
"title": "Service Port",
"required": false,
"default": 5432,
"description": "Backend service port for TCP routing",
"config": {
"placeholder": "5432"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
@@ -0,0 +1,24 @@
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
ipAllowList:
sourceRange:
<%- for source_range in source_ranges.split(',') %>
- << source_range.strip() >>
<%- endfor %>
<%- if ip_strategy_depth_enabled or excluded_ips_enabled %>
ipStrategy:
<%- if ip_strategy_depth_enabled %>
depth: << ip_strategy_depth >>
<%- endif %>
<%- if excluded_ips_enabled %>
excludedIPs:
<%- for ip in excluded_ips.split(',') %>
- << ip.strip() >>
<%- endfor %>
<%- endif %>
<%- endif %>
@@ -0,0 +1,101 @@
{
"slug": "traefik-ipallowlist",
"kind": "kubernetes",
"metadata": {
"name": "Traefik IPAllowList Middleware",
"description": "Traefik Middleware CRD for restricting access to trusted source CIDR ranges, with optional client IP strategy controls for proxied deployments.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"draft": true,
"version": {
"name": "3.5.3",
"source_dep_name": "manual/traefik-ipallowlist"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Middleware name",
"required": false,
"default": "allow-private-networks",
"config": {
"placeholder": "allow-private-networks"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
}
]
},
{
"title": "IP Allow List",
"name": "ipallowlist",
"items": [
{
"name": "source_ranges",
"type": "str",
"title": "Source ranges",
"required": false,
"default": "192.168.0.0/16,10.0.0.0/8,172.16.0.0/12",
"description": "Comma-separated list of CIDR ranges allowed to access the route.",
"config": {
"placeholder": "192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"
}
},
{
"name": "ip_strategy_depth_enabled",
"type": "bool",
"title": "Depth strategy",
"required": false,
"default": false,
"description": "Evaluate the client IP based on a specific position in the X-Forwarded-For chain."
},
{
"name": "ip_strategy_depth",
"type": "int",
"title": "Depth",
"required": false,
"default": 1,
"description": "Position from the right in the X-Forwarded-For chain.",
"config": {
"placeholder": "1"
}
},
{
"name": "excluded_ips_enabled",
"type": "bool",
"title": "Excluded IPs",
"required": false,
"default": false,
"description": "Exclude trusted proxy IPs from client IP evaluation."
},
{
"name": "excluded_ips",
"type": "str",
"title": "Excluded IPs list",
"required": false,
"default": "10.42.0.0/16,10.43.0.0/16",
"description": "Comma-separated list of trusted proxy ranges to ignore during client IP evaluation.",
"config": {
"placeholder": "10.42.0.0/16,10.43.0.0/16"
}
}
]
}
]
}
@@ -0,0 +1,27 @@
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
<%- if middleware_type == 'redirectScheme' %>
redirectScheme:
scheme: https
permanent: true
<%- elif middleware_type == 'stripPrefix' %>
stripPrefix:
prefixes:
- /api
<%- elif middleware_type == 'addPrefix' %>
addPrefix:
prefix: /api
<%- elif middleware_type == 'headers' %>
headers:
customRequestHeaders:
X-Forwarded-Proto: https
<%- elif middleware_type == 'rateLimit' %>
rateLimit:
average: 100
burst: 50
<%- endif %>
+163
View File
@@ -0,0 +1,163 @@
{
"slug": "traefik-middleware",
"kind": "kubernetes",
"metadata": {
"name": "Traefik Middleware",
"description": "Traefik Middleware CRD for modifying HTTP requests and responses. Supports headers, redirects, rate-limiting, authentication, and more.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"draft": true,
"version": {
"name": "3.5.3",
"source_dep_name": "manual/traefik-middleware"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "app-middleware",
"config": {
"placeholder": "app-middleware"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "middleware_type",
"type": "enum",
"title": "Middleware type",
"required": false,
"default": "redirectScheme",
"config": {
"options": [
"redirectScheme",
"stripPrefix",
"addPrefix",
"headers",
"rateLimit"
]
}
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}
+12
View File
@@ -0,0 +1,12 @@
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
retry:
attempts: << attempts >>
<%- if initial_interval %>
initialInterval: << initial_interval >>
<%- endif %>
+74
View File
@@ -0,0 +1,74 @@
{
"slug": "traefik-retry",
"kind": "kubernetes",
"metadata": {
"name": "Traefik Retry Middleware",
"description": "Traefik Middleware CRD for retrying failed upstream requests with a configurable attempt count and optional initial interval.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"draft": true,
"version": {
"name": "3.5.3",
"source_dep_name": "manual/traefik-retry"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Middleware name",
"required": false,
"default": "retry-upstream",
"config": {
"placeholder": "retry-upstream"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
}
]
},
{
"title": "Retry",
"name": "retry",
"items": [
{
"name": "attempts",
"type": "int",
"title": "Attempts",
"required": false,
"default": 3,
"description": "Number of times Traefik should retry failed requests.",
"config": {
"placeholder": "3"
}
},
{
"name": "initial_interval",
"type": "str",
"title": "Initial interval",
"required": false,
"default": "100ms",
"description": "Initial wait time before the first retry attempt.",
"config": {
"placeholder": "100ms"
}
}
]
}
]
}
@@ -0,0 +1,12 @@
---
apiVersion: twingate.com/v1beta
kind: TwingateConnector
metadata:
name: << resource_name >>
namespace: << namespace >>
spec:
image:
repository: twingate/connector
tag: 1.88.0
name: << connector_name >>
hasStatusNotificationsEnabled: << status_notifications | lower >>
+161
View File
@@ -0,0 +1,161 @@
{
"slug": "twingate-connector-kubernetes",
"kind": "kubernetes",
"metadata": {
"name": "Twingate Connector",
"description": "Twingate Connector for secure zero-trust network access, deployed via the Twingate Kubernetes Operator.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "twingate"
},
"draft": true,
"version": {
"name": "1.88.0",
"source_dep_name": "twingate/connector",
"source_dep_version": "1.88.0"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "resource_name",
"type": "str",
"title": "Resource Name",
"required": false,
"default": "twingate-connector",
"config": {
"placeholder": "twingate-connector"
}
},
{
"name": "namespace",
"type": "str",
"title": "Namespace",
"required": false,
"default": "default",
"config": {
"placeholder": "default"
}
},
{
"name": "connector_name",
"type": "str",
"title": "Twingate connector name",
"required": true
},
{
"name": "status_notifications",
"type": "bool",
"title": "Status Notifications",
"required": false,
"default": true
}
]
},
{
"title": "Resource Limits",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "CPU limit",
"required": false,
"default": "100m",
"config": {
"placeholder": "100m"
}
},
{
"name": "resources_cpu_request",
"type": "str",
"title": "CPU request",
"required": false,
"default": "50m",
"config": {
"placeholder": "50m"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Memory limit",
"required": false,
"default": "128Mi",
"config": {
"placeholder": "128Mi"
}
},
{
"name": "resources_memory_request",
"type": "str",
"title": "Memory request",
"required": false,
"default": "64Mi",
"config": {
"placeholder": "64Mi"
}
}
]
},
{
"title": "Traefik Integration",
"name": "traefik",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Traefik host",
"required": true,
"config": {
"placeholder": "app"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Traefik domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "TLS certificate resolver",
"required": false,
"default": "letsencrypt-prod",
"config": {
"placeholder": "letsencrypt-prod"
}
}
]
}
]
}