migrate
This commit is contained in:
@@ -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 >>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 >>
|
||||
@@ -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 >>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: << resource_name >>
|
||||
namespace: << namespace >>
|
||||
type: << secret_type >>
|
||||
stringData:
|
||||
api-token: << api_token >>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 >>
|
||||
@@ -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 %>
|
||||
@@ -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 >>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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: {}
|
||||
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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 %>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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 >>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user