From b78378565a2dca484a4cd26b57d68df3ee783051 Mon Sep 17 00:00:00 2001 From: Mike McFetridge <91107715+mmcfetridge1969@users.noreply.github.com> Date: Fri, 24 Jul 2026 15:42:46 -0400 Subject: [PATCH] Remove dups --- .../CHeckmk/activate-changes.yaml | 20 - .../checkmk-install-agent/files/main.yml | 16 - .../checkmk-install-agent/template.json | 82 -- .../checkmk-manage-host/files/main.yml | 18 - .../CHeckmk/checkmk-manage-host/template.json | 94 --- AnisiblePlaybooks/CHeckmk/install-agent.yaml | 20 - AnisiblePlaybooks/CHeckmk/inventory.ini | 23 - AnisiblePlaybooks/CHeckmk/inventory.yaml | 21 - AnisiblePlaybooks/CHeckmk/lookup-rule.yaml | 25 - AnisiblePlaybooks/CHeckmk/manage-hosts.yaml | 286 ------- AnisiblePlaybooks/CHeckmk/manage-rules.yaml | 71 -- AnisiblePlaybooks/CHeckmk/secrets.yaml | 3 - .../docker-certs-enable/files/main.yml | 52 -- .../docker-certs-enable/template.json | 37 - AnisiblePlaybooks/docker-certs/files/main.yml | 158 ---- AnisiblePlaybooks/docker-certs/template.json | 63 -- .../docker-cleanup/files/main.yml | 18 - .../docker-cleanup/files/requirements.yml | 2 - .../docker-cleanup/template.json | 83 -- .../docker-disk-usage-report/files/main.yml | 72 -- .../docker-disk-usage-report/template.json | 148 ---- .../docker-healthcheck-audit/files/main.yml | 51 -- .../files/requirements.yml | 2 - .../docker-healthcheck-audit/template.json | 86 -- .../docker-install-ubuntu/files/main.yml | 84 -- .../docker-install-ubuntu/template.json | 46 -- .../docker-mysql-backup/files/main.yml | 158 ---- .../files/requirements.yml | 2 - .../docker-mysql-backup/template.json | 186 ----- .../docker-orphan-detection/files/main.yml | 93 --- .../docker-orphan-detection/template.json | 155 ---- .../docker-postgres-backup/files/main.yml | 156 ---- .../files/requirements.yml | 2 - .../docker-postgres-backup/template.json | 187 ----- .../docker-volume-backup/files/main.yml | 77 -- .../files/requirements.yml | 2 - .../docker-volume-backup/template.json | 113 --- .../k3s-postinstall/files/main.yml | 404 ---------- .../k3s-postinstall/template.json | 527 ------------ .../k3sup-k3s-cluster/files/main.yml | 200 ----- .../k3sup-k3s-cluster/template.json | 353 -------- .../ubuntu-add-sshkey/files/main.yml | 24 - .../ubuntu-add-sshkey/template.json | 55 -- .../ubuntu-packages/files/main.yml | 85 -- .../ubuntu-packages/template.json | 157 ---- .../ubuntu-vm-core/files/main.yml | 19 - .../ubuntu-vm-core/template.json | 19 - .../{ => ArrsStack}/spark - media build | 0 Docker-Compose/adguardhome/files/compose.yaml | 112 --- Docker-Compose/adguardhome/template.json | 373 --------- Docker-Compose/alloy/files/compose.yaml | 62 -- .../alloy/files/config/common.alloy | 4 - .../alloy/files/config/logs_docker.alloy | 23 - .../alloy/files/config/logs_system.alloy | 44 - .../alloy/files/config/metrics_docker.alloy | 23 - .../alloy/files/config/metrics_system.alloy | 36 - .../alloy/files/config/targets.alloy | 20 - Docker-Compose/alloy/template.json | 239 ------ Docker-Compose/arcane-agent/files/.env | 2 - .../arcane-agent/files/compose.yaml | 46 -- Docker-Compose/arcane-agent/template.json | 247 ------ Docker-Compose/arcane/files/.env | 7 - Docker-Compose/arcane/files/compose.yaml | 100 --- Docker-Compose/arcane/template.json | 451 ----------- Docker-Compose/authentik/files/.env | 10 - Docker-Compose/authentik/files/compose.yaml | 210 ----- Docker-Compose/authentik/template.json | 402 ---------- Docker-Compose/bind9/files/compose.yaml | 87 -- Docker-Compose/bind9/files/config/named.conf | 67 -- .../bind9/files/config/named.conf.zones | 14 - Docker-Compose/bind9/files/config/tsig.key | 6 - .../bind9/files/zones/db.primary.zone | 11 - Docker-Compose/bind9/template.json | 262 ------ Docker-Compose/caddy/files/Caddyfile | 7 - Docker-Compose/caddy/files/compose.yaml | 47 -- .../caddy/files/config/webserver.caddy | 25 - Docker-Compose/caddy/template.json | 319 -------- Docker-Compose/checkmk/files/.env | 2 - Docker-Compose/checkmk/files/compose.yaml | 55 -- Docker-Compose/checkmk/template.json | 225 ------ Docker-Compose/cloudflared/files/.env | 2 - Docker-Compose/cloudflared/files/compose.yaml | 18 - Docker-Compose/cloudflared/template.json | 103 --- Docker-Compose/crowdsec/files/.env | 7 - Docker-Compose/crowdsec/files/compose.yaml | 63 -- .../files/config/acquis.d/appsec.yaml | 9 - .../crowdsec/files/config/acquis.yaml | 26 - Docker-Compose/crowdsec/template.json | 451 ----------- Docker-Compose/dockge/files/compose.yaml | 47 -- Docker-Compose/dockge/template.json | 175 ---- Docker-Compose/dockhand/files/.env | 7 - Docker-Compose/dockhand/files/compose.yaml | 59 -- Docker-Compose/dockhand/template.json | 290 ------- Docker-Compose/forgejo/files/.env | 5 - Docker-Compose/forgejo/files/compose.yaml | 118 --- Docker-Compose/forgejo/template.json | 290 ------- Docker-Compose/gitea/files/.env | 5 - Docker-Compose/gitea/files/compose.yaml | 118 --- Docker-Compose/gitea/template.json | 291 ------- .../gitlab-runner/files/compose.yaml | 8 - .../gitlab-runner/files/config/config.toml | 25 - Docker-Compose/gitlab-runner/template.json | 112 --- Docker-Compose/gitlab/files/.env | 1 - Docker-Compose/gitlab/files/compose.yaml | 65 -- Docker-Compose/gitlab/files/config/gitlab.rb | 94 --- Docker-Compose/gitlab/template.json | 428 ---------- Docker-Compose/grafana/files/.env | 9 - Docker-Compose/grafana/files/compose.yaml | 108 --- Docker-Compose/grafana/template.json | 290 ------- .../homeassistant/files/compose.yaml | 15 - Docker-Compose/homeassistant/template.json | 72 -- Docker-Compose/homepage/files/compose.yaml | 90 --- Docker-Compose/homepage/template.json | 255 ------ Docker-Compose/homer/files/assets/config.yml | 71 -- Docker-Compose/homer/files/compose.yaml | 43 - Docker-Compose/homer/template.json | 261 ------ Docker-Compose/infisical/files/.env | 33 - Docker-Compose/infisical/files/compose.yaml | 138 ---- Docker-Compose/infisical/template.json | 681 ---------------- Docker-Compose/influxdb/files/.env | 6 - Docker-Compose/influxdb/files/compose.yaml | 53 -- Docker-Compose/influxdb/template.json | 225 ------ Docker-Compose/kestra/files/compose.yaml | 56 -- Docker-Compose/kestra/template.json | 297 ------- Docker-Compose/komodo/files/.env | 8 - Docker-Compose/komodo/files/compose.yaml | 209 ----- Docker-Compose/komodo/template.json | 461 ----------- Docker-Compose/loki/files/compose.yaml | 43 - Docker-Compose/loki/template.json | 172 ---- Docker-Compose/mariadb/files/.env | 4 - Docker-Compose/mariadb/files/compose.yaml | 19 - Docker-Compose/mariadb/template.json | 116 --- Docker-Compose/n8n/.env | 5 - Docker-Compose/n8n/docker-compose.yml | 38 - Docker-Compose/n8n/files/.env | 6 - Docker-Compose/n8n/files/compose.yaml | 76 -- Docker-Compose/n8n/template.json | 303 ------- Docker-Compose/netbird/files/compose.yaml | 177 ---- Docker-Compose/netbird/template.json | 265 ------ Docker-Compose/netbox/files/.env | 9 - Docker-Compose/netbox/files/compose.yaml | 199 ----- Docker-Compose/netbox/template.json | 324 -------- Docker-Compose/nextcloud/files/.env | 5 - Docker-Compose/nextcloud/files/compose.yaml | 145 ---- Docker-Compose/nextcloud/template.json | 284 ------- Docker-Compose/nginx/files/compose.yaml | 39 - .../nginx/files/config/default.conf | 9 - Docker-Compose/nginx/files/data/index.html | 1 - Docker-Compose/nginx/template.json | 185 ----- Docker-Compose/openwebui/files/.env | 5 - Docker-Compose/openwebui/files/compose.yaml | 60 -- Docker-Compose/openwebui/template.json | 282 ------- Docker-Compose/passbolt/files/.env | 9 - Docker-Compose/passbolt/files/compose.yaml | 49 -- Docker-Compose/passbolt/template.json | 180 ----- Docker-Compose/pihole/files/.env | 2 - Docker-Compose/pihole/files/compose.yaml | 129 --- Docker-Compose/pihole/template.json | 402 ---------- Docker-Compose/portainer/files/compose.yaml | 59 -- Docker-Compose/portainer/template.json | 257 ------ Docker-Compose/postgres/files/.env | 3 - Docker-Compose/postgres/files/compose.yaml | 59 -- Docker-Compose/postgres/template.json | 233 ------ Docker-Compose/prometheus/files/compose.yaml | 56 -- .../prometheus/files/config/prometheus.yaml | 28 - Docker-Compose/prometheus/template.json | 191 ----- Docker-Compose/renovate/files/.env | 4 - Docker-Compose/renovate/files/compose.yaml | 56 -- Docker-Compose/renovate/template.json | 264 ------ Docker-Compose/semaphoreui/files/.env | 8 - Docker-Compose/semaphoreui/files/compose.yaml | 121 --- Docker-Compose/semaphoreui/template.json | 324 -------- Docker-Compose/technitium/files/.env | 2 - Docker-Compose/technitium/files/compose.yaml | 141 ---- Docker-Compose/technitium/template.json | 469 ----------- Docker-Compose/teleport/files/compose.yaml | 39 - .../teleport/files/config/teleport.yaml | 40 - Docker-Compose/teleport/template.json | 271 ------- .../traefik-addons/files/compose.yaml | 56 -- .../files/config/dynamic/chains.yaml | 32 - .../files/config/dynamic/middlewares.yaml | 78 -- Docker-Compose/traefik-addons/template.json | 524 ------------ Docker-Compose/traefik/files/.env | 31 - Docker-Compose/traefik/files/compose.yaml | 139 ---- Docker-Compose/traefik/template.json | 417 ---------- Docker-Compose/twingate-connector/files/.env | 3 - .../twingate-connector/files/compose.yaml | 17 - .../twingate-connector/template.json | 184 ----- Docker-Compose/uptimekuma/files/compose.yaml | 14 - Docker-Compose/uptimekuma/template.json | 73 -- Docker-Compose/whoami/files/compose.yaml | 25 - Docker-Compose/whoami/template.json | 135 ---- Terraform/cloudflare-dns-record/files/main.tf | 29 - Terraform/cloudflare-dns-record/template.json | 175 ---- .../files/main.tf | 17 - .../template.json | 89 -- Terraform/cloudflare-zone-data/files/main.tf | 3 - Terraform/cloudflare-zone-data/template.json | 44 - ...loudflare_zero_trust_access_application.tf | 23 - .../cloudflare_zero_trust_access_policy.tf | 28 - .../cloudflare-ztna-application/files/main.tf | 7 - .../cloudflare-ztna-application/template.json | 157 ---- Terraform/dns-a-record-tsig/files/main.tf | 8 - Terraform/dns-a-record-tsig/template.json | 69 -- Terraform/netbird-group/files/main.tf | 53 -- Terraform/netbird-group/template.json | 66 -- .../netbird-network-resource/files/main.tf | 29 - .../netbird-network-resource/template.json | 88 -- .../netbird-network-router/files/main.tf | 36 - .../netbird-network-router/template.json | 112 --- Terraform/netbird-network/files/main.tf | 6 - Terraform/netbird-network/template.json | 49 -- Terraform/netbird-policy/files/main.tf | 84 -- Terraform/netbird-policy/template.json | 192 ----- .../files/main.tf | 145 ---- .../template.json | 283 ------- Terraform/netbox-vm/files/main.tf | 63 -- Terraform/netbox-vm/template.json | 222 ----- Terraform/proxmox-lxc/files/main.tf | 39 - Terraform/proxmox-lxc/template.json | 231 ------ Terraform/proxmox-vm-qemu/files/main.tf | 77 -- Terraform/proxmox-vm-qemu/template.json | 355 -------- helm/argocd/files/values.yaml | 79 -- helm/argocd/template.json | 301 ------- helm/authentik/files/secrets.yaml | 14 - helm/authentik/files/values.yaml | 56 -- helm/authentik/template.json | 273 ------- helm/certmanager/files/values.yaml | 21 - helm/certmanager/template.json | 56 -- helm/infisical/files/helm-secrets.yaml | 12 - helm/infisical/files/namespace.yaml | 8 - helm/infisical/files/postgres-secret.yaml | 16 - helm/infisical/files/secret.yaml | 29 - helm/infisical/files/values.yaml | 110 --- helm/infisical/template.json | 758 ------------------ helm/longhorn/files/values.yaml | 51 -- helm/longhorn/template.json | 66 -- helm/netbox/files/values.yaml | 132 --- helm/netbox/template.json | 418 ---------- helm/portainer/files/values.yaml | 29 - helm/portainer/template.json | 108 --- helm/traefik-helm/files/values.yaml | 41 - helm/traefik-helm/template.json | 123 --- .../certmanager-certificate/files/main.yaml | 15 - .../certmanager-certificate/template.json | 207 ----- .../certmanager-clusterissuer/files/main.yaml | 17 - .../certmanager-clusterissuer/template.json | 196 ----- kubernetes/certmanager-issuer/files/main.yaml | 18 - kubernetes/certmanager-issuer/template.json | 195 ----- .../core-clusterrolebinding/files/main.yaml | 14 - .../core-clusterrolebinding/template.json | 100 --- kubernetes/core-configmap/files/main.yaml | 12 - kubernetes/core-configmap/template.json | 147 ---- kubernetes/core-cronjob/files/main.yaml | 76 -- kubernetes/core-cronjob/template.json | 405 ---------- kubernetes/core-daemonset/files/main.yaml | 79 -- kubernetes/core-daemonset/template.json | 337 -------- kubernetes/core-deployment/files/main.yaml | 52 -- kubernetes/core-deployment/template.json | 276 ------- kubernetes/core-ingress/files/main.yaml | 19 - kubernetes/core-ingress/template.json | 179 ----- kubernetes/core-ingressclass/files/main.yaml | 11 - kubernetes/core-ingressclass/template.json | 155 ---- kubernetes/core-namespace/files/main.yaml | 12 - kubernetes/core-namespace/template.json | 104 --- kubernetes/core-networkpolicy/files/main.yaml | 78 -- kubernetes/core-networkpolicy/template.json | 288 ------- .../core-persistentvolume/files/main.yaml | 16 - .../core-persistentvolume/template.json | 195 ----- .../files/main.yaml | 15 - .../core-persistentvolumeclaim/template.json | 181 ----- kubernetes/core-secret/files/main.yaml | 9 - kubernetes/core-secret/template.json | 169 ---- kubernetes/core-service/files/main.yaml | 15 - kubernetes/core-service/template.json | 203 ----- .../core-serviceaccount/files/main.yaml | 6 - kubernetes/core-serviceaccount/template.json | 147 ---- kubernetes/core-statefulset/files/main.yaml | 76 -- kubernetes/core-statefulset/template.json | 398 --------- kubernetes/core-storageclass/files/main.yaml | 8 - kubernetes/core-storageclass/template.json | 174 ---- kubernetes/flux-bootstrap/files/main.yaml | 86 -- kubernetes/flux-bootstrap/template.json | 377 --------- kubernetes/kube-vip/files/main.yaml | 147 ---- kubernetes/kube-vip/template.json | 246 ------ kubernetes/metallb/files/main.yaml | 36 - kubernetes/metallb/template.json | 153 ---- kubernetes/traefik-basicauth/files/main.yaml | 14 - kubernetes/traefik-basicauth/template.json | 100 --- kubernetes/traefik-buffering/files/main.yaml | 12 - kubernetes/traefik-buffering/template.json | 96 --- .../traefik-circuitbreaker/files/main.yaml | 9 - .../traefik-circuitbreaker/template.json | 63 -- .../files/main.yaml | 26 - .../template.json | 116 --- .../traefik-ingressroute/files/main.yaml | 23 - kubernetes/traefik-ingressroute/template.json | 187 ----- .../traefik-ingressroutetcp/files/main.yaml | 18 - .../traefik-ingressroutetcp/template.json | 176 ---- .../traefik-ipallowlist/files/main.yaml | 24 - kubernetes/traefik-ipallowlist/template.json | 101 --- kubernetes/traefik-middleware/files/main.yaml | 27 - kubernetes/traefik-middleware/template.json | 163 ---- kubernetes/traefik-retry/files/main.yaml | 12 - kubernetes/traefik-retry/template.json | 74 -- kubernetes/twingate-connector/files/main.yaml | 12 - kubernetes/twingate-connector/template.json | 161 ---- python/broken-link-crawler/files/main.py | 241 ------ .../files/requirements.txt | 2 - python/broken-link-crawler/template.json | 110 --- .../server-disk-usage-monitor/files/main.py | 116 --- .../files/requirements.txt | 1 - .../server-disk-usage-monitor/template.json | 83 -- swarm/homepage/files/compose.yaml | 97 --- swarm/homepage/template.json | 284 ------- swarm/homer/files/assets/config.yml | 71 -- swarm/homer/files/compose.yaml | 60 -- swarm/homer/template.json | 259 ------ swarm/komodo/files/compose.yaml | 127 --- swarm/komodo/template.json | 460 ----------- swarm/n8n/files/compose.yaml | 263 ------ swarm/n8n/template.json | 562 ------------- swarm/nextcloud/files/compose.yaml | 147 ---- swarm/nextcloud/template.json | 239 ------ swarm/nginx/files/compose.yaml | 53 -- swarm/nginx/files/config/default.conf | 9 - swarm/nginx/files/data/index.html | 1 - swarm/nginx/template.json | 208 ----- swarm/pihole/files/.env.secret.webpassword | 1 - swarm/pihole/files/compose.yaml | 157 ---- swarm/pihole/template.json | 407 ---------- swarm/portainer/files/compose.yaml | 68 -- swarm/portainer/template.json | 266 ------ swarm/postgres/files/compose.yaml | 71 -- swarm/postgres/template.json | 238 ------ swarm/renovate/files/compose.yaml | 64 -- swarm/renovate/template.json | 301 ------- .../traefik/files/.env.secret.aws_credentials | 5 - swarm/traefik/files/.env.secret.consumer_key | 1 - swarm/traefik/files/.env.secret.token | 1 - swarm/traefik/files/.env.secret.token_key | 1 - swarm/traefik/files/compose.yaml | 189 ----- swarm/traefik/template.json | 513 ------------ swarm/twingate-connector/files/compose.yaml | 39 - swarm/twingate-connector/template.json | 206 ----- 345 files changed, 40650 deletions(-) delete mode 100644 AnisiblePlaybooks/CHeckmk/activate-changes.yaml delete mode 100644 AnisiblePlaybooks/CHeckmk/checkmk-install-agent/files/main.yml delete mode 100644 AnisiblePlaybooks/CHeckmk/checkmk-install-agent/template.json delete mode 100644 AnisiblePlaybooks/CHeckmk/checkmk-manage-host/files/main.yml delete mode 100644 AnisiblePlaybooks/CHeckmk/checkmk-manage-host/template.json delete mode 100644 AnisiblePlaybooks/CHeckmk/install-agent.yaml delete mode 100644 AnisiblePlaybooks/CHeckmk/inventory.ini delete mode 100644 AnisiblePlaybooks/CHeckmk/inventory.yaml delete mode 100644 AnisiblePlaybooks/CHeckmk/lookup-rule.yaml delete mode 100644 AnisiblePlaybooks/CHeckmk/manage-hosts.yaml delete mode 100644 AnisiblePlaybooks/CHeckmk/manage-rules.yaml delete mode 100644 AnisiblePlaybooks/CHeckmk/secrets.yaml delete mode 100644 AnisiblePlaybooks/docker-certs-enable/files/main.yml delete mode 100644 AnisiblePlaybooks/docker-certs-enable/template.json delete mode 100644 AnisiblePlaybooks/docker-certs/files/main.yml delete mode 100644 AnisiblePlaybooks/docker-certs/template.json delete mode 100644 AnisiblePlaybooks/docker-cleanup/files/main.yml delete mode 100644 AnisiblePlaybooks/docker-cleanup/files/requirements.yml delete mode 100644 AnisiblePlaybooks/docker-cleanup/template.json delete mode 100644 AnisiblePlaybooks/docker-disk-usage-report/files/main.yml delete mode 100644 AnisiblePlaybooks/docker-disk-usage-report/template.json delete mode 100644 AnisiblePlaybooks/docker-healthcheck-audit/files/main.yml delete mode 100644 AnisiblePlaybooks/docker-healthcheck-audit/files/requirements.yml delete mode 100644 AnisiblePlaybooks/docker-healthcheck-audit/template.json delete mode 100644 AnisiblePlaybooks/docker-install-ubuntu/files/main.yml delete mode 100644 AnisiblePlaybooks/docker-install-ubuntu/template.json delete mode 100644 AnisiblePlaybooks/docker-mysql-backup/files/main.yml delete mode 100644 AnisiblePlaybooks/docker-mysql-backup/files/requirements.yml delete mode 100644 AnisiblePlaybooks/docker-mysql-backup/template.json delete mode 100644 AnisiblePlaybooks/docker-orphan-detection/files/main.yml delete mode 100644 AnisiblePlaybooks/docker-orphan-detection/template.json delete mode 100644 AnisiblePlaybooks/docker-postgres-backup/files/main.yml delete mode 100644 AnisiblePlaybooks/docker-postgres-backup/files/requirements.yml delete mode 100644 AnisiblePlaybooks/docker-postgres-backup/template.json delete mode 100644 AnisiblePlaybooks/docker-volume-backup/files/main.yml delete mode 100644 AnisiblePlaybooks/docker-volume-backup/files/requirements.yml delete mode 100644 AnisiblePlaybooks/docker-volume-backup/template.json delete mode 100644 AnisiblePlaybooks/k3s-postinstall/files/main.yml delete mode 100644 AnisiblePlaybooks/k3s-postinstall/template.json delete mode 100644 AnisiblePlaybooks/k3sup-k3s-cluster/files/main.yml delete mode 100644 AnisiblePlaybooks/k3sup-k3s-cluster/template.json delete mode 100644 AnisiblePlaybooks/ubuntu-add-sshkey/files/main.yml delete mode 100644 AnisiblePlaybooks/ubuntu-add-sshkey/template.json delete mode 100644 AnisiblePlaybooks/ubuntu-packages/files/main.yml delete mode 100644 AnisiblePlaybooks/ubuntu-packages/template.json delete mode 100644 AnisiblePlaybooks/ubuntu-vm-core/files/main.yml delete mode 100644 AnisiblePlaybooks/ubuntu-vm-core/template.json rename Docker-Compose/{ => ArrsStack}/spark - media build (100%) delete mode 100644 Docker-Compose/adguardhome/files/compose.yaml delete mode 100644 Docker-Compose/adguardhome/template.json delete mode 100644 Docker-Compose/alloy/files/compose.yaml delete mode 100644 Docker-Compose/alloy/files/config/common.alloy delete mode 100644 Docker-Compose/alloy/files/config/logs_docker.alloy delete mode 100644 Docker-Compose/alloy/files/config/logs_system.alloy delete mode 100644 Docker-Compose/alloy/files/config/metrics_docker.alloy delete mode 100644 Docker-Compose/alloy/files/config/metrics_system.alloy delete mode 100644 Docker-Compose/alloy/files/config/targets.alloy delete mode 100644 Docker-Compose/alloy/template.json delete mode 100644 Docker-Compose/arcane-agent/files/.env delete mode 100644 Docker-Compose/arcane-agent/files/compose.yaml delete mode 100644 Docker-Compose/arcane-agent/template.json delete mode 100644 Docker-Compose/arcane/files/.env delete mode 100644 Docker-Compose/arcane/files/compose.yaml delete mode 100644 Docker-Compose/arcane/template.json delete mode 100644 Docker-Compose/authentik/files/.env delete mode 100644 Docker-Compose/authentik/files/compose.yaml delete mode 100644 Docker-Compose/authentik/template.json delete mode 100644 Docker-Compose/bind9/files/compose.yaml delete mode 100644 Docker-Compose/bind9/files/config/named.conf delete mode 100644 Docker-Compose/bind9/files/config/named.conf.zones delete mode 100644 Docker-Compose/bind9/files/config/tsig.key delete mode 100644 Docker-Compose/bind9/files/zones/db.primary.zone delete mode 100644 Docker-Compose/bind9/template.json delete mode 100644 Docker-Compose/caddy/files/Caddyfile delete mode 100644 Docker-Compose/caddy/files/compose.yaml delete mode 100644 Docker-Compose/caddy/files/config/webserver.caddy delete mode 100644 Docker-Compose/caddy/template.json delete mode 100644 Docker-Compose/checkmk/files/.env delete mode 100644 Docker-Compose/checkmk/files/compose.yaml delete mode 100644 Docker-Compose/checkmk/template.json delete mode 100644 Docker-Compose/cloudflared/files/.env delete mode 100644 Docker-Compose/cloudflared/files/compose.yaml delete mode 100644 Docker-Compose/cloudflared/template.json delete mode 100644 Docker-Compose/crowdsec/files/.env delete mode 100644 Docker-Compose/crowdsec/files/compose.yaml delete mode 100644 Docker-Compose/crowdsec/files/config/acquis.d/appsec.yaml delete mode 100644 Docker-Compose/crowdsec/files/config/acquis.yaml delete mode 100644 Docker-Compose/crowdsec/template.json delete mode 100644 Docker-Compose/dockge/files/compose.yaml delete mode 100644 Docker-Compose/dockge/template.json delete mode 100644 Docker-Compose/dockhand/files/.env delete mode 100644 Docker-Compose/dockhand/files/compose.yaml delete mode 100644 Docker-Compose/dockhand/template.json delete mode 100644 Docker-Compose/forgejo/files/.env delete mode 100644 Docker-Compose/forgejo/files/compose.yaml delete mode 100644 Docker-Compose/forgejo/template.json delete mode 100644 Docker-Compose/gitea/files/.env delete mode 100644 Docker-Compose/gitea/files/compose.yaml delete mode 100644 Docker-Compose/gitea/template.json delete mode 100644 Docker-Compose/gitlab-runner/files/compose.yaml delete mode 100644 Docker-Compose/gitlab-runner/files/config/config.toml delete mode 100644 Docker-Compose/gitlab-runner/template.json delete mode 100644 Docker-Compose/gitlab/files/.env delete mode 100644 Docker-Compose/gitlab/files/compose.yaml delete mode 100644 Docker-Compose/gitlab/files/config/gitlab.rb delete mode 100644 Docker-Compose/gitlab/template.json delete mode 100644 Docker-Compose/grafana/files/.env delete mode 100644 Docker-Compose/grafana/files/compose.yaml delete mode 100644 Docker-Compose/grafana/template.json delete mode 100644 Docker-Compose/homeassistant/files/compose.yaml delete mode 100644 Docker-Compose/homeassistant/template.json delete mode 100644 Docker-Compose/homepage/files/compose.yaml delete mode 100644 Docker-Compose/homepage/template.json delete mode 100644 Docker-Compose/homer/files/assets/config.yml delete mode 100644 Docker-Compose/homer/files/compose.yaml delete mode 100644 Docker-Compose/homer/template.json delete mode 100644 Docker-Compose/infisical/files/.env delete mode 100644 Docker-Compose/infisical/files/compose.yaml delete mode 100644 Docker-Compose/infisical/template.json delete mode 100644 Docker-Compose/influxdb/files/.env delete mode 100644 Docker-Compose/influxdb/files/compose.yaml delete mode 100644 Docker-Compose/influxdb/template.json delete mode 100644 Docker-Compose/kestra/files/compose.yaml delete mode 100644 Docker-Compose/kestra/template.json delete mode 100644 Docker-Compose/komodo/files/.env delete mode 100644 Docker-Compose/komodo/files/compose.yaml delete mode 100644 Docker-Compose/komodo/template.json delete mode 100644 Docker-Compose/loki/files/compose.yaml delete mode 100644 Docker-Compose/loki/template.json delete mode 100644 Docker-Compose/mariadb/files/.env delete mode 100644 Docker-Compose/mariadb/files/compose.yaml delete mode 100644 Docker-Compose/mariadb/template.json delete mode 100644 Docker-Compose/n8n/.env delete mode 100644 Docker-Compose/n8n/docker-compose.yml delete mode 100644 Docker-Compose/n8n/files/.env delete mode 100644 Docker-Compose/n8n/files/compose.yaml delete mode 100644 Docker-Compose/n8n/template.json delete mode 100644 Docker-Compose/netbird/files/compose.yaml delete mode 100644 Docker-Compose/netbird/template.json delete mode 100644 Docker-Compose/netbox/files/.env delete mode 100644 Docker-Compose/netbox/files/compose.yaml delete mode 100644 Docker-Compose/netbox/template.json delete mode 100644 Docker-Compose/nextcloud/files/.env delete mode 100644 Docker-Compose/nextcloud/files/compose.yaml delete mode 100644 Docker-Compose/nextcloud/template.json delete mode 100644 Docker-Compose/nginx/files/compose.yaml delete mode 100644 Docker-Compose/nginx/files/config/default.conf delete mode 100644 Docker-Compose/nginx/files/data/index.html delete mode 100644 Docker-Compose/nginx/template.json delete mode 100644 Docker-Compose/openwebui/files/.env delete mode 100644 Docker-Compose/openwebui/files/compose.yaml delete mode 100644 Docker-Compose/openwebui/template.json delete mode 100644 Docker-Compose/passbolt/files/.env delete mode 100644 Docker-Compose/passbolt/files/compose.yaml delete mode 100644 Docker-Compose/passbolt/template.json delete mode 100644 Docker-Compose/pihole/files/.env delete mode 100644 Docker-Compose/pihole/files/compose.yaml delete mode 100644 Docker-Compose/pihole/template.json delete mode 100644 Docker-Compose/portainer/files/compose.yaml delete mode 100644 Docker-Compose/portainer/template.json delete mode 100644 Docker-Compose/postgres/files/.env delete mode 100644 Docker-Compose/postgres/files/compose.yaml delete mode 100644 Docker-Compose/postgres/template.json delete mode 100644 Docker-Compose/prometheus/files/compose.yaml delete mode 100755 Docker-Compose/prometheus/files/config/prometheus.yaml delete mode 100644 Docker-Compose/prometheus/template.json delete mode 100644 Docker-Compose/renovate/files/.env delete mode 100644 Docker-Compose/renovate/files/compose.yaml delete mode 100644 Docker-Compose/renovate/template.json delete mode 100644 Docker-Compose/semaphoreui/files/.env delete mode 100644 Docker-Compose/semaphoreui/files/compose.yaml delete mode 100644 Docker-Compose/semaphoreui/template.json delete mode 100644 Docker-Compose/technitium/files/.env delete mode 100644 Docker-Compose/technitium/files/compose.yaml delete mode 100644 Docker-Compose/technitium/template.json delete mode 100644 Docker-Compose/teleport/files/compose.yaml delete mode 100644 Docker-Compose/teleport/files/config/teleport.yaml delete mode 100644 Docker-Compose/teleport/template.json delete mode 100644 Docker-Compose/traefik-addons/files/compose.yaml delete mode 100644 Docker-Compose/traefik-addons/files/config/dynamic/chains.yaml delete mode 100644 Docker-Compose/traefik-addons/files/config/dynamic/middlewares.yaml delete mode 100644 Docker-Compose/traefik-addons/template.json delete mode 100644 Docker-Compose/traefik/files/.env delete mode 100644 Docker-Compose/traefik/files/compose.yaml delete mode 100644 Docker-Compose/traefik/template.json delete mode 100644 Docker-Compose/twingate-connector/files/.env delete mode 100644 Docker-Compose/twingate-connector/files/compose.yaml delete mode 100644 Docker-Compose/twingate-connector/template.json delete mode 100644 Docker-Compose/uptimekuma/files/compose.yaml delete mode 100644 Docker-Compose/uptimekuma/template.json delete mode 100644 Docker-Compose/whoami/files/compose.yaml delete mode 100644 Docker-Compose/whoami/template.json delete mode 100644 Terraform/cloudflare-dns-record/files/main.tf delete mode 100644 Terraform/cloudflare-dns-record/template.json delete mode 100644 Terraform/cloudflare-zero-trust-tunnel-config/files/main.tf delete mode 100644 Terraform/cloudflare-zero-trust-tunnel-config/template.json delete mode 100644 Terraform/cloudflare-zone-data/files/main.tf delete mode 100644 Terraform/cloudflare-zone-data/template.json delete mode 100644 Terraform/cloudflare-ztna-application/files/cloudflare_zero_trust_access_application.tf delete mode 100644 Terraform/cloudflare-ztna-application/files/cloudflare_zero_trust_access_policy.tf delete mode 100644 Terraform/cloudflare-ztna-application/files/main.tf delete mode 100644 Terraform/cloudflare-ztna-application/template.json delete mode 100644 Terraform/dns-a-record-tsig/files/main.tf delete mode 100644 Terraform/dns-a-record-tsig/template.json delete mode 100644 Terraform/netbird-group/files/main.tf delete mode 100644 Terraform/netbird-group/template.json delete mode 100644 Terraform/netbird-network-resource/files/main.tf delete mode 100644 Terraform/netbird-network-resource/template.json delete mode 100644 Terraform/netbird-network-router/files/main.tf delete mode 100644 Terraform/netbird-network-router/template.json delete mode 100644 Terraform/netbird-network/files/main.tf delete mode 100644 Terraform/netbird-network/template.json delete mode 100644 Terraform/netbird-policy/files/main.tf delete mode 100644 Terraform/netbird-policy/template.json delete mode 100644 Terraform/netbird-reverse-proxy-service/files/main.tf delete mode 100644 Terraform/netbird-reverse-proxy-service/template.json delete mode 100644 Terraform/netbox-vm/files/main.tf delete mode 100644 Terraform/netbox-vm/template.json delete mode 100644 Terraform/proxmox-lxc/files/main.tf delete mode 100644 Terraform/proxmox-lxc/template.json delete mode 100644 Terraform/proxmox-vm-qemu/files/main.tf delete mode 100644 Terraform/proxmox-vm-qemu/template.json delete mode 100644 helm/argocd/files/values.yaml delete mode 100644 helm/argocd/template.json delete mode 100644 helm/authentik/files/secrets.yaml delete mode 100644 helm/authentik/files/values.yaml delete mode 100644 helm/authentik/template.json delete mode 100644 helm/certmanager/files/values.yaml delete mode 100644 helm/certmanager/template.json delete mode 100644 helm/infisical/files/helm-secrets.yaml delete mode 100644 helm/infisical/files/namespace.yaml delete mode 100644 helm/infisical/files/postgres-secret.yaml delete mode 100644 helm/infisical/files/secret.yaml delete mode 100644 helm/infisical/files/values.yaml delete mode 100644 helm/infisical/template.json delete mode 100644 helm/longhorn/files/values.yaml delete mode 100644 helm/longhorn/template.json delete mode 100644 helm/netbox/files/values.yaml delete mode 100644 helm/netbox/template.json delete mode 100644 helm/portainer/files/values.yaml delete mode 100644 helm/portainer/template.json delete mode 100644 helm/traefik-helm/files/values.yaml delete mode 100644 helm/traefik-helm/template.json delete mode 100644 kubernetes/certmanager-certificate/files/main.yaml delete mode 100644 kubernetes/certmanager-certificate/template.json delete mode 100644 kubernetes/certmanager-clusterissuer/files/main.yaml delete mode 100644 kubernetes/certmanager-clusterissuer/template.json delete mode 100644 kubernetes/certmanager-issuer/files/main.yaml delete mode 100644 kubernetes/certmanager-issuer/template.json delete mode 100644 kubernetes/core-clusterrolebinding/files/main.yaml delete mode 100644 kubernetes/core-clusterrolebinding/template.json delete mode 100644 kubernetes/core-configmap/files/main.yaml delete mode 100644 kubernetes/core-configmap/template.json delete mode 100644 kubernetes/core-cronjob/files/main.yaml delete mode 100644 kubernetes/core-cronjob/template.json delete mode 100644 kubernetes/core-daemonset/files/main.yaml delete mode 100644 kubernetes/core-daemonset/template.json delete mode 100644 kubernetes/core-deployment/files/main.yaml delete mode 100644 kubernetes/core-deployment/template.json delete mode 100644 kubernetes/core-ingress/files/main.yaml delete mode 100644 kubernetes/core-ingress/template.json delete mode 100644 kubernetes/core-ingressclass/files/main.yaml delete mode 100644 kubernetes/core-ingressclass/template.json delete mode 100644 kubernetes/core-namespace/files/main.yaml delete mode 100644 kubernetes/core-namespace/template.json delete mode 100644 kubernetes/core-networkpolicy/files/main.yaml delete mode 100644 kubernetes/core-networkpolicy/template.json delete mode 100644 kubernetes/core-persistentvolume/files/main.yaml delete mode 100644 kubernetes/core-persistentvolume/template.json delete mode 100644 kubernetes/core-persistentvolumeclaim/files/main.yaml delete mode 100644 kubernetes/core-persistentvolumeclaim/template.json delete mode 100644 kubernetes/core-secret/files/main.yaml delete mode 100644 kubernetes/core-secret/template.json delete mode 100644 kubernetes/core-service/files/main.yaml delete mode 100644 kubernetes/core-service/template.json delete mode 100644 kubernetes/core-serviceaccount/files/main.yaml delete mode 100644 kubernetes/core-serviceaccount/template.json delete mode 100644 kubernetes/core-statefulset/files/main.yaml delete mode 100644 kubernetes/core-statefulset/template.json delete mode 100644 kubernetes/core-storageclass/files/main.yaml delete mode 100644 kubernetes/core-storageclass/template.json delete mode 100644 kubernetes/flux-bootstrap/files/main.yaml delete mode 100644 kubernetes/flux-bootstrap/template.json delete mode 100644 kubernetes/kube-vip/files/main.yaml delete mode 100644 kubernetes/kube-vip/template.json delete mode 100644 kubernetes/metallb/files/main.yaml delete mode 100644 kubernetes/metallb/template.json delete mode 100644 kubernetes/traefik-basicauth/files/main.yaml delete mode 100644 kubernetes/traefik-basicauth/template.json delete mode 100644 kubernetes/traefik-buffering/files/main.yaml delete mode 100644 kubernetes/traefik-buffering/template.json delete mode 100644 kubernetes/traefik-circuitbreaker/files/main.yaml delete mode 100644 kubernetes/traefik-circuitbreaker/template.json delete mode 100644 kubernetes/traefik-forwardauth-middleware/files/main.yaml delete mode 100644 kubernetes/traefik-forwardauth-middleware/template.json delete mode 100644 kubernetes/traefik-ingressroute/files/main.yaml delete mode 100644 kubernetes/traefik-ingressroute/template.json delete mode 100644 kubernetes/traefik-ingressroutetcp/files/main.yaml delete mode 100644 kubernetes/traefik-ingressroutetcp/template.json delete mode 100644 kubernetes/traefik-ipallowlist/files/main.yaml delete mode 100644 kubernetes/traefik-ipallowlist/template.json delete mode 100644 kubernetes/traefik-middleware/files/main.yaml delete mode 100644 kubernetes/traefik-middleware/template.json delete mode 100644 kubernetes/traefik-retry/files/main.yaml delete mode 100644 kubernetes/traefik-retry/template.json delete mode 100644 kubernetes/twingate-connector/files/main.yaml delete mode 100644 kubernetes/twingate-connector/template.json delete mode 100644 python/broken-link-crawler/files/main.py delete mode 100644 python/broken-link-crawler/files/requirements.txt delete mode 100644 python/broken-link-crawler/template.json delete mode 100644 python/server-disk-usage-monitor/files/main.py delete mode 100644 python/server-disk-usage-monitor/files/requirements.txt delete mode 100644 python/server-disk-usage-monitor/template.json delete mode 100644 swarm/homepage/files/compose.yaml delete mode 100644 swarm/homepage/template.json delete mode 100644 swarm/homer/files/assets/config.yml delete mode 100644 swarm/homer/files/compose.yaml delete mode 100644 swarm/homer/template.json delete mode 100644 swarm/komodo/files/compose.yaml delete mode 100644 swarm/komodo/template.json delete mode 100644 swarm/n8n/files/compose.yaml delete mode 100644 swarm/n8n/template.json delete mode 100644 swarm/nextcloud/files/compose.yaml delete mode 100644 swarm/nextcloud/template.json delete mode 100644 swarm/nginx/files/compose.yaml delete mode 100644 swarm/nginx/files/config/default.conf delete mode 100644 swarm/nginx/files/data/index.html delete mode 100644 swarm/nginx/template.json delete mode 100644 swarm/pihole/files/.env.secret.webpassword delete mode 100644 swarm/pihole/files/compose.yaml delete mode 100644 swarm/pihole/template.json delete mode 100644 swarm/portainer/files/compose.yaml delete mode 100644 swarm/portainer/template.json delete mode 100644 swarm/postgres/files/compose.yaml delete mode 100644 swarm/postgres/template.json delete mode 100644 swarm/renovate/files/compose.yaml delete mode 100644 swarm/renovate/template.json delete mode 100644 swarm/traefik/files/.env.secret.aws_credentials delete mode 100644 swarm/traefik/files/.env.secret.consumer_key delete mode 100644 swarm/traefik/files/.env.secret.token delete mode 100644 swarm/traefik/files/.env.secret.token_key delete mode 100644 swarm/traefik/files/compose.yaml delete mode 100644 swarm/traefik/template.json delete mode 100644 swarm/twingate-connector/files/compose.yaml delete mode 100644 swarm/twingate-connector/template.json diff --git a/AnisiblePlaybooks/CHeckmk/activate-changes.yaml b/AnisiblePlaybooks/CHeckmk/activate-changes.yaml deleted file mode 100644 index 128b9f2..0000000 --- a/AnisiblePlaybooks/CHeckmk/activate-changes.yaml +++ /dev/null @@ -1,20 +0,0 @@ ---- -- name: "Activate Checkmk changes" - hosts: localhost - gather_facts: false - vars_files: - - secrets.yaml - vars: - server_url: "http://192.168.2.4:5000" - site: "cmk" - - tasks: - - name: "Start activation on a specific site" - checkmk.general.activation: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - force_foreign_changes: 'true' - sites: - - "{{ site }}" diff --git a/AnisiblePlaybooks/CHeckmk/checkmk-install-agent/files/main.yml b/AnisiblePlaybooks/CHeckmk/checkmk-install-agent/files/main.yml deleted file mode 100644 index cb149c0..0000000 --- a/AnisiblePlaybooks/CHeckmk/checkmk-install-agent/files/main.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -- name: Install Checkmk agent on all hosts - hosts: all - become: true - roles: - - checkmk.general.agent - vars: - checkmk_agent_version: "2.4.0p15" - checkmk_agent_server: << checkmk_server >> - checkmk_agent_server_protocol: << checkmk_protocol >> - checkmk_agent_site: << checkmk_site >> - checkmk_agent_auto_activate: << checkmk_auto_activate >> - checkmk_agent_tls: << checkmk_tls >> - checkmk_agent_user: << checkmk_user >> - checkmk_agent_pass: << checkmk_pass >> - checkmk_agent_host_name: << checkmk_host >> diff --git a/AnisiblePlaybooks/CHeckmk/checkmk-install-agent/template.json b/AnisiblePlaybooks/CHeckmk/checkmk-install-agent/template.json deleted file mode 100644 index 7af14dd..0000000 --- a/AnisiblePlaybooks/CHeckmk/checkmk-install-agent/template.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "slug": "checkmk-install-agent", - "kind": "ansible", - "metadata": { - "name": "Install Checkmk Agent", - "description": "Installs and registers the Checkmk monitoring agent on target hosts using the checkmk.general.agent Ansible role.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "checkmk" - }, - "draft": false, - "version": { - "name": "2.4.0", - "source_dep_name": "manual/checkmk-install-agent" - } - }, - "variables": [ - { - "title": "Checkmk Configuration", - "name": "checkmk", - "items": [ - { - "name": "checkmk_server", - "type": "str", - "title": "Checkmk Server", - "required": true - }, - { - "name": "checkmk_protocol", - "type": "str", - "title": "Protocol", - "required": true, - "default": "https", - "config": { - "placeholder": "https" - } - }, - { - "name": "checkmk_site", - "type": "str", - "title": "Checkmk Site", - "required": true, - "default": "cmk", - "config": { - "placeholder": "cmk" - } - }, - { - "name": "checkmk_auto_activate", - "type": "bool", - "title": "Auto Activate Agent", - "required": false - }, - { - "name": "checkmk_tls", - "type": "bool", - "title": "TLS", - "required": false - }, - { - "name": "checkmk_user", - "type": "str", - "title": "Checkmk Automation User", - "required": true - }, - { - "name": "checkmk_pass", - "type": "secret", - "title": "Automation Password", - "required": true - }, - { - "name": "checkmk_host", - "type": "str", - "title": "Checkmk Host Name", - "required": true - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/CHeckmk/checkmk-manage-host/files/main.yml b/AnisiblePlaybooks/CHeckmk/checkmk-manage-host/files/main.yml deleted file mode 100644 index be5fe4d..0000000 --- a/AnisiblePlaybooks/CHeckmk/checkmk-manage-host/files/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- name: Manage Checkmk host - hosts: all - gather_facts: false - tasks: - - name: "Create or update host in Checkmk" - checkmk.general.host: - server_url: "<< checkmk_protocol >>://<< checkmk_server >>" - site: << checkmk_site >> - automation_user: << checkmk_user >> - automation_secret: << checkmk_pass >> - name: << host_name >> - attributes: - ipaddress: << host_ip >> - folder: << host_folder >> - state: "present" - delegate_to: localhost - run_once: true diff --git a/AnisiblePlaybooks/CHeckmk/checkmk-manage-host/template.json b/AnisiblePlaybooks/CHeckmk/checkmk-manage-host/template.json deleted file mode 100644 index 2bde7fe..0000000 --- a/AnisiblePlaybooks/CHeckmk/checkmk-manage-host/template.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "slug": "checkmk-manage-host", - "kind": "ansible", - "metadata": { - "name": "Manage Checkmk Host", - "description": "Manages host entries in Checkmk monitoring using the checkmk.general.host Ansible module. Creates or updates host configuration in your Checkmk instance.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "checkmk" - }, - "draft": false, - "version": { - "name": "2.4.0", - "source_dep_name": "manual/checkmk-manage-host" - } - }, - "variables": [ - { - "title": "Checkmk Configuration", - "name": "checkmk", - "items": [ - { - "name": "checkmk_server", - "type": "str", - "title": "Checkmk Server", - "required": true - }, - { - "name": "checkmk_protocol", - "type": "str", - "title": "Protocol", - "required": true, - "default": "https", - "config": { - "placeholder": "https" - } - }, - { - "name": "checkmk_site", - "type": "str", - "title": "Checkmk Site", - "required": true, - "default": "cmk", - "config": { - "placeholder": "cmk" - } - }, - { - "name": "checkmk_user", - "type": "str", - "title": "Checkmk Automation User", - "required": true - }, - { - "name": "checkmk_pass", - "type": "secret", - "title": "Automation Password", - "required": true - } - ] - }, - { - "title": "Host Configuration", - "name": "host", - "items": [ - { - "name": "host_name", - "type": "str", - "title": "Host Name", - "required": true, - "description": "Hostname to add to Checkmk" - }, - { - "name": "host_ip", - "type": "str", - "title": "Host IP", - "required": true, - "description": "IP address of the host" - }, - { - "name": "host_folder", - "type": "str", - "title": "Folder Path", - "required": true, - "default": "/", - "config": { - "placeholder": "/" - } - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/CHeckmk/install-agent.yaml b/AnisiblePlaybooks/CHeckmk/install-agent.yaml deleted file mode 100644 index 59b7e96..0000000 --- a/AnisiblePlaybooks/CHeckmk/install-agent.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# to run: ansible-playbook -i ./inventory.ini install-agent.yaml --ask-become-pass ---- -- name: "Install Checkmk agent on all hosts" - hosts: all - become: yes - roles: - - checkmk.general.agent - vars: - checkmk_agent_version: "2.3.0p7" - #checkmk_agent_server: "192.168.2.4:5000" - checkmk_agent_server: "checkmk.mikemcfetridge.com" - checkmk_agent_server_protocol: https - checkmk_agent_site: "cmk" - checkmk_agent_auto_activate: true - checkmk_agent_tls: "true" # NOTE: Register Agent to enable TLS - checkmk_agent_user: "{{ automation_user }}" - checkmk_agent_pass: "{{ automation_secret }}" - checkmk_agent_host_name: "{{ ansible_hostname }}" # NOTE: Required to replace FQDN with hostname only - vars_files: - - secrets.yaml diff --git a/AnisiblePlaybooks/CHeckmk/inventory.ini b/AnisiblePlaybooks/CHeckmk/inventory.ini deleted file mode 100644 index b53eecc..0000000 --- a/AnisiblePlaybooks/CHeckmk/inventory.ini +++ /dev/null @@ -1,23 +0,0 @@ -[servers] -192.168.2.1 -192.168.2.2 -192.168.2.3 -192.168.2.4 -192.168.2.5 -192.168.2.6 -192.168.2.7 -192.168.2.8 -192.168.2.9 -192.168.2.10 -192.168.2.11 -192.168.2.12 -192.168.2.13 -192.168.2.14 -192.168.2.16 -192.168.2.17 -192.168.2.18 -192.168.2.19 -192.168.2.20 -192.168.2.22 -192.168.2.23 -192.168.2.24 diff --git a/AnisiblePlaybooks/CHeckmk/inventory.yaml b/AnisiblePlaybooks/CHeckmk/inventory.yaml deleted file mode 100644 index a91174f..0000000 --- a/AnisiblePlaybooks/CHeckmk/inventory.yaml +++ /dev/null @@ -1,21 +0,0 @@ -[servers] -ansible-server.home.mikemcfetridge.com -arrsserver.home.mikemcfetridge.com -beszel-server.home.mikemcfetridge.com -checkmk.home.mikemcfetridge.com -dockerapps.home.mikemcfetridge.com -gitea-server.home.mikemcfetridge.com -glance-server.home.mikemcfetridge.com -immich-wallabag.home.mikemcfetridge.com -linkwarden.home.mikemcfetridge.com -netbird-1.home.mikemcfetridge.com -netbird-2.home.mikemcfetridge.com -npm-server.home.mikemcfetridge.com -pihole-server.home.mikemcfetridge.com -pve.home.mikemcfetridge.com -pve2.home.mikemcfetridge.com -retrogaming-server.home.mikemcfetridge.com -searxng-server.home.mikemcfetridge.com -technitiumdns-server.home.mikemcfetridge.com -vaultwarden-server.home.mikemcfetridge.com -wireguard-server.home.mikemcfetridge.com diff --git a/AnisiblePlaybooks/CHeckmk/lookup-rule.yaml b/AnisiblePlaybooks/CHeckmk/lookup-rule.yaml deleted file mode 100644 index df15807..0000000 --- a/AnisiblePlaybooks/CHeckmk/lookup-rule.yaml +++ /dev/null @@ -1,25 +0,0 @@ ---- -- name: "Manage Checkmk rules" - hosts: localhost - gather_facts: false - vars_files: - - secrets.yaml - vars: - server_url: "http://192.168.2.4:5000" - site: "cmk" - - tasks: - - name: Get a rule with a particular rule id - ansible.builtin.debug: - msg: "Rule: {{ extensions | to_nice_yaml }}" - vars: - extensions: "{{ - lookup('checkmk.general.rule', - rule_id='checkmk-rule-id', - server_url=server_url, - site=site, - automation_user=automation_user, - automation_secret=automation_secret, - validate_certs=False - ) - }}" diff --git a/AnisiblePlaybooks/CHeckmk/manage-hosts.yaml b/AnisiblePlaybooks/CHeckmk/manage-hosts.yaml deleted file mode 100644 index a477436..0000000 --- a/AnisiblePlaybooks/CHeckmk/manage-hosts.yaml +++ /dev/null @@ -1,286 +0,0 @@ ---- -- name: "Manage Checkmk hosts" - hosts: localhost - gather_facts: false - vars_files: - - secrets.yaml - vars: - server_url: "http://192.168.2.4:5000" - site: "cmk" - - tasks: - - - name: "Create host - PVE01" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "pve01" - attributes: - ipaddress: "192.168.2.1" - folder: "/" - state: "present" - - - name: "Create host - PVE02" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "pve02" - attributes: - ipaddress: "192.168.2.2" - folder: "/" - state: "present" - - - name: "Create host - beszel" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "Beszel" - attributes: - ipaddress: "192.168.2.3" - folder: "/" - state: "present" - - - name: "Create host - Checkmk" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "Checkmk" - attributes: - ipaddress: "192.168.2.4" - folder: "/" - state: "present" - - - name: "Create host - komodo" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "komodo" - attributes: - ipaddress: "192.168.2.5" - folder: "/" - state: "present" - - - name: "Create host - Datacenter" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "Datacenter" - attributes: - ipaddress: "192.168.2.6" - folder: "/" - state: "present" - - - name: "Create host - DockerApps" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "DockerApps" - attributes: - ipaddress: "192.168.2.7" - folder: "/" - state: "present" - - - - name: "Create host - PIHOLE" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "PiHole" - attributes: - ipaddress: "192.168.2.8" - folder: "/" - state: "present" - - - name: "Create host - TECHNITIUMDNS" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "TechnitiumDNS" - attributes: - ipaddress: "192.168.2.9" - folder: "/" - state: "present" - - - name: "Create host - Wireguard" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "Wireguard" - attributes: - ipaddress: "192.168.2.10" - folder: "/" - state: "present" - - - name: "Create host - Ansible" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "Ansible" - attributes: - ipaddress: "192.168.2.11" - folder: "/" - state: "present" - - - name: "Create host - LinkWarden" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "LinkWarden" - attributes: - ipaddress: "192.168.2.12" - folder: "/" - state: "present" - - - name: "Create host - Immich" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "Immich" - attributes: - ipaddress: "192.168.2.13" - folder: "/" - state: "present" - - - name: "Create host - RetroGaming" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "RetroGaming" - attributes: - ipaddress: "192.168.2.14" - folder: "/" - state: "present" - - - name: "Create host - MediaServer" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "MediaServer" - attributes: - ipaddress: "192.168.2.16" - folder: "/" - state: "present" - - - name: "Create host - NetBird1" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "NetBird1" - attributes: - ipaddress: "192.168.2.17" - folder: "/" - state: "present" - - - name: "Create host - NetBird2" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "NetBird2" - attributes: - ipaddress: "192.168.2.18" - folder: "/" - state: "present" - - - name: "Create host - VaultWarden" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "VaultWarden" - attributes: - ipaddress: "192.168.2.19" - folder: "/" - state: "present" - - - name: "Create host - Glance" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "Glance" - attributes: - ipaddress: "192.168.2.20" - folder: "/" - state: "present" - - - name: "Create host - NPM" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "Npm" - attributes: - ipaddress: "192.168.2.22" - folder: "/" - state: "present" - - - name: "Create host - Searxng" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "Searxng" - attributes: - ipaddress: "192.168.2.23" - folder: "/" - state: "present" - - - name: "Create host - Gitea" - checkmk.general.host: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - name: "Gitea" - attributes: - ipaddress: "192.168.2.24" - folder: "/" - state: "present" - - - name: "Start activation on a specific site" - checkmk.general.activation: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - force_foreign_changes: 'true' - sites: - - "{{ site }}" diff --git a/AnisiblePlaybooks/CHeckmk/manage-rules.yaml b/AnisiblePlaybooks/CHeckmk/manage-rules.yaml deleted file mode 100644 index 38854a0..0000000 --- a/AnisiblePlaybooks/CHeckmk/manage-rules.yaml +++ /dev/null @@ -1,71 +0,0 @@ ---- -- name: "Manage Checkmk rules" - hosts: localhost - gather_facts: false - vars_files: - - secrets.yaml - vars: - server_url: "checkmk.home.arpa" - site: "cmk" - - tasks: - - name: Create DNS Check Rule - checkmk.general.rule: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - ruleset: "active_checks:dns" - rule: - properties: { - "comment": "Ansible managed", - "description": "DNS DNS Monitoring", - "disabled": false, - } - conditions: { - "host_label_groups": [], - "host_name": { - "match_on": [ - "your-dns-container-host" - ], - "operator": "one_of" - }, - "host_tags": [], - "service_label_groups": [] - } - "value_raw": { - "hostname": "hostname-to-query", - "server": "dns-server-ip", - "expected_addresses_list": [ - "expected-ip-address" - ] - } - location: - folder: "/" - position: "top" - state: "present" - - - name: Create NVME Temperature override rule - checkmk.general.rule: - server_url: "{{ server_url }}" - site: "{{ site }}" - automation_user: "{{ automation_user }}" - automation_secret: "{{ automation_secret }}" - ruleset: "checkgroup_parameters:temperature" - rule: - conditions: - host_label_groups: [] - host_tags: [] - service_description: - match_on: - - "DRIVE MODEL NAME*" - operator: "one_of" - service_label_groups: [] - location: - folder: "/" - position: "top" - properties: - description: "NVME Temperature override" - disabled: false - value_raw: "{'levels': (60.0, 80.0)}" - state: present diff --git a/AnisiblePlaybooks/CHeckmk/secrets.yaml b/AnisiblePlaybooks/CHeckmk/secrets.yaml deleted file mode 100644 index 18f40a1..0000000 --- a/AnisiblePlaybooks/CHeckmk/secrets.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -automation_user: "ansible" -automation_secret: "Px40If4VUvvA35" diff --git a/AnisiblePlaybooks/docker-certs-enable/files/main.yml b/AnisiblePlaybooks/docker-certs-enable/files/main.yml deleted file mode 100644 index 158df77..0000000 --- a/AnisiblePlaybooks/docker-certs-enable/files/main.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- -- name: Enable Docker TLS - hosts: all - become: true - vars: - certs_path: "<< certs_path >>" - - tasks: - - name: Check if docker certs are existing - ansible.builtin.stat: - path: {{ certs_path }} - register: certs_dir - - - name: Fail if docker certs are not existing - ansible.builtin.fail: - msg: "Docker certificates are not existing in /root/docker-certs." - when: not certs_dir.stat.exists - - - name: Get machine's primary internal ip address from eth0 interface - ansible.builtin.setup: - register: ip_address - - - name: Set machine's primary internal ip address - ansible.builtin.set_fact: - ip_address: {{ ip_address.ansible_facts.ansible_default_ipv4.address }} - - - name: Check if ip_address is a valid ip address - ansible.builtin.assert: - that: - - ip_address is match("^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}$") - fail_msg: "ip_address is not a valid ip address." - success_msg: "ip_address is a valid ip address." - - - name: Change docker daemon to use certs - ansible.builtin.lineinfile: - path: /lib/systemd/system/docker.service - line: > - ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock - -H tcp://{{ ip_address }}:2376 --tlsverify --tlscacert={{ certs_path }}/ca.pem - --tlscert={{ certs_path }}/server-cert.pem --tlskey={{ certs_path }}/server-key.pem - regexp: '^ExecStart=' - state: present - - - name: Reload systemd daemon - ansible.builtin.systemd: - daemon_reload: true - - - name: Restart docker daemon - ansible.builtin.systemd: - name: docker - state: restarted - enabled: true diff --git a/AnisiblePlaybooks/docker-certs-enable/template.json b/AnisiblePlaybooks/docker-certs-enable/template.json deleted file mode 100644 index 2d8eb4c..0000000 --- a/AnisiblePlaybooks/docker-certs-enable/template.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "slug": "docker-certs-enable", - "kind": "ansible", - "metadata": { - "name": "Enable Docker TLS", - "description": "Enables TLS on the Docker daemon using existing certificates. Configures Docker for secure remote API access over an encrypted connection.", - "tags": [], - "icon": { - "provider": "simple-icons", - "id": "docker" - }, - "draft": true, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/docker-certs-enable" - } - }, - "variables": [ - { - "title": "Certificate Configuration", - "name": "certificates", - "items": [ - { - "name": "certs_path", - "type": "str", - "title": "Certs Path", - "required": false, - "default": "/root/docker-certs", - "description": "Path where certificates are stored", - "config": { - "placeholder": "/root/docker-certs" - } - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/docker-certs/files/main.yml b/AnisiblePlaybooks/docker-certs/files/main.yml deleted file mode 100644 index b446c65..0000000 --- a/AnisiblePlaybooks/docker-certs/files/main.yml +++ /dev/null @@ -1,158 +0,0 @@ ---- -- name: Generate Docker TLS certificates - hosts: all - become: true - vars: - certs_path: "<< certs_path >>" - cert_validity_days: << cert_validity_days >> - cn_domain: "<< cn_domain >>" - - tasks: - - name: Check if docker certs are existing - ansible.builtin.stat: - path: {{ certs_path }} - register: certs_dir - - - name: Create docker certs directory (if needed) - ansible.builtin.file: - path: {{ certs_path }} - state: directory - mode: '0700' - when: not certs_dir.stat.exists - - - name: Check if docker certs directory is empty - ansible.builtin.command: ls -A {{ certs_path }} - register: certs_list - when: certs_dir.stat.exists - changed_when: false - ignore_errors: true - - - name: Fail if docker certs already exist - ansible.builtin.fail: - msg: "Docker certificates already exist in /root/docker-certs." - when: certs_list.stdout | default('') != '' - - - name: Get machine's primary internal ip address from eth0 interface - ansible.builtin.setup: - register: ip_address - - - name: Set machine's primary internal ip address - ansible.builtin.set_fact: - ip_address: {{ ip_address.ansible_facts.ansible_default_ipv4.address }} - - - name: Check if ip_address is a valid ip address - ansible.builtin.assert: - that: - - ip_address is match("^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}$") - fail_msg: "ip_address is not a valid ip address." - success_msg: "ip_address is a valid ip address." - - - name: Generate CA private key - ansible.builtin.command: - cmd: > - openssl genrsa -out {{ certs_path }}/ca-key.pem 4096 - args: - creates: {{ certs_path }}/ca-key.pem - - - name: Generate CA certificate - ansible.builtin.command: - cmd: > - openssl req -sha256 -new -x509 - -subj "/CN={{ cn_domain }}" - -days {{ cert_validity_days }} - -key {{ certs_path }}/ca-key.pem - -out {{ certs_path }}/ca.pem - args: - creates: {{ certs_path }}/ca.pem - - - name: Generate server private key - ansible.builtin.command: - cmd: > - openssl genrsa -out {{ certs_path }}/server-key.pem 4096 - creates: {{ certs_path }}/server-key.pem - - - name: Generate server certificate signing request - ansible.builtin.command: - cmd: > - openssl req -sha256 -new - -subj "/CN={{ inventory_hostname }}" - -key {{ certs_path }}/server-key.pem - -out {{ certs_path }}/server.csr - creates: {{ certs_path }}/server.csr - - - name: Generate server certificate extension file - ansible.builtin.shell: | - echo "subjectAltName = DNS:{{ inventory_hostname }},IP:{{ ip_address }},IP:127.0.0.1" >> {{ certs_path }}/extfile.cnf - echo "extendedKeyUsage = serverAuth" >> {{ certs_path }}/extfile.cnf - args: - creates: {{ certs_path }}/extfile.cnf - - - name: Generate server certificate - ansible.builtin.command: - cmd: > - openssl x509 -req -days {{ cert_validity_days }} -sha256 - -in {{ certs_path }}/server.csr - -CA {{ certs_path }}/ca.pem - -CAkey {{ certs_path }}/ca-key.pem - -CAcreateserial -out {{ certs_path }}/server-cert.pem - -extfile {{ certs_path }}/extfile.cnf - creates: {{ certs_path }}/server-cert.pem - - - name: Generate client private key - ansible.builtin.command: - cmd: > - openssl genrsa -out {{ certs_path }}/key.pem 4096 - creates: {{ certs_path }}/key.pem - - - name: Generate client certificate signing request - ansible.builtin.command: - cmd: > - openssl req -sha256 -new - -subj "/CN=client" - -key {{ certs_path }}/key.pem - -out {{ certs_path }}/client.csr - creates: {{ certs_path }}/client.csr - - - name: Generate client certificate extension file - ansible.builtin.shell: | - echo "extendedKeyUsage = clientAuth" >> {{ certs_path }}/client-extfile.cnf - args: - creates: {{ certs_path }}/client-extfile.cnf - - - name: Generate client certificate - ansible.builtin.command: - cmd: > - openssl x509 -req -days {{ cert_validity_days }} - -sha256 -in {{ certs_path }}/client.csr - -CA {{ certs_path }}/ca.pem - -CAkey {{ certs_path }}/ca-key.pem - -CAcreateserial -out {{ certs_path }}/cert.pem - -extfile {{ certs_path }}/client-extfile.cnf - creates: {{ certs_path }}/cert.pem - - - name: Remove client certificate signing request - ansible.builtin.file: - path: {{ certs_path }}/server.csr - state: absent - - - name: Remove client certificate signing request - ansible.builtin.file: - path: {{ certs_path }}/client.csr - state: absent - - - name: Remove server certificate extension file - ansible.builtin.file: - path: {{ certs_path }}/extfile.cnf - state: absent - - - name: Remove client certificate extension file - ansible.builtin.file: - path: {{ certs_path }}/client-extfile.cnf - state: absent - - - name: Set permissions for docker certs - ansible.builtin.file: - path: {{ certs_path }} - mode: '0700' - recurse: true - follow: true diff --git a/AnisiblePlaybooks/docker-certs/template.json b/AnisiblePlaybooks/docker-certs/template.json deleted file mode 100644 index 9fe16da..0000000 --- a/AnisiblePlaybooks/docker-certs/template.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "slug": "docker-certs", - "kind": "ansible", - "metadata": { - "name": "Generate Docker TLS Certificates", - "description": "Generates TLS certificates for the Docker daemon, including CA, server, and client certificates. Used to secure Docker remote API access.", - "tags": [], - "icon": { - "provider": "simple-icons", - "id": "docker" - }, - "draft": true, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/docker-certs" - } - }, - "variables": [ - { - "title": "Certificate Configuration", - "name": "certificates", - "items": [ - { - "name": "certs_path", - "type": "str", - "title": "Certs Path", - "required": false, - "default": "/root/docker-certs", - "description": "Path where certificates will be stored", - "config": { - "placeholder": "/root/docker-certs" - } - }, - { - "name": "cert_validity_days", - "type": "int", - "title": "Validity Days", - "required": false, - "default": 3630, - "description": "Certificate validity period in days", - "config": { - "slider": true, - "min": 30, - "max": 3650, - "step": 30, - "placeholder": "3650", - "unit": "days" - } - }, - { - "name": "cn_domain", - "type": "str", - "title": "CA Common Name", - "required": false, - "description": "Common Name (CN) for the CA certificate", - "config": { - "placeholder": "home.arpa.tld" - } - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/docker-cleanup/files/main.yml b/AnisiblePlaybooks/docker-cleanup/files/main.yml deleted file mode 100644 index fc39dc2..0000000 --- a/AnisiblePlaybooks/docker-cleanup/files/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- name: Docker prune safe - hosts: all - become: true - gather_facts: false - - tasks: - - name: Prune Docker resources with safe defaults - community.docker.docker_prune: - containers: << prune_stopped_containers | default(false) >> - images: true - images_filters: - dangling: << not (prune_include_unused_tagged_images | default(false)) >> - networks: << prune_unused_networks | default(false) >> - volumes: << prune_unused_volumes | default(false) >> - builder_cache: << prune_builder_cache | default(false) >> - builder_cache_keep_storage: "<< prune_keep_storage_mb | default(1024) >>M" - timeout: 300 diff --git a/AnisiblePlaybooks/docker-cleanup/files/requirements.yml b/AnisiblePlaybooks/docker-cleanup/files/requirements.yml deleted file mode 100644 index bfa7410..0000000 --- a/AnisiblePlaybooks/docker-cleanup/files/requirements.yml +++ /dev/null @@ -1,2 +0,0 @@ -collections: - - name: community.docker diff --git a/AnisiblePlaybooks/docker-cleanup/template.json b/AnisiblePlaybooks/docker-cleanup/template.json deleted file mode 100644 index 6f621d9..0000000 --- a/AnisiblePlaybooks/docker-cleanup/template.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "slug": "docker-cleanup", - "kind": "ansible", - "metadata": { - "name": "Docker Cleanup", - "description": "Safely prunes Docker resources on target hosts. Only removes resources that are explicitly enabled in the configuration, keeping a conservative default.", - "tags": [ - "docker", - "cleanup", - "prune", - "maintenance" - ], - "icon": { - "provider": "mdi", - "id": "broom", - "color": "fuchsia" - }, - "draft": false, - "version": { - "name": "1", - "source_dep_name": "manual/docker-cleanup" - } - }, - "variables": [ - { - "title": "Prune Options", - "name": "prune", - "items": [ - { - "name": "prune_include_unused_tagged_images", - "type": "bool", - "title": "Tagged Images", - "required": false, - "default": false - }, - { - "name": "prune_stopped_containers", - "type": "bool", - "title": "Prune Stopped Containers", - "required": false, - "default": false - }, - { - "name": "prune_unused_volumes", - "type": "bool", - "title": "Prune Unused Volumes", - "required": false, - "default": false - }, - { - "name": "prune_unused_networks", - "type": "bool", - "title": "Prune Unused Networks", - "required": false, - "default": false - }, - { - "name": "prune_builder_cache", - "type": "bool", - "title": "Prune Builder Cache", - "required": false, - "default": false - }, - { - "name": "prune_keep_storage_mb", - "type": "int", - "title": "Keep Storage", - "required": false, - "default": 1024, - "description": "Minimum amount of cache/storage to keep when pruning (where supported)", - "config": { - "slider": true, - "min": 256, - "max": 102400, - "step": 256, - "placeholder": "1024", - "unit": "MB" - } - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/docker-disk-usage-report/files/main.yml b/AnisiblePlaybooks/docker-disk-usage-report/files/main.yml deleted file mode 100644 index d4469b2..0000000 --- a/AnisiblePlaybooks/docker-disk-usage-report/files/main.yml +++ /dev/null @@ -1,72 +0,0 @@ ---- -- name: Docker disk usage report - hosts: all - become: true - gather_facts: false - - vars: - report_root: "/opt/docker-reports" - report_timestamp: "{{ lookup('pipe', 'date +%Y%m%d-%H%M%S') }}" - report_file_name: "docker_disk_usage_<< inventory_hostname >>_<< report_timestamp >>.txt" - - tasks: - - name: Ensure report root exists - ansible.builtin.file: - path: "<< report_root >>" - state: directory - mode: "0750" - - - name: Collect docker system df summary - ansible.builtin.command: docker system df - register: docker_df_summary - changed_when: false - - - name: Collect docker system df verbose report - ansible.builtin.command: docker system df -v - register: docker_df_verbose - changed_when: false - when: include_verbose_report | default(false) - - - name: Build report body - ansible.builtin.set_fact: - docker_disk_usage_report_body: | - Host: << inventory_hostname >> - Timestamp: {{ lookup('pipe', 'date -u +%Y-%m-%dT%H:%M:%SZ') }} - - Docker system df: - << docker_df_summary.stdout >> - <%- if include_verbose_report | default(false) %> - - Docker system df -v: - << docker_df_verbose.stdout >> - <%- endif %> - - - name: Save local disk usage report - ansible.builtin.copy: - dest: "<< report_root >>/<< report_file_name >>" - content: "<< docker_disk_usage_report_body >>" - mode: "0640" - - - name: Build Discord report content - ansible.builtin.set_fact: - discord_disk_report_content: | - << discord_message_prefix | default('Docker Disk Usage Report') >> - ```text - << docker_disk_usage_report_body | truncate(1700, true, '...') >> - ``` - when: - - discord_enabled | default(false) - - (discord_webhook_url | default('')) | length > 0 - - - name: Send disk usage report to Discord webhook - ansible.builtin.uri: - url: "<< discord_webhook_url | default('') >>" - method: POST - body_format: json - body: - username: "<< discord_username | default('Docker Reporter') >>" - content: "<< discord_disk_report_content >>" - status_code: 204 - when: - - discord_enabled | default(false) - - (discord_webhook_url | default('')) | length > 0 diff --git a/AnisiblePlaybooks/docker-disk-usage-report/template.json b/AnisiblePlaybooks/docker-disk-usage-report/template.json deleted file mode 100644 index a687c88..0000000 --- a/AnisiblePlaybooks/docker-disk-usage-report/template.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "slug": "docker-disk-usage-report", - "kind": "ansible", - "metadata": { - "name": "Docker Disk Usage Report", - "description": "Generates a Docker disk usage report on target hosts and optionally sends a summary to Discord via webhook.", - "tags": [ - "docker", - "report", - "disk", - "monitoring" - ], - "icon": { - "provider": "mdi", - "id": "chart-box", - "color": "blue" - }, - "draft": true, - "version": { - "name": "1", - "source_dep_name": "manual/docker-disk-usage-report" - } - }, - "variables": [ - { - "title": "Report", - "name": "report", - "items": [ - { - "name": "include_verbose_report", - "type": "bool", - "title": "Verbose Report", - "required": false, - "default": false, - "description": "Include docker system df -v output in local report" - } - ] - }, - { - "title": "Discord Webhook", - "name": "discord", - "items": [ - { - "name": "discord_enabled", - "type": "bool", - "title": "Discord", - "required": false, - "default": false, - "description": "Send a short report to Discord webhook" - }, - { - "name": "discord_webhook_url", - "type": "str", - "title": "Discord Webhook URL", - "required": false, - "default": "" - }, - { - "name": "discord_username", - "type": "str", - "title": "Discord Username", - "required": false, - "default": "Docker Reporter", - "description": "Sender name for webhook message", - "config": { - "placeholder": "Docker Reporter" - } - }, - { - "name": "discord_message_prefix", - "type": "str", - "title": "Discord Message Prefix", - "required": false, - "default": "Docker Disk Usage Report", - "description": "Prefix line sent before report content", - "config": { - "placeholder": "Docker Disk Usage Report" - } - } - ] - }, - { - "title": "Internal", - "name": "internal", - "items": [ - { - "name": "docker_df_verbose", - "type": "str", - "title": "Docker DF Verbose", - "required": false, - "default": "" - }, - { - "name": "report_file_name", - "type": "str", - "title": "Report File Name", - "required": false, - "default": "" - }, - { - "name": "report_root", - "type": "str", - "title": "Report Root", - "required": false, - "default": "/reports", - "config": { - "placeholder": "/reports" - } - }, - { - "name": "docker_disk_usage_report_body", - "type": "str", - "title": "Report Body", - "required": false, - "default": "" - }, - { - "name": "discord_disk_report_content", - "type": "str", - "title": "Discord Report", - "required": false, - "default": "" - }, - { - "name": "inventory_hostname", - "type": "str", - "title": "Inventory Hostname", - "required": false, - "default": "" - }, - { - "name": "report_timestamp", - "type": "str", - "title": "Report Timestamp", - "required": false, - "default": "" - }, - { - "name": "docker_df_summary", - "type": "str", - "title": "Docker DF Summary", - "required": false, - "default": "" - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/docker-healthcheck-audit/files/main.yml b/AnisiblePlaybooks/docker-healthcheck-audit/files/main.yml deleted file mode 100644 index 3bf8dd0..0000000 --- a/AnisiblePlaybooks/docker-healthcheck-audit/files/main.yml +++ /dev/null @@ -1,51 +0,0 @@ ---- -- name: Docker healthcheck audit - hosts: all - become: true - gather_facts: false - - tasks: - - name: Collect Docker containers - community.docker.docker_host_info: - containers: true - register: docker_host_info - - - name: Build list of containers missing healthcheck - ansible.builtin.set_fact: - containers_missing_healthcheck: "{{ (containers_missing_healthcheck | default([])) + [item.Names[0] | default(item.Id)] }}" - when: - - item.Config is defined - - item.Config.Healthcheck is not defined - loop: "{{ docker_host_info.containers | default([]) }}" - - - name: Ensure missing-healthcheck list exists - ansible.builtin.set_fact: - containers_missing_healthcheck: [] - when: containers_missing_healthcheck is not defined - - - name: Build audit report - ansible.builtin.set_fact: - docker_healthcheck_audit_report: - checked_containers: "{{ docker_host_info.containers | default([]) | length }}" - missing_healthcheck_count: "{{ containers_missing_healthcheck | length }}" - missing_healthcheck_containers: "{{ containers_missing_healthcheck }}" - - - name: Save healthcheck audit report - ansible.builtin.copy: - dest: "<< audit_report_path | default('/tmp/docker-healthcheck-audit.json') >>" - content: "{{ docker_healthcheck_audit_report | to_nice_json }}" - mode: "0640" - when: audit_save_report | default(true) - - - name: Print audit summary - ansible.builtin.debug: - msg: >- - Checked {{ docker_healthcheck_audit_report.checked_containers }} containers, - found {{ docker_healthcheck_audit_report.missing_healthcheck_count }} without healthcheck. - - - name: Fail when missing healthchecks are found - ansible.builtin.fail: - msg: "Containers missing healthcheck: {{ containers_missing_healthcheck | join(', ') }}" - when: - - audit_fail_on_missing | default(false) - - containers_missing_healthcheck | length > 0 diff --git a/AnisiblePlaybooks/docker-healthcheck-audit/files/requirements.yml b/AnisiblePlaybooks/docker-healthcheck-audit/files/requirements.yml deleted file mode 100644 index bfa7410..0000000 --- a/AnisiblePlaybooks/docker-healthcheck-audit/files/requirements.yml +++ /dev/null @@ -1,2 +0,0 @@ -collections: - - name: community.docker diff --git a/AnisiblePlaybooks/docker-healthcheck-audit/template.json b/AnisiblePlaybooks/docker-healthcheck-audit/template.json deleted file mode 100644 index d5aeec4..0000000 --- a/AnisiblePlaybooks/docker-healthcheck-audit/template.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "slug": "docker-healthcheck-audit", - "kind": "ansible", - "metadata": { - "name": "Docker Healthcheck Audit", - "description": "Audits Docker containers for missing healthchecks and optionally fails the playbook when violations are found. Can save a JSON audit report to the target host.", - "tags": [ - "docker", - "audit", - "healthcheck", - "compliance" - ], - "icon": { - "provider": "mdi", - "id": "stethoscope", - "color": "blue" - }, - "draft": false, - "version": { - "name": "1", - "source_dep_name": "manual/docker-healthcheck-audit" - } - }, - "variables": [ - { - "title": "Audit", - "name": "audit", - "items": [ - { - "name": "audit_fail_on_missing", - "type": "bool", - "title": "Fail Missing Checks", - "required": false, - "default": false, - "description": "Fail the play if one or more containers are missing a healthcheck" - }, - { - "name": "audit_save_report", - "type": "bool", - "title": "Save JSON Report", - "required": false, - "default": true, - "description": "Save audit report to a JSON file on the target host" - }, - { - "name": "audit_report_path", - "type": "str", - "title": "Audit Report Path", - "required": false, - "default": "/tmp/docker-healthcheck-audit.json", - "description": "Path to store the generated JSON report", - "config": { - "placeholder": "/tmp/docker-healthcheck-audit.json" - } - } - ] - }, - { - "title": "Internal", - "name": "internal", - "items": [ - { - "name": "containers_missing_healthcheck", - "type": "str", - "title": "Containers Missing Healthcheck", - "required": false, - "default": "" - }, - { - "name": "docker_healthcheck_audit_report", - "type": "str", - "title": "Healthcheck Audit Report", - "required": false, - "default": "" - }, - { - "name": "docker_host_info", - "type": "str", - "title": "Docker Host Info", - "required": false, - "default": "" - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/docker-install-ubuntu/files/main.yml b/AnisiblePlaybooks/docker-install-ubuntu/files/main.yml deleted file mode 100644 index 3c1828b..0000000 --- a/AnisiblePlaybooks/docker-install-ubuntu/files/main.yml +++ /dev/null @@ -1,84 +0,0 @@ ---- -- name: Install Docker on Ubuntu - hosts: all - become: true - gather_facts: true - - vars: - docker_apt_arch_map: - x86_64: amd64 - aarch64: arm64 - armv7l: armhf - ppc64le: ppc64el - s390x: s390x - docker_apt_arch: "{{ docker_apt_arch_map[ansible_architecture] | default('amd64') }}" - - tasks: - - name: Remove conflicting packages - ansible.builtin.apt: - name: - - docker.io - - docker-compose - - docker-compose-v2 - - docker-doc - - podman-docker - - containerd - - runc - state: absent - - - name: Install prerequisite packages - ansible.builtin.apt: - name: - - ca-certificates - - curl - update_cache: true - state: present - - - name: Create apt keyrings directory - ansible.builtin.file: - path: /etc/apt/keyrings - state: directory - mode: "0755" - - - name: Download Docker GPG key - ansible.builtin.get_url: - url: https://download.docker.com/linux/ubuntu/gpg - dest: /etc/apt/keyrings/docker.asc - mode: "0644" - force: true - - - name: Add Docker apt repository list file - ansible.builtin.copy: - dest: /etc/apt/sources.list.d/docker.list - mode: "0644" - content: | - deb [arch={{ docker_apt_arch }} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable - - - name: Install Docker Engine packages - ansible.builtin.apt: - name: - - docker-ce - - docker-ce-cli - - containerd.io - - docker-buildx-plugin - - docker-compose-plugin - update_cache: true - state: present - - - name: Ensure Docker service is enabled and started - ansible.builtin.systemd: - name: docker - enabled: true - state: started - - <%- if add_user_to_docker == true %> - - name: Add user to docker group - ansible.builtin.user: - name: "<< user >>" - groups: docker - append: true - <%- endif %> - - - name: Verify Docker CLI is available - ansible.builtin.command: docker --version - changed_when: false diff --git a/AnisiblePlaybooks/docker-install-ubuntu/template.json b/AnisiblePlaybooks/docker-install-ubuntu/template.json deleted file mode 100644 index 8a32c7f..0000000 --- a/AnisiblePlaybooks/docker-install-ubuntu/template.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "slug": "docker-install-ubuntu", - "kind": "ansible", - "metadata": { - "name": "Install Docker on Ubuntu", - "description": "Installs Docker Engine on Ubuntu systems using the official Docker APT repository.", - "tags": [], - "icon": { - "provider": "simple-icons", - "id": "docker", - "color": "blue" - }, - "draft": false, - "version": { - "name": "1", - "source_dep_name": "manual/docker-install-ubuntu" - } - }, - "variables": [ - { - "title": "User Access", - "name": "postinstall", - "items": [ - { - "name": "add_user_to_docker", - "type": "bool", - "title": "Docker Group", - "required": false, - "default": false, - "description": "Add a user to the docker group" - }, - { - "name": "user", - "type": "str", - "title": "User", - "required": false, - "default": "", - "description": "Username to add to docker group", - "needs": [ - "add_user_to_docker=true" - ] - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/docker-mysql-backup/files/main.yml b/AnisiblePlaybooks/docker-mysql-backup/files/main.yml deleted file mode 100644 index 80f90df..0000000 --- a/AnisiblePlaybooks/docker-mysql-backup/files/main.yml +++ /dev/null @@ -1,158 +0,0 @@ ---- -- name: Docker mysql backup - hosts: all - become: true - gather_facts: false - - vars: - backup_root: "/opt/docker-db-backups/mysql" - backup_timestamp: "{{ lookup('pipe', 'date +%Y%m%d-%H%M%S') }}" - backup_file_name: "backup_mysql_<< container_name >>_<< backup_timestamp >>.sql.gz" - backup_file_path: "<< backup_root >>/<< backup_file_name >>" - - tasks: - - name: Ensure backup root exists - ansible.builtin.file: - path: "<< backup_root >>" - state: directory - mode: "0750" - - - name: Get container information - community.docker.docker_container_info: - name: "<< container_name >>" - register: container_info - - - name: Fail if container does not exist - ansible.builtin.fail: - msg: "Container '<< container_name >>' does not exist" - when: not container_info.exists - - - name: Run backup and validation - block: - - name: Dump all databases with password - ansible.builtin.shell: | - set -euo pipefail - docker exec -e MYSQL_PWD=<< mysql_password | quote >> "<< container_name >>" \ - mysqldump --single-transaction --routines --events --triggers \ - --all-databases -u "<< mysql_user | default('root') >>" \ - | gzip > "<< backup_file_path >>" - args: - executable: /bin/bash - changed_when: true - when: - - mysql_database | default('all') == 'all' - - (mysql_password | default('')) | length > 0 - - - name: Dump all databases without password - ansible.builtin.shell: | - set -euo pipefail - docker exec "<< container_name >>" \ - mysqldump --single-transaction --routines --events --triggers \ - --all-databases -u "<< mysql_user | default('root') >>" \ - | gzip > "<< backup_file_path >>" - args: - executable: /bin/bash - changed_when: true - when: - - mysql_database | default('all') == 'all' - - (mysql_password | default('')) | length == 0 - - - name: Dump selected database with password - ansible.builtin.shell: | - set -euo pipefail - docker exec -e MYSQL_PWD=<< mysql_password | quote >> "<< container_name >>" \ - mysqldump --single-transaction --routines --events --triggers \ - -u "<< mysql_user | default('root') >>" "<< mysql_database >>" \ - | gzip > "<< backup_file_path >>" - args: - executable: /bin/bash - changed_when: true - when: - - mysql_database | default('all') != 'all' - - (mysql_password | default('')) | length > 0 - - - name: Dump selected database without password - ansible.builtin.shell: | - set -euo pipefail - docker exec "<< container_name >>" \ - mysqldump --single-transaction --routines --events --triggers \ - -u "<< mysql_user | default('root') >>" "<< mysql_database >>" \ - | gzip > "<< backup_file_path >>" - args: - executable: /bin/bash - changed_when: true - when: - - mysql_database | default('all') != 'all' - - (mysql_password | default('')) | length == 0 - - - name: Validate backup file exists - ansible.builtin.stat: - path: "<< backup_file_path >>" - register: backup_archive_stat - - - name: Fail if backup file is missing or empty - ansible.builtin.fail: - msg: "Backup file missing or empty: << backup_file_path >>" - when: - - not (backup_archive_stat.stat.exists | default(false)) - or (backup_archive_stat.stat.size | default(0) | int) == 0 - - - name: Validate gzip archive integrity - ansible.builtin.command: gzip -t "<< backup_file_path >>" - changed_when: false - - - name: Validate mysql dump signature - ansible.builtin.shell: | - set -euo pipefail - gzip -dc "<< backup_file_path >>" \ - | head -n 50 \ - | grep -Eq 'MySQL dump' - args: - executable: /bin/bash - changed_when: false - - - name: Remove old mysql backup archives - ansible.builtin.find: - paths: "<< backup_root >>" - patterns: "backup_mysql_<< container_name >>_*.sql.gz" - age: "<< backup_retention_days | default(14) >>d" - recurse: true - register: old_backups - - - name: Delete old mysql backup archives - ansible.builtin.file: - path: "<< item.path >>" - state: absent - loop: "<< old_backups.files >>" - - - name: Mark backup status success - ansible.builtin.set_fact: - backup_status: "success" - backup_status_message: "Backup and validation succeeded" - rescue: - - name: Mark backup status failed - ansible.builtin.set_fact: - backup_status: "failed" - backup_status_message: "<< ansible_failed_result.msg | default('Backup or validation failed') >>" - always: - - name: Send mysql backup status to Discord - ansible.builtin.uri: - url: "<< discord_webhook | default('') >>" - method: POST - body_format: json - body: - content: | - MySQL Backup << backup_status | default('failed') | upper >> - Host: << inventory_hostname >> - Container: << container_name >> - File: << backup_file_path >> - Message: << backup_status_message | default('n/a') >> - status_code: 204 - when: - - send_discord_notification | default(false) - - (discord_webhook | default('')) | length > 0 - - - name: Fail play if backup failed - ansible.builtin.fail: - msg: "<< backup_status_message | default('Backup failed') >>" - when: backup_status | default('failed') == 'failed' diff --git a/AnisiblePlaybooks/docker-mysql-backup/files/requirements.yml b/AnisiblePlaybooks/docker-mysql-backup/files/requirements.yml deleted file mode 100644 index bfa7410..0000000 --- a/AnisiblePlaybooks/docker-mysql-backup/files/requirements.yml +++ /dev/null @@ -1,2 +0,0 @@ -collections: - - name: community.docker diff --git a/AnisiblePlaybooks/docker-mysql-backup/template.json b/AnisiblePlaybooks/docker-mysql-backup/template.json deleted file mode 100644 index 24bd183..0000000 --- a/AnisiblePlaybooks/docker-mysql-backup/template.json +++ /dev/null @@ -1,186 +0,0 @@ -{ - "slug": "docker-mysql-backup", - "kind": "ansible", - "metadata": { - "name": "Docker MySQL Backup", - "description": "Connects to a named MySQL container and creates compressed SQL dumps with configurable retention. Supports optional Discord notifications on success or failure.", - "tags": [ - "docker", - "backup", - "mysql", - "database" - ], - "icon": { - "provider": "simple-icons", - "id": "mysql", - "color": "emerald" - }, - "draft": true, - "version": { - "name": "1", - "source_dep_name": "manual/docker-mysql-backup" - } - }, - "variables": [ - { - "title": "Backup", - "name": "backup", - "items": [ - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": true - }, - { - "name": "mysql_user", - "type": "str", - "title": "MySQL User", - "required": false, - "default": "root", - "config": { - "placeholder": "root" - } - }, - { - "name": "mysql_password", - "type": "str", - "title": "MySQL Password", - "required": false, - "default": "" - }, - { - "name": "mysql_database", - "type": "str", - "title": "Database Name", - "required": false, - "default": "all", - "description": "Database to dump, or 'all' for all databases", - "config": { - "placeholder": "all" - } - }, - { - "name": "backup_retention_days", - "type": "int", - "title": "Retention Days", - "required": false, - "default": 14, - "description": "Delete backup archives older than this many days", - "config": { - "slider": true, - "min": 1, - "max": 365, - "step": 1, - "placeholder": "14", - "unit": "days" - } - } - ] - }, - { - "title": "Notification", - "name": "notification", - "items": [ - { - "name": "send_discord_notification", - "type": "bool", - "title": "Send Discord Notification", - "required": false, - "default": false, - "description": "Send success/failure status to Discord webhook" - }, - { - "name": "discord_webhook", - "type": "secret", - "title": "Discord Webhook", - "required": false, - "default": "", - "description": "Discord webhook URL for notifications" - } - ] - }, - { - "title": "Internal", - "name": "internal", - "items": [ - { - "name": "backup_file_name", - "type": "str", - "title": "Backup File Name", - "required": false, - "default": "" - }, - { - "name": "backup_root", - "type": "str", - "title": "Backup Root", - "required": false, - "default": "/backups/mysql", - "config": { - "placeholder": "/backups/mysql" - } - }, - { - "name": "ansible_failed_result", - "type": "str", - "title": "Failed Result", - "required": false, - "default": "" - }, - { - "name": "backup_timestamp", - "type": "str", - "title": "Backup Timestamp", - "required": false, - "default": "" - }, - { - "name": "old_backups", - "type": "str", - "title": "Old Backups", - "required": false, - "default": "" - }, - { - "name": "backup_status", - "type": "str", - "title": "Backup Status", - "required": false, - "default": "" - }, - { - "name": "inventory_hostname", - "type": "str", - "title": "Inventory Hostname", - "required": false, - "default": "" - }, - { - "name": "backup_file_path", - "type": "str", - "title": "Backup File Path", - "required": false, - "default": "" - }, - { - "name": "item", - "type": "str", - "title": "Loop Item", - "required": false, - "default": "" - }, - { - "name": "backup_status_message", - "type": "str", - "title": "Backup Status Message", - "required": false, - "default": "", - "config": { - "textarea": true - } - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/docker-orphan-detection/files/main.yml b/AnisiblePlaybooks/docker-orphan-detection/files/main.yml deleted file mode 100644 index d66f866..0000000 --- a/AnisiblePlaybooks/docker-orphan-detection/files/main.yml +++ /dev/null @@ -1,93 +0,0 @@ ---- -- name: Docker orphan detection - hosts: all - become: true - gather_facts: false - - vars: - report_root: "/opt/docker-reports" - report_timestamp: "{{ lookup('pipe', 'date +%Y%m%d-%H%M%S') }}" - report_file_name: "docker_orphan_detection_<< inventory_hostname >>_<< report_timestamp >>.txt" - - tasks: - - name: Ensure report root exists - ansible.builtin.file: - path: "<< report_root >>" - state: directory - mode: "0750" - - - name: List exited containers - ansible.builtin.command: docker ps -a --filter status=exited --format "{{.Names}}" - register: orphan_exited_containers - changed_when: false - - - name: List dead containers - ansible.builtin.command: docker ps -a --filter status=dead --format "{{.Names}}" - register: orphan_dead_containers - changed_when: false - - - name: List dangling images - ansible.builtin.command: docker images -f dangling=true -q - register: orphan_dangling_images - changed_when: false - - - name: List dangling volumes - ansible.builtin.command: docker volume ls -qf dangling=true - register: orphan_dangling_volumes - changed_when: false - - - name: List dangling networks - ansible.builtin.command: docker network ls -qf dangling=true - register: orphan_dangling_networks - changed_when: false - - - name: Build orphan report body - ansible.builtin.set_fact: - docker_orphan_report_body: | - Host: << inventory_hostname >> - Timestamp: {{ lookup('pipe', 'date -u +%Y-%m-%dT%H:%M:%SZ') }} - - Exited containers (<< orphan_exited_containers.stdout_lines | length >>): - << (orphan_exited_containers.stdout_lines | default([])) | join('\n') if (orphan_exited_containers.stdout_lines | length > 0) else 'none' >> - - Dead containers (<< orphan_dead_containers.stdout_lines | length >>): - << (orphan_dead_containers.stdout_lines | default([])) | join('\n') if (orphan_dead_containers.stdout_lines | length > 0) else 'none' >> - - Dangling images (<< orphan_dangling_images.stdout_lines | length >>): - << (orphan_dangling_images.stdout_lines | default([])) | join('\n') if (orphan_dangling_images.stdout_lines | length > 0) else 'none' >> - - Dangling volumes (<< orphan_dangling_volumes.stdout_lines | length >>): - << (orphan_dangling_volumes.stdout_lines | default([])) | join('\n') if (orphan_dangling_volumes.stdout_lines | length > 0) else 'none' >> - - Dangling networks (<< orphan_dangling_networks.stdout_lines | length >>): - << (orphan_dangling_networks.stdout_lines | default([])) | join('\n') if (orphan_dangling_networks.stdout_lines | length > 0) else 'none' >> - - - name: Save local orphan detection report - ansible.builtin.copy: - dest: "<< report_root >>/<< report_file_name >>" - content: "<< docker_orphan_report_body >>" - mode: "0640" - - - name: Build Discord report content - ansible.builtin.set_fact: - discord_orphan_report_content: | - << discord_message_prefix | default('Docker Orphan Detection Report') >> - ```text - << docker_orphan_report_body | truncate(1700, true, '...') >> - ``` - when: - - discord_enabled | default(false) - - (discord_webhook_url | default('')) | length > 0 - - - name: Send orphan report to Discord webhook - ansible.builtin.uri: - url: "<< discord_webhook_url | default('') >>" - method: POST - body_format: json - body: - username: "<< discord_username | default('Docker Reporter') >>" - content: "<< discord_orphan_report_content >>" - status_code: 204 - when: - - discord_enabled | default(false) - - (discord_webhook_url | default('')) | length > 0 diff --git a/AnisiblePlaybooks/docker-orphan-detection/template.json b/AnisiblePlaybooks/docker-orphan-detection/template.json deleted file mode 100644 index 5cc4238..0000000 --- a/AnisiblePlaybooks/docker-orphan-detection/template.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "slug": "docker-orphan-detection", - "kind": "ansible", - "metadata": { - "name": "Docker Orphan Detection", - "description": "Detects orphaned Docker resources (dead/exited containers, dangling images, volumes, and networks) and optionally sends a report to Discord via webhook.", - "tags": [ - "docker", - "audit", - "orphan", - "report" - ], - "icon": { - "provider": "mdi", - "id": "magnify", - "color": "fuchsia" - }, - "draft": true, - "version": { - "name": "1", - "source_dep_name": "manual/docker-orphan-detection" - } - }, - "variables": [ - { - "title": "Discord Webhook", - "name": "discord", - "items": [ - { - "name": "discord_enabled", - "type": "bool", - "title": "Discord", - "required": false, - "default": false, - "description": "Send orphan detection summary to Discord webhook" - }, - { - "name": "discord_webhook_url", - "type": "str", - "title": "Discord Webhook URL", - "required": false, - "default": "" - }, - { - "name": "discord_username", - "type": "str", - "title": "Discord Username", - "required": false, - "default": "Docker Reporter", - "description": "Sender name for webhook message", - "config": { - "placeholder": "Docker Reporter" - } - }, - { - "name": "discord_message_prefix", - "type": "str", - "title": "Discord Message Prefix", - "required": false, - "default": "Docker Orphan Detection Report", - "description": "Prefix line sent before report content", - "config": { - "placeholder": "Docker Orphan Detection Report" - } - } - ] - }, - { - "title": "Internal", - "name": "internal", - "items": [ - { - "name": "report_root", - "type": "str", - "title": "Report Root", - "required": false, - "default": "/reports", - "config": { - "placeholder": "/reports" - } - }, - { - "name": "orphan_dead_containers", - "type": "str", - "title": "Orphan Dead Containers", - "required": false, - "default": "" - }, - { - "name": "orphan_dangling_images", - "type": "str", - "title": "Orphan Dangling Images", - "required": false, - "default": "" - }, - { - "name": "orphan_dangling_volumes", - "type": "str", - "title": "Orphan Dangling Volumes", - "required": false, - "default": "" - }, - { - "name": "docker_orphan_report_body", - "type": "str", - "title": "Orphan Report Body", - "required": false, - "default": "" - }, - { - "name": "report_timestamp", - "type": "str", - "title": "Report Timestamp", - "required": false, - "default": "" - }, - { - "name": "orphan_exited_containers", - "type": "str", - "title": "Orphan Exited Containers", - "required": false, - "default": "" - }, - { - "name": "orphan_dangling_networks", - "type": "str", - "title": "Orphan Dangling Networks", - "required": false, - "default": "" - }, - { - "name": "report_file_name", - "type": "str", - "title": "Report File Name", - "required": false, - "default": "" - }, - { - "name": "discord_orphan_report_content", - "type": "str", - "title": "Orphan Report", - "required": false, - "default": "" - }, - { - "name": "inventory_hostname", - "type": "str", - "title": "Inventory Hostname", - "required": false, - "default": "" - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/docker-postgres-backup/files/main.yml b/AnisiblePlaybooks/docker-postgres-backup/files/main.yml deleted file mode 100644 index 3f2ed22..0000000 --- a/AnisiblePlaybooks/docker-postgres-backup/files/main.yml +++ /dev/null @@ -1,156 +0,0 @@ ---- -- name: Docker postgres backup - hosts: all - become: true - gather_facts: false - - vars: - backup_root: "/opt/docker-db-backups/postgres" - backup_timestamp: "{{ lookup('pipe', 'date +%Y%m%d-%H%M%S') }}" - backup_file_name: "backup_postgres_<< container_name >>_<< backup_timestamp >>.sql.gz" - backup_file_path: "<< backup_root >>/<< backup_file_name >>" - - tasks: - - name: Ensure backup root exists - ansible.builtin.file: - path: "<< backup_root >>" - state: directory - mode: "0750" - - - name: Get container information - community.docker.docker_container_info: - name: "<< container_name >>" - register: container_info - - - name: Fail if container does not exist - ansible.builtin.fail: - msg: "Container '<< container_name >>' does not exist" - when: not container_info.exists - - - name: Run backup and validation - block: - - name: Dump all databases with password - ansible.builtin.shell: | - set -euo pipefail - docker exec -e PGPASSWORD=<< postgres_password | quote >> "<< container_name >>" \ - pg_dumpall -U "<< postgres_user | default('postgres') >>" \ - | gzip > "<< backup_file_path >>" - args: - executable: /bin/bash - changed_when: true - when: - - postgres_database | default('all') == 'all' - - (postgres_password | default('')) | length > 0 - - - name: Dump all databases without password - ansible.builtin.shell: | - set -euo pipefail - docker exec "<< container_name >>" \ - pg_dumpall -U "<< postgres_user | default('postgres') >>" \ - | gzip > "<< backup_file_path >>" - args: - executable: /bin/bash - changed_when: true - when: - - postgres_database | default('all') == 'all' - - (postgres_password | default('')) | length == 0 - - - name: Dump selected database with password - ansible.builtin.shell: | - set -euo pipefail - docker exec -e PGPASSWORD=<< postgres_password | quote >> "<< container_name >>" \ - pg_dump -U "<< postgres_user | default('postgres') >>" \ - "<< postgres_database >>" \ - | gzip > "<< backup_file_path >>" - args: - executable: /bin/bash - changed_when: true - when: - - postgres_database | default('all') != 'all' - - (postgres_password | default('')) | length > 0 - - - name: Dump selected database without password - ansible.builtin.shell: | - set -euo pipefail - docker exec "<< container_name >>" \ - pg_dump -U "<< postgres_user | default('postgres') >>" \ - "<< postgres_database >>" \ - | gzip > "<< backup_file_path >>" - args: - executable: /bin/bash - changed_when: true - when: - - postgres_database | default('all') != 'all' - - (postgres_password | default('')) | length == 0 - - - name: Validate backup file exists - ansible.builtin.stat: - path: "<< backup_file_path >>" - register: backup_archive_stat - - - name: Fail if backup file is missing or empty - ansible.builtin.fail: - msg: "Backup file missing or empty: << backup_file_path >>" - when: - - not (backup_archive_stat.stat.exists | default(false)) - or (backup_archive_stat.stat.size | default(0) | int) == 0 - - - name: Validate gzip archive integrity - ansible.builtin.command: gzip -t "<< backup_file_path >>" - changed_when: false - - - name: Validate postgres dump signature - ansible.builtin.shell: | - set -euo pipefail - gzip -dc "<< backup_file_path >>" \ - | head -n 50 \ - | grep -Eq 'PostgreSQL database dump' - args: - executable: /bin/bash - changed_when: false - - - name: Remove old postgres backup archives - ansible.builtin.find: - paths: "<< backup_root >>" - patterns: "backup_postgres_<< container_name >>_*.sql.gz" - age: "<< backup_retention_days | default(14) >>d" - recurse: true - register: old_backups - - - name: Delete old postgres backup archives - ansible.builtin.file: - path: "<< item.path >>" - state: absent - loop: "<< old_backups.files >>" - - - name: Mark backup status success - ansible.builtin.set_fact: - backup_status: "success" - backup_status_message: "Backup and validation succeeded" - rescue: - - name: Mark backup status failed - ansible.builtin.set_fact: - backup_status: "failed" - backup_status_message: "<< ansible_failed_result.msg | default('Backup or validation failed') >>" - always: - - name: Send postgres backup status to Discord - ansible.builtin.uri: - url: "<< discord_webhook | default('') >>" - method: POST - body_format: json - body: - content: | - PostgreSQL Backup << backup_status | default('failed') | upper >> - Host: << inventory_hostname >> - Container: << container_name >> - File: << backup_file_path >> - Message: << backup_status_message | default('n/a') >> - status_code: 204 - when: - - send_discord_notification | default(false) - - (discord_webhook | default('')) | length > 0 - - - name: Fail play if backup failed - ansible.builtin.fail: - msg: "<< backup_status_message | default('Backup failed') >>" - when: backup_status | default('failed') == 'failed' diff --git a/AnisiblePlaybooks/docker-postgres-backup/files/requirements.yml b/AnisiblePlaybooks/docker-postgres-backup/files/requirements.yml deleted file mode 100644 index bfa7410..0000000 --- a/AnisiblePlaybooks/docker-postgres-backup/files/requirements.yml +++ /dev/null @@ -1,2 +0,0 @@ -collections: - - name: community.docker diff --git a/AnisiblePlaybooks/docker-postgres-backup/template.json b/AnisiblePlaybooks/docker-postgres-backup/template.json deleted file mode 100644 index f7d7ce5..0000000 --- a/AnisiblePlaybooks/docker-postgres-backup/template.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "slug": "docker-postgres-backup", - "kind": "ansible", - "metadata": { - "name": "Docker Postgres Backup", - "description": "Connects to a named PostgreSQL container and creates compressed SQL dumps with configurable retention. Supports optional Discord notifications on success or failure.", - "tags": [ - "docker", - "backup", - "postgres", - "database" - ], - "icon": { - "provider": "simple-icons", - "id": "postgresql", - "color": "emerald" - }, - "draft": true, - "version": { - "name": "1", - "source_dep_name": "manual/docker-postgres-backup" - } - }, - "variables": [ - { - "title": "Backup", - "name": "backup", - "items": [ - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": true - }, - { - "name": "postgres_user", - "type": "str", - "title": "Postgres User", - "required": false, - "default": "postgres", - "description": "Database user for pg_dump/pg_dumpall", - "config": { - "placeholder": "postgres" - } - }, - { - "name": "postgres_password", - "type": "str", - "title": "Postgres Password", - "required": false, - "default": "" - }, - { - "name": "postgres_database", - "type": "str", - "title": "Database Name", - "required": false, - "default": "all", - "description": "Database to dump, or 'all' for all databases", - "config": { - "placeholder": "all" - } - }, - { - "name": "backup_retention_days", - "type": "int", - "title": "Retention Days", - "required": false, - "default": 14, - "description": "Delete backup archives older than this many days", - "config": { - "slider": true, - "min": 1, - "max": 365, - "step": 1, - "placeholder": "14", - "unit": "days" - } - } - ] - }, - { - "title": "Notification", - "name": "notification", - "items": [ - { - "name": "send_discord_notification", - "type": "bool", - "title": "Send Discord Notification", - "required": false, - "default": false, - "description": "Send success/failure status to Discord webhook" - }, - { - "name": "discord_webhook", - "type": "secret", - "title": "Discord Webhook", - "required": false, - "default": "", - "description": "Discord webhook URL for notifications" - } - ] - }, - { - "title": "Internal", - "name": "internal", - "items": [ - { - "name": "backup_status", - "type": "str", - "title": "Backup Status", - "required": false, - "default": "" - }, - { - "name": "inventory_hostname", - "type": "str", - "title": "Inventory Hostname", - "required": false, - "default": "" - }, - { - "name": "backup_timestamp", - "type": "str", - "title": "Backup Timestamp", - "required": false, - "default": "" - }, - { - "name": "item", - "type": "str", - "title": "Loop Item", - "required": false, - "default": "" - }, - { - "name": "backup_file_path", - "type": "str", - "title": "Backup File Path", - "required": false, - "default": "" - }, - { - "name": "old_backups", - "type": "str", - "title": "Old Backups", - "required": false, - "default": "" - }, - { - "name": "backup_root", - "type": "str", - "title": "Backup Root", - "required": false, - "default": "/backups/postgres", - "config": { - "placeholder": "/backups/postgres" - } - }, - { - "name": "backup_file_name", - "type": "str", - "title": "Backup File Name", - "required": false, - "default": "" - }, - { - "name": "ansible_failed_result", - "type": "str", - "title": "Failed Result", - "required": false, - "default": "" - }, - { - "name": "backup_status_message", - "type": "str", - "title": "Backup Status Message", - "required": false, - "default": "", - "config": { - "textarea": true - } - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/docker-volume-backup/files/main.yml b/AnisiblePlaybooks/docker-volume-backup/files/main.yml deleted file mode 100644 index ade6be1..0000000 --- a/AnisiblePlaybooks/docker-volume-backup/files/main.yml +++ /dev/null @@ -1,77 +0,0 @@ ---- -- name: Docker volume backup - hosts: all - become: true - gather_facts: false - - vars: - backup_root: "/opt/docker-volume-backups" - backup_timestamp: "{{ lookup('pipe', 'date +%Y%m%d-%H%M%S') }}" - backup_archive_name: "backup_<< container_name >>_{{ backup_timestamp }}.tar.gz" - - tasks: - - name: Ensure backup root exists - ansible.builtin.file: - path: "{{ backup_root }}" - state: directory - mode: "0750" - - - name: Get container information - community.docker.docker_container_info: - name: "<< container_name >>" - register: container_info - - - name: Fail if container does not exist - ansible.builtin.fail: - msg: "Container '<< container_name >>' does not exist" - when: not container_info.exists - - - name: Record container running state - ansible.builtin.set_fact: - container_was_running: "{{ (container_info.container.State.Status | default('')) == 'running' }}" - - - name: Stop container for consistent backup - community.docker.docker_container: - name: "<< container_name >>" - state: stopped - when: - - stop_containers_during_backup | default(false) - - container_was_running - - - name: Back up container path using all attached volumes - ansible.builtin.shell: | - set -eu - docker run --rm \ - --volumes-from "<< container_name >>" \ - -v "{{ backup_root }}":/backup \ - busybox sh -c ' - test -e "<< backup_container_path >>" - tar -czf "/backup/{{ backup_archive_name }}" \ - -C / "<< backup_container_path | regex_replace('^/', '') >>" - ' - args: - executable: /bin/sh - changed_when: true - - - name: Start container after backup - community.docker.docker_container: - name: "<< container_name >>" - state: started - when: - - stop_containers_during_backup | default(false) - - container_was_running - - - name: Remove old backup archives - ansible.builtin.find: - paths: "{{ backup_root }}" - patterns: "backup_<< container_name >>_*.tar.gz" - age: "<< backup_retention_days | default(14) >>d" - recurse: true - register: old_backups - - - name: Delete old backup archives - ansible.builtin.file: - path: "{{ item.path }}" - state: absent - loop: "{{ old_backups.files }}" - diff --git a/AnisiblePlaybooks/docker-volume-backup/files/requirements.yml b/AnisiblePlaybooks/docker-volume-backup/files/requirements.yml deleted file mode 100644 index bfa7410..0000000 --- a/AnisiblePlaybooks/docker-volume-backup/files/requirements.yml +++ /dev/null @@ -1,2 +0,0 @@ -collections: - - name: community.docker diff --git a/AnisiblePlaybooks/docker-volume-backup/template.json b/AnisiblePlaybooks/docker-volume-backup/template.json deleted file mode 100644 index 9a6d09b..0000000 --- a/AnisiblePlaybooks/docker-volume-backup/template.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "slug": "docker-volume-backup", - "kind": "ansible", - "metadata": { - "name": "Docker Volume Backup", - "description": "Backs up data from a Docker container path by auto-attaching all container volumes into a temporary backup container. Creates timestamped tar.gz archives with configurable retention.", - "tags": [ - "docker", - "backup", - "volume", - "container" - ], - "icon": { - "provider": "mdi", - "id": "harddisk", - "color": "emerald" - }, - "draft": true, - "version": { - "name": "1", - "source_dep_name": "manual/docker-volume-backup" - } - }, - "variables": [ - { - "title": "Backup", - "name": "backup", - "items": [ - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": true - }, - { - "name": "backup_retention_days", - "type": "int", - "title": "Retention Days", - "required": false, - "default": 14, - "description": "Delete backup archives older than this many days", - "config": { - "slider": true, - "min": 1, - "max": 365, - "step": 1, - "placeholder": "14", - "unit": "days" - } - }, - { - "name": "backup_container_path", - "type": "str", - "title": "Backup Path", - "required": true, - "description": "Path inside the container that should be archived" - }, - { - "name": "stop_containers_during_backup", - "type": "bool", - "title": "Stop Backup", - "required": false, - "default": false, - "description": "If enabled, stop the container before backup and start it again afterwards if it was running" - } - ] - }, - { - "title": "Internal", - "name": "internal", - "items": [ - { - "name": "backup_timestamp", - "type": "str", - "title": "Backup Timestamp", - "required": false, - "default": "" - }, - { - "name": "backup_root", - "type": "str", - "title": "Backup Root", - "required": false, - "default": "/backups", - "config": { - "placeholder": "/backups" - } - }, - { - "name": "backup_archive_name", - "type": "str", - "title": "Backup Archive Name", - "required": false, - "default": "" - }, - { - "name": "item", - "type": "str", - "title": "Loop Item", - "required": false, - "default": "" - }, - { - "name": "old_backups", - "type": "str", - "title": "Old Backups", - "required": false, - "default": "" - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/k3s-postinstall/files/main.yml b/AnisiblePlaybooks/k3s-postinstall/files/main.yml deleted file mode 100644 index 2f790bb..0000000 --- a/AnisiblePlaybooks/k3s-postinstall/files/main.yml +++ /dev/null @@ -1,404 +0,0 @@ ---- -- name: Configure K3s post-install platform services - Fetch kubeconfig - hosts: all - gather_facts: false - become: true -<%- if secrets_file %> - vars_files: - - << secrets_file >> -<%- endif %> - - vars: - kubeconfig_path: "<< kubeconfig_local_path >>" - kubeconfig_server_target: "<< kubeconfig_server_endpoint >>" - - tasks: - - name: Validate that the kubeconfig source host exists in inventory - ansible.builtin.assert: - that: - - "'<< kubeconfig_source_host | default('k3s-server-01') >>' in hostvars" - fail_msg: "Inventory host '<< kubeconfig_source_host | default('k3s-server-01') >>' was not found." - run_once: true - - - name: Read kubeconfig from the primary K3s server - ansible.builtin.slurp: - src: "<< kubeconfig_source_path | default('/etc/rancher/k3s/k3s.yaml') >>" - delegate_to: "<< kubeconfig_source_host | default('k3s-server-01') >>" - register: k3s_source_kubeconfig - when: fetch_kubeconfig | default(true) - run_once: true - - - name: Ensure local kubeconfig directory exists - ansible.builtin.file: - path: "{{ kubeconfig_path | dirname }}" - state: directory - mode: "0700" - delegate_to: localhost - run_once: true - when: fetch_kubeconfig | default(true) - - - name: Write kubeconfig to the control machine - ansible.builtin.copy: - dest: "{{ kubeconfig_path }}" - mode: "0600" - content: "{{ (k3s_source_kubeconfig.content | b64decode) | regex_replace('https://127\\.0\\.0\\.1:6443', 'https://' ~ kubeconfig_server_target ~ ':6443') }}" - delegate_to: localhost - run_once: true - when: fetch_kubeconfig | default(true) - -- name: Configure K3s post-install platform services - Prepare Longhorn prerequisites - hosts: all - gather_facts: false - become: true -<%- if secrets_file %> - vars_files: - - << secrets_file >> -<%- endif %> - vars: - longhorn_target_hosts: "{{ query('inventory_hostnames', '<< longhorn_node_hosts >>') }}" - - tasks: - - name: Validate Longhorn target host pattern - ansible.builtin.assert: - that: - - longhorn_target_hosts | length > 0 - fail_msg: "No inventory hosts matched '<< longhorn_node_hosts >>'." - when: longhorn_prerequisites_enabled | default(false) - run_once: true - - - name: Install Longhorn prerequisite packages - ansible.builtin.apt: - name: - - open-iscsi - - nfs-common - - cryptsetup - - util-linux - state: present - update_cache: true - when: - - longhorn_prerequisites_enabled | default(false) - - inventory_hostname in longhorn_target_hosts - - - name: Ensure iscsid service is enabled and running - ansible.builtin.service: - name: iscsid - state: started - enabled: true - when: - - longhorn_prerequisites_enabled | default(false) - - inventory_hostname in longhorn_target_hosts - - - name: Ensure open-iscsi service is enabled and running when present - ansible.builtin.service: - name: open-iscsi - state: started - enabled: true - failed_when: false - when: - - longhorn_prerequisites_enabled | default(false) - - inventory_hostname in longhorn_target_hosts - - - name: Persist dm_crypt kernel module for Longhorn - ansible.builtin.copy: - dest: /etc/modules-load.d/longhorn.conf - mode: "0644" - content: | - dm_crypt - when: - - longhorn_prerequisites_enabled | default(false) - - inventory_hostname in longhorn_target_hosts - - - name: Load dm_crypt kernel module immediately - community.general.modprobe: - name: dm_crypt - state: present - when: - - longhorn_prerequisites_enabled | default(false) - - inventory_hostname in longhorn_target_hosts - - - name: Disable multipathd when the environment does not use multipath storage - ansible.builtin.service: - name: multipathd - state: stopped - enabled: false - failed_when: false - when: - - longhorn_prerequisites_enabled | default(false) - - longhorn_disable_multipathd | default(false) - - inventory_hostname in longhorn_target_hosts - -- name: Configure K3s post-install platform services - Configure cluster add-ons - hosts: all - gather_facts: false -<%- if secrets_file %> - vars_files: - - << secrets_file >> -<%- endif %> - - vars: - kubeconfig_path: "<< kubeconfig_local_path >>" - - tasks: - - block: - - name: Ensure the kubeconfig file exists before applying cluster resources - ansible.builtin.stat: - path: "{{ kubeconfig_path }}" - register: kubeconfig_stat - - - name: Fail when the kubeconfig file is missing - ansible.builtin.fail: - msg: "Kubeconfig not found at {{ kubeconfig_path }}. Enable fetch_kubeconfig or provide an existing kubeconfig path." - when: not (kubeconfig_stat.stat.exists | default(false)) - - - name: Verify Helm is available on the control machine when required - ansible.builtin.command: - cmd: helm version --short - changed_when: false - when: (cert_manager_install_enabled | default(false)) or (metrics_server_install_enabled | default(false)) or (longhorn_install_enabled | default(false)) - - - name: Validate ACME email when ClusterIssuer creation is enabled - ansible.builtin.assert: - that: - - (cert_manager_acme_email | default('')) | length > 0 - fail_msg: "cert_manager_acme_email must be set when cert_manager_clusterissuer_enabled=true." - when: cert_manager_clusterissuer_enabled | default(false) - - - name: Build namespace list for enabled platform components - ansible.builtin.set_fact: - managed_namespaces: >- - {{ - ( - (extra_namespaces_yaml | default('[]') | from_yaml) - + ([cert_manager_namespace | default('cert-manager')] if cert_manager_install_enabled | default(false) or cert_manager_create_cloudflare_secret | default(false) or cert_manager_clusterissuer_enabled | default(false) else []) - + ([longhorn_namespace | default('longhorn-system')] if longhorn_install_enabled | default(false) else []) - + ([traefik_dashboard_namespace | default('traefik')] if traefik_dashboard_exposure_enabled | default(false) else []) - ) | unique - }} - when: ensure_namespaces | default(true) - - - name: Ensure selected namespaces exist - kubernetes.core.k8s: - kubeconfig: "{{ kubeconfig_path }}" - state: present - definition: - apiVersion: v1 - kind: Namespace - metadata: - name: "{{ item }}" - loop: "{{ managed_namespaces | default([]) }}" - loop_control: - label: "{{ item }}" - when: - - ensure_namespaces | default(true) - - item | length > 0 - - - name: Add cert-manager Helm repository - kubernetes.core.helm_repository: - name: jetstack - repo_url: https://charts.jetstack.io - when: cert_manager_install_enabled | default(false) - - - name: Install cert-manager - kubernetes.core.helm: - kubeconfig: "{{ kubeconfig_path }}" - name: cert-manager - chart_ref: jetstack/cert-manager - chart_version: "<< cert_manager_chart_version | default('1.18.2') >>" - release_namespace: "<< cert_manager_namespace | default('cert-manager') >>" - create_namespace: true - wait: true - values: - crds: - enabled: true - when: cert_manager_install_enabled | default(false) - - - name: Create Cloudflare API token secret placeholder for cert-manager - kubernetes.core.k8s: - kubeconfig: "{{ kubeconfig_path }}" - state: present - definition: - apiVersion: v1 - kind: Secret - metadata: - name: "<< cert_manager_cloudflare_secret_name | default('cloudflare-api-token-secret') >>" - namespace: "<< cert_manager_namespace | default('cert-manager') >>" - type: Opaque - stringData: - << cert_manager_cloudflare_secret_key | default('api-token') >>: "<< cert_manager_cloudflare_api_token | default('replace-me-with-your-cloudflare-api-token') >>" - when: cert_manager_create_cloudflare_secret | default(false) - - - name: Create cert-manager ClusterIssuer - kubernetes.core.k8s: - kubeconfig: "{{ kubeconfig_path }}" - state: present - definition: - apiVersion: cert-manager.io/v1 - kind: ClusterIssuer - metadata: - name: "<< cert_manager_clusterissuer_name | default('letsencrypt-production') >>" - spec: - acme: - email: "<< cert_manager_acme_email >>" - server: "<< cert_manager_acme_server | default('https://acme-v02.api.letsencrypt.org/directory') >>" - privateKeySecretRef: - name: "<< cert_manager_clusterissuer_name | default('letsencrypt-production') >>-account-key" - solvers: - - dns01: - cloudflare: - apiTokenSecretRef: - name: "<< cert_manager_cloudflare_secret_name | default('cloudflare-api-token-secret') >>" - key: "<< cert_manager_cloudflare_secret_key | default('api-token') >>" - when: cert_manager_clusterissuer_enabled | default(false) - - - name: Add metrics-server Helm repository - kubernetes.core.helm_repository: - name: metrics-server - repo_url: https://kubernetes-sigs.github.io/metrics-server/ - when: metrics_server_install_enabled | default(false) - - - name: Install metrics-server - kubernetes.core.helm: - kubeconfig: "{{ kubeconfig_path }}" - name: metrics-server - chart_ref: metrics-server/metrics-server - chart_version: "<< metrics_server_chart_version | default('3.13.0') >>" - release_namespace: "<< metrics_server_namespace | default('kube-system') >>" - create_namespace: true - wait: true -<%- if metrics_server_kubelet_insecure_tls %> - values: - args: - - --kubelet-insecure-tls -<%- endif %> - when: metrics_server_install_enabled | default(false) - - - name: Add Longhorn Helm repository - kubernetes.core.helm_repository: - name: longhorn - repo_url: https://charts.longhorn.io - when: longhorn_install_enabled | default(false) - - - name: Install Longhorn - kubernetes.core.helm: - kubeconfig: "{{ kubeconfig_path }}" - name: longhorn - chart_ref: longhorn/longhorn - chart_version: "<< longhorn_chart_version | default('1.9.1') >>" - release_namespace: "<< longhorn_namespace | default('longhorn-system') >>" - create_namespace: true - wait: true - values: - defaultSettings: - defaultDataPath: "<< longhorn_default_data_path | default('/var/lib/longhorn') >>" - when: longhorn_install_enabled | default(false) - - - name: Expose Traefik dashboard through an IngressRoute - kubernetes.core.k8s: - kubeconfig: "{{ kubeconfig_path }}" - state: present - definition: - apiVersion: traefik.io/v1alpha1 - kind: IngressRoute - metadata: - name: traefik-dashboard - namespace: "<< traefik_dashboard_namespace | default('traefik') >>" - spec: - entryPoints: - - "<< traefik_dashboard_entrypoint | default('websecure') >>" - routes: - - match: "Host(`<< traefik_dashboard_host | default('traefik.example.internal') >>`)" - kind: Rule -<%- if traefik_dashboard_middleware_name %> - middlewares: - - name: "<< traefik_dashboard_middleware_name >>" - namespace: "<< traefik_dashboard_middleware_namespace | default('traefik') >>" -<%- endif %> - services: - - kind: TraefikService - name: api@internal -<%- if traefik_dashboard_tls_enabled %> - tls: - secretName: "<< traefik_dashboard_tls_secret_name | default('traefik-dashboard-tls') >>" -<%- endif %> - when: traefik_dashboard_exposure_enabled | default(false) - - - name: Read kube-proxy ConfigMap before strictARP patch - kubernetes.core.k8s_info: - kubeconfig: "{{ kubeconfig_path }}" - api_version: v1 - kind: ConfigMap - namespace: kube-system - name: kube-proxy - register: kube_proxy_configmap - when: kube_proxy_strict_arp_enabled | default(false) - - - name: Build kube-proxy configuration with strictARP enabled - ansible.builtin.set_fact: - kube_proxy_rendered_config: >- - {{ - (kube_proxy_configmap.resources[0].data['config.conf'] | from_yaml) - | combine( - { - 'ipvs': ( - (kube_proxy_configmap.resources[0].data['config.conf'] | from_yaml).ipvs - | default({}) - | combine({'strictARP': true}) - ) - }, - recursive=True - ) - }} - when: - - kube_proxy_strict_arp_enabled | default(false) - - kube_proxy_configmap.resources | length > 0 - - - name: Patch kube-proxy ConfigMap with strictARP enabled - kubernetes.core.k8s: - kubeconfig: "{{ kubeconfig_path }}" - state: present - merge_type: - - merge - definition: - apiVersion: v1 - kind: ConfigMap - metadata: - name: kube-proxy - namespace: kube-system - data: - config.conf: "{{ kube_proxy_rendered_config | to_nice_yaml(indent=2) }}" - when: - - kube_proxy_strict_arp_enabled | default(false) - - kube_proxy_configmap.resources | length > 0 - - - name: Read kube-proxy daemonset for restart - kubernetes.core.k8s_info: - kubeconfig: "{{ kubeconfig_path }}" - api_version: apps/v1 - kind: DaemonSet - namespace: kube-system - name: kube-proxy - register: kube_proxy_daemonset - when: kube_proxy_strict_arp_enabled | default(false) - - - name: Restart kube-proxy daemonset after strictARP change - kubernetes.core.k8s: - kubeconfig: "{{ kubeconfig_path }}" - state: present - merge_type: - - merge - definition: - apiVersion: apps/v1 - kind: DaemonSet - metadata: - name: kube-proxy - namespace: kube-system - spec: - template: - metadata: - annotations: - homelab.boilerplates.io/restarted-at: "{{ lookup('pipe', 'date -u +%Y-%m-%dT%H:%M:%SZ') }}" - when: - - kube_proxy_strict_arp_enabled | default(false) - - kube_proxy_daemonset.resources | length > 0 - delegate_to: localhost - run_once: true diff --git a/AnisiblePlaybooks/k3s-postinstall/template.json b/AnisiblePlaybooks/k3s-postinstall/template.json deleted file mode 100644 index c08f25d..0000000 --- a/AnisiblePlaybooks/k3s-postinstall/template.json +++ /dev/null @@ -1,527 +0,0 @@ -{ - "slug": "k3s-postinstall", - "kind": "ansible", - "metadata": { - "name": "K3s Post-Install Platform Setup", - "description": "Configures common post-install building blocks for a fresh K3s cluster. Supports kubeconfig retrieval, namespace management, Traefik dashboard exposure, cert-manager bootstrap, metrics-server, Longhorn preparation, and optional kube-system tuning.", - "tags": [ - "kubernetes", - "k3s", - "postinstall", - "helm", - "homelab" - ], - "icon": { - "provider": "simple-icons", - "id": "kubernetes" - }, - "draft": false, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/k3s-postinstall" - } - }, - "variables": [ - { - "title": "Execution", - "name": "execution", - "items": [ - { - "name": "secrets_file", - "type": "str", - "title": "Secrets File", - "required": false, - "default": "", - "description": "Optional vars file to load before running the playbook." - } - ] - }, - { - "title": "Kubeconfig", - "name": "kubeconfig", - "items": [ - { - "name": "fetch_kubeconfig", - "type": "bool", - "title": "Fetch Kubeconfig", - "required": false, - "default": true, - "description": "Fetch the admin kubeconfig from the first K3s server before applying cluster resources" - }, - { - "name": "kubeconfig_source_host", - "type": "str", - "title": "Source Host", - "required": false, - "default": "k3s-server-01", - "description": "Inventory host that stores the K3s admin kubeconfig", - "needs": [ - "fetch_kubeconfig=true" - ], - "config": { - "placeholder": "k3s-server-01" - } - }, - { - "name": "kubeconfig_source_path", - "type": "str", - "title": "Source Path", - "required": false, - "default": "/etc/rancher/k3s/k3s.yaml", - "description": "Path to the kubeconfig file on the K3s server", - "needs": [ - "fetch_kubeconfig=true" - ], - "config": { - "placeholder": "/etc/rancher/k3s/k3s.yaml" - } - }, - { - "name": "kubeconfig_server_endpoint", - "type": "str", - "title": "API Endpoint", - "required": false, - "default": "{{ hostvars['k3s-server-01'].ansible_host | default('k3s-server-01') }}", - "description": "Host or IP that should replace 127.0.0.1 in the fetched kubeconfig", - "needs": [ - "fetch_kubeconfig=true" - ], - "config": { - "placeholder": "192.168.1.10" - } - }, - { - "name": "kubeconfig_local_path", - "type": "str", - "title": "Local Kubeconfig", - "required": false, - "default": "{{ lookup('env', 'HOME') }}/.kube/k3s.yaml", - "description": "Local kubeconfig path used by the control machine for all cluster operations", - "config": { - "placeholder": "{{ lookup('env', 'HOME') }}/.kube/k3s.yaml" - } - } - ] - }, - { - "title": "Namespaces", - "name": "namespaces", - "items": [ - { - "name": "ensure_namespaces", - "type": "bool", - "title": "Manage Namespaces", - "required": false, - "default": true, - "description": "Ensure common namespaces exist before installing platform add-ons" - }, - { - "name": "extra_namespaces_yaml", - "type": "str", - "title": "Extra Namespaces", - "required": false, - "default": "[]", - "description": "YAML list of extra namespaces to create", - "needs": [ - "ensure_namespaces=true" - ], - "config": { - "textarea": true, - "placeholder": "- apps\n- monitoring" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "items": [ - { - "name": "traefik_dashboard_exposure_enabled", - "type": "bool", - "title": "Expose Dashboard", - "required": false, - "default": false, - "description": "Create a Traefik IngressRoute that exposes the internal Traefik dashboard" - }, - { - "name": "traefik_dashboard_namespace", - "type": "str", - "title": "Namespace", - "required": false, - "default": "traefik", - "description": "Namespace where the Traefik release is installed", - "needs": [ - "traefik_dashboard_exposure_enabled=true" - ], - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_dashboard_host", - "type": "str", - "title": "Dashboard Host", - "required": false, - "default": "traefik.example.internal", - "description": "FQDN used to expose the Traefik dashboard", - "needs": [ - "traefik_dashboard_exposure_enabled=true" - ], - "config": { - "placeholder": "traefik.example.internal" - } - }, - { - "name": "traefik_dashboard_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": false, - "default": "websecure", - "description": "Traefik entrypoint for the dashboard route", - "needs": [ - "traefik_dashboard_exposure_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_dashboard_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": true, - "needs": [ - "traefik_dashboard_exposure_enabled=true" - ] - }, - { - "name": "traefik_dashboard_tls_secret_name", - "type": "str", - "title": "TLS Secret", - "required": false, - "default": "traefik-dashboard-tls", - "description": "TLS secret used by the dashboard route when TLS is enabled", - "needs": [ - "traefik_dashboard_exposure_enabled=true", - "traefik_dashboard_tls_enabled=true" - ], - "config": { - "placeholder": "traefik-dashboard-tls" - } - }, - { - "name": "traefik_dashboard_middleware_name", - "type": "str", - "title": "Middleware", - "required": false, - "default": "", - "description": "Optional Traefik middleware name attached to the dashboard route", - "needs": [ - "traefik_dashboard_exposure_enabled=true" - ], - "config": { - "placeholder": "traefik-dashboard-auth" - } - }, - { - "name": "traefik_dashboard_middleware_namespace", - "type": "str", - "title": "Middleware NS", - "required": false, - "default": "traefik", - "needs": [ - "traefik_dashboard_exposure_enabled=true" - ], - "config": { - "placeholder": "traefik" - } - } - ] - }, - { - "title": "Cert-Manager", - "name": "cert-manager", - "items": [ - { - "name": "cert_manager_install_enabled", - "type": "bool", - "title": "Install cert-manager", - "required": false, - "default": false - }, - { - "name": "cert_manager_chart_version", - "type": "str", - "title": "Chart Version", - "required": false, - "default": "1.18.2", - "needs": [ - "cert_manager_install_enabled=true" - ], - "config": { - "placeholder": "1.18.2" - } - }, - { - "name": "cert_manager_namespace", - "type": "str", - "title": "Namespace", - "required": false, - "default": "cert-manager", - "config": { - "placeholder": "cert-manager" - } - }, - { - "name": "cert_manager_create_cloudflare_secret", - "type": "bool", - "title": "Cloudflare Secret", - "required": false, - "default": false, - "description": "Create a placeholder secret for a Cloudflare DNS API token" - }, - { - "name": "cert_manager_cloudflare_secret_name", - "type": "str", - "title": "Secret Name", - "required": false, - "default": "cloudflare-api-token-secret", - "description": "Secret name for the Cloudflare DNS API token", - "needs": [ - "cert_manager_create_cloudflare_secret=true" - ], - "config": { - "placeholder": "cloudflare-api-token-secret" - } - }, - { - "name": "cert_manager_cloudflare_secret_key", - "type": "str", - "title": "Secret Key", - "required": false, - "default": "api-token", - "description": "Secret key that stores the Cloudflare API token", - "needs": [ - "cert_manager_create_cloudflare_secret=true" - ], - "config": { - "placeholder": "api-token" - } - }, - { - "name": "cert_manager_cloudflare_api_token", - "type": "secret", - "title": "Cloudflare Token", - "required": false, - "default": "", - "description": "Optional Cloudflare API token value used to populate the placeholder secret", - "needs": [ - "cert_manager_create_cloudflare_secret=true" - ] - }, - { - "name": "cert_manager_clusterissuer_enabled", - "type": "bool", - "title": "ClusterIssuer", - "required": false, - "default": false, - "description": "Create a production Let's Encrypt ClusterIssuer that uses Cloudflare DNS-01" - }, - { - "name": "cert_manager_clusterissuer_name", - "type": "str", - "title": "ClusterIssuer Name", - "required": false, - "default": "letsencrypt-production", - "needs": [ - "cert_manager_clusterissuer_enabled=true" - ], - "config": { - "placeholder": "letsencrypt-production" - } - }, - { - "name": "cert_manager_acme_email", - "type": "str", - "title": "ACME Email", - "required": false, - "default": "", - "description": "Email address used for ACME registration", - "needs": [ - "cert_manager_clusterissuer_enabled=true" - ], - "config": { - "placeholder": "me@example.com" - } - }, - { - "name": "cert_manager_acme_server", - "type": "str", - "title": "ACME Server", - "required": false, - "default": "https://acme-v02.api.letsencrypt.org/directory", - "description": "ACME directory URL used by the ClusterIssuer", - "needs": [ - "cert_manager_clusterissuer_enabled=true" - ], - "config": { - "placeholder": "https://acme-v02.api.letsencrypt.org/directory" - } - } - ] - }, - { - "title": "Metrics Server", - "name": "metrics-server", - "items": [ - { - "name": "metrics_server_install_enabled", - "type": "bool", - "title": "Install Metrics Server", - "required": false, - "default": false - }, - { - "name": "metrics_server_chart_version", - "type": "str", - "title": "Chart Version", - "required": false, - "default": "3.13.0", - "needs": [ - "metrics_server_install_enabled=true" - ], - "config": { - "placeholder": "3.13.0" - } - }, - { - "name": "metrics_server_namespace", - "type": "str", - "title": "Namespace", - "required": false, - "default": "kube-system", - "needs": [ - "metrics_server_install_enabled=true" - ], - "config": { - "placeholder": "kube-system" - } - }, - { - "name": "metrics_server_kubelet_insecure_tls", - "type": "bool", - "title": "Insecure TLS", - "required": false, - "default": true, - "description": "Add --kubelet-insecure-tls for clusters that use self-signed kubelet certificates", - "needs": [ - "metrics_server_install_enabled=true" - ] - } - ] - }, - { - "title": "Longhorn", - "name": "longhorn", - "items": [ - { - "name": "longhorn_prerequisites_enabled", - "type": "bool", - "title": "Prepare Nodes", - "required": false, - "default": false, - "description": "Install host packages and kernel module configuration needed by Longhorn" - }, - { - "name": "longhorn_node_hosts", - "type": "str", - "title": "Node Hosts", - "required": false, - "default": "k3s_cluster", - "description": "Inventory host pattern for the nodes that should be prepared for Longhorn", - "needs": [ - "longhorn_prerequisites_enabled=true" - ], - "config": { - "placeholder": "k3s_cluster" - } - }, - { - "name": "longhorn_disable_multipathd", - "type": "bool", - "title": "Disable multipathd", - "required": false, - "default": false, - "description": "Stop and disable multipathd if your nodes do not use multipath storage", - "needs": [ - "longhorn_prerequisites_enabled=true" - ] - }, - { - "name": "longhorn_install_enabled", - "type": "bool", - "title": "Install Longhorn", - "required": false, - "default": false, - "description": "Install Longhorn with Helm after prerequisites are in place" - }, - { - "name": "longhorn_chart_version", - "type": "str", - "title": "Chart Version", - "required": false, - "default": "1.9.1", - "needs": [ - "longhorn_install_enabled=true" - ], - "config": { - "placeholder": "1.9.1" - } - }, - { - "name": "longhorn_namespace", - "type": "str", - "title": "Namespace", - "required": false, - "default": "longhorn-system", - "needs": [ - "longhorn_install_enabled=true" - ], - "config": { - "placeholder": "longhorn-system" - } - }, - { - "name": "longhorn_default_data_path", - "type": "str", - "title": "Data Path", - "required": false, - "default": "/var/lib/longhorn", - "description": "Default host path used by Longhorn for replica data", - "needs": [ - "longhorn_install_enabled=true" - ], - "config": { - "placeholder": "/var/lib/longhorn" - } - } - ] - }, - { - "title": "Kube-System", - "name": "kube-system", - "items": [ - { - "name": "kube_proxy_strict_arp_enabled", - "type": "bool", - "title": "Enable strictARP", - "required": false, - "default": false, - "description": "Patch the kube-proxy ConfigMap and restart the daemonset with strictARP enabled" - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/k3sup-k3s-cluster/files/main.yml b/AnisiblePlaybooks/k3sup-k3s-cluster/files/main.yml deleted file mode 100644 index 4300b22..0000000 --- a/AnisiblePlaybooks/k3sup-k3s-cluster/files/main.yml +++ /dev/null @@ -1,200 +0,0 @@ ---- -- name: Bootstrap K3s cluster with k3sup - hosts: all - gather_facts: false -<%- if secrets_file %> - vars_files: - - << secrets_file >> -<%- endif %> - - vars: - k3s_server_target: "{{ hostvars['<< k3s_server_host >>'].ansible_host | default('<< k3s_server_host >>') }}" -<%- if kubeconfig_destination_mode == 'remote' %> - k3s_generated_kubeconfig_path: "/tmp/<< k3s_context_name | default('homelab-k3s') >>-kubeconfig" -<%- else %> - k3s_generated_kubeconfig_path: "<< local_kubeconfig_path >>" -<%- endif %> - - tasks: - - name: Gather control machine facts - ansible.builtin.setup: - delegate_to: localhost - run_once: true - register: localhost_facts - - - name: Validate that the first server host exists in inventory - ansible.builtin.assert: - that: - - "'<< k3s_server_host >>' in hostvars" - fail_msg: "Inventory host '<< k3s_server_host >>' was not found." - run_once: true - - - name: Resolve k3sup release asset - ansible.builtin.set_fact: - k3sup_release_asset: >- - {%- if localhost_facts.ansible_facts.ansible_system == 'Linux' and localhost_facts.ansible_facts.ansible_architecture in ['x86_64', 'amd64'] -%} - k3sup - {%- elif localhost_facts.ansible_facts.ansible_system == 'Linux' and localhost_facts.ansible_facts.ansible_architecture in ['aarch64', 'arm64'] -%} - k3sup-arm64 - {%- elif localhost_facts.ansible_facts.ansible_system == 'Linux' and localhost_facts.ansible_facts.ansible_architecture in ['armv7l', 'armv6l'] -%} - k3sup-arm - {%- elif localhost_facts.ansible_facts.ansible_system == 'Darwin' and localhost_facts.ansible_facts.ansible_architecture in ['x86_64', 'amd64'] -%} - k3sup-darwin - {%- elif localhost_facts.ansible_facts.ansible_system == 'Darwin' and localhost_facts.ansible_facts.ansible_architecture in ['arm64', 'aarch64'] -%} - k3sup-darwin-arm64 - {%- else -%} - unsupported - {%- endif -%} - when: install_k3sup_binary | default(false) - run_once: true - - - name: Fail when k3sup binary installation is not supported for this control machine - ansible.builtin.fail: - msg: "Automatic k3sup installation is not supported for {{ localhost_facts.ansible_facts.ansible_system }}/{{ localhost_facts.ansible_facts.ansible_architecture }}. Set install_k3sup_binary=false and install k3sup manually." - when: - - install_k3sup_binary | default(false) - - k3sup_release_asset == "unsupported" - run_once: true - - - name: Ensure local directory for k3sup exists - ansible.builtin.file: - path: "{{ '<< k3sup_install_path >>' | dirname }}" - state: directory - mode: "0755" - delegate_to: localhost - become: true - when: install_k3sup_binary | default(false) - run_once: true - - - name: Install k3sup binary on the control machine - ansible.builtin.get_url: - url: "https://github.com/alexellis/k3sup/releases/download/<< k3sup_version >>/{{ k3sup_release_asset }}" - dest: "<< k3sup_install_path >>" - mode: "0755" - delegate_to: localhost - become: true - when: install_k3sup_binary | default(false) - run_once: true - - - name: Verify k3sup is available - ansible.builtin.command: - cmd: "<< k3sup_install_path >> version" - changed_when: false - delegate_to: localhost - run_once: true - - - name: Ensure local kubeconfig directory exists when using local destination mode - ansible.builtin.file: - path: "{{ k3s_generated_kubeconfig_path | dirname }}" - state: directory - mode: "0700" - delegate_to: localhost - when: "<< kubeconfig_destination_mode >>" == "local" - run_once: true - - - name: Check whether K3s is already present on the first server - ansible.builtin.stat: - path: /etc/rancher/k3s/k3s.yaml - delegate_to: "<< k3s_server_host >>" - register: k3s_server_install_state - run_once: true - - - name: Bootstrap the first K3s server with k3sup - ansible.builtin.command: - cmd: >- - << k3sup_install_path >> install - --ip {{ k3s_server_target }} - --user << k3s_server_user | default('ubuntu') >> - --ssh-port << k3s_server_ssh_port | default(22) >> - --local-path {{ k3s_generated_kubeconfig_path }} - --merge=false - --context << k3s_context_name | default('homelab-k3s') >> -<%- if k3sup_use_sudo %> - --sudo -<%- endif %> -<%- if k3s_server_ssh_key_path %> - --ssh-key << k3s_server_ssh_key_path | quote >> -<%- endif %> -<%- if extra_server_args %> - --k3s-extra-args << extra_server_args | quote >> -<%- endif %> - delegate_to: localhost - when: - - bootstrap_control_plane | default(true) - - not (k3s_server_install_state.stat.exists | default(false)) - run_once: true - - - name: Resolve inventory hosts for K3s agents - ansible.builtin.set_fact: - k3s_agent_inventory_hosts: "{{ query('inventory_hostnames', '<< k3s_agent_hosts_pattern >>') }}" - when: join_agent_nodes | default(true) - run_once: true - - - name: Fail when agent join is enabled but no hosts match the inventory pattern - ansible.builtin.assert: - that: - - k3s_agent_inventory_hosts | length > 0 - fail_msg: "No inventory hosts matched '<< k3s_agent_hosts_pattern >>'." - when: join_agent_nodes | default(true) - run_once: true - - - name: Check whether K3s agent is already present on each node - ansible.builtin.stat: - path: /etc/systemd/system/k3s-agent.service - delegate_to: "{{ item }}" - loop: "{{ k3s_agent_inventory_hosts | default([]) }}" - loop_control: - label: "{{ item }}" - register: k3s_agent_install_state - when: join_agent_nodes | default(true) - run_once: true - - - name: Join agent nodes to the K3s cluster with k3sup - ansible.builtin.command: - cmd: >- - << k3sup_install_path >> join - --ip {{ hostvars[item.item].ansible_host | default(item.item) }} - --server-ip {{ k3s_server_target }} - --user << k3s_agent_user | default('ubuntu') >> - --server-user << k3s_server_user | default('ubuntu') >> - --ssh-port << k3s_agent_ssh_port | default(22) >> - --server-ssh-port << k3s_server_ssh_port | default(22) >> -<%- if k3sup_use_sudo %> - --sudo -<%- endif %> -<%- if k3s_server_ssh_key_path %> - --ssh-key << k3s_server_ssh_key_path | quote >> -<%- endif %> -<%- if extra_agent_args %> - --k3s-extra-args << extra_agent_args | quote >> -<%- endif %> - delegate_to: localhost - loop: "{{ k3s_agent_install_state.results | default([]) }}" - loop_control: - label: "{{ item.item }}" - when: - - join_agent_nodes | default(true) - - not (item.stat.exists | default(false)) - run_once: true - - - name: Ensure remote kubeconfig directory exists - ansible.builtin.file: - path: "{{ '<< kubeconfig_remote_path >>' | dirname }}" - state: directory - mode: "0700" - delegate_to: "<< kubeconfig_remote_host | default('localhost') >>" - become: << kubeconfig_remote_become | default(false) >> - when: "<< kubeconfig_destination_mode >>" == "remote" - run_once: true - - - name: Copy kubeconfig to the remote destination host - ansible.builtin.copy: - src: "{{ k3s_generated_kubeconfig_path }}" - dest: "<< kubeconfig_remote_path >>" - owner: "<< kubeconfig_remote_owner | default('ubuntu') >>" - group: "<< kubeconfig_remote_group | default('ubuntu') >>" - mode: "<< kubeconfig_remote_mode | default('0600') >>" - delegate_to: "<< kubeconfig_remote_host | default('localhost') >>" - become: << kubeconfig_remote_become | default(false) >> - when: "<< kubeconfig_destination_mode >>" == "remote" - run_once: true diff --git a/AnisiblePlaybooks/k3sup-k3s-cluster/template.json b/AnisiblePlaybooks/k3sup-k3s-cluster/template.json deleted file mode 100644 index b534403..0000000 --- a/AnisiblePlaybooks/k3sup-k3s-cluster/template.json +++ /dev/null @@ -1,353 +0,0 @@ -{ - "slug": "k3sup-k3s-cluster", - "kind": "ansible", - "metadata": { - "name": "Bootstrap K3s Cluster with k3sup", - "description": "Bootstraps a K3s cluster from the Ansible control machine by using k3sup over SSH. Supports first-server install, optional agent joins, and local or remote kubeconfig placement.", - "tags": [ - "kubernetes", - "k3s", - "k3sup", - "bootstrap" - ], - "icon": { - "provider": "simple-icons", - "id": "kubernetes" - }, - "draft": true, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/k3sup-k3s-cluster" - } - }, - "variables": [ - { - "title": "Execution", - "name": "execution", - "items": [ - { - "name": "secrets_file", - "type": "str", - "title": "Secrets File", - "required": false, - "default": "", - "description": "Optional vars file to load before running the playbook." - }, - { - "name": "install_k3sup_binary", - "type": "bool", - "title": "Install k3sup", - "required": false, - "default": false, - "description": "Download and install the k3sup binary on the Ansible control machine before bootstrapping" - }, - { - "name": "k3sup_version", - "type": "str", - "title": "k3sup Version", - "required": false, - "default": "0.13.15", - "description": "Version of k3sup to install when binary installation is enabled", - "needs": [ - "install_k3sup_binary=true" - ], - "config": { - "placeholder": "0.13.15" - } - }, - { - "name": "k3sup_install_path", - "type": "str", - "title": "k3sup Path", - "required": false, - "default": "/usr/local/bin/k3sup", - "description": "Local filesystem path for the k3sup binary", - "config": { - "placeholder": "/usr/local/bin/k3sup" - } - } - ] - }, - { - "title": "Control Plane", - "name": "control-plane", - "items": [ - { - "name": "bootstrap_control_plane", - "type": "bool", - "title": "Bootstrap Server", - "required": false, - "default": true, - "description": "Run k3sup install against the first K3s server" - }, - { - "name": "k3s_server_host", - "type": "str", - "title": "Server Host", - "required": true, - "default": "k3s-server-01", - "description": "Inventory host name for the first K3s server", - "config": { - "placeholder": "k3s-server-01" - } - }, - { - "name": "k3s_server_user", - "type": "str", - "title": "Server SSH User", - "required": false, - "default": "ubuntu", - "description": "SSH user used by k3sup for the first server", - "config": { - "placeholder": "ubuntu" - } - }, - { - "name": "k3s_server_ssh_port", - "type": "int", - "title": "Server SSH Port", - "required": false, - "default": 22, - "description": "SSH port used for the first server", - "config": { - "slider": true, - "min": 1, - "max": 65535, - "step": 1, - "placeholder": "22" - } - }, - { - "name": "k3s_server_ssh_key_path", - "type": "str", - "title": "SSH Key Path", - "required": false, - "default": "", - "description": "Optional private SSH key path for k3sup", - "config": { - "placeholder": "~/.ssh/id_ed25519" - } - }, - { - "name": "k3s_context_name", - "type": "str", - "title": "Cluster Context", - "required": false, - "default": "homelab-k3s", - "description": "kubectl context name written into the generated kubeconfig", - "config": { - "placeholder": "homelab-k3s" - } - }, - { - "name": "k3sup_use_sudo", - "type": "bool", - "title": "Use sudo", - "required": false, - "default": true, - "description": "Run k3sup remote operations with sudo on the target hosts" - }, - { - "name": "extra_server_args", - "type": "str", - "title": "Server Args", - "required": false, - "default": "--write-kubeconfig-mode 644 --disable servicelb", - "description": "Optional extra K3s server arguments passed through k3sup", - "config": { - "placeholder": "--write-kubeconfig-mode 644 --disable servicelb" - } - } - ] - }, - { - "title": "Agents", - "name": "agents", - "items": [ - { - "name": "join_agent_nodes", - "type": "bool", - "title": "Join Agents", - "required": false, - "default": true, - "description": "Join matching inventory hosts to the cluster as K3s agents" - }, - { - "name": "k3s_agent_hosts_pattern", - "type": "str", - "title": "Agent Hosts", - "required": false, - "default": "k3s_agents", - "description": "Inventory host pattern used to discover K3s agent nodes", - "needs": [ - "join_agent_nodes=true" - ], - "config": { - "placeholder": "k3s_agents" - } - }, - { - "name": "k3s_agent_user", - "type": "str", - "title": "Agent SSH User", - "required": false, - "default": "ubuntu", - "description": "SSH user used by k3sup for agent nodes", - "needs": [ - "join_agent_nodes=true" - ], - "config": { - "placeholder": "ubuntu" - } - }, - { - "name": "k3s_agent_ssh_port", - "type": "int", - "title": "Agent SSH Port", - "required": false, - "default": 22, - "description": "SSH port used for agent nodes", - "needs": [ - "join_agent_nodes=true" - ], - "config": { - "slider": true, - "min": 1, - "max": 65535, - "step": 1, - "placeholder": "22" - } - }, - { - "name": "extra_agent_args", - "type": "str", - "title": "Agent Args", - "required": false, - "default": "", - "description": "Optional extra K3s agent arguments passed through k3sup", - "needs": [ - "join_agent_nodes=true" - ], - "config": { - "placeholder": "--node-label role=worker" - } - } - ] - }, - { - "title": "Kubeconfig", - "name": "kubeconfig", - "items": [ - { - "name": "kubeconfig_destination_mode", - "type": "enum", - "title": "Destination Mode", - "required": false, - "default": "local", - "description": "Store the generated kubeconfig locally on the control machine or copy it to another managed host", - "config": { - "options": [ - "local", - "remote" - ] - } - }, - { - "name": "local_kubeconfig_path", - "type": "str", - "title": "Local Kubeconfig", - "required": false, - "default": "{{ lookup('env', 'HOME') }}/.kube/config", - "description": "Local kubeconfig path used when destination mode is local", - "needs": [ - "kubeconfig_destination_mode=local" - ], - "config": { - "placeholder": "{{ lookup('env', 'HOME') }}/.kube/config" - } - }, - { - "name": "kubeconfig_remote_host", - "type": "str", - "title": "Remote Host", - "required": false, - "default": "localhost", - "description": "Managed inventory host that should receive the kubeconfig copy", - "needs": [ - "kubeconfig_destination_mode=remote" - ], - "config": { - "placeholder": "bastion-01" - } - }, - { - "name": "kubeconfig_remote_path", - "type": "str", - "title": "Remote Kubeconfig", - "required": false, - "default": "/home/ubuntu/.kube/config", - "description": "Destination path on the remote host for the kubeconfig file", - "needs": [ - "kubeconfig_destination_mode=remote" - ], - "config": { - "placeholder": "/home/ubuntu/.kube/config" - } - }, - { - "name": "kubeconfig_remote_owner", - "type": "str", - "title": "Remote Owner", - "required": false, - "default": "ubuntu", - "description": "Owner for the remote kubeconfig file", - "needs": [ - "kubeconfig_destination_mode=remote" - ], - "config": { - "placeholder": "ubuntu" - } - }, - { - "name": "kubeconfig_remote_group", - "type": "str", - "title": "Remote Group", - "required": false, - "default": "ubuntu", - "description": "Group for the remote kubeconfig file", - "needs": [ - "kubeconfig_destination_mode=remote" - ], - "config": { - "placeholder": "ubuntu" - } - }, - { - "name": "kubeconfig_remote_mode", - "type": "str", - "title": "Remote Mode", - "required": false, - "default": "0600", - "description": "Filesystem mode for the remote kubeconfig file", - "needs": [ - "kubeconfig_destination_mode=remote" - ], - "config": { - "placeholder": "0600" - } - }, - { - "name": "kubeconfig_remote_become", - "type": "bool", - "title": "Remote Become", - "required": false, - "default": false, - "description": "Use become when creating directories or copying the remote kubeconfig", - "needs": [ - "kubeconfig_destination_mode=remote" - ] - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/ubuntu-add-sshkey/files/main.yml b/AnisiblePlaybooks/ubuntu-add-sshkey/files/main.yml deleted file mode 100644 index f17b98e..0000000 --- a/AnisiblePlaybooks/ubuntu-add-sshkey/files/main.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -- name: Add SSH authorized keys - hosts: all - become: true - - tasks: - - name: Install SSH public key - ansible.posix.authorized_key: - user: "<< target_user >>" - state: present - key: "<< ssh_public_key >>" - manage_dir: true - -<%- if configure_passwordless_sudo %> - - name: Enable passwordless sudo for the sudo group - ansible.builtin.copy: - dest: /etc/sudoers.d/90-sudo-nopasswd - content: | - %sudo ALL=(ALL:ALL) NOPASSWD: ALL - owner: root - group: root - mode: "0440" - validate: /usr/sbin/visudo -cf %s -<%- endif %> diff --git a/AnisiblePlaybooks/ubuntu-add-sshkey/template.json b/AnisiblePlaybooks/ubuntu-add-sshkey/template.json deleted file mode 100644 index c08bb80..0000000 --- a/AnisiblePlaybooks/ubuntu-add-sshkey/template.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "slug": "ubuntu-add-sshkey", - "kind": "ansible", - "metadata": { - "name": "Add SSH Key and Configure Sudoers", - "description": "Installs a single SSH public key for a target user on the workload-selected hosts and can enable passwordless sudo for the Ubuntu sudo group.", - "tags": [], - "icon": { - "provider": "simple-icons", - "id": "ansible" - }, - "draft": false, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/ubuntu-add-sshkey" - } - }, - "variables": [ - { - "title": "Access", - "name": "access", - "items": [ - { - "name": "target_user", - "type": "str", - "title": "Target User", - "required": false, - "default": "ubuntu", - "description": "Linux user account that should receive the authorized SSH keys.", - "config": { - "placeholder": "ubuntu" - } - }, - { - "name": "ssh_public_key", - "type": "str", - "title": "SSH Public Key", - "required": true, - "description": "SSH public key to add to the target user's authorized_keys file.", - "config": { - "textarea": true, - "placeholder": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBExampleKey user@laptop" - } - }, - { - "name": "configure_passwordless_sudo", - "type": "bool", - "title": "Passwordless Sudo", - "required": false, - "default": true - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/ubuntu-packages/files/main.yml b/AnisiblePlaybooks/ubuntu-packages/files/main.yml deleted file mode 100644 index 225c123..0000000 --- a/AnisiblePlaybooks/ubuntu-packages/files/main.yml +++ /dev/null @@ -1,85 +0,0 @@ ---- -- name: Install curated Ubuntu packages - hosts: all - become: true - gather_facts: true - - vars: - ubuntu_package_matrix: - - name: python3-venv - enabled: << install_python3_venv >> - - name: python3-pip - enabled: << install_python3_pip >> - - name: python3-apt - enabled: << install_python3_apt >> - - name: curl - enabled: << install_curl >> - - name: wget - enabled: << install_wget >> - - name: git - enabled: << install_git >> - - name: jq - enabled: << install_jq >> - - name: rsync - enabled: << install_rsync >> - - name: unzip - enabled: << install_unzip >> - - name: ca-certificates - enabled: << install_ca_certificates >> - - name: gnupg - enabled: << install_gnupg >> - - name: lsb-release - enabled: << install_lsb_release >> - - name: prometheus-node-exporter - enabled: << install_prometheus_node_exporter >> - - name: nfs-common - enabled: << install_nfs_common >> - - name: qemu-guest-agent - enabled: << install_qemu_guest_agent >> - - tasks: - - name: Validate Ubuntu APT target - ansible.builtin.assert: - that: - - ansible_facts['distribution'] == 'Ubuntu' - - ansible_facts['pkg_mgr'] == 'apt' - fail_msg: "This playbook only supports Ubuntu hosts that use APT." - - - name: Build selected package list - ansible.builtin.set_fact: - ubuntu_selected_packages: "{{ ubuntu_package_matrix | selectattr('enabled') | map(attribute='name') | list }}" - - - name: Refresh APT package index - ansible.builtin.command: - cmd: apt-get update - environment: - DEBIAN_FRONTEND: noninteractive - register: ubuntu_packages_apt_update - changed_when: false - - - name: Install selected Ubuntu packages - ansible.builtin.apt: - name: "{{ ubuntu_selected_packages }}" - state: present - update_cache: false - when: ubuntu_selected_packages | length > 0 - - - name: Enable and start Prometheus node exporter - ansible.builtin.service: - name: prometheus-node-exporter - state: started - enabled: true - when: << install_prometheus_node_exporter >> - - - name: Enable and start QEMU guest agent - ansible.builtin.service: - name: qemu-guest-agent - state: started - enabled: true - when: << install_qemu_guest_agent >> - - - name: Show selected package summary - ansible.builtin.debug: - msg: - - "Host: {{ inventory_hostname }}" - - "Selected packages: {{ ubuntu_selected_packages | join(', ') if (ubuntu_selected_packages | length > 0) else 'none' }}" diff --git a/AnisiblePlaybooks/ubuntu-packages/template.json b/AnisiblePlaybooks/ubuntu-packages/template.json deleted file mode 100644 index 3155fd2..0000000 --- a/AnisiblePlaybooks/ubuntu-packages/template.json +++ /dev/null @@ -1,157 +0,0 @@ -{ - "slug": "ubuntu-packages", - "kind": "ansible", - "metadata": { - "name": "Install Ubuntu Packages", - "description": "Installs a curated set of useful Ubuntu packages with per-package switches for scripting, package management, monitoring, NFS, and VM guest integration.", - "tags": [ - "ubuntu", - "apt", - "packages", - "ansible" - ], - "icon": { - "provider": "simple-icons", - "id": "ansible" - }, - "draft": false, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/ubuntu-packages" - } - }, - "variables": [ - { - "title": "Base Packages", - "name": "base_packages", - "items": [ - { - "name": "install_python3_venv", - "type": "bool", - "title": "python3-venv", - "required": false, - "default": true, - "description": "Install Python virtual environment support." - }, - { - "name": "install_python3_pip", - "type": "bool", - "title": "python3-pip", - "required": false, - "default": true, - "description": "Install pip for Python 3." - }, - { - "name": "install_python3_apt", - "type": "bool", - "title": "python3-apt", - "required": false, - "default": true, - "description": "Install Python bindings for APT." - }, - { - "name": "install_curl", - "type": "bool", - "title": "curl", - "required": false, - "default": true, - "description": "Install curl for HTTP requests and downloads." - }, - { - "name": "install_wget", - "type": "bool", - "title": "wget", - "required": false, - "default": true, - "description": "Install wget for scripted downloads." - }, - { - "name": "install_git", - "type": "bool", - "title": "git", - "required": false, - "default": true, - "description": "Install Git for source control and repository operations." - }, - { - "name": "install_jq", - "type": "bool", - "title": "jq", - "required": false, - "default": true, - "description": "Install jq for JSON parsing in shell scripts." - }, - { - "name": "install_rsync", - "type": "bool", - "title": "rsync", - "required": false, - "default": true, - "description": "Install rsync for file synchronization and copy jobs." - }, - { - "name": "install_unzip", - "type": "bool", - "title": "unzip", - "required": false, - "default": true, - "description": "Install unzip for archive extraction." - }, - { - "name": "install_ca_certificates", - "type": "bool", - "title": "ca-certificates", - "required": false, - "default": true, - "description": "Install CA certificates for HTTPS trust." - }, - { - "name": "install_gnupg", - "type": "bool", - "title": "gnupg", - "required": false, - "default": true, - "description": "Install GnuPG for repository keys and signing workflows." - }, - { - "name": "install_lsb_release", - "type": "bool", - "title": "lsb-release", - "required": false, - "default": true, - "description": "Install lsb-release for distro detection in scripts." - } - ] - }, - { - "title": "Optional Packages", - "name": "optional_packages", - "items": [ - { - "name": "install_prometheus_node_exporter", - "type": "bool", - "title": "prometheus-node-exporter", - "required": false, - "default": false, - "description": "Install Prometheus node exporter and enable its service." - }, - { - "name": "install_nfs_common", - "type": "bool", - "title": "nfs-common", - "required": false, - "default": false, - "description": "Install NFS client utilities." - }, - { - "name": "install_qemu_guest_agent", - "type": "bool", - "title": "qemu-guest-agent", - "required": false, - "default": false, - "description": "Install the QEMU guest agent and enable its service." - } - ] - } - ] -} diff --git a/AnisiblePlaybooks/ubuntu-vm-core/files/main.yml b/AnisiblePlaybooks/ubuntu-vm-core/files/main.yml deleted file mode 100644 index 016431d..0000000 --- a/AnisiblePlaybooks/ubuntu-vm-core/files/main.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -- name: Install Ubuntu VM core packages - hosts: all - become: true - - tasks: - - name: Install packages - ansible.builtin.apt: - name: - - prometheus-node-exporter - - nfs-common - - qemu-guest-agent - update_cache: true - - - name: Start guest qemu-guest-agent - ansible.builtin.service: - name: qemu-guest-agent - state: started - enabled: true diff --git a/AnisiblePlaybooks/ubuntu-vm-core/template.json b/AnisiblePlaybooks/ubuntu-vm-core/template.json deleted file mode 100644 index a28d14a..0000000 --- a/AnisiblePlaybooks/ubuntu-vm-core/template.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "slug": "ubuntu-vm-core", - "kind": "ansible", - "metadata": { - "name": "Install Ubuntu VM Core Packages", - "description": "Installs essential packages for Ubuntu virtual machines, including Prometheus node exporter, NFS client utilities, and QEMU guest agent.", - "tags": [], - "icon": { - "provider": "simple-icons", - "id": "ansible" - }, - "draft": false, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/ubuntu-vm-core" - } - }, - "variables": [] -} diff --git a/Docker-Compose/spark - media build b/Docker-Compose/ArrsStack/spark - media build similarity index 100% rename from Docker-Compose/spark - media build rename to Docker-Compose/ArrsStack/spark - media build diff --git a/Docker-Compose/adguardhome/files/compose.yaml b/Docker-Compose/adguardhome/files/compose.yaml deleted file mode 100644 index a507ece..0000000 --- a/Docker-Compose/adguardhome/files/compose.yaml +++ /dev/null @@ -1,112 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/adguard/adguardhome:v0.107.74 - restart: << restart_policy >> - <%- if network_mode == 'host' %> - network_mode: host - <%- elif network_mode == 'bridge' or network_mode == 'macvlan' or traefik_enabled %> - networks: - <%- if traefik_enabled %> - << traefik_network >>: - <%- endif %> - <%- if network_mode == 'macvlan' %> - << network_name >>: - ipv4_address: << network_macvlan_ipv4_address >> - <%- elif network_mode == 'bridge' %> - << network_name >>: - <%- endif %> - <%- endif %> - <%- if not network_mode or network_mode == 'bridge' or traefik_enabled %> - ports: - <%- if not traefik_enabled %> - - "<< ports_http >>:80/tcp" - - "<< ports_https >>:443/tcp" - <%- endif %> - <%- if initial_setup %> - - "<< ports_initial >>:3000/tcp" - <%- endif %> - - "<< ports_https >>:443/udp" - - "<< ports_dns >>:53/tcp" - - "<< ports_dns >>:53/udp" - - "<< ports_tls >>:853/tcp" - - "<< ports_dnscrypt >>:5443/tcp" - - "<< ports_dnscrypt >>:5443/udp" - <%- endif %> - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/work:/opt/adguardhome/work:rw - - << volume_mount_path >>/conf:/opt/adguardhome/conf:rw - <%- else %> - - << service_name >>_work:/opt/adguardhome/work - - << service_name >>_conf:/opt/adguardhome/conf - <%- endif %> - cap_add: - - NET_ADMIN - - NET_BIND_SERVICE - - NET_RAW - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=80 - - traefik.http.routers.<< service_name >>_web_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_web_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_web_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_web_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_web_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_web_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_web_https.tls=true - - traefik.http.routers.<< service_name >>_web_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -<%- if network_mode == 'bridge' or network_mode == 'macvlan' or traefik_enabled %> -networks: - <%- if network_mode == 'bridge' or network_mode == 'macvlan'%> - << network_name >>: - <%- if network_external %> - external: true - <%- else %> - <%- if network_mode == 'macvlan' %> - driver: macvlan - driver_opts: - parent: << network_macvlan_parent_interface >> - ipam: - config: - - subnet: << network_macvlan_subnet >> - gateway: << network_macvlan_gateway >> - name: << network_name >> - <%- else %> - driver: bridge - <%- endif %> - <%- endif %> - <%- endif %> - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> -<%- endif %> - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>_work: - driver: local - << service_name >>_conf: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>_work: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/work" - << service_name >>_conf: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/conf" -<%- endif %> diff --git a/Docker-Compose/adguardhome/template.json b/Docker-Compose/adguardhome/template.json deleted file mode 100644 index ae2bcc8..0000000 --- a/Docker-Compose/adguardhome/template.json +++ /dev/null @@ -1,373 +0,0 @@ -{ - "slug": "adguardhome", - "kind": "compose", - "metadata": { - "name": "AdGuard Home", - "description": "Network-wide DNS-based ad and tracker blocker. AdGuard Home operates as a DNS server that blocks tracking domains, with support for DNS-over-HTTPS, DNS-over-TLS, DNS-over-QUIC, parental controls, and safe browsing filters.", - "tags": [ - "traefik", - "network", - "volume" - ], - "icon": { - "provider": "selfhst", - "id": "adguard-home" - }, - "draft": false, - "version": { - "name": "v0.107.74", - "source_dep_name": "docker.io/adguard/adguardhome", - "source_dep_version": "v0.107.74" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "adguardhome", - "config": { - "placeholder": "adguardhome" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "initial_setup", - "type": "bool", - "title": "Initial Setup", - "required": false, - "default": true, - "description": "Enable initial setup wizard on port 3000 (only used without Traefik)" - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_mode", - "type": "str", - "title": "Network Mode", - "required": false - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "adguardhome_network", - "config": { - "placeholder": "adguardhome_network" - } - }, - { - "name": "network_macvlan_ipv4_address", - "type": "str", - "title": "IPv4 Address", - "required": true, - "default": "IP_ADDRESS", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "IP_ADDRESS" - } - }, - { - "name": "network_macvlan_parent_interface", - "type": "str", - "title": "Parent Interface", - "required": true, - "default": "eth0", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "eth0" - } - }, - { - "name": "network_macvlan_subnet", - "type": "str", - "title": "Subnet", - "required": true, - "default": "IP_RANGE", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "IP_RANGE" - } - }, - { - "name": "network_macvlan_gateway", - "type": "str", - "title": "Gateway", - "required": true, - "default": "GATEWAY", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "GATEWAY" - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 80, - "config": { - "placeholder": "80" - } - }, - { - "name": "ports_https", - "type": "str", - "title": "HTTPS Port", - "required": false, - "default": 443, - "config": { - "placeholder": "443" - } - }, - { - "name": "ports_dns", - "type": "int", - "title": "DNS Port", - "required": true, - "default": 53, - "config": { - "placeholder": "53" - } - }, - { - "name": "ports_initial", - "type": "int", - "title": "Initial Setup Port", - "required": false, - "default": 3000, - "description": "Initial setup wizard port (only when Traefik is disabled)", - "needs": [ - "traefik_enabled=false", - "initial_setup=true" - ], - "config": { - "placeholder": "3000" - } - }, - { - "name": "ports_tls", - "type": "int", - "title": "DoT Port", - "required": true, - "default": 853, - "config": { - "placeholder": "853" - } - }, - { - "name": "ports_dnscrypt", - "type": "int", - "title": "DNSCrypt Port", - "required": true, - "default": 5443, - "config": { - "placeholder": "5443" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "adguardhome" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/data", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/data" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": true, - "default": "NFS_SERVER", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "NFS_SERVER" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": true, - "default": "/export", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/export" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": true, - "default": "rw,nolock,soft", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw,nolock,soft" - } - } - ] - } - ] -} diff --git a/Docker-Compose/alloy/files/compose.yaml b/Docker-Compose/alloy/files/compose.yaml deleted file mode 100644 index 7a901a8..0000000 --- a/Docker-Compose/alloy/files/compose.yaml +++ /dev/null @@ -1,62 +0,0 @@ -services: - << service_name >>: - image: docker.io/grafana/alloy:v1.16.0 - restart: << restart_policy >> - <%- if container_hostname %> - hostname: << container_hostname >> - <%- endif %> - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - command: - - run - - /etc/alloy/alloy.d/ - - --server.http.listen-addr=127.0.0.1:12345 - <%- if not traefik_enabled %> - ports: - - "<< ports_webui >>:12345" - <%- endif %> - volumes: - - << service_name >>_data:/alloy/data - - ./config:/etc/alloy/alloy.d/:ro - <%- if logs_enabled or metrics_enabled %> - - /:/rootfs:ro - - /sys:/sys:ro - <%- endif %> - <%- if logs_enabled and logs_system %> - - /run:/run:ro - - /var/log:/var/log:ro - <%- endif %> - <%- if (logs_enabled and logs_docker) or (metrics_enabled and metrics_docker) %> - - /var/lib/docker/:/var/lib/docker/:ro - <%- endif %> - <%- if metrics_enabled and metrics_system %> - - /run/udev/data:/run/udev/data:ro - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=12345 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> - -volumes: - << service_name >>_data: - driver: local diff --git a/Docker-Compose/alloy/files/config/common.alloy b/Docker-Compose/alloy/files/config/common.alloy deleted file mode 100644 index 1592326..0000000 --- a/Docker-Compose/alloy/files/config/common.alloy +++ /dev/null @@ -1,4 +0,0 @@ -logging { - level = "info" - format = "logfmt" -} diff --git a/Docker-Compose/alloy/files/config/logs_docker.alloy b/Docker-Compose/alloy/files/config/logs_docker.alloy deleted file mode 100644 index 67bce86..0000000 --- a/Docker-Compose/alloy/files/config/logs_docker.alloy +++ /dev/null @@ -1,23 +0,0 @@ -<%- if logs_enabled and logs_docker %> -discovery.docker "dockerlogs" { - host = "unix:///var/run/docker.sock" -} - -discovery.relabel "dockerlogs" { - targets = [] - - rule { - source_labels = ["__meta_docker_container_name"] - regex = "/(.*)" - target_label = "service_name" - } -} - -loki.source.docker "default" { - host = "unix:///var/run/docker.sock" - targets = discovery.docker.dockerlogs.targets - labels = {"platform" = "docker"} - relabel_rules = discovery.relabel.dockerlogs.rules - forward_to = [loki.write.default.receiver] -} -<%- endif %> diff --git a/Docker-Compose/alloy/files/config/logs_system.alloy b/Docker-Compose/alloy/files/config/logs_system.alloy deleted file mode 100644 index 2608c3a..0000000 --- a/Docker-Compose/alloy/files/config/logs_system.alloy +++ /dev/null @@ -1,44 +0,0 @@ -<%- if logs_enabled and logs_system %> -loki.source.journal "journal" { - max_age = "24h0m0s" - relabel_rules = discovery.relabel.journal.rules - forward_to = [loki.write.default.receiver] - labels = {component = string.format("%s-journal", constants.hostname)} - // NOTE: This is important to fix https://github.com/grafana/alloy/issues/924 - path = "/var/log/journal" -} - -local.file_match "system" { - path_targets = [{ - __address__ = "localhost", - __path__ = "/var/log/{syslog,messages,*.log}", - instance = constants.hostname, - job = string.format("%s-logs", constants.hostname), - }] -} - -discovery.relabel "journal" { - targets = [] - rule { - source_labels = ["__journal__systemd_unit"] - target_label = "unit" - } - rule { - source_labels = ["__journal__boot_id"] - target_label = "boot_id" - } - rule { - source_labels = ["__journal__transport"] - target_label = "transport" - } - rule { - source_labels = ["__journal_priority_keyword"] - target_label = "level" - } -} - -loki.source.file "system" { - targets = local.file_match.system.targets - forward_to = [loki.write.default.receiver] -} -<%- endif %> diff --git a/Docker-Compose/alloy/files/config/metrics_docker.alloy b/Docker-Compose/alloy/files/config/metrics_docker.alloy deleted file mode 100644 index 6d6bcd3..0000000 --- a/Docker-Compose/alloy/files/config/metrics_docker.alloy +++ /dev/null @@ -1,23 +0,0 @@ -<%- if metrics_enabled and metrics_docker %> -prometheus.exporter.cadvisor "dockermetrics" { - docker_host = "unix:///var/run/docker.sock" - storage_duration = "5m" -} - -/* Relabel component to drop container_spec metrics that often have NaN values */ -prometheus.relabel "docker_filter" { - forward_to = [prometheus.remote_write.default.receiver] - - rule { - source_labels = ["__name__"] - regex = "container_spec_(cpu_period|cpu_quota|cpu_shares|memory_limit_bytes|memory_swap_limit_bytes|memory_reservation_limit_bytes)" - action = "drop" - } -} - -prometheus.scrape "dockermetrics" { - targets = prometheus.exporter.cadvisor.dockermetrics.targets - forward_to = [prometheus.relabel.docker_filter.receiver] - scrape_interval = "10s" -} -<%- endif %> diff --git a/Docker-Compose/alloy/files/config/metrics_system.alloy b/Docker-Compose/alloy/files/config/metrics_system.alloy deleted file mode 100644 index 9805df8..0000000 --- a/Docker-Compose/alloy/files/config/metrics_system.alloy +++ /dev/null @@ -1,36 +0,0 @@ -<%- if metrics_enabled and metrics_system %> -discovery.relabel "metrics" { - targets = prometheus.exporter.unix.metrics.targets - rule { - target_label = "instance" - replacement = constants.hostname - } - rule { - target_label = "job" - replacement = string.format("%s-metrics", constants.hostname) - } -} - -prometheus.exporter.unix "metrics" { - disable_collectors = ["ipvs", "btrfs", "infiniband", "xfs", "zfs"] - enable_collectors = ["meminfo"] - rootfs_path = "/rootfs" - filesystem { - fs_types_exclude = "^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|tmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$" - mount_points_exclude = "^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+)($|/)" - mount_timeout = "5s" - } - netclass { - ignored_devices = "^(veth.*|cali.*|[a-f0-9]{15})$" - } - netdev { - device_exclude = "^(veth.*|cali.*|[a-f0-9]{15})$" - } -} - -prometheus.scrape "metrics" { - scrape_interval = "15s" - targets = discovery.relabel.metrics.output - forward_to = [prometheus.remote_write.default.receiver] -} -<%- endif %> diff --git a/Docker-Compose/alloy/files/config/targets.alloy b/Docker-Compose/alloy/files/config/targets.alloy deleted file mode 100644 index 47dc5ae..0000000 --- a/Docker-Compose/alloy/files/config/targets.alloy +++ /dev/null @@ -1,20 +0,0 @@ -<%- if logs_enabled %> -loki.write "default" { - endpoint { - url = "<< logs_loki_url >>" - - // Batching configuration to reduce request volume and prevent rate limiting - batch_wait = "5s" // Wait up to 5 seconds before sending - batch_size = "1MiB" // Send when batch reaches 1MB (1048576 bytes) - } - external_labels = {} -} -<%- endif %> - -<%- if metrics_enabled %> -prometheus.remote_write "default" { - endpoint { - url = "<< metrics_prometheus_url >>" - } -} -<%- endif %> diff --git a/Docker-Compose/alloy/template.json b/Docker-Compose/alloy/template.json deleted file mode 100644 index ecebdc1..0000000 --- a/Docker-Compose/alloy/template.json +++ /dev/null @@ -1,239 +0,0 @@ -{ - "slug": "alloy", - "kind": "compose", - "metadata": { - "name": "Grafana Alloy", - "description": "OpenTelemetry collector by Grafana that collects, processes, and exports metrics and logs to various backends like Prometheus and Loki.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "grafana-alloy" - }, - "draft": false, - "version": { - "name": "v1.16.0", - "source_dep_name": "docker.io/grafana/alloy", - "source_dep_version": "v1.16.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "alloy", - "config": { - "placeholder": "alloy" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Hostname", - "required": false - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Container restart policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Log Collection", - "toggle": "logs_enabled", - "name": "logs", - "items": [ - { - "name": "logs_docker", - "type": "bool", - "title": "Docker Logs", - "required": false, - "default": true - }, - { - "name": "logs_enabled", - "type": "bool", - "title": "Logs", - "required": false, - "default": false - }, - { - "name": "logs_loki_url", - "type": "str", - "title": "Loki URL", - "required": true, - "default": "http://loki:3100/loki/api/v1/push", - "description": "Loki endpoint URL for sending logs", - "config": { - "placeholder": "http://loki:3100/loki/api/v1/push" - } - }, - { - "name": "logs_system", - "type": "bool", - "title": "System Logs", - "required": false, - "default": true - } - ] - }, - { - "title": "Metrics Collection", - "toggle": "metrics_enabled", - "name": "metrics", - "items": [ - { - "name": "metrics_docker", - "type": "bool", - "title": "Docker Metrics", - "required": false, - "default": true - }, - { - "name": "metrics_enabled", - "type": "bool", - "title": "Metrics", - "required": false, - "default": false - }, - { - "name": "metrics_prometheus_url", - "type": "str", - "title": "Prometheus URL", - "required": true, - "default": "http://prometheus:9090/api/v1/write", - "config": { - "placeholder": "http://prometheus:9090/api/v1/write" - } - }, - { - "name": "metrics_system", - "type": "bool", - "title": "System Metrics", - "required": false, - "default": true - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_webui", - "type": "int", - "title": "Web UI Port", - "required": false, - "default": 12345, - "description": "Port for Alloy web UI", - "config": { - "placeholder": "12345" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "alloy" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Traefik network name", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": true - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/arcane-agent/files/.env b/Docker-Compose/arcane-agent/files/.env deleted file mode 100644 index 5844b52..0000000 --- a/Docker-Compose/arcane-agent/files/.env +++ /dev/null @@ -1,2 +0,0 @@ -# Arcane agent token generated by Arcane when creating a remote environment. -ARCANE_AGENT_TOKEN='<< agent_token >>' diff --git a/Docker-Compose/arcane-agent/files/compose.yaml b/Docker-Compose/arcane-agent/files/compose.yaml deleted file mode 100644 index dd5fe4b..0000000 --- a/Docker-Compose/arcane-agent/files/compose.yaml +++ /dev/null @@ -1,46 +0,0 @@ ---- -services: - << service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane-agent' >>: - image: ghcr.io/getarcaneapp/agent:v2.1.0 - restart: << restart_policy >> - <%- if container_name is string and container_name and (container_name | lower) not in ['true', 'false'] %> - container_name: << container_name >> - <%- endif %> - environment: - <%- if connection_mode == 'direct' %> - AGENT_MODE: "true" - <%- elif connection_mode == 'edge' %> - EDGE_AGENT: "true" - <%- endif %> - EDGE_TRANSPORT: "<< edge_transport >>" - AGENT_TOKEN: "${ARCANE_AGENT_TOKEN}" - MANAGER_API_URL: "<< manager_api_url >>" - TZ: "<< container_timezone >>" - volumes: - - << docker_socket_path >>:/var/run/docker.sock - <%- if volume_mode == 'mount' and volume_mount_path %> - - << volume_mount_path >>:/app/data - <%- else %> - - << service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane-agent' >>-data:/app/data - <%- endif %> - <%- if project_mount_path %> - - << project_mount_path >>:/app/data/projects - <%- endif %> - <%- if connection_mode == 'direct' %> - ports: - - "<< ports_agent >>:3553" - <%- endif %> - -<%- if volume_mode == 'local' or (volume_mode == 'mount' and not volume_mount_path) %> -volumes: - << service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane-agent' >>-data: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane-agent' >>-data: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>" -<%- endif %> diff --git a/Docker-Compose/arcane-agent/template.json b/Docker-Compose/arcane-agent/template.json deleted file mode 100644 index b59dda4..0000000 --- a/Docker-Compose/arcane-agent/template.json +++ /dev/null @@ -1,247 +0,0 @@ -{ - "slug": "arcane-agent", - "kind": "compose", - "metadata": { - "name": "Arcane Agent", - "description": "Remote Docker host agent for Arcane manager environments, supporting direct inbound and edge outbound connection modes.", - "tags": [ - "docker", - "management", - "agent" - ], - "icon": { - "provider": "selfhst", - "id": "arcane", - "color": "violet" - }, - "draft": false, - "version": { - "name": "v2.1.0", - "source_dep_name": "ghcr.io/getarcaneapp/agent", - "source_dep_version": "v2.1.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "description": "Name of the Docker Compose service. Leave empty to omit/fall back to Arcane defaults.", - "config": { - "placeholder": "arcane-agent" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "description": "Name to use for the container. Leave empty to omit/fall back to Arcane defaults.", - "config": { - "placeholder": "arcane-agent" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "docker_socket_path", - "type": "str", - "title": "Docker Socket Path", - "required": true, - "default": "/var/run/docker.sock", - "config": { - "placeholder": "/var/run/docker.sock" - } - } - ] - }, - { - "title": "Advanced", - "name": "advanced", - "items": [ - { - "name": "project_mount_path", - "type": "str", - "title": "Project Mount Path", - "required": false, - "description": "Optional host path mounted to /app/data/projects for agent-visible project/Compose stack storage. Leave empty to skip this mount.", - "config": { - "placeholder": "/path/to/projects" - } - } - ] - }, - { - "title": "Agent Connection", - "name": "connection", - "items": [ - { - "name": "connection_mode", - "type": "enum", - "title": "Connection Mode", - "required": false, - "default": "direct", - "description": "Direct exposes TCP 3553 for the manager to connect inbound. Edge connects outbound from the agent to the manager.", - "config": { - "options": [ - "direct", - "edge" - ] - } - }, - { - "name": "edge_transport", - "type": "enum", - "title": "Transport Mode", - "required": false, - "default": "poll", - "description": "Arcane agent transport. Official generated snippets default to poll; auto keeps a live tunnel when possible.", - "config": { - "options": [ - "poll", - "auto" - ] - } - }, - { - "name": "manager_api_url", - "type": "str", - "title": "Manager API URL", - "required": true, - "default": "http://arcane:3552", - "description": "Arcane manager API URL reachable from the agent.", - "config": { - "placeholder": "https://arcane.example.com" - } - }, - { - "name": "agent_token", - "type": "secret", - "title": "Agent Token", - "required": true, - "description": "Agent token generated by Arcane when creating the remote environment." - } - ] - }, - { - "title": "Storage", - "name": "storage", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": false, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Data Mount Path", - "required": false, - "default": "", - "description": "Host path for agent data when using mount mode.", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/opt/arcane-agent/data" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "NFS Server", - "required": false, - "default": "", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "nas.home.arpa" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "NFS Path", - "required": false, - "default": "", - "description": "NFS export path for Arcane agent data.", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/export/app" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "NFS Options", - "required": false, - "default": "rw", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_agent", - "type": "int", - "title": "Agent Port", - "required": false, - "default": 3553, - "needs": [ - "connection_mode=direct" - ], - "config": { - "placeholder": "3553" - } - } - ] - } - ] -} diff --git a/Docker-Compose/arcane/files/.env b/Docker-Compose/arcane/files/.env deleted file mode 100644 index 4e6c7ce..0000000 --- a/Docker-Compose/arcane/files/.env +++ /dev/null @@ -1,7 +0,0 @@ -# Arcane manager secrets -# ENCRYPTION_KEY must be 32 bytes. For a hex value, use: openssl rand -hex 32 -ARCANE_ENCRYPTION_KEY='<< encryption_key >>' -ARCANE_JWT_SECRET='<< jwt_secret >>' -<%- if oidc_enabled %> -ARCANE_OIDC_CLIENT_SECRET='<< oidc_client_secret >>' -<%- endif %> diff --git a/Docker-Compose/arcane/files/compose.yaml b/Docker-Compose/arcane/files/compose.yaml deleted file mode 100644 index eb5d170..0000000 --- a/Docker-Compose/arcane/files/compose.yaml +++ /dev/null @@ -1,100 +0,0 @@ ---- -services: - << service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>: - image: ghcr.io/getarcaneapp/manager:v2.1.0 - restart: << restart_policy >> - <%- if container_name is string and container_name and (container_name | lower) not in ['true', 'false'] %> - container_name: << container_name >> - <%- endif %> - environment: - APP_URL: "<< app_url >>" - <%- if puid %> - PUID: "<< puid >>" - <%- endif %> - <%- if pgid %> - PGID: "<< pgid >>" - <%- endif %> - ENCRYPTION_KEY: "${ARCANE_ENCRYPTION_KEY}" - JWT_SECRET: "${ARCANE_JWT_SECRET}" - TZ: "<< container_timezone >>" - <%- if analytics_enabled %> - ANALYTICS_DISABLED: "false" - <%- endif %> - <%- if oidc_enabled %> - OIDC_ENABLED: "true" - OIDC_CLIENT_ID: "<< oidc_client_id >>" - OIDC_CLIENT_SECRET: "${ARCANE_OIDC_CLIENT_SECRET}" - OIDC_ISSUER_URL: "<< oidc_issuer_url >>" - <%- if oidc_provider_name %> - OIDC_PROVIDER_NAME: "<< oidc_provider_name >>" - <%- endif %> - <%- if oidc_scopes %> - OIDC_SCOPES: "<< oidc_scopes >>" - <%- endif %> - <%- if oidc_groups_claim %> - OIDC_GROUPS_CLAIM: "<< oidc_groups_claim >>" - <%- endif %> - <%- if oidc_role_mappings %> - OIDC_ROLE_MAPPINGS: '<< oidc_role_mappings >>' - <%- endif %> - <%- endif %> - volumes: - - << docker_socket_path >>:/var/run/docker.sock - <%- if volume_mode == 'mount' and volume_mount_path %> - - << volume_mount_path >>:/app/data - <%- else %> - - << service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-data:/app/data - <%- endif %> - <%- if project_mount_path %> - - << project_mount_path >>:/app/data/projects - <%- endif %> - <%- if builds_mount_path %> - - << builds_mount_path >>:/builds - <%- endif %> - <%- if backups_mount_path %> - - << backups_mount_path >>:/backups - <%- endif %> - <%- if traefik_enabled %> - networks: - - << traefik_network >> - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:3552" - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-web.loadBalancer.server.port=3552 - - traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-http.service=<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-web - - traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-https.service=<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-web - - traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-https.tls=true - - traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -<%- if volume_mode == 'local' or (volume_mode == 'mount' and not volume_mount_path) %> -volumes: - << service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-data: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-data: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>" -<%- endif %> - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/arcane/template.json b/Docker-Compose/arcane/template.json deleted file mode 100644 index 843d9fe..0000000 --- a/Docker-Compose/arcane/template.json +++ /dev/null @@ -1,451 +0,0 @@ -{ - "slug": "arcane", - "kind": "compose", - "metadata": { - "name": "Arcane", - "description": "Modern self-hosted Docker management UI for containers, images, volumes, networks, Docker Compose projects, and remote environments.", - "tags": [ - "docker", - "management", - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "arcane", - "color": "violet" - }, - "draft": false, - "version": { - "name": "v2.1.0", - "source_dep_name": "ghcr.io/getarcaneapp/manager", - "source_dep_version": "v2.1.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "config": { - "placeholder": "arcane" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "config": { - "placeholder": "arcane" - } - }, - { - "name": "app_url", - "type": "str", - "title": "Application URL", - "required": true, - "default": "http://localhost:3552", - "config": { - "placeholder": "https://arcane.example.com" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "puid", - "type": "int", - "title": "PUID", - "required": false, - "config": { - "placeholder": "1000" - } - }, - { - "name": "pgid", - "type": "int", - "title": "PGID", - "required": false, - "config": { - "placeholder": "1000" - } - }, - { - "name": "docker_socket_path", - "type": "str", - "title": "Docker Socket Path", - "required": true, - "default": "/var/run/docker.sock", - "config": { - "placeholder": "/var/run/docker.sock" - } - }, - { - "name": "analytics_enabled", - "type": "bool", - "title": "Enable Analytics", - "required": false - } - ] - }, - { - "title": "Advanced", - "name": "advanced", - "items": [ - { - "name": "project_mount_path", - "type": "str", - "title": "Project Mount Path", - "required": false, - "description": "Optional host path mounted to /app/data/projects for Arcane project/Compose stack storage. Leave empty to skip this mount.", - "config": { - "placeholder": "/path/to/projects" - } - }, - { - "name": "builds_mount_path", - "type": "str", - "title": "Builds Mount Path", - "required": false, - "description": "Optional host path mounted to /builds for Arcane build workspace files. Leave empty to skip this mount.", - "config": { - "placeholder": "/path/to/builds" - } - }, - { - "name": "backups_mount_path", - "type": "str", - "title": "Backups Mount Path", - "required": false, - "description": "Optional host path mounted to /backups for Arcane volume backups. Leave empty to skip this mount.", - "config": { - "placeholder": "/path/to/backups" - } - } - ] - }, - { - "title": "Secrets", - "name": "secrets", - "items": [ - { - "name": "encryption_key", - "type": "secret", - "title": "Encryption Key", - "required": true, - "description": "Arcane ENCRYPTION_KEY. It must be 32 bytes; a 64-character hex value from `openssl rand -hex 32` is recommended.", - "config": { - "autogenerated": { - "length": 64 - } - } - }, - { - "name": "jwt_secret", - "type": "secret", - "title": "JWT Secret", - "required": true, - "config": { - "autogenerated": { - "length": 64 - } - } - } - ] - }, - { - "title": "Storage", - "name": "storage", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": false, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Data Mount Path", - "required": false, - "default": "", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/opt/arcane/data" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "NFS Server", - "required": false, - "default": "", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "nas.home.arpa" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "NFS Path", - "required": false, - "default": "", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/export/app" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "NFS Options", - "required": false, - "default": "rw", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "arcane" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "needs": [ - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "needs": [ - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "cloudflare" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 3552, - "needs": [ - "traefik_enabled=false" - ], - "config": { - "placeholder": "3552" - } - } - ] - }, - { - "title": "OIDC Single Sign-On", - "name": "oidc", - "toggle": "oidc_enabled", - "items": [ - { - "name": "oidc_enabled", - "type": "bool", - "title": "OIDC", - "required": false, - "default": false - }, - { - "name": "oidc_client_id", - "type": "str", - "title": "Client ID", - "required": true, - "needs": [ - "oidc_enabled=true" - ] - }, - { - "name": "oidc_client_secret", - "type": "secret", - "title": "Client Secret", - "required": true, - "needs": [ - "oidc_enabled=true" - ] - }, - { - "name": "oidc_issuer_url", - "type": "str", - "title": "Issuer URL", - "required": true, - "description": "Issuer URL of your OIDC provider. Arcane's docs recommend no trailing slash.", - "needs": [ - "oidc_enabled=true" - ], - "config": { - "placeholder": "https://auth.example.com/application/o/arcane" - } - }, - { - "name": "oidc_provider_name", - "type": "str", - "title": "Provider Name", - "required": false, - "needs": [ - "oidc_enabled=true" - ], - "config": { - "placeholder": "My Identity Provider" - } - }, - { - "name": "oidc_scopes", - "type": "str", - "title": "Scopes", - "required": false, - "description": "Optional OIDC scopes to request. Arcane defaults to openid email profile if unset; include your groups scope when using group mappings.", - "needs": [ - "oidc_enabled=true" - ], - "config": { - "placeholder": "openid email profile groups" - } - }, - { - "name": "oidc_groups_claim", - "type": "str", - "title": "Groups Claim", - "required": false, - "needs": [ - "oidc_enabled=true" - ], - "config": { - "placeholder": "groups" - } - }, - { - "name": "oidc_role_mappings", - "type": "str", - "title": "Role Mappings", - "required": false, - "description": "Optional JSON array for OIDC group-to-role mappings, for example [{\"claimValue\":\"docker-admins\",\"roleId\":\"role_admin\"}].", - "needs": [ - "oidc_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/authentik/files/.env b/Docker-Compose/authentik/files/.env deleted file mode 100644 index 9863ca8..0000000 --- a/Docker-Compose/authentik/files/.env +++ /dev/null @@ -1,10 +0,0 @@ -AUTHENTIK_SECRET_KEY='<< authentik_secret_key >>' -DATABASE_USER='<< database_user >>' -DATABASE_PASSWORD='<< database_password >>' -<%- if email_enabled %> -EMAIL_USERNAME='<< email_username >>' -EMAIL_PASSWORD='<< email_password >>' -<%- endif %> -<%- if authentik_admin_password %> -AUTHENTIK_BOOTSTRAP_PASSWORD='<< authentik_admin_password >>' -<%- endif %> diff --git a/Docker-Compose/authentik/files/compose.yaml b/Docker-Compose/authentik/files/compose.yaml deleted file mode 100644 index 8245155..0000000 --- a/Docker-Compose/authentik/files/compose.yaml +++ /dev/null @@ -1,210 +0,0 @@ ---- -services: - << service_name >>: - image: ghcr.io/goauthentik/server:2026.2.2 - restart: << restart_policy >> - command: server - environment: - - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY} - - AUTHENTIK_ERROR_REPORTING__ENABLED=<< authentik_error_reporting | lower >> - <%- if database_external %> - - AUTHENTIK_POSTGRESQL__HOST=<< database_host >> - - AUTHENTIK_POSTGRESQL__PORT=<< database_port >> - <%- else %> - - AUTHENTIK_POSTGRESQL__HOST=<< service_name >>_postgres - - AUTHENTIK_POSTGRESQL__PORT=5432 - <%- endif %> - - AUTHENTIK_POSTGRESQL__USER=${DATABASE_USER} - - AUTHENTIK_POSTGRESQL__NAME=<< database_name >> - - AUTHENTIK_POSTGRESQL__PASSWORD=${DATABASE_PASSWORD} - <%- if email_enabled %> - - AUTHENTIK_EMAIL__HOST=<< email_host >> - - AUTHENTIK_EMAIL__PORT=<< email_port >> - - AUTHENTIK_EMAIL__FROM=<< email_from >> - - AUTHENTIK_EMAIL__USERNAME=${EMAIL_USERNAME} - - AUTHENTIK_EMAIL__PASSWORD=${EMAIL_PASSWORD} - <%- if email_encryption == "ssl" %> - - AUTHENTIK_EMAIL__USE_SSL=True - <%- elif email_encryption == "starttls" %> - - AUTHENTIK_EMAIL__USE_TLS=True - <%- endif %> - <%- endif %> - networks: - <%- if traefik_enabled %> - - << traefik_network >> - <%- endif %> - - << service_name >>_backend - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:9000" - - "<< ports_https >>:9443" - <%- endif %> - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/data:/data - - << volume_mount_path >>/templates:/templates - <%- elif volume_mode == 'local' or volume_mode == 'nfs' %> - - << service_name >>_data:/data - - << service_name >>_templates:/templates - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=9000 - - traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >> - - "traefik.http.middlewares.authentik.forwardauth.address=\ - http://<< service_name >>:9000/outpost.goauthentik.io/auth/traefik" - - "traefik.http.middlewares.authentik.forwardauth.trustForwardHeader=true" - - "traefik.http.middlewares.authentik.forwardauth.authResponseHeaders=\ - X-authentik-username,\ - X-authentik-groups,\ - X-authentik-entitlements,\ - X-authentik-email,\ - X-authentik-name,\ - X-authentik-uid,\ - X-authentik-jwt,\ - X-authentik-meta-jwks,\ - X-authentik-meta-outpost,\ - X-authentik-meta-provider,\ - X-authentik-meta-app,\ - X-authentik-meta-version" - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_https.tls=true - - traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - <%- if not database_external %> - depends_on: - - << service_name >>_postgres - <%- endif %> - - << service_name >>_worker: - image: ghcr.io/goauthentik/server:2026.2.2 - restart: << restart_policy >> - command: worker - environment: - - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY} - - AUTHENTIK_ERROR_REPORTING__ENABLED=<< authentik_error_reporting | lower >> - <%- if database_external %> - - AUTHENTIK_POSTGRESQL__HOST=<< database_host >> - - AUTHENTIK_POSTGRESQL__PORT=<< database_port >> - <%- else %> - - AUTHENTIK_POSTGRESQL__HOST=<< service_name >>_postgres - - AUTHENTIK_POSTGRESQL__PORT=5432 - <%- endif %> - - AUTHENTIK_POSTGRESQL__USER=${DATABASE_USER} - - AUTHENTIK_POSTGRESQL__NAME=<< database_name >> - - AUTHENTIK_POSTGRESQL__PASSWORD=${DATABASE_PASSWORD} - <%- if email_enabled %> - - AUTHENTIK_EMAIL__HOST=<< email_host >> - - AUTHENTIK_EMAIL__PORT=<< email_port >> - - AUTHENTIK_EMAIL__FROM=<< email_from >> - - AUTHENTIK_EMAIL__USERNAME=${EMAIL_USERNAME} - - AUTHENTIK_EMAIL__PASSWORD=${EMAIL_PASSWORD} - <%- if email_encryption == "ssl" %> - - AUTHENTIK_EMAIL__USE_SSL=True - <%- elif email_encryption == "starttls" %> - - AUTHENTIK_EMAIL__USE_TLS=True - <%- endif %> - <%- endif %> - <%- if authentik_admin_password %> - - AUTHENTIK_BOOTSTRAP_PASSWORD=${AUTHENTIK_BOOTSTRAP_PASSWORD} - <%- endif %> - user: root - networks: - - << service_name >>_backend - volumes: - - /run/docker.sock:/run/docker.sock - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/data:/data - - << volume_mount_path >>/certs:/certs - - << volume_mount_path >>/templates:/templates - <%- elif volume_mode == 'local' or volume_mode == 'nfs' %> - - << service_name >>_data:/data - - << service_name >>_certs:/certs - - << service_name >>_templates:/templates - <%- endif %> - <%- if not database_external %> - depends_on: - - << service_name >>_postgres - <%- endif %> - - <%- if not database_external %> - << service_name >>_postgres: - image: docker.io/library/postgres:17.9 - restart: << restart_policy >> - environment: - - POSTGRES_USER=${DATABASE_USER} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=<< database_name >> - healthcheck: - test: ["CMD-SHELL", "pg_isready -U << database_user >>"] - start_period: 30s - interval: 10s - timeout: 10s - retries: 5 - networks: - - << service_name >>_backend - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/postgres:/var/lib/postgresql/data - <%- elif volume_mode == 'local' or volume_mode == 'nfs' %> - - << service_name >>_postgres:/var/lib/postgresql/data - <%- endif %> - <%- endif %> - -networks: - << service_name >>_backend: - driver: bridge - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> - -<%- if volume_mode == 'local' %> -volumes: - <%- if not database_external %> - << service_name >>_postgres: - driver: local - <%- endif %> - << service_name >>_data: - driver: local - << service_name >>_certs: - driver: local - << service_name >>_templates: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - <%- if not database_external %> - << service_name >>_postgres: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/postgres" - <%- endif %> - << service_name >>_data: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/data" - << service_name >>_certs: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/certs" - << service_name >>_templates: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/templates" -<%- endif %> diff --git a/Docker-Compose/authentik/template.json b/Docker-Compose/authentik/template.json deleted file mode 100644 index 7afd0fe..0000000 --- a/Docker-Compose/authentik/template.json +++ /dev/null @@ -1,402 +0,0 @@ -{ - "slug": "authentik-compose", - "kind": "compose", - "metadata": { - "name": "Authentik", - "description": "Open-source Identity Provider (IdP) that supports OAuth2, SAML, LDAP, and SCIM for single sign-on and user authentication across your applications.", - "tags": [ - "traefik", - "volume" - ], - "icon": { - "provider": "selfhst", - "id": "authentik", - "color": "default" - }, - "draft": false, - "version": { - "name": "2026.2.2" - } - }, - "variables": [ - { - "name": "general", - "title": "General", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "authentik", - "config": { - "placeholder": "authentik" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "name": "database", - "title": "Database", - "items": [ - { - "name": "database_password", - "type": "secret", - "title": "Database password", - "required": true, - "config": { - "autogenerated": {} - } - }, - { - "name": "database_user", - "type": "str", - "title": "The database user", - "required": false, - "default": "authentik", - "config": { - "placeholder": "authentik" - } - }, - { - "name": "database_name", - "type": "str", - "title": "The database name", - "required": false, - "default": "authentik", - "config": { - "placeholder": "authentik" - } - }, - { - "name": "database_external", - "type": "bool", - "title": "External Database", - "required": false, - "default": false - }, - { - "name": "database_host", - "type": "str", - "title": "External database host", - "required": false, - "default": "", - "needs": [ - "database_external=true" - ], - "config": { - "placeholder": "postgres.home.arpa" - } - }, - { - "name": "database_port", - "type": "int", - "title": "External database port", - "required": false, - "default": 5432, - "config": { - "placeholder": "5432" - }, - "needs": [ - "database_external=true" - ] - } - ] - }, - { - "name": "ports", - "title": "Ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 8000, - "config": { - "placeholder": "8000" - } - }, - { - "name": "ports_https", - "type": "str", - "title": "HTTPS Port", - "required": false, - "default": 8443, - "config": { - "placeholder": "8443" - } - } - ] - }, - { - "name": "traefik", - "title": "Traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "authentik" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "name": "authentik", - "title": "Authentik", - "items": [ - { - "name": "authentik_secret_key", - "type": "secret", - "title": "Secret Key", - "required": true, - "config": { - "autogenerated": {} - } - }, - { - "name": "authentik_admin_password", - "type": "secret", - "title": "Admin Password", - "required": false, - "config": { - "autogenerated": {} - } - }, - { - "name": "authentik_error_reporting", - "type": "bool", - "title": "Error Reporting", - "required": false - } - ] - }, - { - "name": "volume", - "title": "Volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/data", - "config": { - "placeholder": "/data" - }, - "needs": [ - "volume_mode=mount" - ] - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": true, - "default": "NFS_SERVER", - "config": { - "placeholder": "NFS_SERVER" - }, - "needs": [ - "volume_mode=nfs" - ] - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": true, - "default": "/export", - "config": { - "placeholder": "/export" - }, - "needs": [ - "volume_mode=nfs" - ] - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": true, - "default": "rw,nolock,soft", - "config": { - "placeholder": "rw,nolock,soft" - }, - "needs": [ - "volume_mode=nfs" - ] - } - ] - }, - { - "name": "email", - "title": "Email", - "toggle": "email_enabled", - "items": [ - { - "name": "email_host", - "type": "str", - "title": "SMTP server hostname", - "required": true, - "config": { - "placeholder": "smtp.home.arpa" - } - }, - { - "name": "email_port", - "type": "int", - "title": "SMTP server port", - "required": true, - "default": 25, - "config": { - "placeholder": "25" - } - }, - { - "name": "email_username", - "type": "str", - "title": "SMTP username", - "required": true, - "config": { - "placeholder": "user@example.com" - } - }, - { - "name": "email_password", - "type": "secret", - "title": "SMTP password", - "required": true - }, - { - "name": "email_from", - "type": "str", - "title": "From email address", - "required": true, - "config": { - "placeholder": "noreply@example.com" - } - }, - { - "name": "email_enabled", - "type": "bool", - "title": "Email", - "required": false, - "default": false - }, - { - "name": "email_encryption", - "type": "str", - "title": "Encryption", - "required": false, - "default": "tls", - "config": { - "placeholder": "tls" - } - } - ] - } - ] -} diff --git a/Docker-Compose/bind9/files/compose.yaml b/Docker-Compose/bind9/files/compose.yaml deleted file mode 100644 index fd69046..0000000 --- a/Docker-Compose/bind9/files/compose.yaml +++ /dev/null @@ -1,87 +0,0 @@ -services: - << service_name >>: - image: docker.io/ubuntu/bind9:9.20-24.10_edge - restart: << restart_policy >> - <%- if container_hostname %> - hostname: << container_hostname >> - <%- endif %> - environment: - - TZ=<< container_timezone >> - - BIND9_USER=bind - <%- if network_mode == 'host' %> - network_mode: host - <%- elif network_mode == 'bridge' or network_mode == 'macvlan' %> - networks: - <%- if network_mode == 'macvlan' %> - << network_name >>: - ipv4_address: << network_macvlan_ipv4_address >> - <%- elif network_mode == 'bridge' %> - << network_name >>: - <%- endif %> - <%- endif %> - <%- if network_mode == '' or network_mode == 'bridge' %> - ports: - - "53:53/tcp" - - "53:53/udp" - <%- endif %> - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/config:/etc/bind:rw - - << volume_mount_path >>/zones:/var/lib/bind:rw - - << volume_mount_path >>/cache:/var/cache/bind:rw - <%- else %> - - << service_name >>_config:/etc/bind - - << service_name >>_zones:/var/lib/bind - - << service_name >>_cache:/var/cache/bind - <%- endif %> - -<%- if network_mode == 'bridge' or network_mode == 'macvlan' %> -networks: - << network_name >>: - <%- if network_external %> - external: true - <%- else %> - <%- if network_mode == 'macvlan' %> - driver: macvlan - driver_opts: - parent: << network_macvlan_parent_interface >> - ipam: - config: - - subnet: << network_macvlan_subnet >> - gateway: << network_macvlan_gateway >> - name: << network_name >> - <%- elif network_mode == 'bridge' %> - driver: bridge - <%- endif %> - <%- endif %> -<%- endif %> - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>_config: - driver: local - << service_name >>_zones: - driver: local - << service_name >>_cache: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>_config: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/config" - << service_name >>_zones: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/zones" - << service_name >>_cache: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/cache" -<%- endif %> diff --git a/Docker-Compose/bind9/files/config/named.conf b/Docker-Compose/bind9/files/config/named.conf deleted file mode 100644 index 5a8f3a5..0000000 --- a/Docker-Compose/bind9/files/config/named.conf +++ /dev/null @@ -1,67 +0,0 @@ -// BIND9 Main Configuration File -// Documentation: https://bind9.readthedocs.io/ - -<%- if tsig_enabled %> -include "/etc/bind/tsig.key"; -<%- endif %> - -acl "trusted" { - 127.0.0.1; - ::1; - 10.0.0.0/8; - 172.16.0.0/12; - 192.168.0.0/16; -}; - -options { - directory "/var/cache/bind"; - - // DNS forwarders for recursive queries - forwarders { - 1.1.1.1; - 8.8.8.8; - }; - - // Allow recursion from trusted networks only - allow-recursion { trusted; }; - - // Allow queries from any (adjust as needed) - allow-query { any; }; - - // Disable zone transfers by default (enable per-zone with TSIG) - allow-transfer { none; }; - - // DNSSEC validation - dnssec-validation auto; - - // Listen on all interfaces - listen-on { any; }; - listen-on-v6 { any; }; - - // Disable query logging (enable for debugging) - // querylog yes; -}; - -// Local zones -zone "localhost" { - type master; - file "/etc/bind/db.local"; -}; - -zone "127.in-addr.arpa" { - type master; - file "/etc/bind/db.127"; -}; - -zone "0.in-addr.arpa" { - type master; - file "/etc/bind/db.0"; -}; - -zone "255.in-addr.arpa" { - type master; - file "/etc/bind/db.255"; -}; - -// Include your custom zones -include "/etc/bind/named.conf.zones"; diff --git a/Docker-Compose/bind9/files/config/named.conf.zones b/Docker-Compose/bind9/files/config/named.conf.zones deleted file mode 100644 index 4bd0031..0000000 --- a/Docker-Compose/bind9/files/config/named.conf.zones +++ /dev/null @@ -1,14 +0,0 @@ -zone "<< domain_name >>" { - type master; - file "/var/lib/bind/db.primary.zone"; - - <%- if tsig_enabled %> - allow-transfer { key "tsig-transfer-key"; }; - allow-update { key "tsig-transfer-key"; }; - <%- endif %> - - <%- if dnssec_enabled %> - dnssec-policy default; - inline-signing yes; - <%- endif %> -}; diff --git a/Docker-Compose/bind9/files/config/tsig.key b/Docker-Compose/bind9/files/config/tsig.key deleted file mode 100644 index 5acdf96..0000000 --- a/Docker-Compose/bind9/files/config/tsig.key +++ /dev/null @@ -1,6 +0,0 @@ -<%- if tsig_enabled %> -key "tsig-transfer-key" { - algorithm hmac-sha256; - secret "<< tsig_key_secret >>"; -}; -<%- endif %> diff --git a/Docker-Compose/bind9/files/zones/db.primary.zone b/Docker-Compose/bind9/files/zones/db.primary.zone deleted file mode 100644 index 0436367..0000000 --- a/Docker-Compose/bind9/files/zones/db.primary.zone +++ /dev/null @@ -1,11 +0,0 @@ -$TTL 86400 -@ IN SOA ns1.<< domain_name >>. admin.<< domain_name >>. ( - 2026010101 ; serial - 3600 ; refresh - 900 ; retry - 604800 ; expire - 86400 ; minimum -) - -@ IN NS ns1.<< domain_name >>. -ns1 IN A 127.0.0.1 diff --git a/Docker-Compose/bind9/template.json b/Docker-Compose/bind9/template.json deleted file mode 100644 index 346573a..0000000 --- a/Docker-Compose/bind9/template.json +++ /dev/null @@ -1,262 +0,0 @@ -{ - "slug": "bind9", - "kind": "compose", - "metadata": { - "name": "BIND9", - "description": "The most widely used authoritative and recursive DNS server. This template includes example zones, TSIG authentication for secure zone transfers, and DNSSEC support.", - "tags": [ - "network", - "volume" - ], - "icon": { - "provider": "selfhst", - "id": "bind-9" - }, - "draft": false, - "version": { - "name": "9.20-24.10_edge", - "source_dep_name": "docker.io/ubuntu/bind9", - "source_dep_version": "9.20-24.10_edge" - } - }, - "variables": [ - { - "title": "dns_security", - "name": "dns-security", - "items": [ - { - "name": "dnssec_enabled", - "type": "bool", - "title": "DNSSEC", - "required": false - } - ] - }, - { - "title": "dns_zone", - "name": "dns-zone", - "items": [ - { - "name": "domain_name", - "type": "str", - "title": "Primary domain name", - "required": false, - "default": "home.arpa", - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "tsig_enabled", - "type": "bool", - "title": "TSIG", - "required": false - }, - { - "name": "tsig_key_secret", - "type": "secret", - "title": "TSIG key secret", - "required": false, - "needs": [ - "tsig_enabled=true" - ], - "config": { - "autogenerated": { - "kind": "base64", - "bytes": 32 - } - } - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/data", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/data" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": true, - "default": "NFS_SERVER", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "NFS_SERVER" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": true, - "default": "/export", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/export" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": true, - "default": "rw,nolock,soft", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw,nolock,soft" - } - } - ] - }, - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "bind9", - "config": { - "placeholder": "bind9" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "network_mode", - "type": "enum", - "title": "Network mode", - "required": false, - "default": "bridge", - "config": { - "options": [ - "bridge", - "macvlan", - "host" - ] - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - }, - { - "name": "network_macvlan_parent_interface", - "type": "str", - "title": "Parent Interface", - "required": false, - "default": "", - "config": { - "placeholder": "eth0" - } - }, - { - "name": "network_macvlan_gateway", - "type": "str", - "title": "Gateway", - "required": false, - "default": "", - "config": { - "placeholder": "10.20.0.1" - } - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "bind9_network", - "config": { - "placeholder": "bind9_network" - } - }, - { - "name": "network_macvlan_subnet", - "type": "str", - "title": "Subnet", - "required": false, - "default": "", - "config": { - "placeholder": "10.20.0.0/16" - } - }, - { - "name": "network_macvlan_ipv4_address", - "type": "str", - "title": "IPv4 Address", - "required": false, - "default": "", - "config": { - "placeholder": "10.20.1.50" - } - } - ] - } - ] -} diff --git a/Docker-Compose/caddy/files/Caddyfile b/Docker-Compose/caddy/files/Caddyfile deleted file mode 100644 index 19dbfd8..0000000 --- a/Docker-Compose/caddy/files/Caddyfile +++ /dev/null @@ -1,7 +0,0 @@ -<%- if tls_enabled and tls_email %> -{ - email << tls_email >> -} - -<%- endif %> -import /etc/caddy/config/*.caddy diff --git a/Docker-Compose/caddy/files/compose.yaml b/Docker-Compose/caddy/files/compose.yaml deleted file mode 100644 index c76017a..0000000 --- a/Docker-Compose/caddy/files/compose.yaml +++ /dev/null @@ -1,47 +0,0 @@ -services: - << service_name >>: - image: docker.io/library/caddy:2.11.2-alpine - restart: << restart_policy >> - <%- if container_timezone %> - environment: - - TZ=<< container_timezone >> - <%- endif %> - ports: - - "<< ports_http >>:80" - - "<< ports_https >>:443" - - "<< ports_https >>:443/udp" - volumes: - - ./Caddyfile:/etc/caddy/Caddyfile:ro - - ./config:/etc/caddy/config:ro - <%- if webserver_enabled %> - <%- if webserver_content_type == 'mount' %> - - << webserver_content_mount_path >>:/srv:ro - <%- elif webserver_content_type == 'nfs' %> - - caddy_site:/srv:ro - <%- endif %> - <%- endif %> - - caddy_data:/data - - caddy_config:/config - networks: - - << docker_network >> - -networks: - << docker_network >>: - <%- if docker_network_external %> - external: true - <%- else %> - driver: bridge - name: << docker_network >> - <%- endif %> - -volumes: -<%- if webserver_enabled and webserver_content_type == 'nfs' %> - caddy_site: - driver: local - driver_opts: - type: nfs - o: addr=<< webserver_content_nfs_server >>,nfsvers=4,<< webserver_content_nfs_options >> - device: ":<< webserver_content_nfs_path >>" -<%- endif %> - caddy_data: - caddy_config: diff --git a/Docker-Compose/caddy/files/config/webserver.caddy b/Docker-Compose/caddy/files/config/webserver.caddy deleted file mode 100644 index 5268068..0000000 --- a/Docker-Compose/caddy/files/config/webserver.caddy +++ /dev/null @@ -1,25 +0,0 @@ -<%- if webserver_enabled %> -<< webserver_domain >> { - root * /srv - file_server - <%- if webserver_custom_config_content %> - <%- for line in webserver_custom_config_content.split('\n') %> - << line >> - <%- endfor %> - <%- endif %> -} -<%- endif %> - -<%- if reverse_proxy_enabled %> -<< reverse_proxy_domain >> { - <%- if reverse_proxy_custom_config_content %> - reverse_proxy << reverse_proxy_upstream >> { - <%- for line in reverse_proxy_custom_config_content.split('\n') %> - << line >> - <%- endfor %> - } - <%- else %> - reverse_proxy << reverse_proxy_upstream >> - <%- endif %> -} -<%- endif %> diff --git a/Docker-Compose/caddy/template.json b/Docker-Compose/caddy/template.json deleted file mode 100644 index 6fd9ea8..0000000 --- a/Docker-Compose/caddy/template.json +++ /dev/null @@ -1,319 +0,0 @@ -{ - "slug": "caddy", - "kind": "compose", - "metadata": { - "name": "Caddy", - "description": "Modern web server and reverse proxy with automatic HTTPS, modular Caddyfile config, and simple presets for static sites or upstream proxying.", - "tags": [ - "reverse-proxy", - "web-server", - "tls" - ], - "icon": { - "provider": "selfhst", - "id": "caddy", - "color": "emerald" - }, - "draft": false, - "version": { - "name": "2.11.2-alpine", - "source_dep_name": "docker.io/library/caddy", - "source_dep_version": "2.11.2-alpine" - } - }, - "variables": [ - { - "name": "general", - "title": "General", - "description": "Basic container naming and lifecycle settings.", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "caddy", - "description": "Compose service name for the Caddy container.", - "config": { - "placeholder": "caddy" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "description": "Restart policy applied to the container.", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "description": "Optional timezone passed through as the `TZ` environment variable.", - "config": { - "placeholder": "UTC" - } - } - ] - }, - { - "name": "network", - "title": "Network", - "description": "Port publishing and Docker network attachment.", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": true, - "default": 80, - "description": "Host port published for HTTP traffic on container port 80.", - "config": { - "placeholder": "80" - } - }, - { - "name": "ports_https", - "type": "int", - "title": "HTTPS Port", - "required": true, - "default": 443, - "description": "Host port published for HTTPS traffic on container port 443.", - "config": { - "placeholder": "443" - } - }, - { - "name": "docker_network", - "type": "str", - "title": "Docker Network", - "required": true, - "default": "caddy", - "description": "Docker network that Caddy should join.", - "config": { - "placeholder": "caddy" - } - }, - { - "name": "docker_network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - } - ] - }, - { - "name": "tls", - "title": "TLS", - "description": "Optional global ACME metadata for Caddy.", - "toggle": "tls_enabled", - "items": [ - { - "name": "tls_enabled", - "type": "bool", - "title": "TLS Settings", - "required": false, - "default": false - }, - { - "name": "tls_email", - "type": "str", - "title": "ACME Email", - "required": false, - "description": "Email address used for ACME account registration.", - "config": { - "placeholder": "admin@example.com" - }, - "needs": [ - "tls_enabled=true" - ] - } - ] - }, - { - "name": "webserver", - "title": "Webserver", - "description": "Optional generated static site config that serves files from `/srv`.", - "toggle": "webserver_enabled", - "items": [ - { - "name": "webserver_enabled", - "type": "bool", - "title": "Static Webserver", - "required": false, - "default": false, - "description": "Render a basic static site config into `config/webserver.caddy`." - }, - { - "name": "webserver_domain", - "type": "str", - "title": "Site Address", - "required": true, - "description": "Hostname or site address used by the generated static site config.", - "config": { - "placeholder": "example.com" - }, - "needs": [ - "webserver_enabled=true" - ] - }, - { - "name": "webserver_content_type", - "type": "enum", - "title": "Site Content", - "required": true, - "default": "mount", - "description": "Storage mode used for static site content mounted into `/srv`.", - "config": { - "options": [ - "mount", - "nfs" - ] - }, - "needs": [ - "webserver_enabled=true" - ] - }, - { - "name": "webserver_content_mount_path", - "type": "str", - "title": "Bind Mount Path", - "required": true, - "default": "./data", - "description": "Host path used when site content is mounted directly from the filesystem.", - "config": { - "placeholder": "./data" - }, - "needs": [ - "webserver_enabled=true", - "webserver_content_type=mount" - ] - }, - { - "name": "webserver_content_nfs_server", - "type": "str", - "title": "NFS Server", - "required": true, - "default": "192.0.2.1", - "description": "Hostname or IP address of the NFS server that stores site content.", - "config": { - "placeholder": "192.0.2.1" - }, - "needs": [ - "webserver_enabled=true", - "webserver_content_type=nfs" - ] - }, - { - "name": "webserver_content_nfs_path", - "type": "str", - "title": "NFS Export Path", - "required": true, - "default": "/path/to/export", - "config": { - "placeholder": "/path/to/export" - }, - "needs": [ - "webserver_enabled=true", - "webserver_content_type=nfs" - ] - }, - { - "name": "webserver_content_nfs_options", - "type": "str", - "title": "NFS Mount Options", - "required": true, - "default": "rw,nolock,soft", - "config": { - "placeholder": "rw,nolock,soft" - }, - "needs": [ - "webserver_enabled=true", - "webserver_content_type=nfs" - ] - }, - { - "name": "webserver_custom_config_content", - "type": "str", - "title": "Custom Config Content", - "required": false, - "description": "Optional additional Caddyfile directives inserted into the generated webserver site block when not empty.", - "config": { - "placeholder": "encode zstd gzip", - "textarea": true - }, - "needs": [ - "webserver_enabled=true" - ] - } - ] - }, - { - "name": "reverse-proxy", - "title": "Reverse Proxy", - "description": "Optional generated reverse proxy config for forwarding requests to an upstream service.", - "toggle": "reverse_proxy_enabled", - "items": [ - { - "name": "reverse_proxy_enabled", - "type": "bool", - "title": "Reverse Proxy", - "required": false, - "default": false, - "description": "Append a reverse proxy site block to `config/webserver.caddy`." - }, - { - "name": "reverse_proxy_domain", - "type": "str", - "title": "Site Address", - "required": true, - "description": "Hostname or site address used by the generated reverse proxy config.", - "config": { - "placeholder": "app.example.com" - }, - "needs": [ - "reverse_proxy_enabled=true" - ] - }, - { - "name": "reverse_proxy_upstream", - "type": "str", - "title": "Upstream", - "required": true, - "description": "Upstream target used by the generated reverse proxy config, for example `app:3000`.", - "config": { - "placeholder": "app:3000" - }, - "needs": [ - "reverse_proxy_enabled=true" - ] - }, - { - "name": "reverse_proxy_custom_config_content", - "type": "str", - "title": "Custom Config Content", - "required": false, - "description": "Optional additional `reverse_proxy` subdirectives inserted into the generated reverse proxy block when not empty.", - "config": { - "placeholder": "header_up X-Forwarded-Proto https", - "textarea": true - }, - "needs": [ - "reverse_proxy_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/checkmk/files/.env b/Docker-Compose/checkmk/files/.env deleted file mode 100644 index bb69d42..0000000 --- a/Docker-Compose/checkmk/files/.env +++ /dev/null @@ -1,2 +0,0 @@ -# Checkmk credentials -CMK_PASSWORD=<< cmk_password >> diff --git a/Docker-Compose/checkmk/files/compose.yaml b/Docker-Compose/checkmk/files/compose.yaml deleted file mode 100644 index 9a8e8fb..0000000 --- a/Docker-Compose/checkmk/files/compose.yaml +++ /dev/null @@ -1,55 +0,0 @@ ---- -services: - << service_name >>: - image: checkmk/check-mk-community:2.5.0-latest - restart: << restart_policy >> - environment: - <%- if container_timezone %> - - TZ=<< container_timezone >> - <%- endif %> - - CMK_PASSWORD=${CMK_PASSWORD} - - CMK_SITE_ID=<< cmk_site_id >> - tmpfs: - - /opt/omd/sites/<< cmk_site_id >>/tmp:uid=<< user_uid >>,gid=<< user_gid >> - volumes: - <%- if not container_timezone %> - - /etc/localtime:/etc/localtime:ro - <%- endif %> - - << service_name >>_data:/omd/sites:rw - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - ports: - <%- if not traefik_enabled %> - - "<< ports_http >>:5000" - <%- endif %> - - "<< ports_agent >>:8000" - - "<< ports_snmp >>:162/udp" - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=5000 - - traefik.http.services.<< service_name >>-web.loadBalancer.server.scheme=http - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -volumes: - << service_name >>_data: - driver: local - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/checkmk/template.json b/Docker-Compose/checkmk/template.json deleted file mode 100644 index 2a63859..0000000 --- a/Docker-Compose/checkmk/template.json +++ /dev/null @@ -1,225 +0,0 @@ -{ - "slug": "checkmk", - "kind": "compose", - "metadata": { - "name": "Checkmk", - "description": "Comprehensive IT monitoring solution for infrastructure, applications, and services. Provides real-time health and performance insights with server, network, cloud, and application monitoring.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "checkmk" - }, - "draft": false, - "version": { - "name": "2.5.0-latest", - "source_dep_name": "checkmk/check-mk-community", - "source_dep_version": "2.5.0-latest" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "checkmk", - "config": { - "placeholder": "checkmk" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "user_uid", - "type": "int", - "title": "User Uid", - "required": false, - "default": 1000, - "config": { - "placeholder": "1000" - } - }, - { - "name": "user_gid", - "type": "int", - "title": "User Gid", - "required": false, - "default": 1000, - "config": { - "placeholder": "1000" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "cmk_password", - "type": "secret", - "title": "CheckMK admin password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "cmk_site_id", - "type": "str", - "title": "CheckMK site ID", - "required": true, - "default": "cmk", - "config": { - "placeholder": "cmk" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "checkmk" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 5000, - "config": { - "placeholder": "5000" - } - }, - { - "name": "ports_agent", - "type": "int", - "title": "Agent port", - "required": true, - "default": 8000, - "config": { - "placeholder": "8000" - } - }, - { - "name": "ports_snmp", - "type": "int", - "title": "SNMP trap port", - "required": true, - "default": 162, - "config": { - "placeholder": "162" - } - } - ] - } - ] -} diff --git a/Docker-Compose/cloudflared/files/.env b/Docker-Compose/cloudflared/files/.env deleted file mode 100644 index d6fc33f..0000000 --- a/Docker-Compose/cloudflared/files/.env +++ /dev/null @@ -1,2 +0,0 @@ -# Cloudflared credentials -TUNNEL_TOKEN=<< tunnel_token >> diff --git a/Docker-Compose/cloudflared/files/compose.yaml b/Docker-Compose/cloudflared/files/compose.yaml deleted file mode 100644 index 94657fd..0000000 --- a/Docker-Compose/cloudflared/files/compose.yaml +++ /dev/null @@ -1,18 +0,0 @@ -services: - << service_name >>: - image: cloudflare/cloudflared:2026.3.0 - container_name: << container_name >> - environment: - - TUNNEL_TOKEN=${TUNNEL_TOKEN} - command: << tunnel_run_command >> - networks: - - << network_name >> - restart: << restart_policy >> - -networks: - << network_name >>: -<%- if network_external %> - external: true -<%- else %> - driver: bridge -<%- endif %> diff --git a/Docker-Compose/cloudflared/template.json b/Docker-Compose/cloudflared/template.json deleted file mode 100644 index 713eef9..0000000 --- a/Docker-Compose/cloudflared/template.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "slug": "cloudflared", - "kind": "compose", - "metadata": { - "name": "Cloudflared", - "description": "Runs a Cloudflare Tunnel connector in Docker Compose so private services can be published through Cloudflare Zero Trust.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "cloudflare-zero-trust" - }, - "draft": false, - "version": { - "name": "2026.3.0", - "source_dep_name": "cloudflare/cloudflared", - "source_dep_version": "2026.3.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Compose service name", - "required": false, - "default": "cloudflared", - "config": { - "placeholder": "cloudflared" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container name", - "required": false, - "default": "cloudflared", - "config": { - "placeholder": "cloudflared" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Container restart policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "tunnel_run_command", - "type": "str", - "title": "Command", - "required": false, - "default": "tunnel --no-autoupdate run", - "config": { - "placeholder": "tunnel --no-autoupdate run" - } - }, - { - "name": "tunnel_token", - "type": "secret", - "title": "Tunnel Token", - "required": true, - "description": "Cloudflare tunnel token used by the connector." - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": true, - "default": "proxy", - "description": "Docker network name for the tunnel container", - "config": { - "placeholder": "proxy" - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": true - } - ] - } - ] -} diff --git a/Docker-Compose/crowdsec/files/.env b/Docker-Compose/crowdsec/files/.env deleted file mode 100644 index 60fe756..0000000 --- a/Docker-Compose/crowdsec/files/.env +++ /dev/null @@ -1,7 +0,0 @@ -# CrowdSec enrollment and bouncer placeholders -<%- if console_enrollment_enabled %> -ENROLL_KEY=<< console_enrollment_key >> -<%- endif %> -<%- if bouncer_traefik_key %> -BOUNCER_KEY_TRAEFIK=<< bouncer_traefik_key >> -<%- endif %> diff --git a/Docker-Compose/crowdsec/files/compose.yaml b/Docker-Compose/crowdsec/files/compose.yaml deleted file mode 100644 index e769e4d..0000000 --- a/Docker-Compose/crowdsec/files/compose.yaml +++ /dev/null @@ -1,63 +0,0 @@ -services: - << service_name >>: - image: crowdsecurity/crowdsec:<< image_tag >> - container_name: << container_name >> - environment: - - TZ=<< container_timezone >> - - COLLECTIONS=<< collections_core >><%- if collections_extra %> << collections_extra >><%- endif %><%- if appsec_enabled %> crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-generic-rules<%- endif %> - <%- if docker_logs_enabled %> - - GID=<< docker_group_id >> - <%- endif %> - <%- if console_enrollment_enabled %> - - ENROLL_KEY=${ENROLL_KEY} - - ENROLL_INSTANCE_NAME=<< console_enrollment_name >> - <%- if console_enrollment_tags %> - - ENROLL_TAGS=<< console_enrollment_tags >> - <%- endif %> - <%- endif %> - <%- if bouncer_traefik_key %> - - BOUNCER_KEY_TRAEFIK=${BOUNCER_KEY_TRAEFIK} - <%- endif %> - volumes: - - ./config/acquis.yaml:/etc/crowdsec/acquis.yaml:ro - - ./config/acquis.d:/etc/crowdsec/acquis.d:ro - - crowdsec_data:/var/lib/crowdsec/data - - /var/log:/var/log-host:ro - <%- if docker_logs_enabled %> - - /var/run/docker.sock:/var/run/docker.sock:ro - <%- endif %> - <%- if traefik_accesslog_enabled %> - - << traefik_accesslog_mount_path >>:/var/log/traefik:ro - <%- endif %> - <%- if lapi_expose_enabled or (appsec_enabled and appsec_expose_enabled) %> - ports: - <%- if lapi_expose_enabled %> - - "<< lapi_bind_address >>:<< lapi_port >>:8080" - <%- endif %> - <%- if appsec_enabled and appsec_expose_enabled %> - - "<< appsec_bind_address >>:<< appsec_port >>:7422" - <%- endif %> - <%- endif %> - restart: << restart_policy >> - networks: - - crowdsec - <%- if traefik_network_enabled %> - - << traefik_network >> - <%- endif %> - -networks: - crowdsec: - driver: bridge - <%- if traefik_network_enabled %> - << traefik_network >>: - <%- if traefik_network_external %> - external: true - <%- else %> - driver: bridge - name: << traefik_network >> - <%- endif %> - <%- endif %> - -volumes: - crowdsec_data: - driver: local diff --git a/Docker-Compose/crowdsec/files/config/acquis.d/appsec.yaml b/Docker-Compose/crowdsec/files/config/acquis.d/appsec.yaml deleted file mode 100644 index 9885d82..0000000 --- a/Docker-Compose/crowdsec/files/config/acquis.d/appsec.yaml +++ /dev/null @@ -1,9 +0,0 @@ -<%- if appsec_enabled %> -source: appsec -listen_addr: 0.0.0.0:7422 -path: << appsec_path >> -appsec_config: crowdsecurity/appsec-default -labels: - type: appsec -name: << appsec_name >> -<%- endif %> diff --git a/Docker-Compose/crowdsec/files/config/acquis.yaml b/Docker-Compose/crowdsec/files/config/acquis.yaml deleted file mode 100644 index 105ab34..0000000 --- a/Docker-Compose/crowdsec/files/config/acquis.yaml +++ /dev/null @@ -1,26 +0,0 @@ -<%- if host_logs_enabled %> -filenames: - - /var/log-host/auth.log - - /var/log-host/syslog -labels: - type: syslog -<%- endif %> -<%- if host_logs_enabled and (docker_logs_enabled or traefik_accesslog_enabled) %> ---- -<%- endif %> -<%- if docker_logs_enabled %> -source: docker -container_name_regexp: - - << docker_container_name_regexp >> -labels: - type: << docker_log_type >> -<%- endif %> -<%- if docker_logs_enabled and traefik_accesslog_enabled %> ---- -<%- endif %> -<%- if traefik_accesslog_enabled %> -filenames: - - /var/log/traefik/<< traefik_accesslog_filename >> -labels: - type: traefik -<%- endif %> diff --git a/Docker-Compose/crowdsec/template.json b/Docker-Compose/crowdsec/template.json deleted file mode 100644 index bf341d6..0000000 --- a/Docker-Compose/crowdsec/template.json +++ /dev/null @@ -1,451 +0,0 @@ -{ - "slug": "crowdsec", - "kind": "compose", - "metadata": { - "name": "CrowdSec", - "description": "Standalone CrowdSec Security Engine deployment for a single Docker host, with host and reverse-proxy log acquisition, optional AppSec exposure, and console or bouncer enrollment placeholders.", - "tags": [ - "security", - "logging", - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "crowdsec" - }, - "draft": true, - "version": { - "name": "v1.7.6", - "source_dep_name": "manual/crowdsec" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "crowdsec", - "description": "Compose service name for CrowdSec.", - "config": { - "placeholder": "crowdsec" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "crowdsec", - "description": "Container name for CrowdSec.", - "config": { - "placeholder": "crowdsec" - } - }, - { - "name": "image_tag", - "type": "str", - "title": "Image Tag", - "required": true, - "default": "v1.7.6", - "description": "CrowdSec image tag to deploy.", - "config": { - "placeholder": "v1.7.6" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": true, - "default": "UTC", - "config": { - "placeholder": "UTC" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Collections", - "name": "collections", - "items": [ - { - "name": "collections_core", - "type": "str", - "title": "Core Collections", - "required": true, - "default": "crowdsecurity/linux crowdsecurity/sshd", - "description": "Space-separated base collections to install on startup.", - "config": { - "placeholder": "crowdsecurity/linux crowdsecurity/sshd" - } - }, - { - "name": "collections_extra", - "type": "str", - "title": "Extra Collections", - "required": false, - "default": "crowdsecurity/traefik", - "description": "Additional space-separated collections to install, for example a reverse-proxy parser.", - "config": { - "placeholder": "crowdsecurity/traefik" - } - } - ] - }, - { - "title": "Acquisition", - "name": "acquisition", - "items": [ - { - "name": "host_logs_enabled", - "type": "bool", - "title": "Host Logs", - "required": false, - "default": true, - "description": "Ingest host auth and syslog files from `/var/log`." - }, - { - "name": "docker_logs_enabled", - "type": "bool", - "title": "Docker Logs", - "required": false, - "default": false, - "description": "Read logs from a matching Docker container through the Docker socket." - }, - { - "name": "docker_group_id", - "type": "int", - "title": "Docker Group ID", - "required": true, - "default": 998, - "description": "Host Docker group ID so the container can access the socket.", - "needs": [ - "docker_logs_enabled=true" - ], - "config": { - "placeholder": "998" - } - }, - { - "name": "docker_container_name_regexp", - "type": "str", - "title": "Docker Container Regex", - "required": true, - "default": ".*traefik.*", - "description": "Regular expression used to match the Docker container whose logs should be parsed.", - "needs": [ - "docker_logs_enabled=true" - ], - "config": { - "placeholder": ".*traefik.*" - } - }, - { - "name": "docker_log_type", - "type": "str", - "title": "Docker Log Type", - "required": true, - "default": "traefik", - "description": "Parser type label for the Docker datasource.", - "needs": [ - "docker_logs_enabled=true" - ], - "config": { - "placeholder": "traefik" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "items": [ - { - "name": "traefik_network_enabled", - "type": "bool", - "title": "Shared Traefik Network", - "required": false, - "default": false, - "description": "Attach CrowdSec to an existing Docker network shared with Traefik or other bouncers." - }, - { - "name": "traefik_network", - "type": "str", - "title": "Traefik Network", - "required": true, - "default": "traefik", - "description": "Docker network shared with Traefik or other remediation components.", - "needs": [ - "traefik_network_enabled=true" - ], - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": true, - "needs": [ - "traefik_network_enabled=true" - ] - }, - { - "name": "traefik_accesslog_enabled", - "type": "bool", - "title": "Traefik Access Log", - "required": false, - "default": false, - "description": "Read Traefik access logs from a mounted host path." - }, - { - "name": "traefik_accesslog_mount_path", - "type": "str", - "title": "Traefik Log Path", - "required": true, - "default": "/var/log/traefik", - "description": "Host directory containing Traefik access logs.", - "needs": [ - "traefik_accesslog_enabled=true" - ], - "config": { - "placeholder": "/var/log/traefik" - } - }, - { - "name": "traefik_accesslog_filename", - "type": "str", - "title": "Traefik Log File", - "required": true, - "default": "access.log", - "description": "Filename of the Traefik access log inside the mounted directory.", - "needs": [ - "traefik_accesslog_enabled=true" - ], - "config": { - "placeholder": "access.log" - } - } - ] - }, - { - "title": "Local API", - "toggle": "lapi_expose_enabled", - "name": "lapi", - "items": [ - { - "name": "lapi_expose_enabled", - "type": "bool", - "title": "Expose Local API", - "required": false, - "default": false, - "description": "Publish CrowdSec Local API on the host." - }, - { - "name": "lapi_bind_address", - "type": "str", - "title": "Local API Bind Address", - "required": true, - "default": "127.0.0.1", - "description": "Host address used for the Local API port binding.", - "needs": [ - "lapi_expose_enabled=true" - ], - "config": { - "placeholder": "127.0.0.1" - } - }, - { - "name": "lapi_port", - "type": "int", - "title": "Local API Port", - "required": true, - "default": 8080, - "description": "Host port used for the Local API binding.", - "needs": [ - "lapi_expose_enabled=true" - ], - "config": { - "placeholder": "8080" - } - } - ] - }, - { - "title": "AppSec", - "toggle": "appsec_enabled", - "name": "appsec", - "items": [ - { - "name": "appsec_enabled", - "type": "bool", - "title": "Enable AppSec", - "required": false, - "default": false - }, - { - "name": "appsec_name", - "type": "str", - "title": "AppSec Name", - "required": true, - "default": "traefik-appsec", - "description": "Friendly name for the AppSec component.", - "needs": [ - "appsec_enabled=true" - ], - "config": { - "placeholder": "traefik-appsec" - } - }, - { - "name": "appsec_path", - "type": "str", - "title": "AppSec Path", - "required": true, - "default": "/", - "description": "Request path handled by the AppSec listener.", - "needs": [ - "appsec_enabled=true" - ], - "config": { - "placeholder": "/" - } - }, - { - "name": "appsec_expose_enabled", - "type": "bool", - "title": "Expose AppSec", - "required": false, - "default": false, - "description": "Publish the AppSec listener on the host.", - "needs": [ - "appsec_enabled=true" - ] - }, - { - "name": "appsec_bind_address", - "type": "str", - "title": "AppSec Bind Address", - "required": true, - "default": "127.0.0.1", - "description": "Host address used for the AppSec port binding.", - "needs": [ - "appsec_enabled=true", - "appsec_expose_enabled=true" - ], - "config": { - "placeholder": "127.0.0.1" - } - }, - { - "name": "appsec_port", - "type": "int", - "title": "AppSec Port", - "required": true, - "default": 7422, - "description": "Host port used for the AppSec port binding.", - "needs": [ - "appsec_enabled=true", - "appsec_expose_enabled=true" - ], - "config": { - "placeholder": "7422" - } - } - ] - }, - { - "title": "Console Enrollment", - "toggle": "console_enrollment_enabled", - "name": "console", - "items": [ - { - "name": "console_enrollment_enabled", - "type": "bool", - "title": "Console Enrollment", - "required": false, - "default": false, - "description": "Enroll this CrowdSec instance into CrowdSec Console." - }, - { - "name": "console_enrollment_name", - "type": "str", - "title": "Instance Name", - "required": true, - "default": "crowdsec-homelab", - "description": "Human-readable name shown in CrowdSec Console.", - "needs": [ - "console_enrollment_enabled=true" - ], - "config": { - "placeholder": "crowdsec-homelab" - } - }, - { - "name": "console_enrollment_tags", - "type": "str", - "title": "Enrollment Tags", - "required": false, - "default": "homelab,edge", - "description": "Comma-separated tags assigned during console enrollment.", - "needs": [ - "console_enrollment_enabled=true" - ], - "config": { - "placeholder": "homelab,edge" - } - }, - { - "name": "console_enrollment_key", - "type": "secret", - "title": "Enrollment Key", - "required": true, - "description": "Enrollment key generated by CrowdSec Console.", - "needs": [ - "console_enrollment_enabled=true" - ] - } - ] - }, - { - "title": "Bouncers", - "name": "bouncers", - "items": [ - { - "name": "bouncer_traefik_key", - "type": "secret", - "title": "Traefik Bouncer Key", - "required": false, - "description": "Optional seed key for a Traefik bouncer or plugin.", - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - } - ] -} diff --git a/Docker-Compose/dockge/files/compose.yaml b/Docker-Compose/dockge/files/compose.yaml deleted file mode 100644 index cf65c72..0000000 --- a/Docker-Compose/dockge/files/compose.yaml +++ /dev/null @@ -1,47 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/louislam/dockge:1.5.0 - restart: << restart_policy >> - environment: - - TZ=<< container_timezone >> - - DOCKGE_STACKS_DIR=<< stacks_path >> - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - << service_name >>_data:/app/data - - << stacks_path >>:<< stacks_path >> - <%- if traefik_enabled %> - networks: - - << traefik_network >> - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:5001" - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=5001 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - - -volumes: - << service_name >>_data: - driver: local - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/dockge/template.json b/Docker-Compose/dockge/template.json deleted file mode 100644 index b306af1..0000000 --- a/Docker-Compose/dockge/template.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "slug": "dockge", - "kind": "compose", - "metadata": { - "name": "Dockge", - "description": "Web-based Docker Compose stack manager with a clean UI for creating, editing, starting, and stopping compose stacks directly from the browser.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "dockge" - }, - "draft": false, - "version": { - "name": "1.5.0", - "source_dep_name": "docker.io/louislam/dockge", - "source_dep_version": "1.5.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "dockge", - "config": { - "placeholder": "dockge" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "stacks_path", - "type": "str", - "title": "Docker Compose Path", - "required": true, - "default": "/stacks", - "description": "Path used for Docker Compose.", - "config": { - "placeholder": "/stacks" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "dockge" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 5001, - "config": { - "placeholder": "5001" - } - } - ] - } - ] -} diff --git a/Docker-Compose/dockhand/files/.env b/Docker-Compose/dockhand/files/.env deleted file mode 100644 index 54e7a62..0000000 --- a/Docker-Compose/dockhand/files/.env +++ /dev/null @@ -1,7 +0,0 @@ -# Dockhand credentials -<%- if database_type == 'postgres' %> -DATABASE_PASSWORD=<< database_password >> -<%- endif %> -<%- if encryption_key %> -ENCRYPTION_KEY=<< encryption_key >> -<%- endif %> diff --git a/Docker-Compose/dockhand/files/compose.yaml b/Docker-Compose/dockhand/files/compose.yaml deleted file mode 100644 index 33533ee..0000000 --- a/Docker-Compose/dockhand/files/compose.yaml +++ /dev/null @@ -1,59 +0,0 @@ -services: - << service_name >>: - image: docker.io/fnsys/dockhand:v1.0.27 - restart: << restart_policy >> - <%- if database_type == 'postgres' or disable_local_login or encryption_key or puid or pgid %> - environment: - <%- if database_type == 'postgres' %> - - DATABASE_URL=postgres://<< database_user >>:${DATABASE_PASSWORD}@<< database_host >>:<< database_port >>/<< database_name >> - <%- endif %> - <%- if encryption_key %> - - ENCRYPTION_KEY=${ENCRYPTION_KEY} - <%- endif %> - <%- if puid %> - - PUID=<< puid >> - <%- endif %> - <%- if pgid %> - - PGID=<< pgid >> - <%- endif %> - <%- if disable_local_login %> - - DISABLE_LOCAL_LOGIN=<< disable_local_login | lower >> - <%- endif %> - <%- endif %> - volumes: - - /var/run/docker.sock:/var/run/docker.sock - - dockhand_data:/app/data - <%- if traefik_enabled %> - networks: - - << traefik_network >> - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:3000" - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=3000 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -volumes: - dockhand_data: - driver: local - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/dockhand/template.json b/Docker-Compose/dockhand/template.json deleted file mode 100644 index e3e086e..0000000 --- a/Docker-Compose/dockhand/template.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "slug": "dockhand", - "kind": "compose", - "metadata": { - "name": "Dockhand", - "description": "Modern Docker management UI with Compose stack support, Git-based stack deployments, and optional OIDC authentication.", - "tags": [ - "traefik", - "postgresql", - "sqlite" - ], - "icon": { - "provider": "selfhst", - "id": "dockhand" - }, - "draft": false, - "version": { - "name": "v1.0.27", - "source_dep_name": "docker.io/fnsys/dockhand", - "source_dep_version": "v1.0.27" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "dockhand", - "config": { - "placeholder": "dockhand" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "encryption_key", - "type": "secret", - "title": "Encryption Key", - "required": false, - "description": "Base64-encoded 32-byte AES-256 key used for credential encryption.", - "config": { - "autogenerated": { - "kind": "base64", - "bytes": 32 - } - } - }, - { - "name": "puid", - "type": "int", - "title": "PUID", - "required": false, - "config": { - "placeholder": "1000" - }, - "description": "Optional user ID for Dockhand. On Linux check with `id -u`." - }, - { - "name": "pgid", - "type": "int", - "title": "PGID", - "required": false, - "config": { - "placeholder": "1000" - }, - "description": "Optional group ID for Dockhand. On Linux check with `id -g`." - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": true, - "default": 3000, - "needs": [ - "traefik_enabled=false" - ], - "config": { - "placeholder": "3000" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "dockhand" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "needs": [ - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "cloudflare" - } - } - ] - }, - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_type", - "type": "enum", - "title": "Database Type", - "required": false, - "default": "sqlite", - "config": { - "options": [ - "sqlite", - "postgres" - ] - } - }, - { - "name": "database_host", - "type": "str", - "title": "Database Host", - "required": true, - "needs": [ - "database_type=postgres" - ], - "default": "postgres", - "config": { - "placeholder": "postgres" - } - }, - { - "name": "database_port", - "type": "int", - "title": "Database Port", - "required": true, - "needs": [ - "database_type=postgres" - ], - "default": 5432, - "config": { - "placeholder": "5432" - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": true, - "needs": [ - "database_type=postgres" - ], - "default": "dockhand", - "config": { - "placeholder": "dockhand" - }, - "description": "Database name used for PostgreSQL." - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": true, - "needs": [ - "database_type=postgres" - ], - "default": "dockhand", - "config": { - "placeholder": "dockhand" - }, - "description": "Username used for PostgreSQL." - }, - { - "name": "database_password", - "type": "secret", - "title": "Database Password", - "required": true, - "needs": [ - "database_type=postgres" - ], - "description": "Password used for PostgreSQL." - } - ] - }, - { - "title": "Authentication", - "name": "authentication", - "items": [ - { - "name": "disable_local_login", - "type": "bool", - "title": "Disable Local Login", - "required": false, - "default": false, - "description": "when SSO correctly setup, not recommended as first deployment" - } - ] - } - ] -} diff --git a/Docker-Compose/forgejo/files/.env b/Docker-Compose/forgejo/files/.env deleted file mode 100644 index 6f3d50c..0000000 --- a/Docker-Compose/forgejo/files/.env +++ /dev/null @@ -1,5 +0,0 @@ -# Forgejo database credentials -<%- if database_type != 'sqlite' %> -DATABASE_USER=<< database_user >> -DATABASE_PASSWORD=<< database_password >> -<%- endif %> diff --git a/Docker-Compose/forgejo/files/compose.yaml b/Docker-Compose/forgejo/files/compose.yaml deleted file mode 100644 index fb0180e..0000000 --- a/Docker-Compose/forgejo/files/compose.yaml +++ /dev/null @@ -1,118 +0,0 @@ -services: - << service_name >>: - image: codeberg.org/forgejo/forgejo:15.0.2 - restart: << restart_policy >> - environment: - - USER_UID=<< user_uid >> - - USER_GID=<< user_gid >> - <%- if database_type != 'sqlite' %> - - FORGEJO__database__DB_TYPE=<< database_type >> - <%- if database_external %> - - FORGEJO__database__HOST=<< database_host >> - <%- else %> - - FORGEJO__database__HOST=<< service_name >>_db - <%- endif %> - - FORGEJO__database__NAME=<< database_name >> - - FORGEJO__database__USER=${DATABASE_USER} - - FORGEJO__database__PASSWD=${DATABASE_PASSWORD} - <%- endif %> - - FORGEJO__server__SSH_PORT=<< ports_ssh >> - <%- if not traefik_enabled %> - - FORGEJO__server__ROOT_URL=<< forgejo_url >> - <%- else %> - - FORGEJO__server__ROOT_URL=https://<< traefik_host >>.<< traefik_domain >> - <%- endif %> - <%- if not database_external and (database_type == "postgres" or database_type == "mysql") or traefik_enabled %> - networks: - <%- if not database_external and database_type != 'sqlite' %> - - << service_name >>_backend - <%- endif %> - <%- if traefik_enabled %> - - << traefik_network >> - <%- endif %> - <%- endif %> - ports: - <%- if not traefik_enabled %> - - "<< ports_http >>:3000" - <%- endif %> - - "<< ports_ssh >>:22" - volumes: - - << service_name >>_data:/data - - /etc/timezone:/etc/timezone:ro - - /etc/localtime:/etc/localtime:ro - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=3000 - - traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_https.tls=true - - traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - <%- if not database_external and database_type != 'sqlite' %> - depends_on: - - << service_name >>_db - <%- endif %> - - <%- if not database_external and database_type == "postgres" %> - << service_name >>_db: - image: docker.io/library/postgres:18 - restart: << restart_policy >> - environment: - - TZ=<< container_timezone >> - - POSTGRES_USER=${DATABASE_USER} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=<< database_name >> - networks: - - << service_name >>_backend - healthcheck: - test: ["CMD-SHELL", "pg_isready -U << database_user >>"] - start_period: 30s - interval: 10s - timeout: 10s - retries: 5 - volumes: - - << service_name >>_db:/var/lib/postgresql/data - <%- elif not database_external and database_type == "mysql" %> - << service_name >>_db: - image: docker.io/library/mysql:8.1 - restart: << restart_policy >> - environment: - - MYSQL_USER=${DATABASE_USER} - - MYSQL_PASSWORD=${DATABASE_PASSWORD} - - MYSQL_DATABASE=<< database_name >> - - MYSQL_ROOT_PASSWORD=${DATABASE_PASSWORD} - networks: - - << service_name >>_backend - volumes: - - << service_name >>_db:/var/lib/mysql - <%- endif %> - -volumes: - << service_name >>_data: - driver: local - <%- if not database_external %> - <%- if database_type == "postgres" or database_type == "mysql" %> - << service_name >>_db: - driver: local - <%- endif %> - <%- endif %> - -<%- if not database_external and (database_type == "postgres" or database_type == "mysql") or traefik_enabled %> -networks: - <%- if not database_external %> - << service_name >>_backend: - driver: bridge - <%- endif %> - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> -<%- endif %> diff --git a/Docker-Compose/forgejo/template.json b/Docker-Compose/forgejo/template.json deleted file mode 100644 index d160f43..0000000 --- a/Docker-Compose/forgejo/template.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "slug": "forgejo", - "kind": "compose", - "metadata": { - "name": "Forgejo", - "description": "Self-hosted lightweight software forge for Git repository hosting, code review, issue tracking, package publishing, and team collaboration.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "forgejo" - }, - "draft": false, - "version": { - "name": "15.0.2", - "source_dep_name": "codeberg.org/forgejo/forgejo", - "source_dep_version": "15.0.2" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "forgejo", - "config": { - "placeholder": "forgejo" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "user_uid", - "type": "int", - "title": "User Uid", - "required": false, - "default": 1000, - "config": { - "placeholder": "1000" - } - }, - { - "name": "user_gid", - "type": "int", - "title": "User Gid", - "required": false, - "default": 1000, - "config": { - "placeholder": "1000" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "forgejo_url", - "type": "str", - "title": "Public URL", - "required": false, - "default": "https://forgejo.home.arpa", - "needs": [ - "traefik_enabled=false" - ], - "config": { - "placeholder": "https://forgejo.home.arpa" - } - } - ] - }, - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_type", - "type": "enum", - "title": "Database backend type", - "required": false, - "default": "sqlite", - "config": { - "options": [ - "sqlite", - "postgres", - "mysql" - ] - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database name", - "required": false, - "default": "forgejo", - "needs": [ - "database_type=postgres,mysql" - ], - "config": { - "placeholder": "forgejo" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database user", - "required": false, - "default": "forgejo", - "needs": [ - "database_type=postgres,mysql" - ], - "config": { - "placeholder": "forgejo" - } - }, - { - "name": "database_host", - "type": "str", - "title": "Database host", - "required": false, - "default": "postgres", - "needs": [ - "database_type=postgres,mysql;database_external=true" - ], - "config": { - "placeholder": "postgres" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database password", - "required": false, - "needs": [ - "database_type=postgres,mysql" - ], - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "database_external", - "type": "bool", - "title": "External Database", - "required": false, - "default": false, - "needs": [ - "database_type=postgres,mysql" - ] - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 3000, - "config": { - "placeholder": "3000" - } - }, - { - "name": "ports_ssh", - "type": "str", - "title": "Ports Ssh", - "required": false, - "default": 2222, - "config": { - "placeholder": "2222" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "forgejo" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/gitea/files/.env b/Docker-Compose/gitea/files/.env deleted file mode 100644 index 2b93be2..0000000 --- a/Docker-Compose/gitea/files/.env +++ /dev/null @@ -1,5 +0,0 @@ -# Gitea database credentials -<%- if database_type != 'sqlite' %> -DATABASE_USER=<< database_user >> -DATABASE_PASSWORD=<< database_password >> -<%- endif %> diff --git a/Docker-Compose/gitea/files/compose.yaml b/Docker-Compose/gitea/files/compose.yaml deleted file mode 100644 index b458e52..0000000 --- a/Docker-Compose/gitea/files/compose.yaml +++ /dev/null @@ -1,118 +0,0 @@ -services: - << service_name >>: - image: docker.io/gitea/gitea:1.26.1 - restart: << restart_policy >> - environment: - - USER_UID=<< user_uid >> - - USER_GID=<< user_gid >> - <%- if database_type != 'sqlite' %> - - GITEA__database__DB_TYPE=<< database_type >> - <%- if database_external %> - - GITEA__database__HOST=<< database_host >> - <%- else %> - - GITEA__database__HOST=<< service_name >>_db - <%- endif %> - - GITEA__database__NAME=<< database_name >> - - GITEA__database__USER=${DATABASE_USER} - - GITEA__database__PASSWD=${DATABASE_PASSWORD} - <%- endif %> - - GITEA__server__SSH_PORT=<< ports_ssh >> - <%- if not traefik_enabled %> - - GITEA__server__ROOT_URL=<< gitea_url >> - <%- else %> - - GITEA__server__ROOT_URL=https://<< traefik_host >>.<< traefik_domain >> - <%- endif %> - <%- if not database_external and (database_type == "postgres" or database_type == "mysql") or traefik_enabled %> - networks: - <%- if not database_external and database_type != 'sqlite' %> - - << service_name >>_backend - <%- endif %> - <%- if traefik_enabled %> - - << traefik_network >> - <%- endif %> - <%- endif %> - ports: - <%- if not traefik_enabled %> - - "<< ports_http >>:3000" - <%- endif %> - - "<< ports_ssh >>:22" - volumes: - - << service_name >>_data:/data - - /etc/timezone:/etc/timezone:ro - - /etc/localtime:/etc/localtime:ro - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=3000 - - traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_https.tls=true - - traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - <%- if not database_external and database_type != 'sqlite' %> - depends_on: - - << service_name >>_db - <%- endif %> - - <%- if not database_external and database_type == "postgres" %> - << service_name >>_db: - image: docker.io/library/postgres:17.9 - restart: << restart_policy >> - environment: - - TZ=<< container_timezone >> - - POSTGRES_USER=${DATABASE_USER} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=<< database_name >> - networks: - - << service_name >>_backend - healthcheck: - test: ["CMD-SHELL", "pg_isready -U << database_user >>"] - start_period: 30s - interval: 10s - timeout: 10s - retries: 5 - volumes: - - << service_name >>_db:/var/lib/postgresql/data - <%- elif not database_external and database_type == "mysql" %> - << service_name >>_db: - image: docker.io/library/mysql:8.1 - restart: << restart_policy >> - environment: - - MYSQL_USER=${DATABASE_USER} - - MYSQL_PASSWORD=${DATABASE_PASSWORD} - - MYSQL_DATABASE=<< database_name >> - - MYSQL_ROOT_PASSWORD=${DATABASE_PASSWORD} - networks: - - << service_name >>_backend - volumes: - - << service_name >>_db:/var/lib/mysql - <%- endif %> - -volumes: - << service_name >>_data: - driver: local - <%- if not database_external %> - <%- if database_type == "postgres" or database_type == "mysql" %> - << service_name >>_db: - driver: local - <%- endif %> - <%- endif %> - -<%- if not database_external and (database_type == "postgres" or database_type == "mysql") or traefik_enabled %> -networks: - <%- if not database_external %> - << service_name >>_backend: - driver: bridge - <%- endif %> - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> -<%- endif %> diff --git a/Docker-Compose/gitea/template.json b/Docker-Compose/gitea/template.json deleted file mode 100644 index fc12175..0000000 --- a/Docker-Compose/gitea/template.json +++ /dev/null @@ -1,291 +0,0 @@ -{ - "slug": "gitea", - "kind": "compose", - "metadata": { - "name": "Gitea", - "description": "Lightweight, self-hosted Git service with a web interface for repository hosting, code review, issue tracking, and team collaboration. Written in Go.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "gitea", - "color": "emerald" - }, - "draft": false, - "version": { - "name": "1.26.1-1", - "source_dep_name": "docker.io/gitea/gitea", - "source_dep_version": "1.26.1" - } - }, - "variables": [ - { - "name": "general", - "title": "General", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "gitea", - "config": { - "placeholder": "gitea" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "user_uid", - "type": "int", - "title": "User Uid", - "required": false, - "default": 1000, - "config": { - "placeholder": "1000" - } - }, - { - "name": "user_gid", - "type": "int", - "title": "User Gid", - "required": false, - "default": 1000, - "config": { - "placeholder": "1000" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "gitea_url", - "type": "str", - "title": "Public URL", - "required": false, - "default": "https://git.home.arpa", - "config": { - "placeholder": "https://git.home.arpa" - }, - "needs": [ - "traefik_enabled=false" - ] - } - ] - }, - { - "name": "database", - "title": "Database", - "items": [ - { - "name": "database_type", - "type": "enum", - "title": "Database backend type", - "required": false, - "default": "sqlite", - "config": { - "options": [ - "sqlite", - "postgres", - "mysql" - ] - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database name", - "required": false, - "default": "gitea", - "config": { - "placeholder": "gitea" - }, - "needs": [ - "database_type=postgres,mysql" - ] - }, - { - "name": "database_user", - "type": "str", - "title": "Database user", - "required": false, - "default": "gitea", - "config": { - "placeholder": "gitea" - }, - "needs": [ - "database_type=postgres,mysql" - ] - }, - { - "name": "database_host", - "type": "str", - "title": "Database host", - "required": false, - "default": "postgres", - "config": { - "placeholder": "postgres" - }, - "needs": [ - "database_type=postgres,mysql;database_external=true" - ] - }, - { - "name": "database_password", - "type": "secret", - "title": "Database password", - "required": false, - "config": { - "autogenerated": { - "length": 32 - } - }, - "needs": [ - "database_type=postgres,mysql" - ] - }, - { - "name": "database_external", - "type": "bool", - "title": "External Database", - "required": false, - "default": false, - "needs": [ - "database_type=postgres,mysql" - ] - } - ] - }, - { - "name": "ports", - "title": "Ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 3000, - "config": { - "placeholder": "3000" - } - }, - { - "name": "ports_ssh", - "type": "str", - "title": "Ports Ssh", - "required": false, - "default": 2221, - "config": { - "placeholder": "2221" - } - } - ] - }, - { - "name": "traefik", - "title": "Traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "gitea" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/gitlab-runner/files/compose.yaml b/Docker-Compose/gitlab-runner/files/compose.yaml deleted file mode 100644 index d6ed941..0000000 --- a/Docker-Compose/gitlab-runner/files/compose.yaml +++ /dev/null @@ -1,8 +0,0 @@ -services: - << service_name >>: - image: docker.io/gitlab/gitlab-runner:alpine-v17.9.1 - container_name: << container_name >> - volumes: - - ./config/config.toml:/etc/gitlab-runner/config.toml:ro - - /var/run/docker.sock:/var/run/docker.sock - restart: << restart_policy >> diff --git a/Docker-Compose/gitlab-runner/files/config/config.toml b/Docker-Compose/gitlab-runner/files/config/config.toml deleted file mode 100644 index 6d25731..0000000 --- a/Docker-Compose/gitlab-runner/files/config/config.toml +++ /dev/null @@ -1,25 +0,0 @@ -concurrent = << gitlab_runner_concurrent >> -log_level = "warning" -log_format = "json" -check_interval = 5 - -[[runners]] - name = "<< gitlab_runner_name >>" - url = "<< gitlab_url >>" - executor = "docker" - token = "<< gitlab_runner_token >>" - limit = 0 - # FIXME To increase rate limits, when pulling down images from the Docker Hub you might want to authenticate: - # 1. Create a Docker Hub account and generate a personal access token - # 2. Encode the username and token in base64 - # Example: echo -n 'username:token' | base64 - # 3. Replace the with the base64 encoded string - environment = ["DOCKER_AUTH_CONFIG={\"auths\":{\"https://index.docker.io/v1/\":{\"auth\":\"\"}}}"] - [runners.docker] - tls_verify = false - image = "<< gitlab_executor_image >>" - privileged = true - disable_cache = false - volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"] - [runners.cache] - Insecure = false diff --git a/Docker-Compose/gitlab-runner/template.json b/Docker-Compose/gitlab-runner/template.json deleted file mode 100644 index 8a16403..0000000 --- a/Docker-Compose/gitlab-runner/template.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "slug": "gitlab-runner", - "kind": "compose", - "metadata": { - "name": "Gitlab-Runner", - "description": "CI/CD build runner for GitLab pipelines. Executes jobs defined in .gitlab-ci.yml using the Docker executor.", - "tags": [], - "icon": { - "provider": "simple-icons", - "id": "gitlab" - }, - "draft": false, - "version": { - "name": "alpine-v17.9.1", - "source_dep_name": "docker.io/gitlab/gitlab-runner", - "source_dep_version": "alpine-v17.9.1" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "gitlab-runner", - "config": { - "placeholder": "gitlab-runner" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "gitlab-runner", - "config": { - "placeholder": "gitlab-runner" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "gitlab_url", - "type": "str", - "title": "GitLab URL", - "required": true, - "config": { - "placeholder": "https://gitlab.example.com/" - }, - "description": "Base URL of the GitLab instance." - }, - { - "name": "gitlab_runner_name", - "type": "str", - "title": "Runner Name", - "required": false, - "default": "gitlab-runner", - "config": { - "placeholder": "gitlab-runner" - }, - "description": "Runner name shown in GitLab." - }, - { - "name": "gitlab_runner_token", - "type": "secret", - "title": "Runner Authentication Token", - "required": true, - "description": "Runner authentication token created in GitLab." - }, - { - "name": "gitlab_runner_concurrent", - "type": "int", - "title": "Concurrent Jobs", - "required": false, - "default": 4, - "description": "Maximum number of jobs the runner can process at the same time.", - "config": { - "placeholder": "4" - } - }, - { - "name": "gitlab_executor_image", - "type": "str", - "title": "Default Executor Image", - "required": false, - "default": "alpine:latest", - "config": { - "placeholder": "alpine:latest" - }, - "description": "Default Docker image used for jobs that do not specify one." - } - ] - } - ] -} diff --git a/Docker-Compose/gitlab/files/.env b/Docker-Compose/gitlab/files/.env deleted file mode 100644 index 2fbf794..0000000 --- a/Docker-Compose/gitlab/files/.env +++ /dev/null @@ -1 +0,0 @@ -GITLAB_ROOT_PASSWORD=<< root_password >> diff --git a/Docker-Compose/gitlab/files/compose.yaml b/Docker-Compose/gitlab/files/compose.yaml deleted file mode 100644 index 59dba00..0000000 --- a/Docker-Compose/gitlab/files/compose.yaml +++ /dev/null @@ -1,65 +0,0 @@ -services: - << service_name >>: - image: docker.io/gitlab/gitlab-ce:18.11.2-ce.0 - restart: << restart_policy >> - shm_size: '256m' - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - ports: - <%- if not traefik_enabled %> - - "<< ports_http >>:80" - <%- endif %> - - "<< ports_ssh >>:22" - <%- if registry_enabled and not traefik_enabled %> - - "<< ports_registry >>:5000" - <%- endif %> - volumes: - - ./config/gitlab.rb:/etc/gitlab/gitlab.rb:ro - - << service_name >>_config:/etc/gitlab - - << service_name >>_logs:/var/log/gitlab - - << service_name >>_data:/var/opt/gitlab - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=80 - - traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_https.tls=true - - traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- if registry_enabled %> - - traefik.http.services.<< service_name >>_registry.loadBalancer.server.port=5000 - - traefik.http.routers.<< service_name >>_registry-http.service=<< service_name >>_registry - - traefik.http.routers.<< service_name >>_registry-http.rule=Host(`<< traefik_registry_host >>`) - - traefik.http.routers.<< service_name >>_registry-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_registry-https.service=<< service_name >>_registry - - traefik.http.routers.<< service_name >>_registry-https.rule=Host(`<< traefik_registry_host >>`) - - traefik.http.routers.<< service_name >>_registry-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_registry-https.tls=true - - traefik.http.routers.<< service_name >>_registry-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - <%- endif %> - -volumes: - << service_name >>_config: - driver: local - << service_name >>_logs: - driver: local - << service_name >>_data: - driver: local - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/gitlab/files/config/gitlab.rb b/Docker-Compose/gitlab/files/config/gitlab.rb deleted file mode 100644 index db8cc41..0000000 --- a/Docker-Compose/gitlab/files/config/gitlab.rb +++ /dev/null @@ -1,94 +0,0 @@ -# GitLab Configuration -external_url '<< external_url >>' - -# Initial root user configuration (only used on first initialization) -gitlab_rails['initial_root_password'] = '<< root_password >>' -gitlab_rails['initial_root_email'] = '<< root_email >>' - -# GitLab Shell SSH settings -gitlab_rails['gitlab_shell_ssh_port'] = << ports_ssh >> - -# Let's Encrypt and built-in TLS settings are currently not supported by the template -# as we are using Traefik as a reverse proxy -letsencrypt['enable'] = false -nginx['listen_port'] = 80 -nginx['listen_https'] = false - -<%- if traefik_tls_enabled %> -# Traefik settings, to redirect http to https -nginx['redirect_http_to_https'] = true -<%- endif %> - -<%- if registry_enabled %> -# Container Registry settings -registry_external_url '<< registry_external_url >>' -gitlab_rails['registry_enabled'] = true -registry_nginx['listen_https'] = false -registry_nginx['listen_port'] = 5000 -<%- endif %> - -<%- if authentik_enabled %> -# Authentik SSO settings -gitlab_rails['omniauth_auto_link_user'] = ['openid_connect'] -gitlab_rails['omniauth_providers'] = [ - { - name: "openid_connect", - label: "Authentik", - icon: "https://avatars.githubusercontent.com/u/82976448?s=200&v=4", - args: { - name: "openid_connect", - scope: ["openid","profile","email"], - response_type: "code", - issuer: "<< authentik_url >>/application/o/<< authentik_slug >>/", - discovery: true, - client_auth_method: "query", - uid_field: "email", - send_scope_to_token_endpoint: "false", - pkce: true, - client_options: { - identifier: "<< authentik_client_id >>", - secret: "<< authentik_client_secret >>", - redirect_uri: "<< external_url >>/users/auth/openid_connect/callback" - } - } - } -] -<%- endif %> - -<%- if email_enabled %> -# SMTP settings -gitlab_rails['smtp_enable'] = true -gitlab_rails['smtp_address'] = "<< email_host >>" -gitlab_rails['smtp_port'] = << email_port >> -gitlab_rails['smtp_user_name'] = "<< email_username >>" -gitlab_rails['smtp_password'] = "<< email_password >>" -gitlab_rails['smtp_authentication'] = "login" -<%- if email_use_ssl %> -gitlab_rails['smtp_ssl'] = true -gitlab_rails['smtp_force_ssl'] = true -<%- elif email_use_tls %> -gitlab_rails['smtp_tls'] = true -<%- endif %> -gitlab_rails['gitlab_email_from'] = '<< email_from >>' -gitlab_rails['gitlab_email_reply_to'] = '<< email_from >>' -<%- endif %> - -<%- if performance_preset == 'homelab' %> -# Performance optimizations for homelab/low-resource environments -# NOTE: These settings reduce resource usage but may impact performance under high load -postgresql['shared_buffers'] = "256MB" -sidekiq['max_concurrency'] = 4 -sidekiq['concurrency'] = 1 -puma['worker_timeout'] = 120 -puma['worker_processes'] = 1 -<%- endif %> - -# Prometheus monitoring -prometheus_monitoring['enable'] = << prometheus_enabled | lower >> - -# Default UI settings -gitlab_rails['gitlab_default_theme'] = << default_theme >> -gitlab_rails['gitlab_default_color_mode'] = << default_color_mode >> - -# Product usage data -gitlab_rails['initial_gitlab_product_usage_data'] = <%- if disable_usage_data %>false<%- else %>true<%- endif %> diff --git a/Docker-Compose/gitlab/template.json b/Docker-Compose/gitlab/template.json deleted file mode 100644 index ecbbf23..0000000 --- a/Docker-Compose/gitlab/template.json +++ /dev/null @@ -1,428 +0,0 @@ -{ - "slug": "gitlab", - "kind": "compose", - "metadata": { - "name": "GitLab", - "description": "Complete DevOps platform providing Git repository management, CI/CD pipelines, issue tracking, and an optional container registry in a single application.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "gitlab" - }, - "draft": false, - "version": { - "name": "18.11.2-ce.0", - "source_dep_name": "docker.io/gitlab/gitlab-ce", - "source_dep_version": "18.11.2-ce.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "gitlab", - "config": { - "placeholder": "gitlab" - } - }, - { - "name": "external_url", - "type": "str", - "title": "External URL", - "required": false, - "default": "http://localhost", - "config": { - "placeholder": "http://localhost" - } - }, - { - "name": "root_email", - "type": "str", - "title": "Root Email", - "required": true, - "description": "Initial root user email address", - "config": { - "placeholder": "admin@home.arpa" - } - }, - { - "name": "root_password", - "type": "secret", - "title": "Root Password", - "required": false, - "description": "Initial root user password (only used on first initialization)", - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "default_theme", - "type": "int", - "title": "UI Theme", - "required": false, - "default": 2, - "description": "Default GitLab UI theme (2 = dark mode)", - "config": { - "placeholder": "2" - } - }, - { - "name": "default_color_mode", - "type": "int", - "title": "Color Mode", - "required": false, - "default": 2, - "description": "Default color mode (2 = dark mode)", - "config": { - "placeholder": "2" - } - }, - { - "name": "disable_usage_data", - "type": "bool", - "title": "Usage Data", - "required": false, - "default": true, - "description": "Disable product usage metrics upload to GitLab" - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Advanced Settings", - "name": "advanced", - "items": [ - { - "name": "performance_preset", - "type": "enum", - "title": "Performance optimization profile", - "required": false, - "default": "homelab", - "config": { - "options": [ - "homelab", - "default" - ] - } - }, - { - "name": "prometheus_enabled", - "type": "bool", - "title": "Prometheus", - "required": false, - "default": false - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 80, - "config": { - "placeholder": "80" - } - }, - { - "name": "ports_ssh", - "type": "str", - "title": "Ports Ssh", - "required": false, - "default": 2424, - "config": { - "placeholder": "2424" - } - }, - { - "name": "ports_registry", - "type": "int", - "title": "Container Registry port", - "required": false, - "default": 5000, - "config": { - "placeholder": "5000" - } - } - ] - }, - { - "title": "Registry", - "toggle": "registry_enabled", - "name": "registry", - "items": [ - { - "name": "registry_enabled", - "type": "bool", - "title": "Registry", - "required": false, - "default": false - }, - { - "name": "registry_external_url", - "type": "str", - "title": "Registry URL", - "required": false, - "default": "http://localhost:5000", - "description": "External URL for Container Registry", - "config": { - "placeholder": "http://localhost:5000" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "gitlab" - } - }, - { - "name": "traefik_registry_host", - "type": "str", - "title": "Registry Host", - "required": false, - "default": "registry.home.arpa", - "description": "Hostname for Container Registry in Traefik (if enabled)", - "needs": [ - "registry_enabled=true" - ], - "config": { - "placeholder": "registry.home.arpa" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Email", - "toggle": "email_enabled", - "name": "email", - "items": [ - { - "name": "email_enabled", - "type": "bool", - "title": "Email", - "required": false, - "default": false - }, - { - "name": "email_host", - "type": "str", - "title": "SMTP server hostname", - "required": false, - "default": "", - "config": { - "placeholder": "smtp.home.arpa" - } - }, - { - "name": "email_port", - "type": "int", - "title": "SMTP server port", - "required": false, - "default": 587, - "config": { - "placeholder": "587" - } - }, - { - "name": "email_username", - "type": "str", - "title": "SMTP username", - "required": false, - "default": "", - "config": { - "placeholder": "user@example.com" - } - }, - { - "name": "email_password", - "type": "secret", - "title": "SMTP password", - "required": false, - "default": "" - }, - { - "name": "email_from", - "type": "str", - "title": "From email address", - "required": false, - "default": "", - "config": { - "placeholder": "noreply@example.com" - } - }, - { - "name": "email_use_tls", - "type": "bool", - "title": "SMTP TLS", - "required": false, - "default": true - }, - { - "name": "email_use_ssl", - "type": "bool", - "title": "SMTP SSL", - "required": false, - "default": false - } - ] - }, - { - "title": "Authentik", - "toggle": "authentik_enabled", - "name": "authentik", - "items": [ - { - "name": "authentik_enabled", - "type": "bool", - "title": "Authentik SSO", - "required": false, - "default": false - }, - { - "name": "authentik_url", - "type": "str", - "title": "Auth URL", - "required": false, - "default": "https://auth.home.arpa", - "description": "Authentik base URL (e.g., https://auth.home.arpa)", - "config": { - "placeholder": "https://auth.home.arpa" - } - }, - { - "name": "authentik_slug", - "type": "str", - "title": "Authentik application slug", - "required": false, - "default": "gitlab", - "config": { - "placeholder": "gitlab" - } - }, - { - "name": "authentik_client_id", - "type": "str", - "title": "Client ID", - "required": false, - "default": "", - "description": "OAuth client ID from Authentik provider" - }, - { - "name": "authentik_client_secret", - "type": "secret", - "title": "Client Secret", - "required": false, - "default": "", - "description": "OAuth client secret from Authentik provider" - } - ] - } - ] -} diff --git a/Docker-Compose/grafana/files/.env b/Docker-Compose/grafana/files/.env deleted file mode 100644 index dd556bd..0000000 --- a/Docker-Compose/grafana/files/.env +++ /dev/null @@ -1,9 +0,0 @@ -# Grafana credentials -<%- if database_type == 'postgres' %> -DATABASE_USER=<< database_user >> -GRAFANA_DB_PASSWORD=<< database_password >> -<%- endif %> -<%- if authentik_enabled %> -GRAFANA_OAUTH_CLIENT_ID=<< authentik_client_id >> -GRAFANA_OAUTH_CLIENT_SECRET=<< authentik_client_secret >> -<%- endif %> diff --git a/Docker-Compose/grafana/files/compose.yaml b/Docker-Compose/grafana/files/compose.yaml deleted file mode 100644 index 24c1f0c..0000000 --- a/Docker-Compose/grafana/files/compose.yaml +++ /dev/null @@ -1,108 +0,0 @@ -services: - << service_name >>: - image: docker.io/grafana/grafana:13.0.1 - restart: << restart_policy >> - <%- if database_type == 'postgres' or authentik_enabled %> - environment: - <%- if database_type == 'postgres' %> - - GF_DATABASE_TYPE=postgres - <%- if database_external %> - - GF_DATABASE_HOST=<< database_host >> - <%- else %> - - GF_DATABASE_HOST=<< service_name >>_db - <%- endif %> - - GF_DATABASE_NAME=<< database_name >> - - GF_DATABASE_USER=${DATABASE_USER} - - GF_DATABASE_PASSWORD=${GRAFANA_DB_PASSWORD} - - GF_DATABASE_SSL_MODE=disable - <%- endif %> - <%- if authentik_enabled %> - - GF_AUTH_GENERIC_OAUTH_ENABLED=true - - GF_AUTH_GENERIC_OAUTH_NAME=<< authentik_slug >> - - GF_AUTH_GENERIC_OAUTH_CLIENT_ID=${GRAFANA_OAUTH_CLIENT_ID} - - GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET=${GRAFANA_OAUTH_CLIENT_SECRET} - - GF_AUTH_GENERIC_OAUTH_SCOPES=openid profile email - - GF_AUTH_GENERIC_OAUTH_AUTH_URL=<< authentik_url >>/application/o/authorize/ - - GF_AUTH_GENERIC_OAUTH_TOKEN_URL=<< authentik_url >>/application/o/token/ - - GF_AUTH_GENERIC_OAUTH_API_URL=<< authentik_url >>/application/o/userinfo/ - - GF_AUTH_SIGNOUT_REDIRECT_URL=<< authentik_url >>/application/o/<< authentik_slug >>/end-session/ - - GF_AUTH_OAUTH_AUTO_LOGIN=true - <%- if traefik_enabled %> - - GF_SERVER_ROOT_URL=https://<< traefik_host >>.<< traefik_domain >> - <%- endif %> - - GF_AUTH_OAUTH_ALLOW_INSECURE_EMAIL_LOOKUP=true - - GF_AUTH_GENERIC_OAUTH_SKIP_ORG_ROLE_SYNC=true - <%- endif %> - <%- endif %> - <%- if not database_external and (database_type == "postgres") or traefik_enabled %> - networks: - <%- if not database_external and database_type != 'sqlite' %> - - << service_name >>_backend - <%- endif %> - <%- if traefik_enabled %> - - << traefik_network >> - <%- endif %> - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:3000" - <%- endif %> - volumes: - - << service_name >>_data:/var/lib/grafana - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=3000 - - traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_https.tls=true - - traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - - <%- if not database_external and database_type == "postgres" %> - << service_name >>_db: - image: docker.io/library/postgres:17.9 - restart: << restart_policy >> - environment: - - POSTGRES_USER=${DATABASE_USER} - - POSTGRES_PASSWORD=${GRAFANA_DB_PASSWORD} - - POSTGRES_DB=<< database_name >> - networks: - - << service_name >>_backend - healthcheck: - test: ["CMD-SHELL", "pg_isready -U << database_user >>"] - start_period: 30s - interval: 10s - timeout: 10s - retries: 5 - volumes: - - << service_name >>_db:/var/lib/postgresql/data - <%- endif %> - -<%- if not database_external and (database_type == "postgres") or traefik_enabled %> -networks: - <%- if not database_external %> - << service_name >>_backend: - driver: bridge - <%- endif %> - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> -<%- endif %> - - -volumes: - << service_name >>_data: - driver: local - <%- if not database_external and database_type == 'postgres' %> - << service_name >>_db: - driver: local - <%- endif %> diff --git a/Docker-Compose/grafana/template.json b/Docker-Compose/grafana/template.json deleted file mode 100644 index 9cafe5e..0000000 --- a/Docker-Compose/grafana/template.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "slug": "grafana", - "kind": "compose", - "metadata": { - "name": "Grafana", - "description": "Open-source observability platform for visualizing and analyzing metrics, logs, and traces from various data sources through flexible, customizable dashboards.", - "tags": [ - "traefik", - "authentik" - ], - "icon": { - "provider": "selfhst", - "id": "grafana" - }, - "draft": false, - "version": { - "name": "13.0.1", - "source_dep_name": "docker.io/grafana/grafana", - "source_dep_version": "13.0.1" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "grafana", - "config": { - "placeholder": "grafana" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 3000, - "config": { - "placeholder": "3000" - } - } - ] - }, - { - "title": "Authentik", - "toggle": "authentik_enabled", - "name": "authentik", - "items": [ - { - "name": "authentik_enabled", - "type": "bool", - "title": "Authentik SSO", - "required": false, - "default": false - }, - { - "name": "authentik_url", - "type": "str", - "title": "Authentik Url", - "required": true, - "default": "https://auth.home.arpa", - "needs": [ - "authentik_enabled=true" - ], - "config": { - "placeholder": "https://auth.home.arpa" - } - }, - { - "name": "authentik_slug", - "type": "str", - "title": "Authentik Slug", - "required": true, - "default": "grafana", - "needs": [ - "authentik_enabled=true" - ], - "config": { - "placeholder": "grafana" - } - }, - { - "name": "authentik_client_id", - "type": "secret", - "title": "Authentik Client Id", - "required": true, - "needs": [ - "authentik_enabled=true" - ] - }, - { - "name": "authentik_client_secret", - "type": "secret", - "title": "Authentik Client Secret", - "required": true, - "needs": [ - "authentik_enabled=true" - ] - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "grafana" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_type", - "type": "enum", - "title": "Database Type", - "required": false, - "config": { - "options": [ - "sqlite", - "postgres" - ] - } - }, - { - "name": "database_external", - "type": "bool", - "title": "External Database", - "required": false, - "default": false, - "needs": [ - "database_type=postgres" - ] - }, - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": false, - "default": "grafana", - "needs": [ - "database_type=postgres" - ], - "config": { - "placeholder": "grafana" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": false, - "default": "grafana", - "needs": [ - "database_type=postgres" - ], - "config": { - "placeholder": "grafana" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database Password", - "required": true, - "needs": [ - "database_type=postgres" - ] - }, - { - "name": "database_host", - "type": "str", - "title": "Database Host", - "required": true, - "needs": [ - "database_type=postgres", - "database_external=true" - ], - "config": { - "placeholder": "postgres.home.arpa" - } - } - ] - } - ] -} diff --git a/Docker-Compose/homeassistant/files/compose.yaml b/Docker-Compose/homeassistant/files/compose.yaml deleted file mode 100644 index d6a6249..0000000 --- a/Docker-Compose/homeassistant/files/compose.yaml +++ /dev/null @@ -1,15 +0,0 @@ -services: - << service_name >>: - container_name: << container_name >> - image: ghcr.io/home-assistant/home-assistant:2026.4.4 - network_mode: host - environment: - - TZ=<< container_timezone >> - volumes: - - ./config:/config - - /etc/localtime:/etc/localtime:ro - - /run/dbus:/run/dbus:ro - # devices: - # - /dev/ttyACMO # (optional) Add serial devices to the container - privileged: true - restart: << restart_policy >> diff --git a/Docker-Compose/homeassistant/template.json b/Docker-Compose/homeassistant/template.json deleted file mode 100644 index 24f78d6..0000000 --- a/Docker-Compose/homeassistant/template.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "slug": "homeassistant", - "kind": "compose", - "metadata": { - "name": "Homeassistant", - "description": "Open-source smart home automation platform that puts local control and privacy first. Supports thousands of devices and integrations.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "home-assistant" - }, - "draft": false, - "version": { - "name": "2026.4.4", - "source_dep_name": "ghcr.io/home-assistant/home-assistant", - "source_dep_version": "2026.4.4" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "homeassistant", - "config": { - "placeholder": "homeassistant" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": false, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "homeassistant", - "config": { - "placeholder": "homeassistant" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "default": "UTC", - "config": { - "placeholder": "UTC" - } - } - ] - } - ] -} diff --git a/Docker-Compose/homepage/files/compose.yaml b/Docker-Compose/homepage/files/compose.yaml deleted file mode 100644 index 90df186..0000000 --- a/Docker-Compose/homepage/files/compose.yaml +++ /dev/null @@ -1,90 +0,0 @@ -services: - << service_name >>: - image: ghcr.io/gethomepage/homepage:v1.12.3 - restart: << restart_policy >> - <%- if container_name %> - container_name: << container_name >> - <%- endif %> - environment: - <%- if traefik_enabled %> - - HOMEPAGE_ALLOWED_HOSTS=<< traefik_host >>.<< traefik_domain >> - <%- else %> - - HOMEPAGE_ALLOWED_HOSTS=localhost:<< ports_http >>,127.0.0.1:<< ports_http >> - <%- endif %> - <%- if container_timezone %> - - TZ=<< container_timezone >> - <%- endif %> - <%- if container_loglevel %> - - LOG_LEVEL=<< container_loglevel >> - <%- endif %> - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if not traefik_enabled %> - ports: - - << ports_http >>:3000 - <%- endif %> - volumes: - <%- if volume_mode == 'local' %> - - << service_name >>_config:/app/config - - << service_name >>_images:/app/images - - << service_name >>_icons:/app/icons - <%- elif volume_mode == 'mount' %> - - << volume_mount_path >>/<< service_name >>/config:/app/config - - << volume_mount_path >>/<< service_name >>/images:/app/images - - << volume_mount_path >>/<< service_name >>/icons:/app/icons - <%- elif volume_mode == 'nfs' %> - - << service_name >>_config:/app/config - - << service_name >>_images:/app/images - - << service_name >>_icons:/app/icons - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadbalancer.server.port=3000 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>_config: - << service_name >>_images: - << service_name >>_icons: -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>_config: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/config" - << service_name >>_images: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/images" - << service_name >>_icons: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/icons" -<%- endif %> diff --git a/Docker-Compose/homepage/template.json b/Docker-Compose/homepage/template.json deleted file mode 100644 index 129434b..0000000 --- a/Docker-Compose/homepage/template.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "slug": "homepage", - "kind": "compose", - "metadata": { - "name": "Homepage", - "description": "Modern, fully static, fast application dashboard with integrations for over 100 services and translations into multiple languages.", - "tags": [ - "traefik", - "volume_modes" - ], - "icon": { - "provider": "selfhst", - "id": "homepage" - }, - "draft": false, - "version": { - "name": "v1.12.3", - "source_dep_name": "ghcr.io/gethomepage/homepage", - "source_dep_version": "v1.12.3" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "The service name", - "required": true, - "default": "homepage", - "config": { - "placeholder": "homepage" - } - }, - { - "name": "container_name", - "type": "str", - "title": "The container name", - "required": false, - "default": "homepage", - "config": { - "placeholder": "homepage" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "The container timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "container_loglevel", - "type": "enum", - "title": "Log Level", - "required": false, - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "The HTTP port", - "required": true, - "default": 3000, - "needs": [ - "traefik_enabled=false" - ], - "config": { - "placeholder": "3000" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "homepage" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/mnt/storage", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/mnt/storage" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "NFS Options", - "required": false, - "default": "nfsvers=4,soft,timeo=180,intr", - "config": { - "placeholder": "nfsvers=4,soft,timeo=180,intr" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "NFS Path", - "required": false, - "default": "", - "config": { - "placeholder": "/export/app" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "NFS Server", - "required": false, - "default": "", - "config": { - "placeholder": "nas.home.arpa" - } - } - ] - } - ] -} diff --git a/Docker-Compose/homer/files/assets/config.yml b/Docker-Compose/homer/files/assets/config.yml deleted file mode 100644 index 676c071..0000000 --- a/Docker-Compose/homer/files/assets/config.yml +++ /dev/null @@ -1,71 +0,0 @@ ---- -# Homepage configuration -# See https://fontawesome.com/icons for icons options - -title: "<< homer_title >>" -subtitle: "<< homer_subtitle >>" -logo: "<< homer_logo >>" -# icon: "fas fa-home" # Optional icon instead of logo - -header: true -footer: false # Set to "" to enable footer with a custom message - -# Optional theme customization -theme: default # Options: default, sui -# colors: -# light: -# highlight-primary: "#3367d6" -# highlight-secondary: "#4285f4" -# highlight-hover: "#5a95f5" -# background: "#f5f5f5" -# card-background: "#ffffff" -# text: "#363636" -# text-header: "#ffffff" -# dark: -# highlight-primary: "#3367d6" -# highlight-secondary: "#4285f4" -# highlight-hover: "#5a95f5" -# background: "#131313" -# card-background: "#2b2b2b" -# text: "#eaeaea" -# text-header: "#ffffff" - -# Optional message displayed at the top -# message: -# style: "is-dark" # Options: is-dark, is-warning, is-info, is-success, is-danger -# title: "Welcome!" -# icon: "fa fa-grin" -# content: "This is your Homer dashboard.
Add your services below." - -# Optional navbar links -# links: -# - name: "GitHub" -# icon: "fab fa-github" -# url: "https://github.com" -# target: "_blank" # optional: open in new tab -# - name: "Documentation" -# icon: "fas fa-book" -# url: "https://github.com/bastienwirtz/homer/blob/main/docs/configuration.md" - -# Services -# First level array represents a group. -# Leave only an "items" key if not using groups (group name, icon & tagstyle are optional) -services: - - name: "Applications" - icon: "fas fa-cloud" - # items: - # - name: "Example App" - # logo: "assets/tools/sample.png" # or use "icon: fas fa-server" - # subtitle: "Description of the app" - # tag: "app" # Optional tag - # tagstyle: "is-success" # Optional: is-success, is-warning, is-info, is-danger - # url: "https://example.com" - # target: "_blank" # optional: open in new tab - - # - name: "Monitoring" - # icon: "fas fa-chart-line" - # items: - # - name: "Grafana" - # icon: "fas fa-chart-area" - # subtitle: "Metrics & dashboards" - # url: "https://grafana.example.com" diff --git a/Docker-Compose/homer/files/compose.yaml b/Docker-Compose/homer/files/compose.yaml deleted file mode 100644 index 43b8f0e..0000000 --- a/Docker-Compose/homer/files/compose.yaml +++ /dev/null @@ -1,43 +0,0 @@ -services: - << service_name >>: - image: docker.io/b4bz/homer:v26.4.2 - restart: << restart_policy >> - <%- if container_name %> - container_name: << container_name >> - <%- endif %> - <%- if container_timezone %> - environment: - - TZ=<< container_timezone >> - <%- endif %> - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:8080" - <%- endif %> - volumes: - - ./assets:/www/assets - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=8080 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/homer/template.json b/Docker-Compose/homer/template.json deleted file mode 100644 index eba9a03..0000000 --- a/Docker-Compose/homer/template.json +++ /dev/null @@ -1,261 +0,0 @@ -{ - "slug": "homer", - "kind": "compose", - "metadata": { - "name": "Homer", - "description": "Simple static homepage for your server to keep your services on hand, configured through a single YAML file.", - "tags": [ - "traefik", - "authentik" - ], - "icon": { - "provider": "selfhst", - "id": "homer" - }, - "draft": false, - "version": { - "name": "v26.4.2", - "source_dep_name": "docker.io/b4bz/homer", - "source_dep_version": "v26.4.2" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "homer", - "config": { - "placeholder": "homer" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "homer", - "config": { - "placeholder": "homer" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "homer_title", - "type": "str", - "title": "Dashboard title", - "required": false, - "default": "Dashboard", - "config": { - "placeholder": "Dashboard" - } - }, - { - "name": "homer_subtitle", - "type": "str", - "title": "Dashboard subtitle", - "required": false, - "default": "Dashboard", - "config": { - "placeholder": "Dashboard" - } - }, - { - "name": "homer_logo", - "type": "str", - "title": "Logo Path", - "required": false, - "default": "logo-file.png", - "description": "Logo file path (relative to assets/)", - "config": { - "placeholder": "logo-file.png" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 8080, - "config": { - "placeholder": "8080" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "dashboard" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Authentik SSO", - "toggle": "authentik_enabled", - "name": "authentik", - "items": [ - { - "name": "authentik_traefik_middleware", - "type": "str", - "title": "Authentik Traefik Middleware", - "required": true, - "default": "middleware@file", - "needs": [ - "traefik_enabled=true" - ], - "config": { - "placeholder": "middleware@file" - } - }, - { - "name": "authentik_client_id", - "type": "str", - "title": "Client ID", - "required": false, - "default": "" - }, - { - "name": "authentik_client_secret", - "type": "str", - "title": "Client Secret", - "required": false, - "default": "" - }, - { - "name": "authentik_enabled", - "type": "bool", - "title": "Authentik SSO", - "required": false, - "default": false - }, - { - "name": "authentik_slug", - "type": "str", - "title": "Slug", - "required": false, - "default": "" - }, - { - "name": "authentik_url", - "type": "str", - "title": "The Authentik URL", - "required": false, - "default": "" - } - ] - } - ] -} diff --git a/Docker-Compose/infisical/files/.env b/Docker-Compose/infisical/files/.env deleted file mode 100644 index 593ade3..0000000 --- a/Docker-Compose/infisical/files/.env +++ /dev/null @@ -1,33 +0,0 @@ -# Infisical core configuration -SITE_URL='<< infisical_site_url >>' -ENCRYPTION_KEY='<< infisical_encryption_key >>' -AUTH_SECRET='<< infisical_auth_secret >>' - -# Data stores -<%- if database_external %> -DB_CONNECTION_URI='<< database_connection_uri >>' -<%- else %> -POSTGRES_USER='<< database_user >>' -POSTGRES_PASSWORD='<< database_password >>' -POSTGRES_DB='<< database_name >>' -DB_CONNECTION_URI='postgresql://<< database_user >>:<< database_password >>@<< service_name or 'infisical' >>_postgres:5432/<< database_name >>?sslmode=disable' -<%- endif %> -<%- if redis_external %> -REDIS_URL='<< redis_url >>' -<%- else %> -REDIS_PASSWORD='<< redis_password >>' -REDIS_URL='redis://:<< redis_password >>@<< service_name or 'infisical' >>_redis:6379' -<%- endif %> - -<%- if email_enabled %> -# SMTP configuration -SMTP_HOST='<< email_host >>' -SMTP_PORT='<< email_port >>' -SMTP_FROM_ADDRESS='<< email_from_address >>' -SMTP_FROM_NAME='<< email_from_name >>' -SMTP_USERNAME='<< email_username >>' -SMTP_PASSWORD='<< email_password >>' -SMTP_SECURE='<< email_secure | lower >>' -SMTP_REQUIRE_TLS='<< email_require_tls | lower >>' -SMTP_IGNORE_TLS='<< email_ignore_tls | lower >>' -<%- endif %> diff --git a/Docker-Compose/infisical/files/compose.yaml b/Docker-Compose/infisical/files/compose.yaml deleted file mode 100644 index 20d9184..0000000 --- a/Docker-Compose/infisical/files/compose.yaml +++ /dev/null @@ -1,138 +0,0 @@ ---- -services: - << service_name or 'infisical' >>: - image: infisical/infisical:v0.158.0 - restart: << restart_policy >> - <%- if container_name %> - container_name: << container_name >> - <%- endif %> - environment: - - NODE_ENV=production - - SITE_URL=${SITE_URL} - - ENCRYPTION_KEY=${ENCRYPTION_KEY} - - AUTH_SECRET=${AUTH_SECRET} - - DB_CONNECTION_URI=${DB_CONNECTION_URI} - - REDIS_URL=${REDIS_URL} - <%- if email_enabled %> - - SMTP_HOST=${SMTP_HOST} - - SMTP_PORT=${SMTP_PORT} - - SMTP_FROM_ADDRESS=${SMTP_FROM_ADDRESS} - - SMTP_FROM_NAME=${SMTP_FROM_NAME} - - SMTP_USERNAME=${SMTP_USERNAME} - - SMTP_PASSWORD=${SMTP_PASSWORD} - - SMTP_SECURE=${SMTP_SECURE} - - SMTP_REQUIRE_TLS=${SMTP_REQUIRE_TLS} - - SMTP_IGNORE_TLS=${SMTP_IGNORE_TLS} - <%- endif %> - <%- if (not database_external) or (not redis_external) %> - depends_on: - <%- if not database_external %> - << service_name or 'infisical' >>_postgres: - condition: service_healthy - <%- endif %> - <%- if not redis_external %> - << service_name or 'infisical' >>_redis: - condition: service_started - <%- endif %> - <%- endif %> - networks: - - << service_name or 'infisical' >>_backend - <%- if traefik_enabled %> - - << traefik_network >> - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:8080" - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name or 'infisical' >>.loadBalancer.server.port=8080 - - traefik.http.routers.<< service_name or 'infisical' >>_http.service=<< service_name or 'infisical' >> - - traefik.http.routers.<< service_name or 'infisical' >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name or 'infisical' >>_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name or 'infisical' >>_https.service=<< service_name or 'infisical' >> - - traefik.http.routers.<< service_name or 'infisical' >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name or 'infisical' >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name or 'infisical' >>_https.tls=true - - traefik.http.routers.<< service_name or 'infisical' >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - - <%- if not database_external %> - << service_name or 'infisical' >>_postgres: - image: docker.io/library/postgres:14-alpine - restart: << restart_policy >> - environment: - - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - - POSTGRES_DB=${POSTGRES_DB} - healthcheck: - test: ["CMD-SHELL", "pg_isready --username=$${POSTGRES_USER} --dbname=$${POSTGRES_DB}"] - interval: 5s - timeout: 10s - retries: 10 - networks: - - << service_name or 'infisical' >>_backend - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/postgres:/var/lib/postgresql/data - <%- elif volume_mode == 'local' or volume_mode == 'nfs' %> - - << service_name or 'infisical' >>_postgres:/var/lib/postgresql/data - <%- endif %> - <%- endif %> - - <%- if not redis_external %> - << service_name or 'infisical' >>_redis: - image: docker.io/library/redis:7-alpine - restart: << restart_policy >> - command: ["redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD}"] - networks: - - << service_name or 'infisical' >>_backend - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/redis:/data - <%- elif volume_mode == 'local' or volume_mode == 'nfs' %> - - << service_name or 'infisical' >>_redis:/data - <%- endif %> - <%- endif %> - -networks: - << service_name or 'infisical' >>_backend: - driver: bridge - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> - -<%- if volume_mode == 'local' and ((not database_external) or (not redis_external)) %> -volumes: - <%- if not database_external %> - << service_name or 'infisical' >>_postgres: - driver: local - <%- endif %> - <%- if not redis_external %> - << service_name or 'infisical' >>_redis: - driver: local - <%- endif %> -<%- elif volume_mode == 'nfs' and ((not database_external) or (not redis_external)) %> -volumes: - <%- if not database_external %> - << service_name or 'infisical' >>_postgres: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/postgres" - <%- endif %> - <%- if not redis_external %> - << service_name or 'infisical' >>_redis: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/redis" - <%- endif %> -<%- endif %> diff --git a/Docker-Compose/infisical/template.json b/Docker-Compose/infisical/template.json deleted file mode 100644 index 5577e9a..0000000 --- a/Docker-Compose/infisical/template.json +++ /dev/null @@ -1,681 +0,0 @@ -{ - "slug": "infisical-compose", - "kind": "compose", - "metadata": { - "name": "Infisical", - "description": "Open-source secrets management platform for teams and homelabs, including PostgreSQL, Redis, SMTP, and Traefik-friendly Docker Compose configuration.", - "tags": [ - "secrets", - "postgresql", - "redis", - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "infisical", - "color": "amber" - }, - "draft": false, - "version": { - "name": "v0.158.0", - "source_dep_name": "infisical/infisical", - "source_dep_version": "v0.158.0" - } - }, - "variables": [ - { - "name": "general", - "title": "General", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "config": { - "placeholder": "infisical" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "description": "Name to use for the container. Leave empty to omit container_name and let Compose generate it.", - "config": { - "placeholder": "infisical" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "description": "Container restart policy.", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "name": "infisical", - "title": "Infisical", - "items": [ - { - "name": "infisical_site_url", - "type": "str", - "title": "Site URL", - "required": true, - "default": "https://infisical.home.arpa", - "config": { - "placeholder": "https://infisical.home.arpa" - } - }, - { - "name": "infisical_encryption_key", - "type": "secret", - "title": "Encryption Key", - "required": true, - "description": "Infisical ENCRYPTION_KEY. Back this up securely; losing it makes stored secrets unrecoverable.", - "config": { - "autogenerated": { - "length": 32, - "characters": [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "a", - "b", - "c", - "d", - "e", - "f" - ] - } - } - }, - { - "name": "infisical_auth_secret", - "type": "secret", - "title": "Auth Secret", - "required": true, - "config": { - "autogenerated": { - "kind": "base64", - "bytes": 32 - } - } - } - ] - }, - { - "name": "database", - "title": "PostgreSQL", - "items": [ - { - "name": "database_external", - "type": "bool", - "title": "External PostgreSQL", - "required": false, - "default": false - }, - { - "name": "database_connection_uri", - "type": "secret", - "title": "External DB Connection URI", - "required": true, - "description": "Full PostgreSQL connection URI for external databases. URL-encode special characters in usernames/passwords.", - "needs": [ - "database_external=true" - ], - "config": { - "placeholder": "postgresql://infisical:password@postgres.example.internal:5432/infisical?sslmode=disable" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": true, - "default": "infisical", - "needs": [ - "database_external=false" - ], - "config": { - "placeholder": "infisical" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database Password", - "required": true, - "description": "PostgreSQL password for the bundled database.", - "needs": [ - "database_external=false" - ], - "config": { - "autogenerated": { - "length": 32, - "characters": [ - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ] - } - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": true, - "default": "infisical", - "needs": [ - "database_external=false" - ], - "config": { - "placeholder": "infisical" - } - } - ] - }, - { - "name": "redis", - "title": "Redis", - "items": [ - { - "name": "redis_external", - "type": "bool", - "title": "External Redis", - "required": false, - "default": false - }, - { - "name": "redis_url", - "type": "secret", - "title": "External Redis URL", - "required": true, - "description": "Full Redis URL for external Redis, for example redis://:password@redis.example.internal:6379.", - "needs": [ - "redis_external=true" - ], - "config": { - "placeholder": "redis://:password@redis.example.internal:6379" - } - }, - { - "name": "redis_password", - "type": "secret", - "title": "Redis Password", - "required": true, - "needs": [ - "redis_external=false" - ], - "config": { - "autogenerated": { - "length": 32, - "characters": [ - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ] - } - } - } - ] - }, - { - "name": "ports", - "title": "Ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": "8080", - "description": "Host port exposed when Traefik integration is disabled.", - "config": { - "placeholder": "8080" - } - } - ] - }, - { - "name": "traefik", - "title": "Traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": true, - "description": "Attach to an external Traefik network and create routing labels." - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "default": "infisical", - "needs": [ - "traefik_enabled=true" - ], - "config": { - "placeholder": "infisical" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "default": "home.arpa", - "needs": [ - "traefik_enabled=true" - ], - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "description": "Traefik HTTP entrypoint.", - "needs": [ - "traefik_enabled=true" - ], - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "description": "External Docker network used by Traefik.", - "needs": [ - "traefik_enabled=true" - ], - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": true, - "description": "Create a TLS router for Traefik.", - "needs": [ - "traefik_enabled=true" - ] - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "description": "Traefik HTTPS entrypoint.", - "needs": [ - "traefik_enabled=true", - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "needs": [ - "traefik_enabled=true", - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "cloudflare" - } - } - ] - }, - { - "name": "volume", - "title": "Volumes", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "description": "Storage mode for bundled PostgreSQL and Redis data.", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Mount Path", - "required": true, - "default": "/data/infisical", - "description": "Base host path used when volume mode is mount.", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/data/infisical" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "NFS Server", - "required": true, - "default": "NFS_SERVER", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "NFS_SERVER" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "NFS Path", - "required": true, - "default": "/export/infisical", - "description": "NFS export path.", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/export/infisical" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "NFS Options", - "required": true, - "default": "rw,nolock,soft", - "description": "NFS mount options.", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw,nolock,soft" - } - } - ] - }, - { - "name": "email", - "title": "Email", - "toggle": "email_enabled", - "items": [ - { - "name": "email_enabled", - "type": "bool", - "title": "SMTP Email", - "required": false, - "default": false - }, - { - "name": "email_host", - "type": "str", - "title": "SMTP Host", - "required": true, - "default": "smtp.home.arpa", - "needs": [ - "email_enabled=true" - ], - "config": { - "placeholder": "smtp.home.arpa" - } - }, - { - "name": "email_port", - "type": "int", - "title": "SMTP Port", - "required": true, - "default": 587, - "needs": [ - "email_enabled=true" - ], - "config": { - "placeholder": "587" - } - }, - { - "name": "email_from_address", - "type": "str", - "title": "From Address", - "required": true, - "default": "infisical@home.arpa", - "needs": [ - "email_enabled=true" - ], - "config": { - "placeholder": "infisical@home.arpa" - } - }, - { - "name": "email_from_name", - "type": "str", - "title": "From Name", - "required": false, - "default": "Infisical", - "needs": [ - "email_enabled=true" - ], - "config": { - "placeholder": "Infisical" - } - }, - { - "name": "email_username", - "type": "str", - "title": "SMTP Username", - "required": true, - "default": "", - "needs": [ - "email_enabled=true" - ], - "config": { - "placeholder": "user@example.com" - } - }, - { - "name": "email_password", - "type": "secret", - "title": "SMTP Password", - "required": true, - "needs": [ - "email_enabled=true" - ] - }, - { - "name": "email_secure", - "type": "bool", - "title": "SMTP Secure", - "required": false, - "default": false, - "needs": [ - "email_enabled=true" - ] - }, - { - "name": "email_require_tls", - "type": "bool", - "title": "Require TLS", - "required": false, - "default": true, - "needs": [ - "email_enabled=true" - ] - }, - { - "name": "email_ignore_tls", - "type": "bool", - "title": "Ignore TLS", - "required": false, - "default": false, - "needs": [ - "email_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/influxdb/files/.env b/Docker-Compose/influxdb/files/.env deleted file mode 100644 index 84e063c..0000000 --- a/Docker-Compose/influxdb/files/.env +++ /dev/null @@ -1,6 +0,0 @@ -# InfluxDB credentials -INFLUXDB_INIT_USERNAME=<< influxdb_init_username >> -INFLUXDB_INIT_PASSWORD=<< influxdb_init_password >> -INFLUXDB_INIT_ORG=<< influxdb_init_org >> -INFLUXDB_INIT_BUCKET=<< influxdb_init_bucket >> -INFLUXDB_INIT_ADMIN_TOKEN=<< influxdb_init_admin_token >> diff --git a/Docker-Compose/influxdb/files/compose.yaml b/Docker-Compose/influxdb/files/compose.yaml deleted file mode 100644 index 3b3cf4c..0000000 --- a/Docker-Compose/influxdb/files/compose.yaml +++ /dev/null @@ -1,53 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/library/influxdb:2.8.0-alpine - restart: << restart_policy >> - environment: - - TZ=<< container_timezone >> - - DOCKER_INFLUXDB_INIT_MODE=setup - - DOCKER_INFLUXDB_INIT_USERNAME=${INFLUXDB_INIT_USERNAME} - - DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUXDB_INIT_PASSWORD} - - DOCKER_INFLUXDB_INIT_ORG=${INFLUXDB_INIT_ORG} - - DOCKER_INFLUXDB_INIT_BUCKET=${INFLUXDB_INIT_BUCKET} - - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUXDB_INIT_ADMIN_TOKEN} - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:8086" - <%- endif %> - volumes: - - << service_name >>_data:/var/lib/influxdb2 - - << service_name >>_config:/etc/influxdb2 - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadbalancer.server.port=8086 - - traefik.http.services.<< service_name >>-web.loadbalancer.server.scheme=http - - traefik.http.routers.<< service_name >>-web-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-web-http.entrypoints=<< traefik_entrypoint >> - - traefik.http.routers.<< service_name >>-web-http.service=<< service_name >>-web - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-web-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-web-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-web-https.tls=true - - traefik.http.routers.<< service_name >>-web-https.tls.certresolver=<< traefik_tls_certresolver >> - - traefik.http.routers.<< service_name >>-web-https.service=<< service_name >>-web - <%- endif %> - <%- endif %> - -volumes: - << service_name >>_data: - driver: local - << service_name >>_config: - driver: local - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/influxdb/template.json b/Docker-Compose/influxdb/template.json deleted file mode 100644 index 162fc0f..0000000 --- a/Docker-Compose/influxdb/template.json +++ /dev/null @@ -1,225 +0,0 @@ -{ - "slug": "influxdb", - "kind": "compose", - "metadata": { - "name": "Influxdb", - "description": "Open-source time series database designed for high-performance storage and retrieval of time-stamped data. Commonly used for monitoring, analytics, and IoT applications.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "influxdb" - }, - "draft": false, - "version": { - "name": "2.8.0-alpine", - "source_dep_name": "docker.io/library/influxdb", - "source_dep_version": "2.8.0-alpine" - } - }, - "variables": [ - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP API Port", - "required": false, - "default": 8086, - "config": { - "placeholder": "8086" - } - } - ] - }, - { - "title": "Influxdb", - "name": "influxdb", - "items": [ - { - "name": "influxdb_init_username", - "type": "str", - "title": "Initial admin username", - "required": true, - "default": "admin", - "config": { - "placeholder": "admin" - } - }, - { - "name": "influxdb_init_password", - "type": "secret", - "title": "Initial admin password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "influxdb_init_org", - "type": "str", - "title": "Initial organization", - "required": true, - "default": "homelab", - "description": "Organization created during the initial setup.", - "config": { - "placeholder": "homelab" - } - }, - { - "name": "influxdb_init_bucket", - "type": "str", - "title": "Initial bucket", - "required": true, - "default": "default", - "description": "Bucket created during the initial setup.", - "config": { - "placeholder": "default" - } - }, - { - "name": "influxdb_init_admin_token", - "type": "secret", - "title": "Initial admin token", - "required": true, - "description": "Admin API token created during the initial setup.", - "config": { - "autogenerated": { - "length": 64 - } - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "influxdb" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "influxdb", - "config": { - "placeholder": "influxdb" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - } - ] -} diff --git a/Docker-Compose/kestra/files/compose.yaml b/Docker-Compose/kestra/files/compose.yaml deleted file mode 100644 index faa76b3..0000000 --- a/Docker-Compose/kestra/files/compose.yaml +++ /dev/null @@ -1,56 +0,0 @@ -services: - << service_name >>: - image: kestra/kestra:v1.3.15 - container_name: << container_name >> - entrypoint: /bin/bash - user: "<< container_user >>" - command: - - -c - - /app/kestra server standalone --worker-thread=<< worker_threads >> -c config.yaml - volumes: -<%- if docker_socket_enabled %> - - /var/run/docker.sock:/var/run/docker.sock -<%- endif %> - - << tmp_workdir_host >>:/tmp/kestra-wd - - << storage_volume_name >>:/app/storage - - ./config/config.yaml:/app/config.yaml:ro -<%- if env_file_enabled %> - env_file: - - << env_file_path >> -<%- endif %> - networks: - - << network_name >> -<%- if traefik_enabled %> - labels: - - traefik.enable=true -<%- if secondary_hostname %> - - traefik.http.routers.<< service_name >>.rule=Host(`<< public_hostname >>`) || Host(`<< secondary_hostname >>`) -<%- else %> - - traefik.http.routers.<< service_name >>.rule=Host(`<< public_hostname >>`) -<%- endif %> -<%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>.tls=true - - traefik.http.routers.<< service_name >>.tls.certresolver=<< traefik_tls_certresolver >> -<%- else %> - - traefik.http.routers.<< service_name >>.entrypoints=<< traefik_entrypoint >> -<%- endif %> -<%- if traefik_middleware %> - - traefik.http.routers.<< service_name >>.middlewares=<< traefik_middleware >> -<%- endif %> - - traefik.http.routers.<< service_name >>.service=<< service_name >> - - traefik.http.services.<< service_name >>.loadBalancer.server.port=8080 -<%- endif %> - restart: << restart_policy >> - -volumes: - << storage_volume_name >>: - driver: local - -networks: - << network_name >>: -<%- if network_external %> - external: true -<%- else %> - driver: bridge -<%- endif %> diff --git a/Docker-Compose/kestra/template.json b/Docker-Compose/kestra/template.json deleted file mode 100644 index ec8d8fa..0000000 --- a/Docker-Compose/kestra/template.json +++ /dev/null @@ -1,297 +0,0 @@ -{ - "slug": "kestra", - "kind": "compose", - "metadata": { - "name": "Kestra", - "description": "Runs Kestra in Docker Compose with a companion configuration file, PostgreSQL datasource settings, and persistent storage.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "kestra" - }, - "draft": true, - "version": { - "name": "v1.3.15", - "source_dep_name": "kestra/kestra", - "source_dep_version": "v1.3.15" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Compose service name", - "required": false, - "default": "kestra", - "config": { - "placeholder": "kestra" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container name", - "required": false, - "default": "kestra", - "config": { - "placeholder": "kestra" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Container restart policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "container_user", - "type": "str", - "title": "Container runtime user", - "required": false, - "default": "root", - "config": { - "placeholder": "root" - } - }, - { - "name": "worker_threads", - "type": "int", - "title": "Worker Threads", - "required": false, - "default": 128, - "config": { - "slider": true, - "min": 4, - "max": 256, - "step": 4, - "placeholder": "128" - } - } - ] - }, - { - "title": "Runtime", - "name": "runtime", - "items": [ - { - "name": "docker_socket_enabled", - "type": "bool", - "title": "Docker Socket", - "required": false, - "default": true, - "description": "Mount the Docker socket into Kestra" - }, - { - "name": "tmp_workdir_host", - "type": "str", - "title": "Temp Workdir", - "required": false, - "default": "/tmp/kestra-wd", - "description": "Host path for Kestra temporary working directory", - "config": { - "placeholder": "/tmp/kestra-wd" - } - }, - { - "name": "storage_volume_name", - "type": "str", - "title": "Storage Volume", - "required": false, - "default": "kestra-data", - "description": "Named volume for Kestra storage", - "config": { - "placeholder": "kestra-data" - } - }, - { - "name": "env_file_enabled", - "type": "bool", - "title": "Env File", - "required": false, - "default": true, - "description": "Load environment variables from an env file" - }, - { - "name": "env_file_path", - "type": "str", - "title": "Env File Path", - "required": false, - "default": ".env", - "description": "Path used for Env File.", - "config": { - "placeholder": ".env" - } - }, - { - "name": "kestra_public_url", - "type": "str", - "title": "Public Kestra URL", - "required": true, - "config": { - "placeholder": "https://kestra.home.arpa/" - } - }, - { - "name": "tutorial_flows_enabled", - "type": "bool", - "title": "Tutorial Flows", - "required": false, - "default": false - } - ] - }, - { - "title": "PostgreSQL Datasource", - "name": "postgres", - "items": [ - { - "name": "postgres_jdbc_url", - "type": "str", - "title": "PostgreSQL JDBC URL", - "required": true, - "config": { - "placeholder": "jdbc:postgresql://database:5432/kestra" - } - }, - { - "name": "postgres_username", - "type": "str", - "title": "PostgreSQL username", - "required": true, - "config": { - "placeholder": "kestra" - } - }, - { - "name": "postgres_password", - "type": "secret", - "title": "PostgreSQL password", - "required": true - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": true, - "default": "proxy", - "config": { - "placeholder": "proxy" - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": true - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": true - }, - { - "name": "public_hostname", - "type": "str", - "title": "Primary public hostname", - "required": false, - "default": "kestra.home.arpa", - "config": { - "placeholder": "kestra.home.arpa" - } - }, - { - "name": "secondary_hostname", - "type": "str", - "title": "Secondary Hostname", - "required": false, - "default": "", - "config": { - "placeholder": "kp1web.home.arpa" - } - }, - { - "name": "traefik_middleware", - "type": "str", - "title": "Traefik Middleware", - "required": false, - "default": "", - "config": { - "placeholder": "authentik@file" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": true - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": false, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/komodo/files/.env b/Docker-Compose/komodo/files/.env deleted file mode 100644 index a68e50e..0000000 --- a/Docker-Compose/komodo/files/.env +++ /dev/null @@ -1,8 +0,0 @@ -# Komodo database credentials -KOMODO_DATABASE_USERNAME=<< database_username >> -KOMODO_DATABASE_PASSWORD=<< database_password >> - -# Komodo credentials -<%- if environment_enabled and environment_jwt_secret %> -KOMODO_JWT_SECRET=<< environment_jwt_secret >> -<%- endif %> diff --git a/Docker-Compose/komodo/files/compose.yaml b/Docker-Compose/komodo/files/compose.yaml deleted file mode 100644 index a43a050..0000000 --- a/Docker-Compose/komodo/files/compose.yaml +++ /dev/null @@ -1,209 +0,0 @@ ---- -services: - << service_name >>: - image: ghcr.io/moghtech/komodo-core:2.1.2 - restart: << restart_policy >> - container_name: << container_name >> - hostname: << container_hostname >> - <%- if not database_external %> - depends_on: - <%- if database_type == 'mongo' %> - - << service_name >>-mongo - <%- elif database_type == 'ferretdb' %> - - << service_name >>-ferretdb - <%- endif %> - <%- endif %> - <%- if network_mode == 'host' %> - network_mode: host - <%- else %> - networks: - <%- if traefik_enabled %> - << traefik_network >>: - <%- endif %> - <%- if network_mode == 'macvlan' %> - << network_name >>: - ipv4_address: << network_macvlan_ipv4_address >> - <%- elif network_mode == 'bridge' %> - << network_name >>: - <%- endif %> - <%- endif %> - <%- if network_mode == 'bridge' and not traefik_enabled %> - ports: - - "<< ports_http >>:9120/tcp" - <%- endif %> - environment: - <%- if database_external %> - KOMODO_DATABASE_ADDRESS: "<< database_address >>" - <%- elif database_type == 'mongo' %> - <%- if network_mode == 'host' %> - KOMODO_DATABASE_ADDRESS: "localhost:27017" - <%- else %> - KOMODO_DATABASE_ADDRESS: "<< service_name >>-mongo:27017" - <%- endif %> - <%- elif database_type == 'ferretdb' %> - <%- if network_mode == 'host' %> - KOMODO_DATABASE_ADDRESS: "localhost:27017" - <%- else %> - KOMODO_DATABASE_ADDRESS: "<< service_name >>-ferretdb:27017" - <%- endif %> - <%- endif %> - KOMODO_DATABASE_DB_NAME: "<< database_name >>" - KOMODO_DATABASE_USERNAME: "${KOMODO_DATABASE_USERNAME}" - KOMODO_DATABASE_PASSWORD: "${KOMODO_DATABASE_PASSWORD}" - <%- if environment_enabled and environment_jwt_secret %> - KOMODO_JWT_SECRET: "${KOMODO_JWT_SECRET}" - <%- endif %> - <%- if environment_enabled %> - LOG_LEVEL: "<< environment_log_level >>" - <%- endif %> - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/data:/app/data:rw - - << volume_mount_path >>/repos:/app/repos:rw - <%- elif volume_mode == 'local' or volume_mode == 'nfs' %> - - << service_name >>-data:/app/data - - << service_name >>-repos:/app/repos - <%- endif %> - <%- if resources_enabled %> - deploy: - resources: - limits: - cpus: '<< resources_cpu_limit >>' - memory: << resources_memory_limit >> - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=9120 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - - <%- if not database_external and database_type == 'mongo' %> - << service_name >>-mongo: - image: docker.io/library/mongo:8 - restart: << restart_policy >> - command: --quiet --wiredTigerCacheSizeGB 0.25 - labels: - komodo.skip: - environment: - MONGO_INITDB_ROOT_USERNAME: "${KOMODO_DATABASE_USERNAME}" - MONGO_INITDB_ROOT_PASSWORD: "${KOMODO_DATABASE_PASSWORD}" - <%- if network_mode == 'host' %> - network_mode: host - <%- else %> - networks: - << network_name >>: - <%- endif %> - volumes: - - << service_name >>-mongo-data:/data/db - - << service_name >>-mongo-config:/data/configdb - <%- elif not database_external and database_type == 'ferretdb' %> - << service_name >>-postgres: - image: ghcr.io/ferretdb/postgres-documentdb:17 - restart: << restart_policy >> - labels: - komodo.skip: - environment: - POSTGRES_USER: "${KOMODO_DATABASE_USERNAME}" - POSTGRES_PASSWORD: "${KOMODO_DATABASE_PASSWORD}" - POSTGRES_DB: postgres - <%- if network_mode == 'host' %> - network_mode: host - <%- else %> - networks: - << network_name >>: - <%- endif %> - volumes: - - << service_name >>-postgres-data:/var/lib/postgresql/data - - << service_name >>-ferretdb: - image: ghcr.io/ferretdb/ferretdb:2 - restart: << restart_policy >> - labels: - komodo.skip: - depends_on: - - << service_name >>-postgres - environment: - <%- if network_mode == 'host' %> - FERRETDB_POSTGRESQL_URL: "postgres://${KOMODO_DATABASE_USERNAME}:${KOMODO_DATABASE_PASSWORD}@localhost:5432/postgres" - <%- else %> - FERRETDB_POSTGRESQL_URL: "postgres://${KOMODO_DATABASE_USERNAME}:${KOMODO_DATABASE_PASSWORD}@<< service_name >>-postgres:5432/postgres" - <%- endif %> - <%- if network_mode == 'host' %> - network_mode: host - <%- else %> - networks: - << network_name >>: - <%- endif %> - volumes: - - << service_name >>-ferretdb-state:/state - <%- endif %> - -<%- if volume_mode == 'local' or volume_mode == 'nfs' or not database_external %> -volumes: - <%- if volume_mode == 'local' %> - << service_name >>-data: - driver: local - << service_name >>-repos: - driver: local - <%- elif volume_mode == 'nfs' %> - << service_name >>-data: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/data" - << service_name >>-repos: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/repos" - <%- endif %> - <%- if not database_external and database_type == 'mongo' %> - << service_name >>-mongo-data: - driver: local - << service_name >>-mongo-config: - driver: local - <%- elif not database_external and database_type == 'ferretdb' %> - << service_name >>-postgres-data: - driver: local - << service_name >>-ferretdb-state: - driver: local - <%- endif %> -<%- endif %> - -<%- if network_mode != 'host' %> -networks: - << network_name >>: - <%- if network_external %> - external: true - <%- else %> - <%- if network_mode == 'macvlan' %> - driver: macvlan - driver_opts: - parent: << network_macvlan_parent_interface >> - ipam: - config: - - subnet: << network_macvlan_subnet >> - gateway: << network_macvlan_gateway >> - name: << network_name >> - <%- else %> - driver: bridge - <%- endif %> - <%- endif %> - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> -<%- endif %> diff --git a/Docker-Compose/komodo/template.json b/Docker-Compose/komodo/template.json deleted file mode 100644 index d6b2286..0000000 --- a/Docker-Compose/komodo/template.json +++ /dev/null @@ -1,461 +0,0 @@ -{ - "slug": "komodo", - "kind": "compose", - "metadata": { - "name": "Komodo", - "description": "Build and deployment automation tool for managing Docker deployments, stacks, and builds across multiple servers. Features real-time container monitoring, batch operations, and a web-based management interface.", - "tags": [ - "traefik", - "deployment", - "automation" - ], - "icon": { - "provider": "selfhst", - "id": "komodo" - }, - "draft": false, - "version": { - "name": "2.1.2", - "source_dep_name": "ghcr.io/moghtech/komodo-core", - "source_dep_version": "2.1.2" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "komodo", - "config": { - "placeholder": "komodo" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "komodo", - "config": { - "placeholder": "komodo" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false, - "default": "komodo", - "config": { - "placeholder": "komodo" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "network_mode", - "type": "enum", - "title": "Network Mode", - "required": false, - "default": "bridge", - "config": { - "options": [ - "bridge", - "macvlan", - "host" - ] - } - }, - { - "name": "network_macvlan_ipv4_address", - "type": "str", - "title": "IPv4 Address", - "required": false, - "default": "", - "config": { - "placeholder": "10.20.1.50" - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - }, - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": false, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": false, - "default": "" - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": false, - "default": "", - "config": { - "placeholder": "/data/app" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": false, - "default": "", - "config": { - "placeholder": "nas.home.arpa" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": false, - "default": "", - "config": { - "placeholder": "/export/app" - } - }, - { - "name": "network_macvlan_subnet", - "type": "str", - "title": "Subnet", - "required": false, - "default": "", - "config": { - "placeholder": "10.20.0.0/16" - } - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "komodo_network", - "config": { - "placeholder": "komodo_network" - } - }, - { - "name": "network_macvlan_parent_interface", - "type": "str", - "title": "Parent Interface", - "required": false, - "default": "", - "config": { - "placeholder": "eth0" - } - }, - { - "name": "network_macvlan_gateway", - "type": "str", - "title": "Gateway", - "required": false, - "default": "", - "config": { - "placeholder": "10.20.0.1" - } - } - ] - }, - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_external", - "type": "bool", - "title": "External Database", - "required": false, - "default": false - }, - { - "name": "database_type", - "type": "enum", - "title": "Database Backend", - "required": false, - "default": "mongo", - "description": "Database backend to deploy with Komodo.", - "needs": [ - "database_external=false" - ], - "config": { - "options": [ - "mongo", - "ferretdb" - ] - } - }, - { - "name": "database_address", - "type": "str", - "title": "Database Address", - "required": false, - "default": "mongo:27017", - "description": "External MongoDB-compatible database address in host:port format.", - "needs": [ - "database_external=true" - ], - "config": { - "placeholder": "mongo:27017" - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": false, - "default": "komodo", - "description": "Database name used by Komodo.", - "config": { - "placeholder": "komodo" - } - }, - { - "name": "database_username", - "type": "str", - "title": "Database User", - "required": false, - "default": "komodo", - "config": { - "placeholder": "komodo" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database Password", - "required": false, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "komodo" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 9120, - "needs": [ - "traefik_enabled=false", - "network_mode=bridge" - ], - "config": { - "placeholder": "9120" - } - } - ] - }, - { - "title": "Resource Limits", - "toggle": "resources_enabled", - "name": "resources", - "items": [ - { - "name": "resources_enabled", - "type": "bool", - "title": "Resources Enabled", - "required": false, - "default": false - }, - { - "name": "resources_cpu_limit", - "type": "str", - "title": "Resources Cpu Limit", - "required": true, - "default": 1, - "config": { - "placeholder": "1" - } - }, - { - "name": "resources_memory_limit", - "type": "str", - "title": "Resources Memory Limit", - "required": true, - "default": "1G", - "config": { - "placeholder": "1G" - } - } - ] - }, - { - "title": "Environment Variables", - "toggle": "environment_enabled", - "name": "environment", - "items": [ - { - "name": "environment_enabled", - "type": "bool", - "title": "Environment", - "required": false, - "default": true, - "description": "Configure Komodo Core environment variables." - }, - { - "name": "environment_jwt_secret", - "type": "secret", - "title": "JWT Secret", - "required": false, - "description": "JWT secret for authentication (auto-generated if empty)", - "needs": [ - "environment_enabled=true" - ], - "config": { - "autogenerated": { - "length": 64 - } - } - }, - { - "name": "environment_log_level", - "type": "enum", - "title": "Log level", - "required": false, - "default": "info", - "needs": [ - "environment_enabled=true" - ], - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - } - ] - } - ] -} diff --git a/Docker-Compose/loki/files/compose.yaml b/Docker-Compose/loki/files/compose.yaml deleted file mode 100644 index 63165cd..0000000 --- a/Docker-Compose/loki/files/compose.yaml +++ /dev/null @@ -1,43 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/grafana/loki:3.7.1 - restart: << restart_policy >> - command: "-config.file=/etc/loki/config.yaml" - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:3100" - <%- endif %> - volumes: - - << service_name >>_data:/loki:rw - - ./config/config.yaml:/etc/loki/config.yaml:ro - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=3100 - - traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_https.tls=true - - traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -volumes: - << service_name >>_data: - driver: local - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/loki/template.json b/Docker-Compose/loki/template.json deleted file mode 100644 index 7a52e2e..0000000 --- a/Docker-Compose/loki/template.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "slug": "loki", - "kind": "compose", - "metadata": { - "name": "Loki", - "description": "Horizontally scalable, multi-tenant log aggregation system by Grafana, inspired by Prometheus. Indexes metadata rather than log content for efficient storage.", - "tags": [ - "traefik", - "authentik" - ], - "icon": { - "provider": "selfhst", - "id": "loki" - }, - "draft": false, - "version": { - "name": "3.7.1", - "source_dep_name": "docker.io/grafana/loki", - "source_dep_version": "3.7.1" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "loki", - "config": { - "placeholder": "loki" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "data_retention_days", - "type": "int", - "title": "Retention Days", - "required": false, - "default": 7, - "description": "Number of days to retain logs", - "config": { - "slider": true, - "min": 1, - "max": 365, - "step": 1, - "placeholder": "7", - "unit": "days" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 3100, - "config": { - "placeholder": "3100" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "loki" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/mariadb/files/.env b/Docker-Compose/mariadb/files/.env deleted file mode 100644 index b3d0587..0000000 --- a/Docker-Compose/mariadb/files/.env +++ /dev/null @@ -1,4 +0,0 @@ -# MariaDB credentials -MARIADB_USER=<< database_user >> -MARIADB_PASSWORD=<< database_password >> -MARIADB_ROOT_PASSWORD=<< database_root_password >> diff --git a/Docker-Compose/mariadb/files/compose.yaml b/Docker-Compose/mariadb/files/compose.yaml deleted file mode 100644 index 9514c94..0000000 --- a/Docker-Compose/mariadb/files/compose.yaml +++ /dev/null @@ -1,19 +0,0 @@ - ---- -services: - << service_name >>: - image: docker.io/library/mariadb:12.2.2 - restart: << restart_policy >> - environment: - - MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD} - - MARIADB_DATABASE=<< database_name >> - - MARIADB_USER=${MARIADB_USER} - - MARIADB_PASSWORD=${MARIADB_PASSWORD} - ports: - - "<< ports_mariadb >>:3306" - volumes: - - << service_name >>_data:/var/lib/mysql - -volumes: - << service_name >>_data: - driver: local diff --git a/Docker-Compose/mariadb/template.json b/Docker-Compose/mariadb/template.json deleted file mode 100644 index a211133..0000000 --- a/Docker-Compose/mariadb/template.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "slug": "mariadb", - "kind": "compose", - "metadata": { - "name": "MariaDB", - "description": "Community-developed, open-source relational database management system and drop-in replacement for MySQL.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "mariadb" - }, - "draft": false, - "version": { - "name": "12.2.2", - "source_dep_name": "docker.io/library/mariadb", - "source_dep_version": "12.2.2" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "mariadb", - "config": { - "placeholder": "mariadb" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_mariadb", - "type": "int", - "title": "MariaDB Port", - "required": true, - "default": 3306, - "config": { - "placeholder": "3306" - } - } - ] - }, - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": true, - "default": "app", - "config": { - "placeholder": "app" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": true, - "default": "app", - "config": { - "placeholder": "app" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database Password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "database_root_password", - "type": "secret", - "title": "Root Password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - } - ] -} diff --git a/Docker-Compose/n8n/.env b/Docker-Compose/n8n/.env deleted file mode 100644 index 085bde0..0000000 --- a/Docker-Compose/n8n/.env +++ /dev/null @@ -1,5 +0,0 @@ -POSTGRES_USER=n8n -POSTGRES_PASSWORD=qqWoLCgg8ElAX6 -POSTGRES_DB=n8n -N8N_BASIC_AUTH_USER=mmcfetridge -N8N_BASIC_AUTH_PASSWORD=qqWoLCgg8ElAX6 diff --git a/Docker-Compose/n8n/docker-compose.yml b/Docker-Compose/n8n/docker-compose.yml deleted file mode 100644 index ee7bf39..0000000 --- a/Docker-Compose/n8n/docker-compose.yml +++ /dev/null @@ -1,38 +0,0 @@ -services: - n8n: - image: n8nio/n8n - ports: - - "5678:5678" - container_name: n8n - env_file: - - .env - security_opt: - - no-new-privileges:true - environment: - - N8N_BASIC_AUTH_ACTIVE=true - - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER} - - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD} - - DB_TYPE=postgresdb - - DB_POSTGRESDB_HOST=db - - DB_POSTGRESDB_PORT=5432 - - DB_POSTGRESDB_DATABASE=${POSTGRES_USER} - - DB_POSTGRESDB_USER=${POSTGRES_USER} - - DB_POSTGRESDB_PASSWORD=$(POSTGRES_PASSWORD) - - NODE_FUNCTION_ALLOW_EXTERNAL=axios,qs - volumes: - - ./appdata/n8n:/home/node/.n8n - depends_on: - - db - restart: unless-stopped - - db: - image: postgres:12 - env_file: - - .env - volumes: - - /home/miker/docker/n8n/data:/var/lib/postgresql/data - environment: - - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) - - POSTGRES_DB=n8n - restart: unless-stopped \ No newline at end of file diff --git a/Docker-Compose/n8n/files/.env b/Docker-Compose/n8n/files/.env deleted file mode 100644 index e940ab6..0000000 --- a/Docker-Compose/n8n/files/.env +++ /dev/null @@ -1,6 +0,0 @@ -# n8n credentials -<%- if database_type == 'postgres' %> -DATABASE_USER=<< database_user >> -DATABASE_PASSWORD=<< database_password >> -<%- endif %> -N8N_ENCRYPTION_KEY=<< encryption_key >> diff --git a/Docker-Compose/n8n/files/compose.yaml b/Docker-Compose/n8n/files/compose.yaml deleted file mode 100644 index c0cf7e3..0000000 --- a/Docker-Compose/n8n/files/compose.yaml +++ /dev/null @@ -1,76 +0,0 @@ -services: - << service_name >>: - image: docker.n8n.io/n8nio/n8n:2.20.0 - container_name: << container_name >> - hostname: << container_hostname >> - restart: << restart_policy >> - environment: - <%- if container_loglevel %> - - N8N_LOG_LEVEL=<< container_loglevel >> - <%- endif %> - <%- if container_timezone %> - - GENERIC_TIMEZONE=<< container_timezone >> - - TZ=<< container_timezone >> - <%- endif %> - - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true - - NODE_ENV=production - - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY} - <%- if database_type == 'postgres' %> - - DB_TYPE=postgresdb - - DB_POSTGRESDB_HOST=<< database_host >> - - DB_POSTGRESDB_PORT=<< database_port >> - - DB_POSTGRESDB_DATABASE=<< database_name >> - - DB_POSTGRESDB_USER=${DATABASE_USER} - - DB_POSTGRESDB_PASSWORD=${DATABASE_PASSWORD} - <%- endif %> - <%- if traefik_enabled %> - - N8N_HOST=<< traefik_host >>.<< traefik_domain >> - - N8N_PORT=5678 - <%- if traefik_tls_enabled %> - - N8N_PROTOCOL=https - - N8N_EDITOR_BASE_URL=https://<< traefik_host >>.<< traefik_domain >> - - WEBHOOK_URL=https://<< traefik_host >>.<< traefik_domain >>/ - <%- else %> - - N8N_PROTOCOL=http - - N8N_EDITOR_BASE_URL=http://<< traefik_host >>.<< traefik_domain >> - - WEBHOOK_URL=http://<< traefik_host >>.<< traefik_domain >>/ - <%- endif %> - - N8N_PROXY_HOPS=1 - <%- endif %> - volumes: - - /etc/localtime:/etc/localtime:ro - - << service_name >>_data:/home/node/.n8n - <%- if traefik_enabled %> - networks: - - << traefik_network >> - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:5678" - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadbalancer.server.port=5678 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -volumes: - << service_name >>_data: - driver: local - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/n8n/template.json b/Docker-Compose/n8n/template.json deleted file mode 100644 index 070db7f..0000000 --- a/Docker-Compose/n8n/template.json +++ /dev/null @@ -1,303 +0,0 @@ -{ - "slug": "n8n", - "kind": "compose", - "metadata": { - "name": "N8N", - "description": "Source-available workflow automation tool that connects apps and services to automate tasks through a visual drag-and-drop node editor.", - "tags": [ - "traefik", - "database" - ], - "icon": { - "provider": "selfhst", - "id": "n8n" - }, - "draft": false, - "version": { - "name": "2.20.0", - "source_dep_name": "docker.n8n.io/n8nio/n8n", - "source_dep_version": "2.20.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "n8n", - "config": { - "placeholder": "n8n" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "n8n", - "config": { - "placeholder": "n8n" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false, - "default": "n8n", - "config": { - "placeholder": "n8n" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "container_loglevel", - "type": "enum", - "title": "Log Level", - "required": false, - "default": "info", - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "n8n" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "needs": [ - "traefik_enabled=true" - ], - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "", - "needs": [ - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_type", - "type": "enum", - "title": "Database Type", - "required": false, - "default": "sqlite", - "config": { - "options": [ - "sqlite", - "postgres" - ] - } - }, - { - "name": "database_host", - "type": "str", - "title": "Database host", - "required": true, - "default": "postgres", - "needs": [ - "database_type=postgres" - ], - "config": { - "placeholder": "postgres" - } - }, - { - "name": "database_port", - "type": "int", - "title": "Database port", - "required": true, - "default": 5432, - "needs": [ - "database_type=postgres" - ], - "config": { - "placeholder": "5432" - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database name", - "required": true, - "default": "n8n", - "needs": [ - "database_type=postgres" - ], - "config": { - "placeholder": "n8n" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database username", - "required": true, - "default": "n8n", - "needs": [ - "database_type=postgres" - ], - "config": { - "placeholder": "n8n" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database password", - "required": true, - "needs": [ - "database_type=postgres" - ] - } - ] - }, - { - "title": "Security", - "name": "security", - "items": [ - { - "name": "encryption_key", - "type": "secret", - "title": "Encryption Key", - "required": false, - "config": { - "autogenerated": { - "length": 64 - } - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "External HTTP port", - "required": false, - "default": 5678, - "needs": [ - "traefik_enabled=false" - ], - "config": { - "placeholder": "5678" - } - } - ] - } - ] -} diff --git a/Docker-Compose/netbird/files/compose.yaml b/Docker-Compose/netbird/files/compose.yaml deleted file mode 100644 index 3ebc0a1..0000000 --- a/Docker-Compose/netbird/files/compose.yaml +++ /dev/null @@ -1,177 +0,0 @@ -services: - <%- if traefik_enabled and traefik_mode == 'integrated' %> - traefik: - image: docker.io/library/traefik:v3.6 - restart: << restart_policy >> - logging: - driver: "json-file" - options: - max-size: "500m" - max-file: "2" - command: - - "--providers.docker=true" - - "--providers.docker.exposedbydefault=false" - - "--providers.docker.network=netbird" - - "--entrypoints.<< traefik_entrypoint >>.address=:80" - <%- if traefik_tls_enabled %> - - "--entrypoints.<< traefik_tls_entrypoint >>.address=:443" - - "--entrypoints.<< traefik_tls_entrypoint >>.transport.respondingTimeouts.readTimeout=0" - - "--entrypoints.<< traefik_entrypoint >>.http.redirections.entrypoint.to=<< traefik_tls_entrypoint >>" - - "--entrypoints.<< traefik_entrypoint >>.http.redirections.entrypoint.scheme=https" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.tlschallenge=true" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.email=<< letsencrypt_email >>" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.storage=/letsencrypt/acme.json" - <%- endif %> - ports: - - "80:80" - <%- if traefik_tls_enabled %> - - "443:443" - <%- endif %> - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - <%- if traefik_tls_enabled %> - - netbird_traefik_letsencrypt:/letsencrypt - <%- endif %> - networks: - - netbird - <%- endif %> - - dashboard: - image: docker.io/netbirdio/dashboard:latest - restart: << restart_policy >> - logging: - driver: "json-file" - options: - max-size: "500m" - max-file: "2" - depends_on: - - netbird-server - environment: - <%- if traefik_tls_enabled %> - - NETBIRD_MGMT_API_ENDPOINT=https://<< public_hostname >> - - NETBIRD_MGMT_GRPC_API_ENDPOINT=https://<< public_hostname >> - <%- else %> - - NETBIRD_MGMT_API_ENDPOINT=http://<< public_hostname >> - - NETBIRD_MGMT_GRPC_API_ENDPOINT=http://<< public_hostname >> - <%- endif %> - - AUTH_AUDIENCE=netbird-dashboard - - AUTH_CLIENT_ID=netbird-dashboard - - AUTH_CLIENT_SECRET= - <%- if traefik_tls_enabled %> - - AUTH_AUTHORITY=https://<< public_hostname >>/oauth2 - <%- else %> - - AUTH_AUTHORITY=http://<< public_hostname >>/oauth2 - <%- endif %> - - USE_AUTH0=false - - AUTH_SUPPORTED_SCOPES=openid profile email groups - - AUTH_REDIRECT_URI=/nb-auth - - AUTH_SILENT_REDIRECT_URI=/nb-silent-auth - <%- if traefik_tls_enabled %> - - NGINX_SSL_PORT=443 - <%- else %> - - NGINX_SSL_PORT=80 - <%- endif %> - - LETSENCRYPT_DOMAIN=none - <%- if not traefik_enabled %> - ports: - - "127.0.0.1:8080:80" - <%- endif %> - <%- if traefik_enabled %> - labels: - - "traefik.enable=true" - <%- if traefik_mode == 'integrated' %> - - "traefik.docker.network=netbird" - <%- elif traefik_mode == 'existing' %> - - "traefik.docker.network=<< traefik_network >>" - <%- endif %> - - "traefik.http.routers.netbird-dashboard.rule=Host(`<< public_hostname >>`)" - <%- if traefik_tls_enabled %> - - "traefik.http.routers.netbird-dashboard.entrypoints=<< traefik_tls_entrypoint >>" - - "traefik.http.routers.netbird-dashboard.tls=true" - - "traefik.http.routers.netbird-dashboard.tls.certresolver=<< traefik_tls_certresolver >>" - <%- else %> - - "traefik.http.routers.netbird-dashboard.entrypoints=<< traefik_entrypoint >>" - <%- endif %> - - "traefik.http.routers.netbird-dashboard.priority=1" - - "traefik.http.services.netbird-dashboard.loadbalancer.server.port=80" - <%- endif %> - networks: - - netbird - <%- if traefik_enabled and traefik_mode == 'existing' %> - - << traefik_network >> - <%- endif %> - - netbird-server: - image: docker.io/netbirdio/netbird-server:latest - restart: << restart_policy >> - logging: - driver: "json-file" - options: - max-size: "500m" - max-file: "2" - command: - - --config - - /etc/netbird/config.yaml - ports: - <%- if not traefik_enabled %> - - "127.0.0.1:8081:80" - <%- endif %> - - "<< stun_port >>:<< stun_port >>/udp" - volumes: - - netbird_data:/var/lib/netbird - - ./config:/etc/netbird:ro - <%- if traefik_enabled %> - labels: - - "traefik.enable=true" - <%- if traefik_mode == 'integrated' %> - - "traefik.docker.network=netbird" - <%- elif traefik_mode == 'existing' %> - - "traefik.docker.network=<< traefik_network >>" - <%- endif %> - # gRPC traffic needs an h2c backend service. - - "traefik.http.routers.netbird-grpc.rule=Host(`<< public_hostname >>`) && (PathPrefix(`/signalexchange.SignalExchange/`) || PathPrefix(`/management.ManagementService/`) || PathPrefix(`/management.ProxyService/`))" - <%- if traefik_tls_enabled %> - - "traefik.http.routers.netbird-grpc.entrypoints=<< traefik_tls_entrypoint >>" - - "traefik.http.routers.netbird-grpc.tls=true" - - "traefik.http.routers.netbird-grpc.tls.certresolver=<< traefik_tls_certresolver >>" - <%- else %> - - "traefik.http.routers.netbird-grpc.entrypoints=<< traefik_entrypoint >>" - <%- endif %> - - "traefik.http.routers.netbird-grpc.service=netbird-server-h2c" - - "traefik.http.routers.netbird-backend.rule=Host(`<< public_hostname >>`) && (PathPrefix(`/relay`) || PathPrefix(`/ws-proxy/`) || PathPrefix(`/api`) || PathPrefix(`/oauth2`))" - <%- if traefik_tls_enabled %> - - "traefik.http.routers.netbird-backend.entrypoints=<< traefik_tls_entrypoint >>" - - "traefik.http.routers.netbird-backend.tls=true" - - "traefik.http.routers.netbird-backend.tls.certresolver=<< traefik_tls_certresolver >>" - <%- else %> - - "traefik.http.routers.netbird-backend.entrypoints=<< traefik_entrypoint >>" - <%- endif %> - - "traefik.http.routers.netbird-backend.service=netbird-server" - - "traefik.http.services.netbird-server.loadbalancer.server.port=80" - - "traefik.http.services.netbird-server-h2c.loadbalancer.server.port=80" - - "traefik.http.services.netbird-server-h2c.loadbalancer.server.scheme=h2c" - <%- endif %> - networks: - - netbird - <%- if traefik_enabled and traefik_mode == 'existing' %> - - << traefik_network >> - <%- endif %> - -networks: - netbird: - name: netbird - driver: bridge - <%- if traefik_enabled and traefik_mode == 'existing' %> - << traefik_network >>: - external: true - <%- endif %> - -volumes: - netbird_data: - name: << data_volume_name >> - driver: local - <%- if traefik_enabled and traefik_mode == 'integrated' and traefik_tls_enabled %> - netbird_traefik_letsencrypt: - name: << letsencrypt_volume_name >> - driver: local - <%- endif %> diff --git a/Docker-Compose/netbird/template.json b/Docker-Compose/netbird/template.json deleted file mode 100644 index 686cab8..0000000 --- a/Docker-Compose/netbird/template.json +++ /dev/null @@ -1,265 +0,0 @@ -{ - "slug": "netbird", - "kind": "compose", - "metadata": { - "name": "NetBird", - "description": "Self-hosted NetBird control plane with embedded local user management and optional Traefik integration.", - "tags": [ - "vpn", - "wireguard", - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "netbird" - }, - "draft": false, - "version": { - "name": "2026.04.14", - "source_dep_name": "manual/netbird" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "public_hostname", - "type": "str", - "title": "Public Hostname", - "required": true, - "description": "Public DNS hostname for the NetBird dashboard and API.", - "config": { - "placeholder": "netbird.example.com" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "NetBird", - "name": "netbird", - "items": [ - { - "name": "stun_port", - "type": "int", - "title": "STUN UDP Port", - "required": true, - "default": 3478, - "description": "Public UDP port exposed for the embedded STUN service.", - "config": { - "placeholder": "3478" - } - }, - { - "name": "netbird_log_level", - "type": "enum", - "title": "Log Level", - "required": true, - "default": "info", - "description": "Log level used by the combined NetBird server.", - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - }, - { - "name": "disable_anonymous_metrics", - "type": "bool", - "title": "Disable Anonymous Metrics", - "required": false, - "default": false, - "description": "Disable NetBird anonymous usage metrics." - }, - { - "name": "disable_geolite_update", - "type": "bool", - "title": "Disable GeoLite Updates", - "required": false, - "default": false, - "description": "Disable automatic GeoLite database updates." - }, - { - "name": "netbird_relay_auth_secret", - "type": "secret", - "title": "Relay Auth Secret", - "required": true, - "description": "Shared secret used internally by the embedded relay service.", - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "netbird_store_encryption_key", - "type": "secret", - "title": "Store Encryption Key", - "required": true, - "description": "Base64-encoded 32-byte key used to protect local user data stored by the embedded IdP.", - "config": { - "autogenerated": { - "kind": "base64", - "bytes": 32 - } - } - } - ] - }, - { - "title": "Storage", - "name": "storage", - "items": [ - { - "name": "data_volume_name", - "type": "str", - "title": "NetBird Data Volume", - "required": true, - "default": "netbird_data", - "description": "Docker volume name for NetBird state, SQLite data, and embedded IdP files.", - "config": { - "placeholder": "netbird_data" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": true - }, - { - "name": "traefik_mode", - "type": "enum", - "title": "Traefik Mode", - "required": true, - "default": "integrated", - "config": { - "options": [ - "integrated", - "existing" - ] - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Traefik Network", - "required": true, - "default": "traefik", - "description": "External Docker network shared with the existing Traefik installation.", - "needs": [ - "traefik_mode=existing" - ], - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "description": "Traefik entrypoint name used by the NetBird routers when TLS is disabled.", - "config": { - "placeholder": "web" - }, - "needs": [ - "traefik_tls_enabled=false" - ] - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": true - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "description": "Secure Traefik entrypoint name used by the NetBird routers.", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "letsencrypt", - "description": "Traefik certificate resolver name used by the NetBird routers.", - "config": { - "placeholder": "letsencrypt" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "letsencrypt_email", - "type": "str", - "title": "ACME Email", - "required": true, - "description": "Email used for Let's Encrypt registration and expiry notices when the bundled Traefik instance is enabled.", - "needs": [ - "traefik_tls_enabled=true", - "traefik_mode=integrated" - ], - "config": { - "placeholder": "admin@example.com" - } - }, - { - "name": "letsencrypt_volume_name", - "type": "str", - "title": "Traefik ACME Volume", - "required": true, - "default": "netbird_traefik_letsencrypt", - "description": "Docker volume name for Traefik ACME certificate storage.", - "needs": [ - "traefik_tls_enabled=true", - "traefik_mode=integrated" - ], - "config": { - "placeholder": "netbird_traefik_letsencrypt" - } - } - ] - } - ] -} diff --git a/Docker-Compose/netbox/files/.env b/Docker-Compose/netbox/files/.env deleted file mode 100644 index 81a3991..0000000 --- a/Docker-Compose/netbox/files/.env +++ /dev/null @@ -1,9 +0,0 @@ -# NetBox credentials -DATABASE_USER=<< database_user >> -DATABASE_PASSWORD=<< database_password >> -REDIS_PASSWORD=<< redis_password >> -NETBOX_SECRET_KEY=<< netbox_secret_key >> -<%- if email_enabled %> -EMAIL_USERNAME=<< email_username >> -EMAIL_PASSWORD=<< email_password >> -<%- endif %> diff --git a/Docker-Compose/netbox/files/compose.yaml b/Docker-Compose/netbox/files/compose.yaml deleted file mode 100644 index b712c78..0000000 --- a/Docker-Compose/netbox/files/compose.yaml +++ /dev/null @@ -1,199 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/netboxcommunity/netbox:v4.5.10 - restart: << restart_policy >> - environment: - <%- if container_timezone %> - - TIME_ZONE=<< container_timezone >> - <%- endif %> - <%- if traefik_enabled %> - - ALLOWED_HOSTS=<< traefik_host >>.<< traefik_domain >> - <%- else %> - - ALLOWED_HOSTS=* - <%- endif %> - <%- if database_external %> - - DB_HOST=<< database_host >> - <%- else %> - - DB_HOST=<< service_name >>_postgres - <%- endif %> - - DB_NAME=<< database_name >> - - DB_USER=${DATABASE_USER} - - DB_PASSWORD=${DATABASE_PASSWORD} - - REDIS_HOST=<< service_name >>_redis - - REDIS_PASSWORD=${REDIS_PASSWORD} - - REDIS_CACHE_HOST=<< service_name >>_redis-cache - - REDIS_CACHE_PASSWORD=${REDIS_PASSWORD} - - SECRET_KEY=${NETBOX_SECRET_KEY} - <%- if netbox_metrics_enabled %> - - METRICS_ENABLED=true - <%- endif %> - <%- if email_enabled %> - - EMAIL_SERVER=<< email_host >> - - EMAIL_PORT=<< email_port >> - - EMAIL_FROM=<< email_from >> - - EMAIL_USERNAME=${EMAIL_USERNAME} - - EMAIL_PASSWORD=${EMAIL_PASSWORD} - <%- if email_encryption == "ssl" %> - - EMAIL_USE_SSL=True - <%- elif email_encryption == "starttls" %> - - EMAIL_USE_TLS=True - <%- endif %> - <%- endif %> - networks: - <%- if traefik_enabled %> - << traefik_network >>: - <%- endif %> - << service_name >>_backend: - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:8080" - <%- endif %> - volumes: - - << service_name >>_media:/opt/netbox/netbox/media - - << service_name >>_reports:/opt/netbox/netbox/reports - - << service_name >>_scripts:/opt/netbox/netbox/scripts - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=8080 - - traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_https.tls=true - - traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - depends_on: - <%- if not database_external %> - - << service_name >>_postgres - <%- endif %> - - << service_name >>_redis - - << service_name >>_redis-cache - - << service_name >>_worker: - image: docker.io/netboxcommunity/netbox:v4.5.10 - restart: << restart_policy >> - command: - - /opt/netbox/venv/bin/python - - /opt/netbox/netbox/manage.py - - rqworker - environment: - <%- if container_timezone %> - - TIME_ZONE=<< container_timezone >> - <%- endif %> - <%- if database_external %> - - DB_HOST=<< database_host >> - <%- else %> - - DB_HOST=<< service_name >>_postgres - <%- endif %> - - DB_NAME=<< database_name >> - - DB_USER=${DATABASE_USER} - - DB_PASSWORD=${DATABASE_PASSWORD} - - REDIS_HOST=<< service_name >>_redis - - REDIS_PASSWORD=${REDIS_PASSWORD} - - REDIS_CACHE_HOST=<< service_name >>_redis-cache - - REDIS_CACHE_PASSWORD=${REDIS_PASSWORD} - - SECRET_KEY=${NETBOX_SECRET_KEY} - <%- if netbox_metrics_enabled %> - - METRICS_ENABLED=true - <%- endif %> - <%- if email_enabled %> - - EMAIL_SERVER=<< email_host >> - - EMAIL_PORT=<< email_port >> - - EMAIL_FROM=<< email_from >> - - EMAIL_USERNAME=${EMAIL_USERNAME} - - EMAIL_PASSWORD=${EMAIL_PASSWORD} - <%- if email_encryption == "ssl" %> - - EMAIL_USE_SSL=True - <%- elif email_encryption == "starttls" %> - - EMAIL_USE_TLS=True - <%- endif %> - <%- endif %> - networks: - << service_name >>_backend: - volumes: - - << service_name >>_media:/opt/netbox/netbox/media - - << service_name >>_reports:/opt/netbox/netbox/reports - - << service_name >>_scripts:/opt/netbox/netbox/scripts - depends_on: - <%- if not database_external %> - - << service_name >>_postgres - <%- endif %> - - << service_name >> - - << service_name >>_redis - - << service_name >>_redis-cache - - << service_name >>_redis: - image: docker.io/library/redis:8.6.2-alpine - restart: << restart_policy >> - command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"] - environment: - - REDIS_PASSWORD=${REDIS_PASSWORD} - networks: - << service_name >>_backend: - volumes: - - << service_name >>_redis:/data - - << service_name >>_redis-cache: - image: docker.io/library/redis:8.6.2-alpine - restart: << restart_policy >> - command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"] - environment: - - REDIS_PASSWORD=${REDIS_PASSWORD} - networks: - << service_name >>_backend: - volumes: - - << service_name >>_redis-cache:/data - - <%- if not database_external %> - << service_name >>_postgres: - image: docker.io/library/postgres:17.9 - restart: << restart_policy >> - environment: - <%- if container_timezone %> - - TZ=<< container_timezone >> - <%- endif %> - - POSTGRES_USER=${DATABASE_USER} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=<< database_name >> - healthcheck: - test: ["CMD-SHELL", "pg_isready -U << database_user >>"] - start_period: 30s - interval: 10s - timeout: 10s - retries: 5 - networks: - - << service_name >>_backend - volumes: - - << service_name >>_postgres:/var/lib/postgresql/data - <%- endif %> - -networks: - << service_name >>_backend: - driver: bridge - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> - -volumes: - <%- if not database_external %> - << service_name >>_postgres: - driver: local - <%- endif %> - << service_name >>_redis: - driver: local - << service_name >>_redis-cache: - driver: local - << service_name >>_media: - driver: local - << service_name >>_reports: - driver: local - << service_name >>_scripts: - driver: local diff --git a/Docker-Compose/netbox/template.json b/Docker-Compose/netbox/template.json deleted file mode 100644 index dc9ad3f..0000000 --- a/Docker-Compose/netbox/template.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "slug": "netbox-compose", - "kind": "compose", - "metadata": { - "name": "NetBox", - "description": "Network infrastructure management (IPAM/DCIM) and automation source of truth. Manages IP addresses, circuits, devices, racks, cables, and other network infrastructure components.", - "tags": [ - "traefik", - "database", - "email" - ], - "icon": { - "provider": "selfhst", - "id": "netbox" - }, - "draft": false, - "version": { - "name": "v4.5.10", - "source_dep_name": "docker.io/netboxcommunity/netbox", - "source_dep_version": "v4.5.10" - } - }, - "variables": [ - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": false, - "default": "netbox", - "config": { - "placeholder": "netbox" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": false, - "default": "netbox", - "config": { - "placeholder": "netbox" - } - }, - { - "name": "database_host", - "type": "str", - "title": "Database Host", - "required": true, - "needs": [ - "database_external=true" - ], - "config": { - "placeholder": "postgres" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database Password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "redis_password", - "type": "secret", - "title": "Redis Password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "database_external", - "type": "bool", - "title": "External Database", - "required": false, - "default": false - } - ] - }, - { - "title": "Email", - "toggle": "email_enabled", - "name": "email", - "items": [ - { - "name": "email_host", - "type": "str", - "title": "SMTP server hostname", - "required": true, - "config": { - "placeholder": "smtp.home.arpa" - } - }, - { - "name": "email_port", - "type": "int", - "title": "SMTP server port", - "required": true, - "default": 25, - "config": { - "placeholder": "25" - } - }, - { - "name": "email_username", - "type": "str", - "title": "SMTP username", - "required": true, - "config": { - "placeholder": "user@example.com" - } - }, - { - "name": "email_password", - "type": "secret", - "title": "SMTP password", - "required": true - }, - { - "name": "email_from", - "type": "str", - "title": "From email address", - "required": true, - "config": { - "placeholder": "noreply@example.com" - } - }, - { - "name": "email_enabled", - "type": "bool", - "title": "Email", - "required": false, - "default": false - }, - { - "name": "email_encryption", - "type": "str", - "title": "Encryption", - "required": false, - "default": "tls", - "config": { - "placeholder": "tls" - } - } - ] - }, - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "netbox", - "config": { - "placeholder": "netbox" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "NetBox Configuration", - "name": "netbox", - "items": [ - { - "name": "netbox_metrics_enabled", - "type": "bool", - "title": "Metrics", - "required": false, - "default": false - }, - { - "name": "netbox_secret_key", - "type": "secret", - "title": "Secret Key", - "required": true, - "config": { - "autogenerated": { - "length": 50 - } - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 8000, - "config": { - "placeholder": "8000" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "netbox" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/nextcloud/files/.env b/Docker-Compose/nextcloud/files/.env deleted file mode 100644 index 44e4215..0000000 --- a/Docker-Compose/nextcloud/files/.env +++ /dev/null @@ -1,5 +0,0 @@ -# Nextcloud database credentials -DATABASE_USER=<< database_user >> -DATABASE_PASSWORD=<< database_password >> -NEXTCLOUD_ADMIN_USER=<< admin_user >> -NEXTCLOUD_ADMIN_PASSWORD=<< admin_password >> diff --git a/Docker-Compose/nextcloud/files/compose.yaml b/Docker-Compose/nextcloud/files/compose.yaml deleted file mode 100644 index 20a86bf..0000000 --- a/Docker-Compose/nextcloud/files/compose.yaml +++ /dev/null @@ -1,145 +0,0 @@ -services: - << service_name >>-app: - image: docker.io/library/nextcloud:33.0.3-apache - restart: << restart_policy >> - container_name: << container_name >>-app - environment: - - TZ=<< container_timezone >> - - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER} - - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD} - - REDIS_HOST=<< service_name >>-redis - <%- if database_type == 'mysql' %> - - MYSQL_USER=${DATABASE_USER} - - MYSQL_PASSWORD=${DATABASE_PASSWORD} - - MYSQL_DATABASE=<< database_name >> - - MYSQL_HOST=<< service_name >>-db - <%- elif database_type == 'postgres' %> - - POSTGRES_USER=${DATABASE_USER} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=<< database_name >> - - POSTGRES_HOST=<< service_name >>-db - <%- endif %> - <%- if traefik_enabled %> - - NEXTCLOUD_TRUSTED_DOMAINS=<< traefik_host >>.<< traefik_domain >> - - OVERWRITEHOST=<< traefik_host >>.<< traefik_domain >> - <%- if traefik_tls_enabled %> - - OVERWRITEPROTOCOL=https - <%- else %> - - OVERWRITEPROTOCOL=http - <%- endif %> - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:80" - <%- endif %> - volumes: - - nextcloud-data:/var/www/html - networks: - - << service_name >>-backend - <%- if traefik_enabled %> - - << traefik_network >> - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadbalancer.server.port=80 - - traefik.http.routers.<< service_name >>-web-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-web-http.entrypoints=<< traefik_entrypoint >> - - traefik.http.routers.<< service_name >>-web-http.service=<< service_name >>-web - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-web-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-web-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-web-https.tls=true - - traefik.http.routers.<< service_name >>-web-https.tls.certresolver=<< traefik_tls_certresolver >> - - traefik.http.routers.<< service_name >>-web-https.service=<< service_name >>-web - <%- endif %> - <%- endif %> - depends_on: - - << service_name >>-db - - << service_name >>-redis - - << service_name >>-cron: - image: docker.io/library/nextcloud:33.0.3-apache - restart: << restart_policy >> - container_name: << container_name >>-cron - entrypoint: /cron.sh - environment: - - TZ=<< container_timezone >> - - REDIS_HOST=<< service_name >>-redis - <%- if database_type == 'mysql' %> - - MYSQL_USER=${DATABASE_USER} - - MYSQL_PASSWORD=${DATABASE_PASSWORD} - - MYSQL_DATABASE=<< database_name >> - - MYSQL_HOST=<< service_name >>-db - <%- elif database_type == 'postgres' %> - - POSTGRES_USER=${DATABASE_USER} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=<< database_name >> - - POSTGRES_HOST=<< service_name >>-db - <%- endif %> - volumes: - - nextcloud-data:/var/www/html - networks: - - << service_name >>-backend - depends_on: - - << service_name >>-app - - << service_name >>-redis: - image: docker.io/library/redis:8-alpine - restart: << restart_policy >> - container_name: << service_name >>-redis - command: redis-server --appendonly yes - volumes: - - nextcloud-redis:/data - networks: - - << service_name >>-backend - - << service_name >>-db: - <%- if database_type == 'mysql' %> - # See compatibility matrix for Nextcloud 31 - # https://docs.nextcloud.com/server/31/admin_manual/installation/system_requirements.html - image: docker.io/library/mariadb:10.11.16 - restart: << restart_policy >> - container_name: << service_name >>-db - command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW - environment: - - TZ=<< container_timezone >> - - MYSQL_RANDOM_ROOT_PASSWORD=true - - MYSQL_USER=${DATABASE_USER} - - MYSQL_PASSWORD=${DATABASE_PASSWORD} - - MYSQL_DATABASE=<< database_name >> - volumes: - - nextcloud-db:/var/lib/mysql - networks: - - << service_name >>-backend - <%- elif database_type == 'postgres' %> - image: docker.io/library/postgres:17.9 - restart: << restart_policy >> - container_name: << service_name >>-db - environment: - - TZ=<< container_timezone >> - - POSTGRES_USER=${DATABASE_USER} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=<< database_name >> - volumes: - - nextcloud-db:/var/lib/postgresql/data - networks: - - << service_name >>-backend - <%- endif %> - -volumes: - nextcloud-data: - driver: local - nextcloud-db: - driver: local - nextcloud-redis: - driver: local - -networks: - << service_name >>-backend: - driver: bridge - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> diff --git a/Docker-Compose/nextcloud/template.json b/Docker-Compose/nextcloud/template.json deleted file mode 100644 index 23a586e..0000000 --- a/Docker-Compose/nextcloud/template.json +++ /dev/null @@ -1,284 +0,0 @@ -{ - "slug": "nextcloud", - "kind": "compose", - "metadata": { - "name": "Nextcloud", - "description": "Self-hosted file sync and share platform, similar to Dropbox, with built-in collaboration tools, calendar, contacts, and extensible app ecosystem.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "nextcloud" - }, - "draft": false, - "version": { - "name": "33.0.3-apache", - "source_dep_name": "docker.io/library/nextcloud", - "source_dep_version": "33.0.3-apache" - } - }, - "variables": [ - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_type", - "type": "enum", - "title": "Database Type", - "required": false, - "default": "postgres", - "config": { - "options": [ - "postgres", - "mysql" - ] - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": true, - "default": "nextcloud", - "config": { - "placeholder": "nextcloud" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": true, - "default": "nextcloud", - "config": { - "placeholder": "nextcloud" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database Password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - }, - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "nextcloud", - "config": { - "placeholder": "nextcloud" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "nextcloud", - "config": { - "placeholder": "nextcloud" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "nextcloud" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "", - "needs": [ - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_mode", - "type": "enum", - "title": "Network Mode", - "required": false, - "default": "bridge", - "config": { - "options": [ - "bridge", - "macvlan" - ] - } - }, - { - "name": "network_macvlan_ipv4_address_db", - "type": "str", - "title": "Database IP", - "required": false, - "default": "IP_ADDRESS", - "description": "Static IP address for database container (macvlan only)", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "IP_ADDRESS" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 80, - "config": { - "placeholder": "80" - } - } - ] - }, - { - "title": "Nextcloud", - "name": "nextcloud", - "items": [ - { - "name": "admin_user", - "type": "str", - "title": "Nextcloud admin username", - "required": false, - "default": "admin", - "config": { - "placeholder": "admin" - } - }, - { - "name": "admin_password", - "type": "secret", - "title": "Nextcloud admin password", - "required": false, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - } - ] -} diff --git a/Docker-Compose/nginx/files/compose.yaml b/Docker-Compose/nginx/files/compose.yaml deleted file mode 100644 index 65ed9d8..0000000 --- a/Docker-Compose/nginx/files/compose.yaml +++ /dev/null @@ -1,39 +0,0 @@ -services: - << service_name >>: - image: docker.io/library/nginx:1.30.0-alpine - restart: << restart_policy >> - container_name: << container_name >> - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:80" - - "<< ports_https >>:443" - <%- endif %> - # volumes: - # - ./config/default.conf:/etc/nginx/conf.d/default.conf:ro - # - ./data:/usr/share/nginx/html:ro - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadbalancer.server.port=80 - - traefik.http.routers.<< service_name >>-web-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-web-http.entrypoints=<< traefik_entrypoint >> - - traefik.http.routers.<< service_name >>-web-http.service=<< service_name >>-web - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-web-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-web-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-web-https.tls=true - - traefik.http.routers.<< service_name >>-web-https.tls.certresolver=<< traefik_tls_certresolver >> - - traefik.http.routers.<< service_name >>-web-https.service=<< service_name >>-web - <%- endif %> - <%- endif %> - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/nginx/files/config/default.conf b/Docker-Compose/nginx/files/config/default.conf deleted file mode 100644 index 9f61a69..0000000 --- a/Docker-Compose/nginx/files/config/default.conf +++ /dev/null @@ -1,9 +0,0 @@ -server { - listen 80; - server_name _; - location / { - root /usr/share/nginx/html; - index index.html; - access_log on; - } -} diff --git a/Docker-Compose/nginx/files/data/index.html b/Docker-Compose/nginx/files/data/index.html deleted file mode 100644 index 7a4b3a6..0000000 --- a/Docker-Compose/nginx/files/data/index.html +++ /dev/null @@ -1 +0,0 @@ -this is a test website... diff --git a/Docker-Compose/nginx/template.json b/Docker-Compose/nginx/template.json deleted file mode 100644 index 705a235..0000000 --- a/Docker-Compose/nginx/template.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "slug": "nginx", - "kind": "compose", - "metadata": { - "name": "Nginx", - "description": "High-performance web server, reverse proxy, and load balancer known for stability, low resource consumption, and simple configuration.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "simple-icons", - "id": "nginx" - }, - "draft": false, - "version": { - "name": "1.30.0-alpine", - "source_dep_name": "docker.io/library/nginx", - "source_dep_version": "1.30.0-alpine" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "nginx", - "config": { - "placeholder": "nginx" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": false, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "nginx", - "config": { - "placeholder": "nginx" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "default": "UTC", - "config": { - "placeholder": "UTC" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik Enabled", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "nginx" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": false, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "", - "needs": [ - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": false, - "default": "", - "needs": [ - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "cloudflare" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 8080, - "config": { - "placeholder": "8080" - } - }, - { - "name": "ports_https", - "type": "int", - "title": "HTTPS Port", - "required": false, - "default": 8443, - "config": { - "placeholder": "8443" - } - } - ] - } - ] -} diff --git a/Docker-Compose/openwebui/files/.env b/Docker-Compose/openwebui/files/.env deleted file mode 100644 index 568ae3a..0000000 --- a/Docker-Compose/openwebui/files/.env +++ /dev/null @@ -1,5 +0,0 @@ -# Open WebUI credentials -<%- if authentik_enabled %> -OAUTH_CLIENT_ID=<< authentik_client_id >> -OAUTH_CLIENT_SECRET=<< authentik_client_secret >> -<%- endif %> diff --git a/Docker-Compose/openwebui/files/compose.yaml b/Docker-Compose/openwebui/files/compose.yaml deleted file mode 100644 index e12917f..0000000 --- a/Docker-Compose/openwebui/files/compose.yaml +++ /dev/null @@ -1,60 +0,0 @@ -services: - << service_name >>: - image: ghcr.io/open-webui/open-webui:v0.9.2 - container_name: << container_name >> - hostname: << container_hostname >> - environment: - - TZ=<< container_timezone >> - - OLLAMA_BASE_URL=<< ollama_base_url >> - - WEBUI_URL=<< webui_url >> - <%- if authentik_enabled %> - - ENABLE_OAUTH_SIGNUP=true - - ENABLE_OAUTH_PERSISTENT_CONFIG=false - - OAUTH_MERGE_ACCOUNTS_BY_EMAIL=<< oauth_merge_accounts|lower >> - - OAUTH_PROVIDER_NAME=authentik - - OPENID_PROVIDER_URL=<< openid_provider_url >> - - OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID} - - OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} - - OAUTH_SCOPES=<< oauth_scopes >> - - OPENID_REDIRECT_URI=<< openid_redirect_uri >> - <%- endif %> - <%- if traefik_tls_enabled %> - - WEBUI_SESSION_COOKIE_SECURE=true - <%- endif %> - volumes: - - data:/app/backend/data:rw - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:8080" - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=8080 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - restart: << restart_policy >> - -volumes: - data: - driver: local - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/openwebui/template.json b/Docker-Compose/openwebui/template.json deleted file mode 100644 index 30e85f8..0000000 --- a/Docker-Compose/openwebui/template.json +++ /dev/null @@ -1,282 +0,0 @@ -{ - "slug": "openwebui", - "kind": "compose", - "metadata": { - "name": "Openwebui", - "description": "Web-based interface for managing and interacting with local AI models (Ollama, etc.). Provides chat, model management, and multi-user support.", - "tags": [ - "traefik", - "authentik" - ], - "icon": { - "provider": "selfhst", - "id": "open-webui" - }, - "draft": false, - "version": { - "name": "v0.9.2", - "source_dep_name": "ghcr.io/open-webui/open-webui", - "source_dep_version": "v0.9.2" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "openwebui", - "config": { - "placeholder": "openwebui" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "openwebui", - "config": { - "placeholder": "openwebui" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": true - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "ollama_base_url", - "type": "str", - "title": "Ollama URL", - "required": false, - "default": "http://ollama:11434", - "config": { - "placeholder": "http://ollama:11434" - } - }, - { - "name": "webui_url", - "type": "str", - "title": "Public WebUI URL", - "required": false, - "default": "http://localhost:8080", - "config": { - "placeholder": "https://openwebui.home.arpa" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "openwebui" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "", - "needs": [ - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "Web UI port", - "required": false, - "default": 8080, - "config": { - "placeholder": "8080" - } - } - ] - }, - { - "title": "Authentik", - "name": "authentik", - "items": [ - { - "name": "authentik_enabled", - "type": "bool", - "title": "Authentik Enabled", - "required": false, - "default": false - }, - { - "name": "openid_provider_url", - "type": "str", - "title": "OpenID Config URL", - "required": false, - "needs": [ - "authentik_enabled=true" - ], - "config": { - "placeholder": "https://authentik.home.arpa/application/o/openwebui/.well-known/openid-configuration" - } - }, - { - "name": "openid_redirect_uri", - "type": "str", - "title": "OAuth redirect URI", - "required": false, - "default": "https://openwebui.home.arpa/oauth/oidc/callback", - "needs": [ - "authentik_enabled=true" - ], - "config": { - "placeholder": "https://openwebui.home.arpa/oauth/oidc/callback" - } - }, - { - "name": "oauth_scopes", - "type": "str", - "title": "OAuth Scopes", - "required": false, - "default": "openid email profile", - "description": "OAuth scopes (space-separated)", - "needs": [ - "authentik_enabled=true" - ], - "config": { - "placeholder": "openid email profile" - } - }, - { - "name": "oauth_merge_accounts", - "type": "bool", - "title": "Merge Accounts", - "required": false, - "default": false, - "description": "Merge OAuth accounts by email", - "needs": [ - "authentik_enabled=true" - ] - }, - { - "name": "authentik_client_id", - "type": "secret", - "title": "Authentik Client Id", - "required": true, - "needs": [ - "authentik_enabled=true" - ] - }, - { - "name": "authentik_client_secret", - "type": "secret", - "title": "Authentik Client Secret", - "required": true, - "needs": [ - "authentik_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/passbolt/files/.env b/Docker-Compose/passbolt/files/.env deleted file mode 100644 index bf07a4a..0000000 --- a/Docker-Compose/passbolt/files/.env +++ /dev/null @@ -1,9 +0,0 @@ -# Passbolt credentials -DATABASE_USER=<< database_user >> -DATABASE_PASSWORD=<< database_password >> -<%- if email_username %> -EMAIL_USERNAME=<< email_username >> -<%- endif %> -<%- if email_password %> -EMAIL_PASSWORD=<< email_password >> -<%- endif %> diff --git a/Docker-Compose/passbolt/files/compose.yaml b/Docker-Compose/passbolt/files/compose.yaml deleted file mode 100644 index 06f1f8f..0000000 --- a/Docker-Compose/passbolt/files/compose.yaml +++ /dev/null @@ -1,49 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/passbolt/passbolt:5.11.0-1-ce - restart: << restart_policy >> - ports: - - "<< ports_http >>:80" - environment: - <%- if container_timezone%> - - APP_DEFAULT_TIMEZONE=<< container_timezone >> - <%- endif %> - - APP_FULL_BASE_URL=<< app_full_base_url >> - - DATASOURCES_DEFAULT_HOST=<< service_name >>-db - - DATASOURCES_DEFAULT_USERNAME=${DATABASE_USER} - - DATASOURCES_DEFAULT_PASSWORD=${DATABASE_PASSWORD} - - DATASOURCES_DEFAULT_DATABASE=<< database_name >> - - EMAIL_TRANSPORT_DEFAULT_HOST=<< email_host >> - - EMAIL_TRANSPORT_DEFAULT_PORT=<< email_port >> - <%- if email_username %> - - EMAIL_TRANSPORT_DEFAULT_USERNAME=${EMAIL_USERNAME} - <%- endif %> - <%- if email_password %> - - EMAIL_TRANSPORT_DEFAULT_PASSWORD=${EMAIL_PASSWORD} - <%- endif %> - - EMAIL_TRANSPORT_DEFAULT_TLS=<< email_use_tls | lower >> - - EMAIL_DEFAULT_FROM=<< email_from >> - volumes: - - << service_name >>-gpg:/etc/passbolt/gpg - - << service_name >>-jwt:/etc/passbolt/jwt - command: ["/usr/bin/wait-for.sh", "-t", "0", "<< service_name >>-db:3306", "--", "/docker-entrypoint.sh"] - depends_on: - - << service_name >>-db - - << service_name >>-db: - image: docker.io/library/mariadb:12.2.2 - restart: << restart_policy >> - environment: - - MYSQL_RANDOM_ROOT_PASSWORD=true - - MYSQL_DATABASE=<< database_name >> - - MYSQL_USER=${DATABASE_USER} - - MYSQL_PASSWORD=${DATABASE_PASSWORD} - volumes: - - << service_name >>-db:/var/lib/mysql - - -volumes: - << service_name >>-db: - << service_name >>-gpg: - << service_name >>-jwt: diff --git a/Docker-Compose/passbolt/template.json b/Docker-Compose/passbolt/template.json deleted file mode 100644 index 6eeb0fc..0000000 --- a/Docker-Compose/passbolt/template.json +++ /dev/null @@ -1,180 +0,0 @@ -{ - "slug": "passbolt", - "kind": "compose", - "metadata": { - "name": "Passbolt", - "description": "Open-source password manager designed for teams and businesses. Provides secure storage, sharing, and collaborative management of passwords and sensitive information.", - "tags": [ - "traefik", - "database" - ], - "icon": { - "provider": "selfhst", - "id": "passbolt" - }, - "draft": false, - "version": { - "name": "5.11.0-1-ce", - "source_dep_name": "docker.io/passbolt/passbolt", - "source_dep_version": "5.11.0-1-ce" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "passbolt", - "config": { - "placeholder": "passbolt" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "ports_http", - "type": "int", - "title": "HTTP port", - "required": false, - "default": 8080, - "config": { - "placeholder": "8080" - } - }, - { - "name": "app_full_base_url", - "type": "str", - "title": "Passbolt base URL", - "required": false, - "default": "http://localhost:8080", - "description": "Public base URL for Passbolt", - "config": { - "placeholder": "http://localhost:8080" - } - } - ] - }, - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": false, - "default": "passbolt", - "config": { - "placeholder": "passbolt" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": false, - "default": "passbolt", - "config": { - "placeholder": "passbolt" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - }, - { - "title": "Email", - "name": "email", - "items": [ - { - "name": "email_host", - "type": "str", - "title": "SMTP server hostname", - "required": true, - "config": { - "placeholder": "smtp.home.arpa" - } - }, - { - "name": "email_port", - "type": "int", - "title": "SMTP server port", - "required": false, - "default": 587, - "config": { - "placeholder": "587" - } - }, - { - "name": "email_username", - "type": "str", - "title": "SMTP username", - "required": false, - "default": "", - "config": { - "placeholder": "user@example.com" - } - }, - { - "name": "email_password", - "type": "secret", - "title": "SMTP password", - "required": false, - "default": "" - }, - { - "name": "email_from", - "type": "str", - "title": "From email address", - "required": true, - "config": { - "placeholder": "no-reply@home.arpa" - } - }, - { - "name": "email_use_tls", - "type": "bool", - "title": "SMTP TLS", - "required": false, - "default": true - } - ] - } - ] -} diff --git a/Docker-Compose/pihole/files/.env b/Docker-Compose/pihole/files/.env deleted file mode 100644 index e78c2e0..0000000 --- a/Docker-Compose/pihole/files/.env +++ /dev/null @@ -1,2 +0,0 @@ -# Pi-hole credentials -WEBPASSWORD=<< webpassword >> diff --git a/Docker-Compose/pihole/files/compose.yaml b/Docker-Compose/pihole/files/compose.yaml deleted file mode 100644 index 491ffa1..0000000 --- a/Docker-Compose/pihole/files/compose.yaml +++ /dev/null @@ -1,129 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/pihole/pihole:2026.04.1 - - restart: << restart_policy >> - <%- if container_name %> - container_name: << container_name >> - <%- endif %> - - <%- if container_hostname %> - hostname: << container_hostname >> - <%- endif %> - - environment: - - TZ=<< container_timezone >> - - PIHOLE_UID=<< user_uid >> - - PIHOLE_GID=<< user_gid >> - - FTLCONF_webserver_api_password=${WEBPASSWORD} - <%- if network_mode == 'bridge' %> - - FTLCONF_dns_listeningMode=all - <%- endif %> - - <%- if network_mode == 'host' %> - network_mode: host - <%- elif network_mode == 'bridge' or network_mode == 'macvlan' or traefik_enabled %> - networks: - <%- if traefik_enabled %> - << traefik_network >>: - <%- endif %> - <%- if network_mode == 'macvlan' %> - << network_name >>: - ipv4_address: << network_macvlan_ipv4_address >> - <%- elif network_mode == 'bridge' %> - << network_name >>: - <%- endif %> - <%- endif %> - - <%- if network_mode == '' or network_mode == 'bridge' or traefik_enabled %> - ports: - <%- if not traefik_enabled %> - - "<< ports_http >>:80/tcp" - - "<< ports_https >>:443/tcp" - <%- endif %> - - "<< ports_dns >>:53/tcp" - - "<< ports_dns >>:53/udp" - - "<< ports_ntp >>:123/udp" - <%- endif %> - - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/dnsmasq:/etc/dnsmasq.d:rw - - << volume_mount_path >>/pihole:/etc/pihole:rw - <%- else %> - - << service_name >>-dnsmasq:/etc/dnsmasq.d - - << service_name >>-pihole:/etc/pihole - <%- endif %> - - cap_add: - - NET_ADMIN - - SYS_TIME - - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=80 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>-dnsmasq: - driver: local - << service_name >>-pihole: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>-dnsmasq: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/dnsmasq" - << service_name >>-pihole: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/pihole" -<%- endif %> - - -<%- if network_mode == 'bridge' or network_mode == 'macvlan' or traefik_enabled %> -networks: - <%- if network_mode == 'bridge' or network_mode == 'macvlan' %> - << network_name >>: - <%- if network_external %> - external: true - <%- else %> - <%- if network_mode == 'macvlan' %> - driver: macvlan - driver_opts: - parent: << network_macvlan_parent_interface >> - ipam: - config: - - subnet: << network_macvlan_subnet >> - gateway: << network_macvlan_gateway >> - name: << network_name >> - <%- else %> - driver: bridge - <%- endif %> - <%- endif %> - <%- endif %> - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> -<%- endif %> diff --git a/Docker-Compose/pihole/template.json b/Docker-Compose/pihole/template.json deleted file mode 100644 index 9e85b22..0000000 --- a/Docker-Compose/pihole/template.json +++ /dev/null @@ -1,402 +0,0 @@ -{ - "slug": "pihole", - "kind": "compose", - "metadata": { - "name": "Pihole", - "description": "Network-wide DNS-based ad and tracker blocker that acts as a DNS sinkhole. Filters content at the DNS level for all devices on your network.", - "tags": [ - "traefik", - "network", - "volume" - ], - "icon": { - "provider": "selfhst", - "id": "pi-hole" - }, - "draft": false, - "version": { - "name": "2026.04.1", - "source_dep_name": "docker.io/pihole/pihole", - "source_dep_version": "2026.04.1" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "pihole", - "config": { - "placeholder": "pihole" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "pihole", - "config": { - "placeholder": "pihole" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "user_uid", - "type": "int", - "title": "User Uid", - "required": false, - "default": 1000, - "config": { - "placeholder": "1000" - } - }, - { - "name": "user_gid", - "type": "int", - "title": "User Gid", - "required": false, - "default": 1000, - "config": { - "placeholder": "1000" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Admin Settings", - "name": "admin-settings", - "items": [ - { - "name": "webpassword", - "type": "secret", - "title": "Admin Password", - "required": false, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_dns", - "type": "int", - "title": "DNS Port", - "required": true, - "default": 53, - "config": { - "placeholder": "53" - } - }, - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 80, - "config": { - "placeholder": "80" - } - }, - { - "name": "ports_https", - "type": "int", - "title": "HTTPS Port", - "required": false, - "default": 443, - "config": { - "placeholder": "443" - } - }, - { - "name": "ports_ntp", - "type": "int", - "title": "External NTP port", - "required": true, - "default": 123, - "config": { - "placeholder": "123" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "pihole" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_mode", - "type": "str", - "title": "Network Mode", - "required": false - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "pihole_network", - "config": { - "placeholder": "pihole_network" - } - }, - { - "name": "network_macvlan_ipv4_address", - "type": "str", - "title": "IPv4 Address", - "required": true, - "default": "IP_ADDRESS", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "IP_ADDRESS" - } - }, - { - "name": "network_macvlan_parent_interface", - "type": "str", - "title": "Parent Interface", - "required": true, - "default": "eth0", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "eth0" - } - }, - { - "name": "network_macvlan_subnet", - "type": "str", - "title": "Subnet", - "required": true, - "default": "IP_RANGE", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "IP_RANGE" - } - }, - { - "name": "network_macvlan_gateway", - "type": "str", - "title": "Gateway", - "required": true, - "default": "GATEWAY", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "GATEWAY" - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/data", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/data" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": true, - "default": "NFS_SERVER", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "NFS_SERVER" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": true, - "default": "/export", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/export" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": true, - "default": "rw,nolock,soft", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw,nolock,soft" - } - } - ] - } - ] -} diff --git a/Docker-Compose/portainer/files/compose.yaml b/Docker-Compose/portainer/files/compose.yaml deleted file mode 100644 index 65e62ef..0000000 --- a/Docker-Compose/portainer/files/compose.yaml +++ /dev/null @@ -1,59 +0,0 @@ -services: - << service_name >>: - image: docker.io/portainer/portainer-ce:2.41.0-alpine - restart: << restart_policy >> - environment: - - TZ=<< container_timezone >> - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - ports: - <%- if not traefik_enabled %> - - "<< ports_http >>:9000" - - "<< ports_https >>:9443" - <%- endif %> - - "<< ports_edge >>:8000" - volumes: - - /run/docker.sock:/var/run/docker.sock - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/data:/data - <%- else %> - - << service_name >>_data:/data - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=9000 - - traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_https.tls=true - - traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>_data: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>_data: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/data" -<%- endif %> - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/portainer/template.json b/Docker-Compose/portainer/template.json deleted file mode 100644 index 5b5ea45..0000000 --- a/Docker-Compose/portainer/template.json +++ /dev/null @@ -1,257 +0,0 @@ -{ - "slug": "portainer-compose", - "kind": "compose", - "metadata": { - "name": "Portainer", - "description": "Web-based management UI for Docker and Kubernetes environments. Simplifies container, image, network, and volume management through an intuitive interface.", - "tags": [ - "traefik", - "volumes" - ], - "icon": { - "provider": "selfhst", - "id": "portainer" - }, - "draft": false, - "version": { - "name": "2.41.0-alpine", - "source_dep_name": "docker.io/portainer/portainer-ce", - "source_dep_version": "2.41.0-alpine" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "portainer", - "config": { - "placeholder": "portainer" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 9000, - "config": { - "placeholder": "9000" - } - }, - { - "name": "ports_https", - "type": "str", - "title": "HTTPS Port", - "required": false, - "default": 9443, - "config": { - "placeholder": "9443" - } - }, - { - "name": "ports_edge", - "type": "int", - "title": "Edge Port", - "required": true, - "default": 8000, - "config": { - "placeholder": "8000" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "portainer" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/data", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/data" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": true, - "default": "NFS_SERVER", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "NFS_SERVER" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": true, - "default": "/export", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/export" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": true, - "default": "rw,nolock,soft", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw,nolock,soft" - } - } - ] - } - ] -} diff --git a/Docker-Compose/postgres/files/.env b/Docker-Compose/postgres/files/.env deleted file mode 100644 index a000463..0000000 --- a/Docker-Compose/postgres/files/.env +++ /dev/null @@ -1,3 +0,0 @@ -# PostgreSQL credentials -POSTGRES_USER=<< database_user >> -POSTGRES_PASSWORD=<< database_password >> diff --git a/Docker-Compose/postgres/files/compose.yaml b/Docker-Compose/postgres/files/compose.yaml deleted file mode 100644 index b0d71da..0000000 --- a/Docker-Compose/postgres/files/compose.yaml +++ /dev/null @@ -1,59 +0,0 @@ -services: - << service_name >>: - image: docker.io/library/postgres:18.3 - restart: << restart_policy >> - container_name: << container_name >> - hostname: << container_hostname >> - environment: - - POSTGRES_INITDB_ARGS=<< postgres_initdb_args >> - <%- if postgres_host_auth_method %> - - POSTGRES_HOST_AUTH_METHOD=<< postgres_host_auth_method >> - <%- endif %> - - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - - POSTGRES_DB=<< database_name >> - - TZ=<< container_timezone >> - <%- if network_mode == 'bridge' or network_mode == '' %> - networks: - << network_name >>: - <%- endif %> - <%- if network_mode == 'bridge' or network_mode == '' %> - ports: - - "<< ports_postgres >>:5432" - <%- endif %> - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>:/var/lib/postgresql:rw - <%- else %> - - << service_name >>-data:/var/lib/postgresql - <%- endif %> - healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] - start_period: 30s - interval: 10s - timeout: 10s - retries: 5 - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>-data: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>-data: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>" -<%- endif %> - -<%- if network_mode == 'bridge' or network_mode == '' %> -networks: - << network_name >>: - <%- if network_external %> - external: true - <%- else %> - driver: bridge - <%- endif %> -<%- endif %> diff --git a/Docker-Compose/postgres/template.json b/Docker-Compose/postgres/template.json deleted file mode 100644 index 1537db7..0000000 --- a/Docker-Compose/postgres/template.json +++ /dev/null @@ -1,233 +0,0 @@ -{ - "slug": "postgres", - "kind": "compose", - "metadata": { - "name": "PostgreSQL", - "description": "Powerful open-source object-relational database system with over 35 years of active development, known for reliability, feature robustness, and performance.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "postgresql" - }, - "draft": false, - "version": { - "name": "18.3", - "source_dep_name": "docker.io/library/postgres", - "source_dep_version": "18.3" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "postgres", - "config": { - "placeholder": "postgres" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "postgres", - "config": { - "placeholder": "postgres" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": true - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "postgres_initdb_args", - "type": "str", - "title": "Postgres Initdb Args", - "required": true, - "default": "" - }, - { - "name": "postgres_host_auth_method", - "type": "str", - "title": "Host Auth", - "required": false, - "default": "" - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_postgres", - "type": "int", - "title": "PostgreSQL port", - "required": false, - "default": 5432, - "config": { - "placeholder": "5432" - } - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_mode", - "type": "str", - "title": "Network Mode", - "required": false - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "postgres_network", - "config": { - "placeholder": "postgres_network" - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": false, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Bind Path", - "required": false, - "default": "/var/lib/postgresql/data", - "config": { - "placeholder": "/var/lib/postgresql/data" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "NFS Server", - "required": false, - "default": "", - "config": { - "placeholder": "nas.home.arpa" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "NFS Path", - "required": false, - "default": "", - "config": { - "placeholder": "/export/app" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "NFS Options", - "required": false, - "default": "rw", - "config": { - "placeholder": "rw" - } - } - ] - }, - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": true, - "default": "app", - "config": { - "placeholder": "app" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": true, - "default": "app", - "config": { - "placeholder": "app" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - } - ] -} diff --git a/Docker-Compose/prometheus/files/compose.yaml b/Docker-Compose/prometheus/files/compose.yaml deleted file mode 100644 index 9202f1d..0000000 --- a/Docker-Compose/prometheus/files/compose.yaml +++ /dev/null @@ -1,56 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/prom/prometheus:v3.11.3 - restart: << restart_policy >> - command: - - --config.file=/etc/prometheus/prometheus.yaml - - --storage.tsdb.retention.time=<< metrics_retention_time >> - <%- if metrics_retention_size != '0' %> - - --storage.tsdb.retention.size=<< metrics_retention_size >> - <%- endif %> - <%- if metrics_enable_remote_write %> - - --web.enable-remote-write-receiver - <%- endif %> - <%- if traefik_enabled %> - <%- if traefik_tls_enabled %> - - --web.external-url=https://<< traefik_host >>.<< traefik_domain >> - <%- else %> - - --web.external-url=http://<< traefik_host >>.<< traefik_domain >> - <%- endif %> - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:9090" - <%- endif %> - volumes: - - << service_name >>_data:/prometheus - - ./config/prometheus.yaml:/etc/prometheus/prometheus.yaml:ro - <%- if traefik_enabled %> - networks: - << traefik_network >>: - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=9090 - - traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_https.tls=true - - traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -volumes: - << service_name >>_data: - driver: local - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/prometheus/files/config/prometheus.yaml b/Docker-Compose/prometheus/files/config/prometheus.yaml deleted file mode 100755 index 69e5117..0000000 --- a/Docker-Compose/prometheus/files/config/prometheus.yaml +++ /dev/null @@ -1,28 +0,0 @@ ---- -global: - scrape_interval: 15s # By default, scrape targets every 15 seconds. - - # Attach these labels to any time series or alerts when communicating with - # external systems (federation, remote storage, Alertmanager). - # external_labels: - # monitor: 'codelab-monitor' - -# A scrape configuration containing exactly one endpoint to scrape: -# Here it's Prometheus itself. -scrape_configs: - # The job name is added as a label `job=` to any timeseries scraped from this config. - - job_name: 'prometheus' - # Override the global default and scrape targets from this job every 5 seconds. - scrape_interval: 5s - static_configs: - - targets: ['localhost:9090'] - -# Example job for node_exporter -# - job_name: 'node_exporter' -# static_configs: -# - targets: ['node_exporter:9100'] - -# Example job for cadvisor -# - job_name: 'cadvisor' -# static_configs: -# - targets: ['cadvisor:8080'] diff --git a/Docker-Compose/prometheus/template.json b/Docker-Compose/prometheus/template.json deleted file mode 100644 index cd11ba5..0000000 --- a/Docker-Compose/prometheus/template.json +++ /dev/null @@ -1,191 +0,0 @@ -{ - "slug": "prometheus", - "kind": "compose", - "metadata": { - "name": "Prometheus", - "description": "Open-source systems monitoring and alerting toolkit. Collects and stores metrics as time series data, with a powerful query language (PromQL) and integration with visualization tools like Grafana.", - "tags": [ - "traefik", - "authentik" - ], - "icon": { - "provider": "selfhst", - "id": "prometheus" - }, - "draft": false, - "version": { - "name": "v3.11.3", - "source_dep_name": "docker.io/prom/prometheus", - "source_dep_version": "v3.11.3" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "prometheus", - "config": { - "placeholder": "prometheus" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Metrics & Storage", - "name": "metrics", - "items": [ - { - "name": "metrics_retention_time", - "type": "str", - "title": "Retention Time", - "required": false, - "default": "15d", - "description": "How long to retain samples (e.g., 15d, 30d, 1y)", - "config": { - "placeholder": "15d" - } - }, - { - "name": "metrics_retention_size", - "type": "str", - "title": "Retention Size", - "required": false, - "default": "0", - "description": "Maximum storage size (e.g., 5GB, 10GB, 1TB)", - "config": { - "placeholder": "0" - } - }, - { - "name": "metrics_enable_remote_write", - "type": "bool", - "title": "Remote Write Receiver", - "required": false, - "default": false - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 9090, - "config": { - "placeholder": "9090" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "prometheus" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/renovate/files/.env b/Docker-Compose/renovate/files/.env deleted file mode 100644 index 5b03a42..0000000 --- a/Docker-Compose/renovate/files/.env +++ /dev/null @@ -1,4 +0,0 @@ -# Renovate credentials -MEND_RNV_LICENSE_KEY=<< license_key >> -MEND_RNV_GITLAB_PAT=<< git_token >> -MEND_RNV_WEBHOOK_SECRET=<< webhook_secret >> diff --git a/Docker-Compose/renovate/files/compose.yaml b/Docker-Compose/renovate/files/compose.yaml deleted file mode 100644 index bc8e165..0000000 --- a/Docker-Compose/renovate/files/compose.yaml +++ /dev/null @@ -1,56 +0,0 @@ ---- -services: - << service_name >>: - image: ghcr.io/mend/renovate-ce:14.5.0-full - container_name: << container_name >> - restart: << restart_policy >> - hostname: << container_hostname >> - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:8080" - <%- endif %> - environment: - - MEND_RNV_ACCEPT_TOS=y - - MEND_RNV_LICENSE_KEY=${MEND_RNV_LICENSE_KEY} - - MEND_RNV_PLATFORM=<< renovate_platform >> - - MEND_RNV_ENDPOINT=<< renovate_endpoint >> - - MEND_RNV_GITLAB_PAT=${MEND_RNV_GITLAB_PAT} - - MEND_RNV_WEBHOOK_SECRET=${MEND_RNV_WEBHOOK_SECRET} - - MEND_RNV_SERVER_PORT=8080 - - RENOVATE_AUTODISCOVER=<< renovate_autodiscover | lower >> - <%- if container_timezone %> - - TZ=<< container_timezone >> - <%- endif %> - <%- if container_loglevel %> - - LOG_LEVEL=<< container_loglevel >> - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>.loadbalancer.server.port=8080 - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/Docker-Compose/renovate/template.json b/Docker-Compose/renovate/template.json deleted file mode 100644 index fdf2d35..0000000 --- a/Docker-Compose/renovate/template.json +++ /dev/null @@ -1,264 +0,0 @@ -{ - "slug": "renovate", - "kind": "compose", - "metadata": { - "name": "Renovate", - "description": "Self-hosted Mend Renovate CE worker for GitLab that scans repositories and opens dependency update merge requests.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "mend-renovate" - }, - "draft": false, - "version": { - "name": "14.5.0-full", - "source_dep_name": "ghcr.io/mend/renovate-ce", - "source_dep_version": "14.5.0-full" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "renovate", - "config": { - "placeholder": "renovate" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": false, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "renovate", - "config": { - "placeholder": "renovate" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false, - "default": "renovate", - "config": { - "placeholder": "renovate" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "default": "UTC", - "config": { - "placeholder": "UTC" - } - }, - { - "name": "container_loglevel", - "type": "enum", - "title": "Log Level", - "required": false, - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik Enabled", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "renovate" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": false, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "", - "needs": [ - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": false, - "default": "", - "needs": [ - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "cloudflare" - } - } - ] - }, - { - "title": "Renovate Settings", - "name": "renovate-settings", - "items": [ - { - "name": "renovate_platform", - "type": "enum", - "title": "Git Platform", - "required": false, - "default": "gitlab", - "config": { - "options": [ - "gitlab" - ] - } - }, - { - "name": "renovate_endpoint", - "type": "str", - "title": "Git Endpoint", - "required": false, - "default": "https://gitlab.com/api/v4/", - "config": { - "placeholder": "https://gitlab.com/api/v4/" - } - }, - { - "name": "renovate_autodiscover", - "type": "bool", - "title": "Auto-discover repositories", - "required": false, - "default": false - } - ] - }, - { - "title": "Authentication", - "name": "authentication", - "items": [ - { - "name": "git_token", - "type": "secret", - "title": "Git Token", - "required": true - }, - { - "name": "license_key", - "type": "secret", - "title": "License Key", - "required": true, - "description": "Mend Renovate CE License Key" - }, - { - "name": "webhook_secret", - "type": "secret", - "title": "Webhook Secret", - "required": false, - "default": "renovate", - "description": "Webhook secret for platform integration", - "config": { - "placeholder": "renovate" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 8080, - "config": { - "placeholder": "8080" - } - } - ] - } - ] -} diff --git a/Docker-Compose/semaphoreui/files/.env b/Docker-Compose/semaphoreui/files/.env deleted file mode 100644 index bd60b79..0000000 --- a/Docker-Compose/semaphoreui/files/.env +++ /dev/null @@ -1,8 +0,0 @@ -# Semaphore UI credentials -<%- if database_type != "sqlite" %> -DATABASE_USER=<< database_user >> -DATABASE_PASSWORD=<< database_password >> -<%- endif %> -SEMAPHORE_ADMIN=<< admin_user >> -SEMAPHORE_ADMIN_PASSWORD=<< admin_pass >> -SEMAPHORE_ACCESS_KEY_ENCRYPTION=<< secret_key >> diff --git a/Docker-Compose/semaphoreui/files/compose.yaml b/Docker-Compose/semaphoreui/files/compose.yaml deleted file mode 100644 index 35bf534..0000000 --- a/Docker-Compose/semaphoreui/files/compose.yaml +++ /dev/null @@ -1,121 +0,0 @@ -services: - << service_name >>: - image: docker.io/semaphoreui/semaphore:v2.18.1 - restart: << restart_policy >> - environment: - - SEMAPHORE_DB_DIALECT=<< database_type >> - <%- if database_type == "sqlite" %> - <%- if database_path %> - - SEMAPHORE_DB=<< database_path >> - <%- endif %> - <%- else %> - <%- if database_external %> - - SEMAPHORE_DB_HOST=<< database_host >> - <%- else %> - - SEMAPHORE_DB_HOST=<< service_name >>_db - <%- endif %> - - SEMAPHORE_DB=<< database_name >> - - SEMAPHORE_DB_USER=${DATABASE_USER} - - SEMAPHORE_DB_PASS=${DATABASE_PASSWORD} - <%- endif %> - - SEMAPHORE_ADMIN=${SEMAPHORE_ADMIN} - - SEMAPHORE_ADMIN_NAME=<< admin_name >> - - SEMAPHORE_ADMIN_EMAIL=<< admin_email >> - - SEMAPHORE_ADMIN_PASSWORD=${SEMAPHORE_ADMIN_PASSWORD} - - SEMAPHORE_PLAYBOOK_PATH=/tmp/semaphore/ - - SEMAPHORE_ACCESS_KEY_ENCRYPTION=${SEMAPHORE_ACCESS_KEY_ENCRYPTION} - - ANSIBLE_HOST_KEY_CHECKING=<< ansible_host_key_checking >> - <%- if database_type == "sqlite" %> - volumes: - - << service_name >>_config:/etc/semaphore - <%- endif %> - <%- if (not database_external and database_type != "sqlite") or traefik_enabled %> - networks: - <%- if not database_external and database_type != "sqlite" %> - - << service_name >>_backend - <%- endif %> - <%- if traefik_enabled %> - - << traefik_network >> - <%- endif %> - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:3000" - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=3000 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - <%- if not database_external and database_type != "sqlite" %> - depends_on: - - << service_name >>_db - <%- endif %> - - <%- if not database_external and database_type == "postgres" %> - << service_name >>_db: - image: docker.io/library/postgres:17.9 - restart: << restart_policy >> - environment: - - POSTGRES_USER=${DATABASE_USER} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=<< database_name >> - networks: - - << service_name >>_backend - healthcheck: - test: ["CMD-SHELL", "pg_isready -U << database_user >>"] - start_period: 30s - interval: 10s - timeout: 10s - retries: 5 - volumes: - - << service_name >>_db:/var/lib/postgresql/data - <%- elif not database_external and database_type == "mysql" %> - << service_name >>_db: - image: docker.io/library/mysql:8.1 - restart: << restart_policy >> - environment: - - MYSQL_USER=${DATABASE_USER} - - MYSQL_PASSWORD=${DATABASE_PASSWORD} - - MYSQL_DATABASE=<< database_name >> - - MYSQL_ROOT_PASSWORD=${DATABASE_PASSWORD} - networks: - - << service_name >>_backend - volumes: - - << service_name >>_db:/var/lib/mysql - <%- endif %> - -<%- if database_type == "sqlite" or (not database_external and (database_type == "postgres" or database_type == "mysql")) %> -volumes: - <%- if database_type == "sqlite" %> - << service_name >>_config: - driver: local - <%- endif %> - <%- if not database_external and (database_type == "postgres" or database_type == "mysql") %> - << service_name >>_db: - driver: local - <%- endif %> -<%- endif %> - -<%- if (not database_external and database_type != "sqlite") or traefik_enabled %> -networks: - <%- if not database_external and database_type != "sqlite" %> - << service_name >>_backend: - driver: bridge - <%- endif %> - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> -<%- endif %> diff --git a/Docker-Compose/semaphoreui/template.json b/Docker-Compose/semaphoreui/template.json deleted file mode 100644 index f2c5c99..0000000 --- a/Docker-Compose/semaphoreui/template.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "slug": "semaphoreui", - "kind": "compose", - "metadata": { - "name": "Semaphore UI", - "description": "Modern web UI for Ansible automation with task scheduling, inventory management, and playbook execution. Ideal for teams who want a user-friendly way to run and monitor Ansible.", - "tags": [ - "traefik", - "database" - ], - "icon": { - "provider": "selfhst", - "id": "semaphore-ui" - }, - "draft": false, - "version": { - "name": "v2.18.1", - "source_dep_name": "docker.io/semaphoreui/semaphore", - "source_dep_version": "v2.18.1" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "semaphoreui", - "config": { - "placeholder": "semaphoreui" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "semaphoreui", - "config": { - "placeholder": "semaphoreui" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "secret_key", - "type": "secret", - "title": "Secret Key", - "required": true, - "description": "Secret key for encrypting access keys", - "config": { - "autogenerated": { - "kind": "base64", - "bytes": 32 - } - } - }, - { - "name": "admin_user", - "type": "str", - "title": "Administrator username", - "required": true, - "default": "admin", - "config": { - "placeholder": "admin" - } - }, - { - "name": "admin_name", - "type": "str", - "title": "Administrator full name", - "required": true, - "default": "Administrator", - "config": { - "placeholder": "Administrator" - } - }, - { - "name": "admin_email", - "type": "str", - "title": "Administrator email address", - "required": true, - "default": "admin@home.arpa", - "config": { - "placeholder": "admin@home.arpa" - } - }, - { - "name": "admin_pass", - "type": "secret", - "title": "Administrator password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "ansible_host_key_checking", - "type": "bool", - "title": "Host Key Checking", - "required": false - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 3000, - "config": { - "placeholder": "3000" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "semaphoreui" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_type", - "type": "enum", - "title": "Database Type", - "required": false, - "default": "sqlite", - "config": { - "options": [ - "sqlite", - "postgres", - "mysql" - ] - } - }, - { - "name": "database_path", - "type": "str", - "title": "Database Path", - "required": false, - "default": "/etc/semaphore/semaphore.sqlite", - "needs": [ - "database_type=sqlite" - ], - "config": { - "placeholder": "/etc/semaphore/semaphore.sqlite" - }, - "description": "Path to the SQLite database file." - }, - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": false, - "default": "semaphore", - "needs": [ - "database_type=postgres,mysql" - ], - "config": { - "placeholder": "semaphore" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": false, - "default": "semaphore", - "needs": [ - "database_type=postgres,mysql" - ], - "config": { - "placeholder": "semaphore" - } - }, - { - "name": "database_host", - "type": "str", - "title": "Database Host", - "required": true, - "default": "postgres", - "needs": [ - "database_type=postgres,mysql", - "database_external=true" - ], - "config": { - "placeholder": "postgres" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database Password", - "required": true, - "needs": [ - "database_type=postgres,mysql" - ], - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "database_external", - "type": "bool", - "title": "External Database", - "required": false, - "default": false, - "needs": [ - "database_type=postgres,mysql" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/technitium/files/.env b/Docker-Compose/technitium/files/.env deleted file mode 100644 index 2d836c8..0000000 --- a/Docker-Compose/technitium/files/.env +++ /dev/null @@ -1,2 +0,0 @@ -# Technitium DNS Server credentials -DNS_SERVER_ADMIN_PASSWORD=<< dns_server_admin_password >> diff --git a/Docker-Compose/technitium/files/compose.yaml b/Docker-Compose/technitium/files/compose.yaml deleted file mode 100644 index c300a54..0000000 --- a/Docker-Compose/technitium/files/compose.yaml +++ /dev/null @@ -1,141 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/technitium/dns-server:15.1.0 - restart: << restart_policy >> - <%- if container_name %> - container_name: << container_name >> - <%- endif %> - <%- if container_hostname %> - hostname: << container_hostname >> - <%- endif %> - environment: - - DNS_SERVER_DOMAIN=<< dns_server_domain >> - - DNS_SERVER_ADMIN_PASSWORD=${DNS_SERVER_ADMIN_PASSWORD} - - DNS_SERVER_LOG_FOLDER_PATH=/var/log/technitium/dns - - DNS_SERVER_LOG_USING_LOCAL_TIME=<< dns_server_log_using_local_time | lower >> - - DNS_SERVER_RECURSION=<< dns_server_recursion >> - <%- if dns_server_forwarders %> - - DNS_SERVER_FORWARDERS=<< dns_server_forwarders >> - - DNS_SERVER_FORWARDER_PROTOCOL=<< dns_server_forwarder_protocol >> - <%- endif %> - <%- if dns_server_enable_blocking %> - - DNS_SERVER_ENABLE_BLOCKING=true - <%- endif %> - <%- if dns_server_optional_protocol_dns_over_http %> - - DNS_SERVER_OPTIONAL_PROTOCOL_DNS_OVER_HTTP=true - <%- endif %> - <%- if network_mode == 'host' %> - network_mode: host - <%- elif network_mode == 'bridge' or network_mode == 'macvlan' or traefik_enabled %> - networks: - <%- if traefik_enabled %> - << traefik_network >>: - <%- endif %> - <%- if network_mode == 'macvlan' %> - << network_name >>: - ipv4_address: << network_macvlan_ipv4_address >> - <%- elif network_mode == 'bridge' %> - << network_name >>: - <%- endif %> - <%- endif %> - <%- if not network_mode or network_mode == 'bridge' or traefik_enabled %> - ports: - <%- if not traefik_enabled %> - - "<< ports_web_http >>:5380/tcp" - - "<< ports_dns_over_https >>:443/tcp" - <%- if dns_server_optional_protocol_dns_over_http %> - - "<< ports_dns_over_http >>:80/tcp" - <%- endif %> - <%- endif %> - - "<< ports_dns >>:53/tcp" - - "<< ports_dns >>:53/udp" - <%- endif %> - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/config:/etc/dns:rw - - << volume_mount_path >>/logs:/var/log/technitium/dns:rw - <%- else %> - - << service_name >>_config:/etc/dns - - << service_name >>_logs:/var/log/technitium/dns - <%- endif %> - <%- if network_mode != 'host' %> - sysctls: - - net.ipv4.ip_local_port_range=1024 65535 - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=5380 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- if dns_server_optional_protocol_dns_over_http %> - - traefik.http.services.<< service_name >>-doh.loadBalancer.server.port=80 - - traefik.http.routers.<< service_name >>-doh.service=<< service_name >>-doh - - traefik.http.routers.<< service_name >>-doh.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) && Path(`/dns-query`) - - traefik.http.routers.<< service_name >>-doh.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-doh.tls=true - - traefik.http.routers.<< service_name >>-doh.tls.certresolver=<< traefik_tls_certresolver >> - - traefik.http.routers.<< service_name >>-doh.priority=100 - <%- endif %> - <%- endif %> - <%- endif %> -<%- if network_mode == 'bridge' or network_mode == 'macvlan' or traefik_enabled %> - -networks: - <%- if network_mode == 'bridge' or network_mode == 'macvlan' %> - << network_name >>: - <%- if network_external %> - external: true - <%- else %> - <%- if network_mode == 'macvlan' %> - driver: macvlan - driver_opts: - parent: << network_macvlan_parent_interface >> - ipam: - config: - - subnet: << network_macvlan_subnet >> - gateway: << network_macvlan_gateway >> - name: << network_name >> - <%- else %> - driver: bridge - <%- endif %> - <%- endif %> - <%- endif %> - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> -<%- endif %> - -<%- if volume_mode == 'local' %> - -volumes: - << service_name >>_config: - driver: local - << service_name >>_logs: - driver: local -<%- elif volume_mode == 'nfs' %> - -volumes: - << service_name >>_config: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/config" - << service_name >>_logs: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/logs" -<%- endif %> diff --git a/Docker-Compose/technitium/template.json b/Docker-Compose/technitium/template.json deleted file mode 100644 index 8edab85..0000000 --- a/Docker-Compose/technitium/template.json +++ /dev/null @@ -1,469 +0,0 @@ -{ - "slug": "technitium", - "kind": "compose", - "metadata": { - "name": "Technitium DNS Server", - "description": "Authoritative and recursive DNS server with a web console, DNS blocking, and optional forwarders for self-hosted networks.", - "tags": [ - "traefik", - "network", - "volume", - "dns" - ], - "icon": { - "provider": "selfhst", - "id": "technitium" - }, - "draft": false, - "version": { - "name": "15.1.0", - "source_dep_name": "docker.io/technitium/dns-server", - "source_dep_version": "15.1.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "technitium", - "config": { - "placeholder": "technitium" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "technitium", - "config": { - "placeholder": "technitium" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false, - "default": "technitium", - "config": { - "placeholder": "technitium" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "DNS Server", - "name": "dns-server", - "items": [ - { - "name": "dns_server_domain", - "type": "str", - "title": "Server Domain", - "required": true, - "default": "dns-server", - "config": { - "placeholder": "dns-server" - }, - "description": "Primary domain name used by this DNS server to identify itself." - }, - { - "name": "dns_server_admin_password", - "type": "secret", - "title": "Admin Password", - "required": false, - "description": "Initial admin password for the DNS web console.", - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "dns_server_recursion", - "type": "enum", - "title": "Recursion", - "required": true, - "default": "AllowOnlyForPrivateNetworks", - "config": { - "options": [ - "Allow", - "Deny", - "AllowOnlyForPrivateNetworks", - "UseSpecifiedNetworkACL" - ] - }, - "description": "DNS recursion policy." - }, - { - "name": "dns_server_forwarders", - "type": "str", - "title": "Forwarders", - "required": false, - "default": "1.1.1.1,9.9.9.9", - "config": { - "placeholder": "1.1.1.1,9.9.9.9" - }, - "description": "Comma-separated upstream DNS forwarders. Leave empty to use recursive resolution." - }, - { - "name": "dns_server_forwarder_protocol", - "type": "enum", - "title": "Forwarder Protocol", - "required": true, - "default": "Udp", - "config": { - "options": [ - "Udp", - "Tcp", - "Tls", - "Https", - "HttpsJson" - ] - }, - "needs": [ - "dns_server_forwarders" - ] - }, - { - "name": "dns_server_enable_blocking", - "type": "bool", - "title": "Enable Blocking", - "required": false, - "default": false - }, - { - "name": "dns_server_optional_protocol_dns_over_http", - "type": "bool", - "title": "Enable DNS-over-HTTP", - "required": false, - "default": false, - "description": "Enable Technitium's DNS-over-HTTP listener on port 80. This is required when running behind a TLS-terminating reverse proxy like Traefik and you want DNS-over-HTTPS on /dns-query." - }, - { - "name": "dns_server_log_using_local_time", - "type": "bool", - "title": "Use Local Time For Logs", - "required": false, - "default": true - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_web_http", - "type": "int", - "title": "Web Console Port", - "required": false, - "default": 5380, - "config": { - "placeholder": "5380" - }, - "description": "Host port exposed for the Technitium web console when Traefik is disabled." - }, - { - "name": "ports_dns_over_http", - "type": "int", - "title": "DNS-over-HTTP Port", - "required": false, - "default": 80, - "config": { - "placeholder": "80" - }, - "description": "Host port exposed for Technitium DNS-over-HTTP when Traefik is disabled. Behind Traefik, /dns-query is routed to container port 80 instead.", - "needs": [ - "dns_server_optional_protocol_dns_over_http=true" - ] - }, - { - "name": "ports_dns_over_https", - "type": "int", - "title": "DNS-over-HTTPS Port", - "required": false, - "default": 443, - "config": { - "placeholder": "443" - }, - "description": "Host port exposed for native Technitium DNS-over-HTTPS when Traefik is disabled." - }, - { - "name": "ports_dns", - "type": "int", - "title": "DNS Port", - "required": true, - "default": 53, - "config": { - "placeholder": "53" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "technitium" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_mode", - "type": "str", - "title": "Network Mode", - "required": false, - "description": "Network mode. Use bridge for normal Docker networking, macvlan for a dedicated LAN IP, or host for DHCP-style deployments." - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "technitium_network", - "config": { - "placeholder": "technitium_network" - } - }, - { - "name": "network_macvlan_ipv4_address", - "type": "str", - "title": "IPv4 Address", - "required": true, - "default": "IP_ADDRESS", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "IP_ADDRESS" - }, - "description": "Static IPv4 address for the macvlan network." - }, - { - "name": "network_macvlan_parent_interface", - "type": "str", - "title": "Parent Interface", - "required": true, - "default": "eth0", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "eth0" - }, - "description": "Parent interface for the macvlan network." - }, - { - "name": "network_macvlan_subnet", - "type": "str", - "title": "Subnet", - "required": true, - "default": "IP_RANGE", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "IP_RANGE" - }, - "description": "Subnet for the macvlan network." - }, - { - "name": "network_macvlan_gateway", - "type": "str", - "title": "Gateway", - "required": true, - "default": "GATEWAY", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "GATEWAY" - }, - "description": "Gateway for the macvlan network." - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/data", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/data" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": true, - "default": "NFS_SERVER", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "NFS_SERVER" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": true, - "default": "/export", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/export" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": true, - "default": "rw,nolock,soft", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw,nolock,soft" - } - } - ] - } - ] -} diff --git a/Docker-Compose/teleport/files/compose.yaml b/Docker-Compose/teleport/files/compose.yaml deleted file mode 100644 index 0eb696b..0000000 --- a/Docker-Compose/teleport/files/compose.yaml +++ /dev/null @@ -1,39 +0,0 @@ -services: - << service_name >>: - image: public.ecr.aws/gravitational/teleport-distroless:18.7.6 - container_name: << container_name >> - ports: - - "<< ports_web >>:<< ports_web >>" - - "<< ports_ssh_proxy >>:<< ports_ssh_proxy >>" - - "<< ports_reverse_tunnel >>:<< ports_reverse_tunnel >>" - - "<< ports_auth >>:<< ports_auth >>" - volumes: - - ./config:/etc/teleport - - << data_host_path >>:/var/lib/teleport -<%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.http.routers.<< service_name >>.rule=HostRegexp(`^(?i)(?:[[:alnum:]]+(?:-+[[:alnum:]]+)*\\.)?<< teleport_public_host >>(?::\\d+)?$`) -<%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>.tls=true - - traefik.http.routers.<< service_name >>.tls.certresolver=<< traefik_tls_certresolver >> - - traefik.http.routers.<< service_name >>.tls.domains[0].main=<< teleport_public_host >> - - traefik.http.routers.<< service_name >>.tls.domains[0].sans=*.<< teleport_public_host >> -<%- else %> - - traefik.http.routers.<< service_name >>.entrypoints=<< traefik_entrypoint >> -<%- endif %> - - traefik.http.services.<< service_name >>.loadbalancer.server.port=<< ports_web >> - - traefik.http.services.<< service_name >>.loadbalancer.server.scheme=https -<%- endif %> - networks: - - << network_name >> - restart: << restart_policy >> - -networks: - << network_name >>: -<%- if network_external %> - external: true -<%- else %> - driver: bridge -<%- endif %> diff --git a/Docker-Compose/teleport/files/config/teleport.yaml b/Docker-Compose/teleport/files/config/teleport.yaml deleted file mode 100644 index 060bfac..0000000 --- a/Docker-Compose/teleport/files/config/teleport.yaml +++ /dev/null @@ -1,40 +0,0 @@ -version: v2 -teleport: - nodename: << teleport_node_name >> - data_dir: /var/lib/teleport - log: - output: stderr - severity: << teleport_log_level >> - format: - output: text - -auth_service: - enabled: true - listen_addr: 0.0.0.0:<< ports_auth >> - proxy_listener_mode: multiplex - cluster_name: << teleport_public_host >> - authentication: - type: local - second_factor: << teleport_second_factor >> - webauthn: - rp_id: << teleport_public_host >> - connector_name: << teleport_connector_name >> - -ssh_service: - enabled: false - -proxy_service: - enabled: true - web_listen_addr: 0.0.0.0:<< ports_web >> - public_addr: ['<< teleport_public_host >>:443'] - https_keypairs: [] - acme: {} - -app_service: - enabled: << app_service_enabled | lower >> -<%- if app_service_enabled %> - # apps: - # - name: "yourapp" - # uri: "http://your-app-url" - # insecure_skip_verify: false -<%- endif %> diff --git a/Docker-Compose/teleport/template.json b/Docker-Compose/teleport/template.json deleted file mode 100644 index 3845e55..0000000 --- a/Docker-Compose/teleport/template.json +++ /dev/null @@ -1,271 +0,0 @@ -{ - "slug": "teleport", - "kind": "compose", - "metadata": { - "name": "Teleport", - "description": "Runs Teleport in Docker Compose with local auth and proxy services plus a companion Teleport configuration file.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "teleport" - }, - "draft": false, - "version": { - "name": "18.7.6", - "source_dep_name": "public.ecr.aws/gravitational/teleport-distroless", - "source_dep_version": "18.7.6" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Compose service name", - "required": false, - "default": "teleport", - "config": { - "placeholder": "teleport" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container name", - "required": false, - "default": "teleport", - "config": { - "placeholder": "teleport" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Container restart policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "data_host_path", - "type": "str", - "title": "Data Path", - "required": false, - "default": "./data", - "description": "Host path for persistent Teleport data", - "config": { - "placeholder": "./data" - } - } - ] - }, - { - "title": "Configuration", - "name": "configuration", - "items": [ - { - "name": "teleport_node_name", - "type": "str", - "title": "Teleport node name", - "required": false, - "default": "teleport-prod-1", - "config": { - "placeholder": "teleport-prod-1" - } - }, - { - "name": "teleport_public_host", - "type": "str", - "title": "Public Teleport hostname", - "required": true, - "config": { - "placeholder": "tp.home.arpa" - } - }, - { - "name": "teleport_log_level", - "type": "enum", - "title": "Teleport log level", - "required": false, - "default": "INFO", - "config": { - "options": [ - "DEBUG", - "INFO", - "WARN", - "ERROR" - ] - } - }, - { - "name": "teleport_second_factor", - "type": "enum", - "title": "2FA Mode", - "required": false, - "default": "on", - "config": { - "options": [ - "on", - "off", - "otp" - ] - } - }, - { - "name": "teleport_connector_name", - "type": "str", - "title": "Connector Name", - "required": false, - "default": "passwordless", - "description": "Connector name for the local auth workflow", - "config": { - "placeholder": "passwordless" - } - }, - { - "name": "app_service_enabled", - "type": "bool", - "title": "App Service", - "required": false, - "default": false - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_web", - "type": "int", - "title": "Teleport web port", - "required": false, - "default": 3080, - "config": { - "placeholder": "3080" - } - }, - { - "name": "ports_ssh_proxy", - "type": "int", - "title": "SSH Proxy Port", - "required": false, - "default": 3023, - "config": { - "placeholder": "3023" - } - }, - { - "name": "ports_reverse_tunnel", - "type": "int", - "title": "Tunnel Port", - "required": false, - "default": 3024, - "config": { - "placeholder": "3024" - } - }, - { - "name": "ports_auth", - "type": "int", - "title": "Teleport auth port", - "required": false, - "default": 3025, - "config": { - "placeholder": "3025" - } - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": true, - "default": "proxy", - "config": { - "placeholder": "proxy" - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": true - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": true - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": true - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": false, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/traefik-addons/files/compose.yaml b/Docker-Compose/traefik-addons/files/compose.yaml deleted file mode 100644 index 4e0ba02..0000000 --- a/Docker-Compose/traefik-addons/files/compose.yaml +++ /dev/null @@ -1,56 +0,0 @@ -services: - <%- if socket_proxy_enabled %> - << socket_proxy_service_name >>: - image: tecnativa/docker-socket-proxy:0.4.2 - container_name: << socket_proxy_container_name >> - environment: - CONTAINERS: 1 - EVENTS: 1 - INFO: 1 - NETWORKS: 1 - PING: 1 - POST: 0 - SERVICES: 1 - TASKS: 1 - VERSION: 1 - VOLUMES: 1 - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - networks: - - << traefik_network >> - restart: << restart_policy >> - <%- endif %> - <%- if whoami_enabled %> - << whoami_service_name >>: - image: traefik/whoami:v1.11.0 - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< whoami_service_name >>.loadbalancer.server.port=80 - - traefik.http.routers.<< whoami_service_name >>-http.rule=Host(`<< whoami_host >>.<< whoami_domain >>`) - - traefik.http.routers.<< whoami_service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if whoami_chain_middleware %> - - traefik.http.routers.<< whoami_service_name >>-http.middlewares=<< whoami_chain_middleware >> - <%- endif %> - <%- if whoami_tls_enabled %> - - traefik.http.routers.<< whoami_service_name >>-https.rule=Host(`<< whoami_host >>.<< whoami_domain >>`) - - traefik.http.routers.<< whoami_service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< whoami_service_name >>-https.tls=true - - traefik.http.routers.<< whoami_service_name >>-https.tls.certresolver=<< whoami_tls_certresolver >> - <%- if whoami_chain_middleware %> - - traefik.http.routers.<< whoami_service_name >>-https.middlewares=<< whoami_chain_middleware >> - <%- endif %> - <%- endif %> - networks: - - << traefik_network >> - restart: << restart_policy >> - <%- endif %> - -networks: - << traefik_network >>: - <%- if traefik_network_external %> - external: true - <%- else %> - driver: bridge - name: << traefik_network >> - <%- endif %> diff --git a/Docker-Compose/traefik-addons/files/config/dynamic/chains.yaml b/Docker-Compose/traefik-addons/files/config/dynamic/chains.yaml deleted file mode 100644 index 2e1527b..0000000 --- a/Docker-Compose/traefik-addons/files/config/dynamic/chains.yaml +++ /dev/null @@ -1,32 +0,0 @@ -http: - middlewares: - default-secured: - chain: - middlewares: - <%- if security_headers_enabled %> - - security-headers - <%- endif %> - <%- if ipallowlist_enabled %> - - default-ipallowlist - <%- endif %> - <%- if crowdsec_middleware_enabled %> - - crowdsec-bouncer - <%- endif %> - <%- if forwardauth_enabled %> - - forward-auth - <%- endif %> - dashboard-secured: - chain: - middlewares: - <%- if security_headers_enabled %> - - security-headers - <%- endif %> - <%- if dashboard_basicauth_enabled %> - - dashboard-basicauth - <%- endif %> - <%- if ipallowlist_enabled %> - - dashboard-ipallowlist - <%- endif %> - <%- if crowdsec_middleware_enabled %> - - crowdsec-bouncer - <%- endif %> diff --git a/Docker-Compose/traefik-addons/files/config/dynamic/middlewares.yaml b/Docker-Compose/traefik-addons/files/config/dynamic/middlewares.yaml deleted file mode 100644 index 2d29fd2..0000000 --- a/Docker-Compose/traefik-addons/files/config/dynamic/middlewares.yaml +++ /dev/null @@ -1,78 +0,0 @@ -http: - middlewares: - <%- if security_headers_enabled %> - security-headers: - headers: - contentTypeNosniff: true - frameDeny: true - browserXssFilter: true - referrerPolicy: same-origin - stsSeconds: 31536000 - stsIncludeSubdomains: true - stsPreload: true - customResponseHeaders: - X-Robots-Tag: none - <%- endif %> - <%- if dashboard_basicauth_enabled %> - dashboard-basicauth: - basicAuth: - users: - - << dashboard_basicauth_users >> - <%- endif %> - <%- if ipallowlist_enabled %> - dashboard-ipallowlist: - ipAllowList: - sourceRange: - - << ipallowlist_range_1 >> - <%- if ipallowlist_range_2 %> - - << ipallowlist_range_2 >> - <%- endif %> - <%- if ipallowlist_range_3 %> - - << ipallowlist_range_3 >> - <%- endif %> - default-ipallowlist: - ipAllowList: - sourceRange: - - << ipallowlist_range_1 >> - <%- if ipallowlist_range_2 %> - - << ipallowlist_range_2 >> - <%- endif %> - <%- if ipallowlist_range_3 %> - - << ipallowlist_range_3 >> - <%- endif %> - <%- endif %> - <%- if forwardauth_enabled %> - forward-auth: - forwardAuth: - address: "<< forwardauth_address >>" - trustForwardHeader: << forwardauth_trust_forward_header | lower >> - authResponseHeadersRegex: "<< forwardauth_response_headers_regex >>" - <%- endif %> - <%- if crowdsec_middleware_enabled %> - crowdsec-bouncer: - plugin: - crowdsec-bouncer-traefik-plugin: - enabled: true - crowdsecMode: << crowdsec_mode >> - crowdsecLapiScheme: http - crowdsecLapiHost: << crowdsec_lapi_host >> - crowdsecLapiKey: << crowdsec_bouncer_key >> - <%- if crowdsec_trusted_ip_1 or crowdsec_trusted_ip_2 or crowdsec_trusted_ip_3 %> - forwardedHeadersTrustedIPs: - <%- if crowdsec_trusted_ip_1 %> - - << crowdsec_trusted_ip_1 >> - <%- endif %> - <%- if crowdsec_trusted_ip_2 %> - - << crowdsec_trusted_ip_2 >> - <%- endif %> - <%- if crowdsec_trusted_ip_3 %> - - << crowdsec_trusted_ip_3 >> - <%- endif %> - <%- endif %> - crowdsecAppsecEnabled: << crowdsec_appsec_enabled | lower >> - <%- if crowdsec_appsec_enabled %> - crowdsecAppsecHost: << crowdsec_appsec_host >> - crowdsecAppsecFailureBlock: << crowdsec_appsec_failure_block | lower >> - crowdsecAppsecUnreachableBlock: << crowdsec_appsec_unreachable_block | lower >> - <%- endif %> - <%- endif %> diff --git a/Docker-Compose/traefik-addons/template.json b/Docker-Compose/traefik-addons/template.json deleted file mode 100644 index ddaa174..0000000 --- a/Docker-Compose/traefik-addons/template.json +++ /dev/null @@ -1,524 +0,0 @@ -{ - "slug": "traefik-addons", - "kind": "compose", - "metadata": { - "name": "Traefik Addons", - "description": "Companion Docker Compose stack for the main Traefik template, with a docker-socket-proxy, a whoami test app, and file-provider middleware examples for hardening and external auth.", - "tags": [ - "traefik", - "security", - "docker" - ], - "icon": { - "provider": "selfhst", - "id": "traefik" - }, - "draft": true, - "version": { - "name": "2026.04.13", - "source_dep_name": "manual/traefik-addons" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "items": [ - { - "name": "traefik_network", - "type": "str", - "title": "Traefik Network", - "required": true, - "default": "traefik", - "description": "Shared Docker network used by the main Traefik stack.", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": true - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - }, - "needs": [ - "whoami_enabled=true" - ] - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "whoami_enabled=true", - "whoami_tls_enabled=true" - ] - } - ] - }, - { - "title": "Socket Proxy", - "toggle": "socket_proxy_enabled", - "name": "socket-proxy", - "items": [ - { - "name": "socket_proxy_enabled", - "type": "bool", - "title": "Docker Socket Proxy", - "required": false, - "default": true, - "description": "Run a restricted Docker socket proxy for Traefik and companion tooling." - }, - { - "name": "socket_proxy_service_name", - "type": "str", - "title": "Socket Proxy Service Name", - "required": true, - "default": "docker-socket-proxy", - "description": "Compose service name for the docker-socket-proxy.", - "needs": [ - "socket_proxy_enabled=true" - ], - "config": { - "placeholder": "docker-socket-proxy" - } - }, - { - "name": "socket_proxy_container_name", - "type": "str", - "title": "Socket Proxy Container Name", - "required": true, - "default": "docker-socket-proxy", - "description": "Container name for the docker-socket-proxy service.", - "needs": [ - "socket_proxy_enabled=true" - ], - "config": { - "placeholder": "docker-socket-proxy" - } - } - ] - }, - { - "title": "Whoami", - "toggle": "whoami_enabled", - "name": "whoami", - "items": [ - { - "name": "whoami_enabled", - "type": "bool", - "title": "Whoami Test App", - "required": false, - "default": true, - "description": "Deploy a small Traefik-routed test application." - }, - { - "name": "whoami_service_name", - "type": "str", - "title": "Whoami Service Name", - "required": true, - "default": "whoami", - "description": "Compose service name for the whoami test container.", - "needs": [ - "whoami_enabled=true" - ], - "config": { - "placeholder": "whoami" - } - }, - { - "name": "whoami_host", - "type": "str", - "title": "Whoami Host", - "required": true, - "default": "whoami", - "needs": [ - "whoami_enabled=true" - ], - "config": { - "placeholder": "whoami" - } - }, - { - "name": "whoami_domain", - "type": "str", - "title": "Whoami Domain", - "required": true, - "default": "home.arpa", - "needs": [ - "whoami_enabled=true" - ], - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "whoami_tls_enabled", - "type": "bool", - "title": "Whoami TLS", - "required": false, - "default": false, - "description": "Create an HTTPS router for the whoami test route.", - "needs": [ - "whoami_enabled=true" - ] - }, - { - "name": "whoami_tls_certresolver", - "type": "str", - "title": "Whoami Cert Resolver", - "required": true, - "default": "cloudflare", - "description": "Traefik certificate resolver used for the HTTPS whoami router.", - "needs": [ - "whoami_enabled=true", - "whoami_tls_enabled=true" - ], - "config": { - "placeholder": "cloudflare" - } - }, - { - "name": "whoami_chain_middleware", - "type": "str", - "title": "Whoami Chain Middleware", - "required": false, - "default": "default-secured@file", - "description": "File-provider middleware chain attached to the whoami routers.", - "needs": [ - "whoami_enabled=true" - ], - "config": { - "placeholder": "default-secured@file" - } - } - ] - }, - { - "title": "Dashboard Hardening", - "name": "dashboard-hardening", - "items": [ - { - "name": "security_headers_enabled", - "type": "bool", - "title": "Security Headers", - "required": false, - "default": true, - "description": "Render a reusable security-headers middleware." - }, - { - "name": "dashboard_basicauth_enabled", - "type": "bool", - "title": "Dashboard BasicAuth", - "required": false, - "default": false, - "description": "Render a BasicAuth middleware suitable for dashboard protection." - }, - { - "name": "dashboard_basicauth_users", - "type": "secret", - "title": "BasicAuth Users", - "required": true, - "description": "One htpasswd entry to render into the dashboard BasicAuth middleware.", - "needs": [ - "dashboard_basicauth_enabled=true" - ] - }, - { - "name": "ipallowlist_enabled", - "type": "bool", - "title": "IP Allowlist", - "required": false, - "default": false, - "description": "Render IP allowlist middlewares for restricted dashboards or internal apps." - }, - { - "name": "ipallowlist_range_1", - "type": "str", - "title": "Allowlist Range 1", - "required": true, - "default": "192.168.0.0/16", - "description": "Primary CIDR allowed through the IP allowlist middleware.", - "needs": [ - "ipallowlist_enabled=true" - ], - "config": { - "placeholder": "192.168.0.0/16" - } - }, - { - "name": "ipallowlist_range_2", - "type": "str", - "title": "Allowlist Range 2", - "required": false, - "default": "10.0.0.0/8", - "description": "Optional second CIDR allowed through the IP allowlist middleware.", - "needs": [ - "ipallowlist_enabled=true" - ], - "config": { - "placeholder": "10.0.0.0/8" - } - }, - { - "name": "ipallowlist_range_3", - "type": "str", - "title": "Allowlist Range 3", - "required": false, - "default": "", - "description": "Optional third CIDR allowed through the IP allowlist middleware.", - "needs": [ - "ipallowlist_enabled=true" - ], - "config": { - "placeholder": "fd00::/8" - } - } - ] - }, - { - "title": "ForwardAuth", - "toggle": "forwardauth_enabled", - "name": "forwardauth", - "items": [ - { - "name": "forwardauth_enabled", - "type": "bool", - "title": "ForwardAuth", - "required": false, - "default": false, - "description": "Render a ForwardAuth middleware for Authentik, Authelia, or another auth proxy." - }, - { - "name": "forwardauth_address", - "type": "str", - "title": "ForwardAuth Address", - "required": true, - "default": "https://auth.home.arpa/outpost.goauthentik.io/auth/traefik", - "description": "ForwardAuth endpoint Traefik should call for authentication.", - "needs": [ - "forwardauth_enabled=true" - ], - "config": { - "placeholder": "https://auth.home.arpa/outpost.goauthentik.io/auth/traefik" - } - }, - { - "name": "forwardauth_trust_forward_header", - "type": "bool", - "title": "Trust Forwarded Headers", - "required": false, - "default": true, - "description": "Trust existing forwarded headers when calling the ForwardAuth endpoint.", - "needs": [ - "forwardauth_enabled=true" - ] - }, - { - "name": "forwardauth_response_headers_regex", - "type": "str", - "title": "Auth Response Headers Regex", - "required": false, - "default": "^X-authentik-.*", - "description": "Regex of headers copied back from the auth response.", - "needs": [ - "forwardauth_enabled=true" - ], - "config": { - "placeholder": "^X-authentik-.*" - } - } - ] - }, - { - "title": "CrowdSec Middleware", - "toggle": "crowdsec_middleware_enabled", - "name": "crowdsec", - "items": [ - { - "name": "crowdsec_middleware_enabled", - "type": "bool", - "title": "CrowdSec Middleware", - "required": false, - "default": false, - "description": "Render the Traefik CrowdSec plugin middleware example." - }, - { - "name": "crowdsec_lapi_host", - "type": "str", - "title": "CrowdSec LAPI Host", - "required": true, - "default": "crowdsec:8080", - "description": "CrowdSec Local API host and port reachable from Traefik.", - "needs": [ - "crowdsec_middleware_enabled=true" - ], - "config": { - "placeholder": "crowdsec:8080" - } - }, - { - "name": "crowdsec_bouncer_key", - "type": "secret", - "title": "CrowdSec Bouncer Key", - "required": true, - "description": "API key for the Traefik CrowdSec remediation component.", - "needs": [ - "crowdsec_middleware_enabled=true" - ], - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "crowdsec_mode", - "type": "enum", - "title": "CrowdSec Mode", - "required": true, - "default": "stream", - "description": "CrowdSec plugin mode used by Traefik.", - "needs": [ - "crowdsec_middleware_enabled=true" - ], - "config": { - "options": [ - "live", - "stream", - "alone", - "appsec" - ] - } - }, - { - "name": "crowdsec_appsec_enabled", - "type": "bool", - "title": "CrowdSec AppSec", - "required": false, - "default": false, - "needs": [ - "crowdsec_middleware_enabled=true" - ] - }, - { - "name": "crowdsec_appsec_host", - "type": "str", - "title": "CrowdSec AppSec Host", - "required": true, - "default": "crowdsec:7422", - "description": "CrowdSec AppSec host and port reachable from Traefik.", - "needs": [ - "crowdsec_middleware_enabled=true", - "crowdsec_appsec_enabled=true" - ], - "config": { - "placeholder": "crowdsec:7422" - } - }, - { - "name": "crowdsec_appsec_failure_block", - "type": "bool", - "title": "Block On AppSec Failure", - "required": false, - "default": true, - "description": "Block requests if CrowdSec AppSec returns an internal error.", - "needs": [ - "crowdsec_middleware_enabled=true", - "crowdsec_appsec_enabled=true" - ] - }, - { - "name": "crowdsec_appsec_unreachable_block", - "type": "bool", - "title": "Block When AppSec Unreachable", - "required": false, - "default": false, - "description": "Block requests if CrowdSec AppSec cannot be reached.", - "needs": [ - "crowdsec_middleware_enabled=true", - "crowdsec_appsec_enabled=true" - ] - }, - { - "name": "crowdsec_trusted_ip_1", - "type": "str", - "title": "Trusted IP 1", - "required": false, - "default": "10.0.0.0/8", - "description": "Optional trusted upstream CIDR for forwarded headers.", - "needs": [ - "crowdsec_middleware_enabled=true" - ], - "config": { - "placeholder": "10.0.0.0/8" - } - }, - { - "name": "crowdsec_trusted_ip_2", - "type": "str", - "title": "Trusted IP 2", - "required": false, - "default": "192.168.0.0/16", - "description": "Optional second trusted CIDR for forwarded headers.", - "needs": [ - "crowdsec_middleware_enabled=true" - ], - "config": { - "placeholder": "192.168.0.0/16" - } - }, - { - "name": "crowdsec_trusted_ip_3", - "type": "str", - "title": "Trusted IP 3", - "required": false, - "default": "", - "description": "Optional third trusted CIDR for forwarded headers.", - "needs": [ - "crowdsec_middleware_enabled=true" - ], - "config": { - "placeholder": "fd00::/8" - } - } - ] - } - ] -} diff --git a/Docker-Compose/traefik/files/.env b/Docker-Compose/traefik/files/.env deleted file mode 100644 index 02f9276..0000000 --- a/Docker-Compose/traefik/files/.env +++ /dev/null @@ -1,31 +0,0 @@ -# Traefik DNS provider credentials -<%- if traefik_tls_enabled %> -<%- if traefik_tls_certresolver == 'cloudflare' %> -CF_DNS_API_TOKEN=<< traefik_tls_acme_token >> -<%- elif traefik_tls_certresolver == 'porkbun' %> -PORKBUN_API_KEY=<< traefik_tls_acme_token >> -PORKBUN_SECRET_API_KEY=<< traefik_tls_acme_secret_key >> -<%- elif traefik_tls_certresolver == 'route53' %> -AWS_ACCESS_KEY_ID=<< traefik_tls_acme_token >> -AWS_SECRET_ACCESS_KEY=<< traefik_tls_acme_secret_key >> -<%- elif traefik_tls_certresolver == 'digitalocean' %> -DO_AUTH_TOKEN=<< traefik_tls_acme_token >> -<%- elif traefik_tls_certresolver == 'godaddy' %> -GODADDY_API_KEY=<< traefik_tls_acme_token >> -GODADDY_API_SECRET=<< traefik_tls_acme_secret_key >> -<%- elif traefik_tls_certresolver == 'azure' %> -AZURE_CLIENT_ID=<< traefik_tls_acme_token >> -AZURE_CLIENT_SECRET=<< traefik_tls_acme_secret_key >> -<%- elif traefik_tls_certresolver == 'namecheap' %> -NAMECHEAP_API_KEY=<< traefik_tls_acme_token >> -NAMECHEAP_API_USER=<< traefik_tls_acme_username >> -<%- elif traefik_tls_certresolver == 'netcup' %> -NETCUP_CUSTOMER_NUMBER=<< traefik_tls_acme_customer_number >> -NETCUP_API_KEY=<< traefik_tls_acme_token >> -NETCUP_API_PASSWORD=<< traefik_tls_acme_secret_key >> -<%- elif traefik_tls_certresolver == 'ovh' %> -OVH_APPLICATION_KEY=<< traefik_tls_acme_token >> -OVH_APPLICATION_SECRET=<< traefik_tls_acme_secret_key >> -OVH_CONSUMER_KEY=<< traefik_tls_acme_consumer_key >> -<%- endif %> -<%- endif %> diff --git a/Docker-Compose/traefik/files/compose.yaml b/Docker-Compose/traefik/files/compose.yaml deleted file mode 100644 index 44a5587..0000000 --- a/Docker-Compose/traefik/files/compose.yaml +++ /dev/null @@ -1,139 +0,0 @@ ---- -services: - traefik: - image: docker.io/library/traefik:v3.6.15 - security_opt: - - no-new-privileges:true - command: - - "--global.checkNewVersion=false" - - "--global.sendAnonymousUsage=false" - <%- if container_loglevel %> - - "--log.level=<< container_loglevel >>" - <%- endif %> - - "--ping=true" - - "--ping.entryPoint=ping" - <%- if accesslog_enabled %> - - "--accesslog=true" - <%- endif %> - <%- if dashboard_enabled %> - - "--api.dashboard=true" - - "--api.insecure=true" - <%- endif %> - <%- if prometheus_enabled %> - - "--metrics.prometheus=true" - - "--metrics.prometheus.entryPoint=metrics" - - "--metrics.prometheus.addRoutersLabels=true" - <%- endif %> - - "--entrypoints.ping.address=:8082" - <%- if prometheus_enabled %> - - "--entrypoints.metrics.address=:9090" - <%- endif %> - - "--entrypoints.web.address=:80" - - "--entrypoints.web.http.encodedCharacters.allowEncodedSlash=true" - <%- if traefik_tls_enabled and traefik_tls_redirect %> - - "--entrypoints.web.http.redirections.entryPoint.to=websecure" - - "--entrypoints.web.http.redirections.entryPoint.scheme=https" - <%- endif %> - <%- if traefik_tls_enabled %> - - "--entrypoints.websecure.address=:443" - - "--entrypoints.websecure.http.encodedCharacters.allowEncodedSlash=true" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.email=<< traefik_tls_acme_email >>" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.caServer=https://acme-v02.api.letsencrypt.org/directory" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.storage=/var/traefik/certs/acme.json" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.dnsChallenge.provider=<< traefik_tls_certresolver >>" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.dnsChallenge.resolvers=1.1.1.1:53,8.8.8.8:53" - <%- endif %> - <%- if traefik_tls_secure_ciphers %> - - "--tls.options.default.cipherSuites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256" - <%- endif %> - <%- if traefik_tls_skipverify %> - - "--serversTransport.insecureSkipVerify=true" - <%- endif %> - - "--providers.docker=true" - - "--providers.docker.exposedByDefault=false" - - "--providers.docker.network=<< traefik_network >>" - ports: - - "<< ports_http >>:80" - - "<< ports_https >>:443" - <%- if dashboard_enabled %> - - "<< ports_dashboard >>:8080" - <%- endif %> - - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>:/var/traefik/certs/:rw - <%- elif volume_mode == 'local' or volume_mode == 'nfs' %> - - traefik_certs:/var/traefik/certs/:rw - <%- endif %> - environment: - - TZ=<< container_timezone >> - <%- if traefik_tls_enabled %> - <%- if traefik_tls_certresolver == 'cloudflare' %> - - CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN} - <%- elif traefik_tls_certresolver == 'porkbun' %> - - PORKBUN_API_KEY=${PORKBUN_API_KEY} - - PORKBUN_SECRET_API_KEY=${PORKBUN_SECRET_API_KEY} - <%- elif traefik_tls_certresolver == 'route53' %> - - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} - - AWS_REGION=<< traefik_tls_acme_region >> - <%- elif traefik_tls_certresolver == 'digitalocean' %> - - DO_AUTH_TOKEN=${DO_AUTH_TOKEN} - <%- elif traefik_tls_certresolver == 'godaddy' %> - - GODADDY_API_KEY=${GODADDY_API_KEY} - - GODADDY_API_SECRET=${GODADDY_API_SECRET} - <%- elif traefik_tls_certresolver == 'azure' %> - - AZURE_CLIENT_ID=${AZURE_CLIENT_ID} - - AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET} - - AZURE_TENANT_ID=<< traefik_tls_acme_tenant_id >> - - AZURE_SUBSCRIPTION_ID=<< traefik_tls_acme_subscription_id >> - - AZURE_RESOURCE_GROUP=<< traefik_tls_acme_resource_group >> - <%- elif traefik_tls_certresolver == 'namecheap' %> - - NAMECHEAP_API_KEY=${NAMECHEAP_API_KEY} - - NAMECHEAP_API_USER=${NAMECHEAP_API_USER} - <%- elif traefik_tls_certresolver == 'netcup' %> - - NETCUP_CUSTOMER_NUMBER=${NETCUP_CUSTOMER_NUMBER} - - NETCUP_API_KEY=${NETCUP_API_KEY} - - NETCUP_API_PASSWORD=${NETCUP_API_PASSWORD} - <%- elif traefik_tls_certresolver == 'ovh' %> - - OVH_ENDPOINT=<< traefik_tls_acme_endpoint >> - - OVH_APPLICATION_KEY=${OVH_APPLICATION_KEY} - - OVH_APPLICATION_SECRET=${OVH_APPLICATION_SECRET} - - OVH_CONSUMER_KEY=${OVH_CONSUMER_KEY} - <%- endif %> - <%- endif %> - healthcheck: - test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8082/ping"] - interval: 30s - timeout: 5s - retries: 3 - start_period: 10s - networks: - - << traefik_network >> - restart: << restart_policy >> - - -networks: - << traefik_network >>: - <%- if traefik_network_external %> - external: true - <%- else %> - driver: bridge - name: << traefik_network >> - <%- endif %> - - -<%- if volume_mode == 'local' %> -volumes: - traefik_certs: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - traefik_certs: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>" -<%- endif %> diff --git a/Docker-Compose/traefik/template.json b/Docker-Compose/traefik/template.json deleted file mode 100644 index b255cdb..0000000 --- a/Docker-Compose/traefik/template.json +++ /dev/null @@ -1,417 +0,0 @@ -{ - "slug": "traefik", - "kind": "compose", - "metadata": { - "name": "Traefik", - "description": "Modern HTTP reverse proxy and load balancer designed for microservices. Provides automatic service discovery, Let's Encrypt TLS, and a built-in dashboard.", - "tags": [ - "reverse-proxy" - ], - "icon": { - "provider": "devicon", - "id": "traefikproxy", - "color": "sky" - }, - "draft": false, - "version": { - "name": "v3.6.15", - "source_dep_name": "docker.io/library/traefik", - "source_dep_version": "v3.6.15" - } - }, - "variables": [ - { - "name": "general", - "title": "General", - "items": [ - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": true, - "default": "UTC", - "config": { - "placeholder": "UTC" - } - }, - { - "name": "container_loglevel", - "type": "enum", - "title": "Log Level", - "required": false, - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "name": "ports", - "title": "Ports", - "items": [ - { - "name": "ports_dashboard", - "type": "int", - "title": "Dashboard Port", - "required": true, - "default": 8080, - "description": "Dashboard port (external)", - "config": { - "placeholder": "8080" - }, - "needs": [ - "dashboard_enabled=true" - ] - }, - { - "name": "ports_http", - "type": "str", - "title": "HTTP Port", - "required": false, - "default": 80, - "config": { - "placeholder": "80" - } - }, - { - "name": "ports_https", - "type": "str", - "title": "HTTPS Port", - "required": false, - "default": 443, - "config": { - "placeholder": "443" - } - } - ] - }, - { - "name": "traefik", - "title": "Traefik", - "items": [ - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "proxy", - "config": { - "placeholder": "proxy" - } - }, - { - "name": "traefik_network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_certresolver", - "type": "enum", - "title": "DNS Provider", - "required": true, - "default": "cloudflare", - "config": { - "options": [ - "cloudflare", - "porkbun", - "godaddy", - "digitalocean", - "route53", - "azure", - "namecheap", - "netcup", - "ovh" - ] - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_acme_email", - "type": "str", - "title": "ACME Email", - "required": true, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_acme_endpoint", - "type": "str", - "title": "OVH Endpoint", - "required": false, - "default": "ovh-eu", - "config": { - "placeholder": "ovh-eu" - }, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=ovh" - ] - }, - { - "name": "traefik_tls_acme_region", - "type": "str", - "title": "AWS Region", - "required": true, - "default": "us-east-1", - "config": { - "placeholder": "us-east-1" - }, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=route53" - ] - }, - { - "name": "traefik_tls_acme_resource_group", - "type": "str", - "title": "Azure Group", - "required": true, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=azure" - ] - }, - { - "name": "traefik_tls_acme_customer_number", - "type": "str", - "title": "Customer Number", - "required": true, - "description": "Netcup customer number used for the ACME DNS challenge.", - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=netcup" - ], - "config": { - "placeholder": "123456" - } - }, - { - "name": "traefik_tls_acme_token", - "type": "secret", - "title": "API Token", - "required": true, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=cloudflare,digitalocean,godaddy,namecheap,ovh,porkbun,netcup" - ] - }, - { - "name": "traefik_tls_acme_secret_key", - "type": "secret", - "title": "Secret Key", - "required": true, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=azure,godaddy,ovh,porkbun,route53,netcup" - ] - }, - { - "name": "traefik_tls_acme_subscription_id", - "type": "str", - "title": "Subscription ID", - "required": true, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=azure" - ] - }, - { - "name": "traefik_tls_acme_tenant_id", - "type": "str", - "title": "Tenant ID", - "required": true, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=azure" - ] - }, - { - "name": "traefik_tls_acme_username", - "type": "str", - "title": "Username", - "required": true, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=namecheap" - ] - }, - { - "name": "traefik_tls_acme_consumer_key", - "type": "secret", - "title": "Consumer Key", - "required": true, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=ovh" - ] - }, - { - "name": "traefik_tls_redirect", - "type": "bool", - "title": "HTTP Redirect", - "required": false, - "default": true, - "description": "Redirect all HTTP traffic to HTTPS", - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_secure_ciphers", - "type": "bool", - "title": "Strict Ciphers", - "required": false, - "default": false, - "description": "Enable strict cipher suites (recommended)", - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_skipverify", - "type": "bool", - "title": "TLS Verify", - "required": false, - "default": false, - "description": "Skip TLS verification for backend servers", - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "accesslog_enabled", - "type": "bool", - "title": "Access Log", - "required": false, - "default": false - }, - { - "name": "dashboard_enabled", - "type": "bool", - "title": "Dashboard", - "required": false, - "default": false - }, - { - "name": "prometheus_enabled", - "type": "bool", - "title": "Prometheus", - "required": false, - "default": false - }, - { - "name": "security_enabled", - "type": "bool", - "title": "Security Headers", - "required": false, - "default": true, - "description": "Create production-ready security headers middleware" - } - ] - }, - { - "name": "volume", - "title": "Volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/data", - "config": { - "placeholder": "/data" - }, - "needs": [ - "volume_mode=mount" - ] - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": true, - "default": "NFS_SERVER", - "config": { - "placeholder": "NFS_SERVER" - }, - "needs": [ - "volume_mode=nfs" - ] - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": true, - "default": "/export", - "config": { - "placeholder": "/export" - }, - "needs": [ - "volume_mode=nfs" - ] - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": true, - "default": "rw,nolock,soft", - "config": { - "placeholder": "rw,nolock,soft" - }, - "needs": [ - "volume_mode=nfs" - ] - } - ] - } - ] -} diff --git a/Docker-Compose/twingate-connector/files/.env b/Docker-Compose/twingate-connector/files/.env deleted file mode 100644 index 78b3fb0..0000000 --- a/Docker-Compose/twingate-connector/files/.env +++ /dev/null @@ -1,3 +0,0 @@ -# Twingate connector credentials -TWINGATE_ACCESS_TOKEN=<< twingate_access_token >> -TWINGATE_REFRESH_TOKEN=<< twingate_refresh_token >> diff --git a/Docker-Compose/twingate-connector/files/compose.yaml b/Docker-Compose/twingate-connector/files/compose.yaml deleted file mode 100644 index 391ce05..0000000 --- a/Docker-Compose/twingate-connector/files/compose.yaml +++ /dev/null @@ -1,17 +0,0 @@ -services: - << service_name >>: - image: docker.io/twingate/connector:1.88.0 - restart: << restart_policy >> - container_name: << container_name >> - hostname: << container_hostname >> - environment: - - TZ=<< container_timezone >> - - TWINGATE_NETWORK=<< twingate_network >> - - TWINGATE_ACCESS_TOKEN=${TWINGATE_ACCESS_TOKEN} - - TWINGATE_REFRESH_TOKEN=${TWINGATE_REFRESH_TOKEN} - - TWINGATE_LOG_LEVEL=<< twingate_log_level >> - <%- if twingate_dns %> - - TWINGATE_DNS=<< twingate_dns >> - <%- endif %> - sysctls: - net.ipv4.ping_group_range: "0 2147483647" diff --git a/Docker-Compose/twingate-connector/template.json b/Docker-Compose/twingate-connector/template.json deleted file mode 100644 index 4eb0b01..0000000 --- a/Docker-Compose/twingate-connector/template.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "slug": "twingate-connector-compose", - "kind": "compose", - "metadata": { - "name": "Twingate_Connector", - "description": "Lightweight agent that establishes secure zero-trust connections between your private network and the Twingate service, allowing authorized users to access internal resources without a VPN.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "twingate" - }, - "draft": false, - "version": { - "name": "1.88.0", - "source_dep_name": "docker.io/twingate/connector", - "source_dep_version": "1.88.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "twingate", - "config": { - "placeholder": "twingate" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "twingate-connector", - "config": { - "placeholder": "twingate-connector" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false, - "default": "twingate-connector", - "config": { - "placeholder": "twingate-connector" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - } - ] - }, - { - "title": "Twingate Configuration", - "name": "twingate", - "items": [ - { - "name": "twingate_network", - "type": "str", - "title": "Network Name", - "required": true - }, - { - "name": "twingate_access_token", - "type": "secret", - "title": "Access Token", - "required": true, - "description": "Connector access token." - }, - { - "name": "twingate_refresh_token", - "type": "secret", - "title": "Refresh Token", - "required": true, - "description": "Connector refresh token." - }, - { - "name": "twingate_log_level", - "type": "int", - "title": "Log Level", - "required": false, - "default": 1, - "description": "Log level (1=ERROR, 2=WARN, 3=INFO, 4=DEBUG)", - "config": { - "slider": true, - "min": 1, - "max": 4, - "step": 1, - "placeholder": "1" - } - }, - { - "name": "twingate_dns", - "type": "str", - "title": "DNS Server", - "required": false, - "default": "", - "description": "Local DNS server IP (optional, leave empty to use default)" - } - ] - }, - { - "title": "Resource Limits", - "toggle": "resources_enabled", - "name": "resources", - "items": [ - { - "name": "resources_enabled", - "type": "bool", - "title": "Resources Enabled", - "required": false, - "default": false - }, - { - "name": "resources_cpu_limit", - "type": "str", - "title": "Resources Cpu Limit", - "required": true, - "default": 1, - "config": { - "placeholder": "1" - } - }, - { - "name": "resources_cpu_reservation", - "type": "str", - "title": "Resources Cpu Reservation", - "required": true, - "default": 0.25, - "config": { - "placeholder": "0.25" - } - }, - { - "name": "resources_memory_limit", - "type": "str", - "title": "Resources Memory Limit", - "required": true, - "default": "1G", - "config": { - "placeholder": "1G" - } - }, - { - "name": "resources_memory_reservation", - "type": "str", - "title": "Resources Memory Reservation", - "required": true, - "default": "512M", - "config": { - "placeholder": "512M" - } - } - ] - } - ] -} diff --git a/Docker-Compose/uptimekuma/files/compose.yaml b/Docker-Compose/uptimekuma/files/compose.yaml deleted file mode 100644 index f580439..0000000 --- a/Docker-Compose/uptimekuma/files/compose.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/louislam/uptime-kuma:2.3.2 - container_name: << container_name >> - restart: << restart_policy >> - ports: - - "<< ports_http >>:3001" - volumes: - - uptimekuma-data:/app/data - -volumes: - uptimekuma-data: - driver: local diff --git a/Docker-Compose/uptimekuma/template.json b/Docker-Compose/uptimekuma/template.json deleted file mode 100644 index b4dacc3..0000000 --- a/Docker-Compose/uptimekuma/template.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "slug": "uptimekuma", - "kind": "compose", - "metadata": { - "name": "Uptimekuma", - "description": "Self-hosted uptime monitoring tool with support for HTTP(s), TCP, ping, DNS, and more. Provides a clean dashboard and customizable notifications.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "uptime-kuma" - }, - "draft": false, - "version": { - "name": "2.3.2", - "source_dep_name": "docker.io/louislam/uptime-kuma", - "source_dep_version": "2.3.2" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "uptimekuma", - "config": { - "placeholder": "uptimekuma" - } - }, - { - "name": "container_name", - "type": "str", - "title": "Container Name", - "required": false, - "default": "uptimekuma", - "config": { - "placeholder": "uptimekuma" - } - }, - { - "name": "restart_policy", - "type": "enum", - "title": "Restart Policy", - "required": false, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": true, - "default": 3001, - "description": "Host port used to expose the Uptime Kuma web UI.", - "config": { - "placeholder": "3001" - } - } - ] - } - ] -} diff --git a/Docker-Compose/whoami/files/compose.yaml b/Docker-Compose/whoami/files/compose.yaml deleted file mode 100644 index d30e3d4..0000000 --- a/Docker-Compose/whoami/files/compose.yaml +++ /dev/null @@ -1,25 +0,0 @@ ---- -services: - whoami: - hostname: << container_hostname >> - image: traefik/whoami:v1.11.0 - restart: << restart_policy >> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.whoami-web.loadbalancer.server.port=80 - - traefik.http.routers.whoami-http.service=whoami-web - - traefik.http.routers.whoami-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.whoami-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.whoami-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.whoami-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.whoami-https.tls=true - - traefik.http.routers.whoami-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - networks: - - << traefik_network >> - -networks: - << traefik_network >>: - external: true diff --git a/Docker-Compose/whoami/template.json b/Docker-Compose/whoami/template.json deleted file mode 100644 index 4da3f5b..0000000 --- a/Docker-Compose/whoami/template.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "slug": "whoami", - "kind": "compose", - "metadata": { - "name": "Whoami", - "description": "Simple HTTP service that echoes back request information. Useful for testing reverse proxy configurations, load balancers, and network setups.", - "tags": [ - "traefik", - "testing", - "http" - ], - "icon": { - "provider": "simple-icons", - "id": "traefikproxy", - "color": "rose" - }, - "draft": false, - "version": { - "name": "v1.11.0", - "source_dep_name": "traefik/whoami", - "source_dep_version": "v1.11.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "restart_policy", - "type": "enum", - "title": "Container restart policy", - "required": true, - "default": "unless-stopped", - "config": { - "options": [ - "unless-stopped", - "always", - "on-failure", - "no" - ] - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container hostname", - "required": false, - "default": "whoami", - "description": "Container hostname (optional)", - "config": { - "placeholder": "whoami" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "items": [ - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "whoami" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Traefik network name", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": true - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - } - ] -} diff --git a/Terraform/cloudflare-dns-record/files/main.tf b/Terraform/cloudflare-dns-record/files/main.tf deleted file mode 100644 index ab1e6a6..0000000 --- a/Terraform/cloudflare-dns-record/files/main.tf +++ /dev/null @@ -1,29 +0,0 @@ -data "cloudflare_zone" "zone" { - zone_id = "<< cloudflare_zone_id >>" -} - -resource "cloudflare_dns_record" "<< resource_name >>" { - zone_id = data.cloudflare_zone.zone.zone_id - name = "<< name >>" - type = "<< record_type >>" -<%- if record_type == "A" %> - content = "<< ipv4_address >>" - proxied = << proxied | lower >> -<%- endif %> -<%- if record_type == "AAAA" %> - content = "<< ipv6_address >>" - proxied = << proxied | lower >> -<%- endif %> -<%- if record_type == "CNAME" %> - content = "<< target_hostname >>" - proxied = << proxied | lower >> -<%- endif %> -<%- if record_type == "TXT" %> - content = "<< text_value >>" -<%- endif %> -<%- if record_type == "MX" %> - content = "<< mail_server >>" - priority = << priority >> -<%- endif %> - ttl = << ttl >> -} diff --git a/Terraform/cloudflare-dns-record/template.json b/Terraform/cloudflare-dns-record/template.json deleted file mode 100644 index abe2d44..0000000 --- a/Terraform/cloudflare-dns-record/template.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "slug": "cloudflare-dns-record", - "kind": "terraform", - "metadata": { - "name": "Cloudflare DNS Record", - "description": "Creates a single Cloudflare DNS record for A, AAAA, CNAME, TXT, or MX with type-specific inputs, TTL, and proxying where supported.", - "icon": { - "provider": "selfhst", - "id": "cloudflare", - "color": "default" - }, - "draft": false, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/cloudflare-dns-record" - } - }, - "variables": [ - { - "name": "terraform", - "title": "Terraform", - "items": [ - { - "name": "resource_name", - "title": "Resource Name", - "type": "str", - "default": "dns_record", - "config": { - "placeholder": "dns_record" - } - } - ] - }, - { - "name": "record", - "title": "DNS Record", - "items": [ - { - "name": "cloudflare_zone_id", - "title": "Cloudflare Zone ID", - "type": "str", - "config": { - "placeholder": "123456789" - }, - "required": true - }, - { - "name": "name", - "title": "Record Name", - "description": "DNS record name (use @ for the root domain).", - "type": "str", - "default": "app", - "config": { - "placeholder": "app" - } - }, - { - "name": "record_type", - "title": "DNS record type", - "type": "enum", - "default": "A", - "config": { - "options": [ - "A", - "AAAA", - "CNAME", - "TXT", - "MX" - ] - } - }, - { - "name": "ttl", - "title": "TTL", - "description": "Time to live (1 = automatic, or 60-86400 seconds)", - "type": "int", - "default": 1, - "config": { - "placeholder": "1", - "unit": "seconds" - } - }, - { - "name": "ipv4_address", - "title": "IPv4 Address", - "description": "IPv4 address for an A record.", - "type": "str", - "required": true, - "needs": [ - "record_type=A" - ], - "config": { - "placeholder": "192.0.2.1" - } - }, - { - "name": "ipv6_address", - "title": "IPv6 Address", - "description": "IPv6 address for an AAAA record.", - "type": "str", - "required": true, - "needs": [ - "record_type=AAAA" - ], - "config": { - "placeholder": "2001:db8::1" - } - }, - { - "name": "target_hostname", - "title": "Target Hostname", - "description": "Canonical hostname target for a CNAME record.", - "type": "str", - "required": true, - "needs": [ - "record_type=CNAME" - ], - "config": { - "placeholder": "origin.example.com" - } - }, - { - "name": "text_value", - "title": "TXT Value", - "description": "Text value for a TXT record.", - "type": "str", - "required": true, - "needs": [ - "record_type=TXT" - ], - "config": { - "placeholder": "v=spf1 include:_spf.example.com ~all", - "textarea": true - } - }, - { - "name": "mail_server", - "title": "Mail Server", - "description": "Mail server hostname for an MX record.", - "type": "str", - "required": true, - "needs": [ - "record_type=MX" - ], - "config": { - "placeholder": "mail.example.com" - } - }, - { - "name": "priority", - "title": "Priority", - "description": "MX record priority (lower value = higher priority).", - "type": "int", - "default": 10, - "required": true, - "needs": [ - "record_type=MX" - ], - "config": { - "placeholder": "10" - } - }, - { - "name": "proxied", - "title": "Proxy", - "type": "bool", - "default": true, - "needs": [ - "record_type=A,AAAA,CNAME" - ] - } - ] - } - ] -} diff --git a/Terraform/cloudflare-zero-trust-tunnel-config/files/main.tf b/Terraform/cloudflare-zero-trust-tunnel-config/files/main.tf deleted file mode 100644 index a0c08a9..0000000 --- a/Terraform/cloudflare-zero-trust-tunnel-config/files/main.tf +++ /dev/null @@ -1,17 +0,0 @@ -resource "cloudflare_zero_trust_tunnel_cloudflared_config" "<< resource_name >>" { - account_id = "<< account_id_value >>" - tunnel_id = "<< tunnel_id >>" - - config = { - ingress = [ - { - hostname = "<< ingress_hostname >>" - service = "<< ingress_service >>" - }, - { - service = "<< fallback_service >>" - } - ] - } - -} diff --git a/Terraform/cloudflare-zero-trust-tunnel-config/template.json b/Terraform/cloudflare-zero-trust-tunnel-config/template.json deleted file mode 100644 index 3ec06aa..0000000 --- a/Terraform/cloudflare-zero-trust-tunnel-config/template.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "slug": "cloudflare-zero-trust-tunnel-config", - "kind": "terraform", - "metadata": { - "name": "Cloudflare Zero Trust Tunnel Config", - "description": "Creates a Cloudflare Zero Trust tunnel ingress configuration for a cloudflared tunnel with a primary hostname and fallback service.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "cloudflare-zero-trust" - }, - "draft": false, - "version": { - "name": "5.12.0", - "source_dep_name": "manual/cloudflare-zero-trust-tunnel-config" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "resource_name", - "type": "str", - "title": "Resource Name", - "required": false, - "default": "tunnel_config", - "config": { - "placeholder": "tunnel_config" - } - }, - { - "name": "account_id_value", - "type": "str", - "title": "Cloudflare account ID", - "required": true - }, - { - "name": "tunnel_id", - "type": "str", - "title": "Cloudflare tunnel ID", - "required": true, - "description": "Cloudflare tunnel identifier.", - "config": { - "placeholder": "Tunnel ID" - } - } - ] - }, - { - "title": "Ingress", - "name": "ingress", - "items": [ - { - "name": "ingress_hostname", - "type": "str", - "title": "Hostname", - "required": true, - "description": "Public hostname routed through the tunnel", - "config": { - "placeholder": "app.home.arpa" - } - }, - { - "name": "ingress_service", - "type": "str", - "title": "Service URL", - "required": true, - "description": "Backend service URL for the hostname", - "config": { - "placeholder": "https://app.internal" - } - }, - { - "name": "fallback_service", - "type": "str", - "title": "Fallback Service", - "required": false, - "default": "http_status:404", - "description": "Fallback service for unmatched requests", - "config": { - "placeholder": "http_status:404" - } - } - ] - } - ] -} diff --git a/Terraform/cloudflare-zone-data/files/main.tf b/Terraform/cloudflare-zone-data/files/main.tf deleted file mode 100644 index 23587ea..0000000 --- a/Terraform/cloudflare-zone-data/files/main.tf +++ /dev/null @@ -1,3 +0,0 @@ -data "cloudflare_zone" "<< resource_name >>" { - zone_id = "<< cloudflare_zone_id >>" -} diff --git a/Terraform/cloudflare-zone-data/template.json b/Terraform/cloudflare-zone-data/template.json deleted file mode 100644 index d97150e..0000000 --- a/Terraform/cloudflare-zone-data/template.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "slug": "cloudflare-zone-data", - "kind": "terraform", - "metadata": { - "name": "Cloudflare Zone (datasource)", - "description": "", - "icon": { - "provider": "selfhst", - "id": "cloudflare", - "color": "default" - }, - "draft": false, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/cloudflare-zone-data" - } - }, - "variables": [ - { - "name": "terraform", - "title": "Terraform", - "items": [ - { - "name": "resource_name", - "title": "Resource Name", - "type": "str", - "required": true, - "config": { - "placeholder": "my_cloudflare_zone" - } - }, - { - "name": "cloudflare_zone_id", - "title": "Cloudflare Zone ID", - "type": "str", - "config": { - "placeholder": "123456789" - }, - "required": true - } - ] - } - ] -} diff --git a/Terraform/cloudflare-ztna-application/files/cloudflare_zero_trust_access_application.tf b/Terraform/cloudflare-ztna-application/files/cloudflare_zero_trust_access_application.tf deleted file mode 100644 index 3055e4f..0000000 --- a/Terraform/cloudflare-ztna-application/files/cloudflare_zero_trust_access_application.tf +++ /dev/null @@ -1,23 +0,0 @@ -resource "cloudflare_zero_trust_access_application" "<< resource_name >>" { - zone_id = data.cloudflare_zone.main.zone_id - name = "<< app_name >>" - domain = "<< domain >>" - type = "self_hosted" - session_duration = "<< session_duration >>" - policies = [ -<%- if service_token_enabled %> - { - id = cloudflare_zero_trust_access_policy.<< resource_name >>_service_token.id - } -<%- if ip_policy_enabled %> - , -<%- endif %> -<%- endif %> -<%- if ip_policy_enabled %> - { - id = cloudflare_zero_trust_access_policy.<< resource_name >>_ip.id - } -<%- endif %> - ] - -} diff --git a/Terraform/cloudflare-ztna-application/files/cloudflare_zero_trust_access_policy.tf b/Terraform/cloudflare-ztna-application/files/cloudflare_zero_trust_access_policy.tf deleted file mode 100644 index f520f89..0000000 --- a/Terraform/cloudflare-ztna-application/files/cloudflare_zero_trust_access_policy.tf +++ /dev/null @@ -1,28 +0,0 @@ -<%- if service_token_enabled %> -resource "cloudflare_zero_trust_access_policy" "<< resource_name >>_service_token" { - account_id = data.cloudflare_account.main.account_id - name = "<< service_token_policy_name >>" - decision = "non_identity" - include = [{ - service_token = { - token_id = "<< service_token_id >>" - } - }] - session_duration = "<< session_duration >>" -} -<%- endif %> -<%- if ip_policy_enabled %> -resource "cloudflare_zero_trust_access_policy" "<< resource_name >>_ip" { - account_id = data.cloudflare_account.main.account_id - name = "<< ip_policy_name >>" - decision = "non_identity" - include = [ - for ip_range in split(",", "<< ip_ranges >>") : { - ip = { - ip = trimspace(ip_range) - } - } - ] - session_duration = "<< session_duration >>" -} -<%- endif %> diff --git a/Terraform/cloudflare-ztna-application/files/main.tf b/Terraform/cloudflare-ztna-application/files/main.tf deleted file mode 100644 index 0d57c04..0000000 --- a/Terraform/cloudflare-ztna-application/files/main.tf +++ /dev/null @@ -1,7 +0,0 @@ -data "cloudflare_account" "main" { - account_id = "<< account_id_value >>" -} - -data "cloudflare_zone" "main" { - zone_id = "<< zone_id_value >>" -} diff --git a/Terraform/cloudflare-ztna-application/template.json b/Terraform/cloudflare-ztna-application/template.json deleted file mode 100644 index 1b2a142..0000000 --- a/Terraform/cloudflare-ztna-application/template.json +++ /dev/null @@ -1,157 +0,0 @@ -{ - "slug": "cloudflare-ztna-application", - "kind": "terraform", - "metadata": { - "name": "Cloudflare Zero Trust Access Application", - "description": "Creates a Cloudflare Zero Trust Access application with service token and IP-based access policies.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "cloudflare-zero-trust" - }, - "draft": false, - "version": { - "name": "5.12.0", - "source_dep_name": "manual/cloudflare-ztna-application" - } - }, - "variables": [ - { - "title": "Application", - "name": "application", - "items": [ - { - "name": "app_name", - "type": "str", - "title": "Application name", - "required": false, - "default": "application", - "config": { - "placeholder": "application" - } - }, - { - "name": "domain", - "type": "str", - "title": "Application domain", - "required": true, - "config": { - "placeholder": "app.home.arpa" - } - }, - { - "name": "session_duration", - "type": "str", - "title": "Session Duration", - "required": false, - "default": "15m", - "description": "Session duration (e.g., 15m, 1h, 24h)", - "config": { - "placeholder": "15m" - } - } - ] - }, - { - "title": "General", - "name": "general", - "items": [ - { - "name": "account_id_value", - "type": "str", - "title": "Cloudflare Account ID", - "required": true - }, - { - "name": "resource_name", - "type": "str", - "title": "Resource Name", - "required": false, - "default": "ztna_app", - "config": { - "placeholder": "ztna_app" - } - }, - { - "name": "zone_id_value", - "type": "str", - "title": "Cloudflare Zone ID", - "required": true - } - ] - }, - { - "title": "IP-Based Policy", - "name": "ip-policy", - "items": [ - { - "name": "ip_policy_enabled", - "type": "bool", - "title": "IP Policy", - "required": false, - "default": false - }, - { - "name": "ip_policy_name", - "type": "str", - "title": "IP Policy Name", - "required": false, - "default": "ip_policy", - "description": "Policy name for IP-based access", - "config": { - "placeholder": "ip_policy" - } - }, - { - "name": "ip_ranges", - "type": "str", - "title": "IP Ranges", - "required": false, - "default": "IP_RANGE", - "description": "Comma-separated list of IP ranges (CIDR notation)", - "needs": [ - "ip_policy_enabled=true" - ], - "config": { - "placeholder": "IP_RANGE" - } - } - ] - }, - { - "title": "Service Token Policy", - "name": "service-token-policy", - "items": [ - { - "name": "service_token_enabled", - "type": "bool", - "title": "Service Token", - "required": false, - "default": false - }, - { - "name": "service_token_id", - "type": "str", - "title": "Service Token ID", - "required": false, - "needs": [ - "service_token_enabled=true" - ] - }, - { - "name": "service_token_policy_name", - "type": "str", - "title": "Service Token Name", - "required": false, - "default": "service_token_policy", - "needs": [ - "service_token_enabled=true" - ], - "config": { - "placeholder": "service_token_policy" - } - } - ] - } - ] -} diff --git a/Terraform/dns-a-record-tsig/files/main.tf b/Terraform/dns-a-record-tsig/files/main.tf deleted file mode 100644 index 8cdcdd7..0000000 --- a/Terraform/dns-a-record-tsig/files/main.tf +++ /dev/null @@ -1,8 +0,0 @@ -resource "dns_a_record_set" "dns_record" { - zone = "<< dns_zone >>" - name = "<< dns_hostname >>" - addresses = [ - "<< ip_address >>" - ] - ttl = "<< dns_ttl | default('3600') >>" -} diff --git a/Terraform/dns-a-record-tsig/template.json b/Terraform/dns-a-record-tsig/template.json deleted file mode 100644 index 2ea8899..0000000 --- a/Terraform/dns-a-record-tsig/template.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "slug": "dns-a-record-tsig", - "kind": "terraform", - "metadata": { - "name": "DNS Record A (TSIG)", - "description": "Creates a DNS A record using TSIG-authenticated dynamic DNS updates. Maps a hostname to an IP address on a TSIG-enabled DNS server.", - "icon": { - "provider": "selfhst", - "id": "bind-9", - "color": "default" - }, - "draft": false, - "version": { - "name": "3.5.0", - "source_dep_name": "hashicorp/dns", - "source_dep_version": "3.5.0" - } - }, - "variables": [ - { - "name": "record", - "title": "DNS Record Configuration", - "items": [ - { - "name": "dns_hostname", - "title": "Hostname", - "type": "str", - "config": { - "placeholder": "hostname" - }, - "required": true - }, - { - "name": "dns_zone", - "title": "Zone", - "type": "str", - "config": { - "placeholder": "home.arpa." - }, - "required": true - }, - { - "name": "ip_address", - "title": "IP Address", - "type": "str", - "config": { - "placeholder": "192.168.0.1/24" - }, - "required": true - }, - { - "name": "dns_ttl", - "title": "TTL", - "description": "Time to live (TTL) for the DNS record in seconds (default: 3600)", - "type": "int", - "default": 3600, - "config": { - "unit": "seconds", - "slider": true, - "min": 60, - "max": 86400, - "step": 60, - "placeholder": "3600" - } - } - ] - } - ] -} diff --git a/Terraform/netbird-group/files/main.tf b/Terraform/netbird-group/files/main.tf deleted file mode 100644 index b819a70..0000000 --- a/Terraform/netbird-group/files/main.tf +++ /dev/null @@ -1,53 +0,0 @@ -<%- if peer_names %> -locals { - netbird_group_peer_names = [ - for name in split(",", "<< peer_names >>") : trimspace(name) - if trimspace(name) != "" - ] -} - -data "netbird_peer" "group_peers" { - for_each = toset(local.netbird_group_peer_names) - name = each.value -} - -<%- endif %> -<%- if resource_lookups %> -locals { - netbird_group_resource_items = [ - for item in split(";", "<< resource_lookups >>") : trimspace(item) - if trimspace(item) != "" - ] - netbird_group_resource_lookup_map = { - for item in local.netbird_group_resource_items : - item => { - network = trimspace(split("|", item)[0]) - name = trimspace(split("|", item)[1]) - } - } - netbird_group_resource_network_names = distinct([ - for lookup in values(local.netbird_group_resource_lookup_map) : lookup.network - ]) -} - -data "netbird_network" "group_resource_networks" { - for_each = toset(local.netbird_group_resource_network_names) - name = each.value -} - -data "netbird_network_resource" "group_resources" { - for_each = local.netbird_group_resource_lookup_map - network_id = data.netbird_network.group_resource_networks[each.value.network].id - name = each.value.name -} - -<%- endif %> -resource "netbird_group" "group" { - name = "<< group_name >>" -<%- if peer_names %> - peers = [for name in local.netbird_group_peer_names : data.netbird_peer.group_peers[name].id] -<%- endif %> -<%- if resource_lookups %> - resources = [for item in local.netbird_group_resource_items : data.netbird_network_resource.group_resources[item].id] -<%- endif %> -} diff --git a/Terraform/netbird-group/template.json b/Terraform/netbird-group/template.json deleted file mode 100644 index 6763a7e..0000000 --- a/Terraform/netbird-group/template.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "slug": "netbird-group", - "kind": "terraform", - "metadata": { - "name": "NetBird Group", - "description": "Creates a NetBird group and can optionally attach peers and network resources.", - "tags": [ - "netbird", - "terraform" - ], - "icon": { - "provider": "selfhst", - "id": "netbird" - }, - "draft": false, - "version": { - "name": "0.0.12", - "source_dep_name": "manual/netbird-group" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "group_name", - "type": "str", - "title": "Group Name", - "required": true, - "config": { - "placeholder": "Engineering" - } - } - ] - }, - { - "title": "Membership", - "name": "membership", - "items": [ - { - "name": "peer_names", - "type": "str", - "title": "Peer Names", - "required": false, - "description": "Comma-separated existing NetBird peer names to attach to the group.", - "config": { - "placeholder": "web-app,db-app", - "textarea": true - } - }, - { - "name": "resource_lookups", - "type": "str", - "title": "Resource Lookups", - "required": false, - "description": "Semicolon-separated `network_name|resource_name` entries for existing NetBird network resources to attach to the group.", - "config": { - "placeholder": "production-network|internal-app;production-network|corp-lan", - "textarea": true - } - } - ] - } - ] -} diff --git a/Terraform/netbird-network-resource/files/main.tf b/Terraform/netbird-network-resource/files/main.tf deleted file mode 100644 index 00395cf..0000000 --- a/Terraform/netbird-network-resource/files/main.tf +++ /dev/null @@ -1,29 +0,0 @@ -data "netbird_network" "parent_network" { - name = "<< network_name >>" -} - -<%- for group_name in group_names.split(',') %> -<%- if group_name|trim %> -data "netbird_group" "group_<< group_name|trim|replace(' ', '_')|replace('-', '_') >>" { - name = "<< group_name|trim >>" -} - -<%- endif %> -<%- endfor %> - -resource "netbird_network_resource" "network_resource" { - network_id = data.netbird_network.parent_network.id - name = "<< resource_name >>" - <%- if resource_description %> - description = "<< resource_description >>" - <%- endif %> - address = "<< resource_address >>" - groups = [ -<%- for group_name in group_names.split(',') %> -<%- if group_name|trim %> - data.netbird_group.group_<< group_name|trim|replace(' ', '_')|replace('-', '_') >>.id, -<%- endif %> -<%- endfor %> - ] - enabled = << resource_enabled | lower >> -} diff --git a/Terraform/netbird-network-resource/template.json b/Terraform/netbird-network-resource/template.json deleted file mode 100644 index 416febd..0000000 --- a/Terraform/netbird-network-resource/template.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "slug": "netbird-network-resource", - "kind": "terraform", - "metadata": { - "name": "NetBird Network Resource", - "description": "Creates a NetBird network resource and attaches it to one or more groups.", - "tags": [ - "netbird", - "terraform" - ], - "icon": { - "provider": "selfhst", - "id": "netbird" - }, - "draft": true, - "version": { - "name": "0.0.15", - "source_dep_name": "manual/netbird-network-resource" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "resource_name", - "type": "str", - "title": "Name", - "required": true, - "config": { - "placeholder": "My Network Resource" - } - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": true, - "description": "Existing NetBird network name for the parent network resource lookup.", - "config": { - "placeholder": "production-network" - } - }, - { - "name": "resource_address", - "type": "str", - "title": "Address", - "required": true, - "description": "Host, subnet, or domain address for the resource.", - "config": { - "placeholder": "10.20.0.0/24" - } - }, - { - "name": "group_names", - "type": "str", - "title": "Group Names", - "required": true, - "description": "Comma-separated existing NetBird group names to attach to this resource.", - "config": { - "placeholder": "Administrators, DevOps", - "textarea": true - }, - "default": "Administrators" - }, - { - "name": "resource_description", - "type": "str", - "title": "Description", - "required": false, - "description": "Optional description for the NetBird network resource.", - "config": { - "placeholder": "Internal application endpoint", - "textarea": true - } - }, - { - "name": "resource_enabled", - "type": "bool", - "title": "Enabled", - "required": false, - "default": true - } - ] - } - ] -} diff --git a/Terraform/netbird-network-router/files/main.tf b/Terraform/netbird-network-router/files/main.tf deleted file mode 100644 index 46d5112..0000000 --- a/Terraform/netbird-network-router/files/main.tf +++ /dev/null @@ -1,36 +0,0 @@ -data "netbird_network" "router_network" { - name = "<< network_name >>" -} - -<%- if router_target_mode == "peer" %> -data "netbird_peer" "router_peer" { - name = "<< peer_name >>" -} - -<%- endif %> -<%- if router_target_mode == "peer_groups" %> -locals { - router_peer_group_names = [ - for name in split(",", "<< peer_group_names >>") : trimspace(name) - if trimspace(name) != "" - ] -} - -data "netbird_group" "router_peer_groups" { - for_each = toset(local.router_peer_group_names) - name = each.value -} - -<%- endif %> -resource "netbird_network_router" "network_router" { - network_id = data.netbird_network.router_network.id - enabled = << router_enabled | lower >> - masquerade = << router_masquerade | lower >> - metric = << router_metric >> -<%- if router_target_mode == "peer" %> - peer = data.netbird_peer.router_peer.id -<%- endif %> -<%- if router_target_mode == "peer_groups" %> - peer_groups = [for name in local.router_peer_group_names : data.netbird_group.router_peer_groups[name].id] -<%- endif %> -} diff --git a/Terraform/netbird-network-router/template.json b/Terraform/netbird-network-router/template.json deleted file mode 100644 index c4b8964..0000000 --- a/Terraform/netbird-network-router/template.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "slug": "netbird-network-router", - "kind": "terraform", - "metadata": { - "name": "NetBird Network Router", - "description": "Creates a NetBird network router and targets either a single peer or a peer group.", - "tags": [ - "netbird", - "terraform" - ], - "icon": { - "provider": "selfhst", - "id": "netbird" - }, - "draft": false, - "version": { - "name": "0.0.12", - "source_dep_name": "manual/netbird-network-router" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "router_enabled", - "type": "bool", - "title": "Enabled", - "required": false, - "default": true - }, - { - "name": "router_masquerade", - "type": "bool", - "title": "Masquerade", - "required": false, - "default": true, - "description": "Masquerade routed traffic on the selected router peer." - }, - { - "name": "router_metric", - "type": "int", - "title": "Metric", - "required": false, - "default": 9999, - "description": "Router metric. Lower values have higher priority.", - "config": { - "placeholder": "9999" - } - }, - { - "name": "router_target_mode", - "type": "enum", - "title": "Target Mode", - "required": true, - "default": "peer_groups", - "description": "Route through a single peer or a peer group.", - "config": { - "options": [ - "peer_groups", - "peer" - ] - } - } - ] - }, - { - "title": "Lookups", - "name": "lookups", - "items": [ - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": true, - "description": "Existing NetBird network name for the parent network lookup.", - "config": { - "placeholder": "production-network" - } - }, - { - "name": "peer_name", - "type": "str", - "title": "Peer Name", - "required": true, - "description": "Existing NetBird peer name for the router peer lookup.", - "needs": [ - "router_target_mode=peer" - ], - "config": { - "placeholder": "gateway-peer" - } - }, - { - "name": "peer_group_names", - "type": "str", - "title": "Peer Group Names", - "required": true, - "description": "Comma-separated existing NetBird group names for router groups.", - "needs": [ - "router_target_mode=peer_groups" - ], - "config": { - "placeholder": "Routers,Gateways", - "textarea": true - } - } - ] - } - ] -} diff --git a/Terraform/netbird-network/files/main.tf b/Terraform/netbird-network/files/main.tf deleted file mode 100644 index 95ccc13..0000000 --- a/Terraform/netbird-network/files/main.tf +++ /dev/null @@ -1,6 +0,0 @@ -resource "netbird_network" "network" { - name = "<< network_name >>" -<%- if network_description %> - description = "<< network_description >>" -<%- endif %> -} diff --git a/Terraform/netbird-network/template.json b/Terraform/netbird-network/template.json deleted file mode 100644 index dd062e1..0000000 --- a/Terraform/netbird-network/template.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "slug": "netbird-network", - "kind": "terraform", - "metadata": { - "name": "NetBird Network", - "description": "Creates a NetBird network for organizing resources and routers.", - "tags": [ - "netbird", - "terraform" - ], - "icon": { - "provider": "selfhst", - "id": "netbird" - }, - "draft": false, - "version": { - "name": "0.0.10", - "source_dep_name": "manual/netbird-network" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": true, - "config": { - "placeholder": "Homelab" - } - }, - { - "name": "network_description", - "type": "str", - "title": "Description", - "required": false, - "description": "Optional description for the NetBird network.", - "config": { - "placeholder": "Internal services network", - "textarea": true - } - } - ] - } - ] -} diff --git a/Terraform/netbird-policy/files/main.tf b/Terraform/netbird-policy/files/main.tf deleted file mode 100644 index 7f6b262..0000000 --- a/Terraform/netbird-policy/files/main.tf +++ /dev/null @@ -1,84 +0,0 @@ -locals { - policy_source_group_names = [ - for name in split(",", "<< source_group_names >>") : trimspace(name) - if trimspace(name) != "" - ] - policy_destination_group_names = [ - for name in split(",", "<< destination_group_names >>") : trimspace(name) - if trimspace(name) != "" - ] -<%- if source_posture_check_names %> - policy_source_posture_check_names = [ - for name in split(",", "<< source_posture_check_names >>") : trimspace(name) - if trimspace(name) != "" - ] -<%- endif %> -<%- if authorized_group_entries %> - policy_authorized_group_entries = [ - for entry in split(";", "<< authorized_group_entries >>") : trimspace(entry) - if trimspace(entry) != "" - ] - policy_authorized_group_map = { - for entry in local.policy_authorized_group_entries : - trimspace(split("|", entry)[0]) => [ - for username in split(",", split("|", entry)[1]) : trimspace(username) - if trimspace(username) != "" - ] - } -<%- endif %> - policy_group_names = distinct(concat( - local.policy_source_group_names, - local.policy_destination_group_names, -<%- if authorized_group_entries %> - keys(local.policy_authorized_group_map), -<%- endif %> - [] - )) -} - -data "netbird_group" "policy_groups" { - for_each = toset(local.policy_group_names) - name = each.value -} - -<%- if source_posture_check_names %> -data "netbird_posture_check" "source_posture_checks" { - for_each = toset(local.policy_source_posture_check_names) - name = each.value -} - -<%- endif %> -resource "netbird_policy" "policy" { - name = "<< policy_name >>" -<%- if policy_description %> - description = "<< policy_description >>" -<%- endif %> - enabled = << policy_enabled | lower >> -<%- if source_posture_check_names %> - source_posture_checks = [for name in local.policy_source_posture_check_names : data.netbird_posture_check.source_posture_checks[name].id] -<%- endif %> - - rule { - name = "<< rule_name >>" - action = "<< rule_action >>" - bidirectional = << rule_bidirectional | lower >> - enabled = << rule_enabled | lower >> - protocol = "<< rule_protocol >>" - sources = [for name in local.policy_source_group_names : data.netbird_group.policy_groups[name].id] - destinations = [for name in local.policy_destination_group_names : data.netbird_group.policy_groups[name].id] -<%- if rule_description %> - description = "<< rule_description >>" -<%- endif %> -<%- if ports %> - ports = [<< ports >>] -<%- endif %> -<%- if rule_protocol == "netbird-ssh" %> -<%- if authorized_group_entries %> - authorized_groups = { - for group_name, users in local.policy_authorized_group_map : - data.netbird_group.policy_groups[group_name].id => users - } -<%- endif %> -<%- endif %> - } -} diff --git a/Terraform/netbird-policy/template.json b/Terraform/netbird-policy/template.json deleted file mode 100644 index 09f0538..0000000 --- a/Terraform/netbird-policy/template.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "slug": "netbird-policy", - "kind": "terraform", - "metadata": { - "name": "NetBird Policy", - "description": "Creates a NetBird access policy with a single rule and optional posture checks.", - "tags": [ - "netbird", - "terraform" - ], - "icon": { - "provider": "selfhst", - "id": "netbird" - }, - "draft": false, - "version": { - "name": "0.0.12", - "source_dep_name": "manual/netbird-policy" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "policy_name", - "type": "str", - "title": "Policy Name", - "required": true, - "config": { - "placeholder": "Allow Internal HTTPS" - } - }, - { - "name": "policy_description", - "type": "str", - "title": "Description", - "required": false, - "description": "Optional description for the policy.", - "config": { - "placeholder": "Allow app traffic from users to services", - "textarea": true - } - }, - { - "name": "policy_enabled", - "type": "bool", - "title": "Enabled", - "required": false, - "default": true - } - ] - }, - { - "title": "Rule", - "name": "rule", - "items": [ - { - "name": "rule_name", - "type": "str", - "title": "Rule Name", - "required": true, - "config": { - "placeholder": "HTTPS" - } - }, - { - "name": "rule_description", - "type": "str", - "title": "Rule Description", - "required": false, - "description": "Optional description for the rule.", - "config": { - "placeholder": "Allow HTTPS from users to the app group", - "textarea": true - } - }, - { - "name": "rule_action", - "type": "enum", - "title": "Action", - "required": false, - "default": "accept", - "description": "Policy action to take.", - "config": { - "options": [ - "accept", - "drop" - ] - } - }, - { - "name": "rule_protocol", - "type": "enum", - "title": "Protocol", - "required": false, - "default": "tcp", - "description": "Protocol enforced by the policy rule.", - "config": { - "options": [ - "tcp", - "udp", - "icmp", - "all", - "netbird-ssh" - ] - } - }, - { - "name": "rule_bidirectional", - "type": "bool", - "title": "Bidirectional", - "required": false, - "default": true, - "description": "Allow traffic in both directions between the selected groups." - }, - { - "name": "rule_enabled", - "type": "bool", - "title": "Rule Enabled", - "required": false, - "default": true - }, - { - "name": "source_group_names", - "type": "str", - "title": "Source Group Names", - "required": true, - "description": "Comma-separated existing NetBird source group names.", - "config": { - "placeholder": "Users,Developers", - "textarea": true - } - }, - { - "name": "destination_group_names", - "type": "str", - "title": "Destination Group Names", - "required": true, - "description": "Comma-separated existing NetBird destination group names.", - "config": { - "placeholder": "Services,Internal Apps", - "textarea": true - } - }, - { - "name": "ports", - "type": "str", - "title": "Ports", - "required": false, - "description": "Raw HCL list entries for ports, for example `\"443\", \"8443\"`.", - "config": { - "placeholder": "\"443\"", - "textarea": true - } - }, - { - "name": "authorized_group_entries", - "type": "str", - "title": "Authorized Group Entries", - "required": false, - "description": "Semicolon-separated `group_name|user1,user2` entries for NetBird SSH local-user authorization.", - "needs": [ - "rule_protocol=netbird-ssh" - ], - "config": { - "placeholder": "Admins|ubuntu;SRE|root,ec2-user", - "textarea": true - } - } - ] - }, - { - "title": "Posture Checks", - "name": "posture-checks", - "items": [ - { - "name": "source_posture_check_names", - "type": "str", - "title": "Posture Check Names", - "required": false, - "description": "Comma-separated existing NetBird posture check names.", - "config": { - "placeholder": "Managed Devices,Minimum Version", - "textarea": true - } - } - ] - } - ] -} diff --git a/Terraform/netbird-reverse-proxy-service/files/main.tf b/Terraform/netbird-reverse-proxy-service/files/main.tf deleted file mode 100644 index 1ee8865..0000000 --- a/Terraform/netbird-reverse-proxy-service/files/main.tf +++ /dev/null @@ -1,145 +0,0 @@ -<%- if domain_mode == "free" %> -data "netbird_reverse_proxy_domain" "free" { - type = "free" -} - -<%- endif %> -<%- if domain_mode == "custom" %> -data "netbird_reverse_proxy_domain" "custom" { - domain = "<< custom_domain >>" - validated = true -} - -<%- endif %> -<%- if target_type == "peer" %> -data "netbird_peer" "target_peer" { - name = "<< target_peer_name >>" -} - -<%- endif %> -<%- if target_type == "host" %> -data "netbird_network" "target_network" { - name = "<< target_network_name >>" -} - -data "netbird_network_resource" "target_resource" { - network_id = data.netbird_network.target_network.id - name = "<< target_host_name >>" -} - -<%- endif %> -<%- if target_type == "domain" %> -data "netbird_network" "target_network" { - name = "<< target_network_name >>" -} - -data "netbird_network_resource" "target_resource" { - network_id = data.netbird_network.target_network.id - name = "<< target_domain_name >>" -} - -<%- endif %> -<%- if target_type == "subnet" %> -data "netbird_network" "target_network" { - name = "<< target_network_name >>" -} - -data "netbird_network_resource" "target_resource" { - network_id = data.netbird_network.target_network.id - name = "<< target_subnet_name >>" -} - -<%- endif %> -<%- if target_type != "peer" %> -locals { - reverse_proxy_target_resource_type = can(cidrnetmask(data.netbird_network_resource.target_resource.address)) ? "subnet" : (length(regexall(":", data.netbird_network_resource.target_resource.address)) > 0 ? "host" : (length(regexall("[A-Za-z*]", data.netbird_network_resource.target_resource.address)) > 0 ? "domain" : "host")) -} - -<%- endif %> -<%- if bearer_distribution_group_names %> -locals { - reverse_proxy_bearer_group_names = [ - for name in split(",", "<< bearer_distribution_group_names >>") : trimspace(name) - if trimspace(name) != "" - ] -} - -data "netbird_group" "bearer_distribution_groups" { - for_each = toset(local.reverse_proxy_bearer_group_names) - name = each.value -} - -<%- endif %> -resource "netbird_reverse_proxy_service" "reverse_proxy_service" { - name = "<< service_name >>" -<%- if domain_mode == "free" %> - domain = data.netbird_reverse_proxy_domain.free.domain -<%- endif %> -<%- if domain_mode == "custom" %> - domain = data.netbird_reverse_proxy_domain.custom.domain -<%- endif %> - enabled = << service_enabled | lower >> - pass_host_header = << pass_host_header | lower >> - rewrite_redirects = << rewrite_redirects | lower >> - - targets = [{ -<%- if target_type == "peer" %> - target_id = data.netbird_peer.target_peer.id -<%- endif %> -<%- if target_type == "host" %> - target_id = data.netbird_network_resource.target_resource.id -<%- endif %> -<%- if target_type == "domain" %> - target_id = data.netbird_network_resource.target_resource.id -<%- endif %> -<%- if target_type == "subnet" %> - target_id = data.netbird_network_resource.target_resource.id -<%- endif %> -<%- if target_type == "peer" %> - target_type = "peer" -<%- endif %> -<%- if target_type != "peer" %> - target_type = local.reverse_proxy_target_resource_type -<%- endif %> - port = << target_port >> - protocol = "<< target_protocol >>" - enabled = << target_enabled | lower >> -<%- if target_host %> - host = "<< target_host >>" -<%- endif %> -<%- if not target_host and target_type != "peer" %> - host = local.reverse_proxy_target_resource_type == "subnet" ? split("/", data.netbird_network_resource.target_resource.address)[0] : null -<%- endif %> -<%- if target_path %> - path = "<< target_path >>" -<%- endif %> - }] - - auth = { -<%- if auth_mode == "link" %> - link_auth = { - enabled = true - } -<%- endif %> -<%- if auth_mode == "password" %> - password_auth = { - enabled = true - password = "<< auth_password >>" - } -<%- endif %> -<%- if auth_mode == "pin" %> - pin_auth = { - enabled = true - pin = "<< auth_pin >>" - } -<%- endif %> -<%- if auth_mode == "bearer" %> - bearer_auth = { - enabled = true -<%- if bearer_distribution_group_names %> - distribution_groups = [for name in local.reverse_proxy_bearer_group_names : data.netbird_group.bearer_distribution_groups[name].id] -<%- endif %> - } -<%- endif %> - } -} diff --git a/Terraform/netbird-reverse-proxy-service/template.json b/Terraform/netbird-reverse-proxy-service/template.json deleted file mode 100644 index 996696c..0000000 --- a/Terraform/netbird-reverse-proxy-service/template.json +++ /dev/null @@ -1,283 +0,0 @@ -{ - "slug": "netbird-reverse-proxy-service", - "kind": "terraform", - "metadata": { - "name": "NetBird Reverse Proxy Service", - "description": "Creates a NetBird reverse proxy service with one backend target and configurable authentication.", - "tags": [ - "netbird", - "terraform", - "reverse-proxy" - ], - "icon": { - "provider": "selfhst", - "id": "netbird" - }, - "draft": false, - "version": { - "name": "0.0.17", - "source_dep_name": "manual/netbird-reverse-proxy-service" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": true, - "config": { - "placeholder": "web-app" - } - }, - { - "name": "domain_mode", - "type": "enum", - "title": "Domain Mode", - "required": true, - "default": "free", - "config": { - "options": [ - "free", - "custom" - ] - } - }, - { - "name": "custom_domain", - "type": "str", - "title": "Custom Domain", - "required": true, - "description": "Validated custom domain for the reverse proxy service.", - "needs": [ - "domain_mode=custom" - ], - "config": { - "placeholder": "app.example.com" - } - }, - { - "name": "service_enabled", - "type": "bool", - "title": "Enabled", - "required": false, - "default": true - }, - { - "name": "pass_host_header", - "type": "bool", - "title": "Pass Host Header", - "required": false, - "default": false, - "description": "Pass the original client Host header through to the backend." - }, - { - "name": "rewrite_redirects", - "type": "bool", - "title": "Rewrite Redirects", - "required": false, - "default": false, - "description": "Rewrite backend redirect locations to the public-facing service domain." - } - ] - }, - { - "title": "Target", - "name": "target", - "items": [ - { - "name": "target_type", - "type": "enum", - "title": "Target Type", - "required": true, - "default": "peer", - "description": "Target type for the backend service.", - "config": { - "options": [ - "peer", - "host", - "domain", - "subnet" - ] - } - }, - { - "name": "target_peer_name", - "type": "str", - "title": "Peer Name", - "required": true, - "description": "Existing NetBird peer name to resolve via `data \"netbird_peer\"` when `target_type=peer`.", - "needs": [ - "target_type=peer" - ], - "config": { - "placeholder": "web-app" - } - }, - { - "name": "target_network_name", - "type": "str", - "title": "Network Name", - "required": true, - "description": "Existing NetBird network name that contains the selected host, domain, or subnet resource.", - "needs": [ - "target_type=host,domain,subnet" - ], - "config": { - "placeholder": "production-network" - } - }, - { - "name": "target_host_name", - "type": "str", - "title": "Host Resource Name", - "required": true, - "description": "Existing NetBird network resource name for a host target.", - "needs": [ - "target_type=host" - ], - "config": { - "placeholder": "internal-app-host" - } - }, - { - "name": "target_domain_name", - "type": "str", - "title": "Domain Resource Name", - "required": true, - "description": "Existing NetBird network resource name for a domain target.", - "needs": [ - "target_type=domain" - ], - "config": { - "placeholder": "app.example.internal" - } - }, - { - "name": "target_subnet_name", - "type": "str", - "title": "Subnet Resource Name", - "required": true, - "description": "Existing NetBird network resource name for a subnet target.", - "needs": [ - "target_type=subnet" - ], - "config": { - "placeholder": "corp-lan" - } - }, - { - "name": "target_port", - "type": "int", - "title": "Target Port", - "required": true, - "default": 8080, - "description": "Backend port for the target.", - "config": { - "placeholder": "8080" - } - }, - { - "name": "target_protocol", - "type": "enum", - "title": "Target Protocol", - "required": true, - "default": "http", - "config": { - "options": [ - "http", - "https" - ] - } - }, - { - "name": "target_enabled", - "type": "bool", - "title": "Target Enabled", - "required": false, - "default": true - }, - { - "name": "target_host", - "type": "str", - "title": "Resolved Host", - "required": false, - "description": "Optional backend IP or domain override for the target. Subnet targets need a host IP within the CIDR range.", - "config": { - "placeholder": "10.20.30.40" - } - }, - { - "name": "target_path", - "type": "str", - "title": "Path Prefix", - "required": false, - "description": "Optional URL path prefix for the backend target.", - "config": { - "placeholder": "/" - } - } - ] - }, - { - "title": "Authentication", - "name": "authentication", - "items": [ - { - "name": "auth_mode", - "type": "enum", - "title": "Authentication Mode", - "required": true, - "default": "link", - "description": "Authentication method exposed by the reverse proxy service.", - "config": { - "options": [ - "link", - "none", - "password", - "pin", - "bearer" - ] - } - }, - { - "name": "auth_password", - "type": "secret", - "title": "Password", - "required": true, - "description": "Shared password for password-based access.", - "needs": [ - "auth_mode=password" - ] - }, - { - "name": "auth_pin", - "type": "secret", - "title": "PIN", - "required": true, - "description": "Shared PIN for PIN-based access.", - "needs": [ - "auth_mode=pin" - ] - }, - { - "name": "bearer_distribution_group_names", - "type": "str", - "title": "Bearer Distribution Groups", - "required": false, - "description": "Comma-separated existing NetBird group names allowed for bearer-auth access.", - "needs": [ - "auth_mode=bearer" - ], - "config": { - "placeholder": "SRE,Incident Response", - "textarea": true - } - } - ] - } - ] -} diff --git a/Terraform/netbox-vm/files/main.tf b/Terraform/netbox-vm/files/main.tf deleted file mode 100644 index 2383c20..0000000 --- a/Terraform/netbox-vm/files/main.tf +++ /dev/null @@ -1,63 +0,0 @@ -data "netbox_cluster" "<< resource_name >>_cluster" { - name = "<< cluster_name >>" -} - -<%- if site_name %> -data "netbox_site" "<< resource_name >>_site" { - name = "<< site_name >>" -} -<%- endif %> - -<%- if device_name %> -data "netbox_devices" "<< resource_name >>_device_lookup" { - limit = 1 - - filter { - name = "name" - value = "<< device_name >>" - } -} -<%- endif %> - -resource "netbox_virtual_machine" "<< resource_name >>" { - name = "<< vm_name >>" - cluster_id = data.netbox_cluster.<< resource_name >>_cluster.id -<%- if site_name %> - site_id = data.netbox_site.<< resource_name >>_site.id -<%- endif %> - status = "<< status >>" -<%- if device_name %> - device_id = data.netbox_devices.<< resource_name >>_device_lookup.devices[0].device_id -<%- endif %> -<%- if resources_enabled %> - vcpus = << vcpus >> - memory = << memory_mb >> - disk = << disk_gb >> -<%- endif %> -<%- if description_enabled %> - comments = "<< description_text >>" -<%- endif %> - -} - -<%- if ipam_enabled %> -resource "netbox_interface" "<< resource_name >>_interface" { - name = "<< interface_name >>" - virtual_machine_id = netbox_virtual_machine.<< resource_name >>.id -} - -resource "netbox_ip_address" "<< resource_name >>_ip" { - ip_address = "<< primary_ip4 >>" - status = "active" - <%- if dns_name %> - dns_name = "<< dns_name >>" - <%- endif %> - interface_id = netbox_interface.<< resource_name >>_interface.id - object_type = "virtualization.vminterface" -} - -resource "netbox_primary_ip" "<< resource_name >>_primary_ip" { - ip_address_id = netbox_ip_address.<< resource_name >>_ip.id - virtual_machine_id = netbox_virtual_machine.<< resource_name >>.id -} -<%- endif %> diff --git a/Terraform/netbox-vm/template.json b/Terraform/netbox-vm/template.json deleted file mode 100644 index b07b4be..0000000 --- a/Terraform/netbox-vm/template.json +++ /dev/null @@ -1,222 +0,0 @@ -{ - "slug": "netbox-vm", - "kind": "terraform", - "metadata": { - "name": "NetBox Virtual Machine", - "description": "Registers a virtual machine in NetBox with cluster, site, and host device associations. Defines VM metadata including resource allocation and optional IPAM integration.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "netbox" - }, - "draft": false, - "version": { - "name": "5.0.1", - "source_dep_name": "manual/netbox-vm" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "resource_name", - "type": "str", - "title": "Resource Name", - "required": false, - "default": "vm", - "config": { - "placeholder": "vm" - } - } - ] - }, - { - "title": "Virtual Machine Configuration", - "name": "vm", - "items": [ - { - "name": "vm_name", - "type": "str", - "title": "Virtual machine name", - "required": true, - "config": { - "placeholder": "servername" - } - }, - { - "name": "cluster_name", - "type": "str", - "title": "Cluster name", - "required": true, - "default": "clustername", - "description": "Existing NetBox cluster name to resolve via data source.", - "config": { - "placeholder": "clustername" - } - }, - { - "name": "status", - "type": "enum", - "title": "VM status", - "required": false, - "default": "active", - "config": { - "options": [ - "active", - "planned", - "staged", - "offline", - "decommissioning" - ] - } - } - ] - }, - { - "title": "Site Assignment", - "name": "site", - "items": [ - { - "name": "site_name", - "type": "str", - "title": "Site Name", - "required": false, - "description": "Existing NetBox site name to resolve via data source (leave empty to skip)" - } - ] - }, - { - "title": "Host Device", - "name": "device", - "items": [ - { - "name": "device_name", - "type": "str", - "title": "Device Name", - "required": false, - "description": "Existing NetBox device name for host assignment (leave empty to skip)" - } - ] - }, - { - "title": "IP Address Management", - "name": "ipam", - "items": [ - { - "name": "ipam_enabled", - "type": "bool", - "title": "IPAM", - "required": false, - "default": false - }, - { - "name": "interface_name", - "type": "str", - "title": "Network interface name", - "required": true, - "default": "eth0", - "config": { - "placeholder": "eth0" - } - }, - { - "name": "primary_ip4", - "type": "str", - "title": "Primary IPv4", - "required": true, - "description": "Primary IPv4 address with CIDR notation" - }, - { - "name": "dns_name", - "type": "str", - "title": "DNS Name", - "required": false, - "description": "DNS name for the IP address (leave empty to skip)" - } - ] - }, - { - "title": "Resource Allocation", - "name": "resources", - "items": [ - { - "name": "resources_enabled", - "type": "bool", - "title": "Resources", - "required": false, - "default": false - }, - { - "name": "vcpus", - "type": "int", - "title": "vCPUs", - "required": false, - "default": 2, - "config": { - "slider": true, - "min": 1, - "max": 24, - "step": 1, - "placeholder": "2", - "unit": "vCPU" - } - }, - { - "name": "memory_mb", - "type": "int", - "title": "Memory", - "required": false, - "default": 4096, - "config": { - "slider": true, - "min": 512, - "max": 24576, - "step": 512, - "placeholder": "4096", - "unit": "MB" - } - }, - { - "name": "disk_gb", - "type": "int", - "title": "Disk Size", - "required": false, - "default": 50, - "config": { - "slider": true, - "min": 10, - "max": 1000, - "step": 10, - "placeholder": "50", - "unit": "GB" - } - } - ] - }, - { - "title": "Description", - "name": "description", - "items": [ - { - "name": "description_enabled", - "type": "bool", - "title": "Description", - "required": false, - "default": false - }, - { - "name": "description_text", - "type": "str", - "title": "VM description", - "required": false, - "config": { - "placeholder": "Add a description here...", - "textarea": true - } - } - ] - } - ] -} diff --git a/Terraform/proxmox-lxc/files/main.tf b/Terraform/proxmox-lxc/files/main.tf deleted file mode 100644 index 68b9d8e..0000000 --- a/Terraform/proxmox-lxc/files/main.tf +++ /dev/null @@ -1,39 +0,0 @@ -resource "proxmox_lxc" "<< resource_name >>" { - hostname = "<< hostname >>" -<%- if description %> - description = "<< description >>" -<%- endif %> - target_node = "<< target_node >>" - unprivileged = << unprivileged | lower >> - ostemplate = "<< ostemplate >>" - - cores = << cores >> - swap = << swap_mb >> - memory = << memory_mb >> - - start = << start_container | lower >> - - rootfs { - storage = "<< rootfs_storage >>" - size = "<< rootfs_size_gb >>G" - } - - nameserver = "<< nameserver >>" -<%- if searchdomain %> - searchdomain = "<< searchdomain >>" -<%- endif %> - - network { - name = "<< network_name >>" - bridge = "<< bridge >>" - ip = "<< ip_address >>" - } - - lifecycle { - ignore_changes = [ - rootfs, - network, - cmode - ] - } -} diff --git a/Terraform/proxmox-lxc/template.json b/Terraform/proxmox-lxc/template.json deleted file mode 100644 index 7e18748..0000000 --- a/Terraform/proxmox-lxc/template.json +++ /dev/null @@ -1,231 +0,0 @@ -{ - "slug": "proxmox-lxc", - "kind": "terraform", - "metadata": { - "name": "Proxmox LXC", - "description": "Creates a Proxmox Linux container with configurable template, compute, root filesystem, and single-interface network settings.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "proxmox" - }, - "draft": false, - "version": { - "name": "3.0.2-rc07", - "source_dep_name": "telmate/proxmox", - "source_dep_version": "3.0.2-rc07" - } - }, - "variables": [ - { - "title": "Terraform", - "name": "terraform", - "items": [ - { - "name": "resource_name", - "type": "str", - "title": "Resource Name", - "required": false, - "default": "lxc", - "config": { - "placeholder": "lxc" - } - } - ] - }, - { - "title": "Container Identity", - "name": "identity", - "items": [ - { - "name": "hostname", - "type": "str", - "title": "Container hostname", - "required": true, - "config": { - "placeholder": "Container Name" - } - }, - { - "name": "description", - "type": "str", - "title": "Container description", - "required": false, - "description": "Add a description here...", - "config": { - "placeholder": "Application container", - "textarea": true - } - }, - { - "name": "target_node", - "type": "str", - "title": "Target Node", - "required": true, - "description": "Proxmox node that will host the container", - "config": { - "placeholder": "Proxmox node" - } - }, - { - "name": "unprivileged", - "type": "bool", - "title": "Unprivileged", - "required": false, - "default": false - }, - { - "name": "ostemplate", - "type": "str", - "title": "Template", - "required": true, - "config": { - "placeholder": "template reference" - } - } - ] - }, - { - "title": "Compute", - "name": "compute", - "items": [ - { - "name": "cores", - "type": "int", - "title": "CPU Cores", - "required": false, - "default": 4, - "config": { - "slider": true, - "min": 1, - "max": 32, - "step": 1, - "placeholder": "4" - } - }, - { - "name": "memory_mb", - "type": "int", - "title": "Memory", - "required": false, - "default": 8192, - "config": { - "slider": true, - "min": 256, - "max": 262144, - "step": 256, - "placeholder": "8192", - "unit": "MB" - } - }, - { - "name": "swap_mb", - "type": "int", - "title": "Swap", - "required": false, - "default": 512, - "config": { - "slider": true, - "min": 0, - "max": 65536, - "step": 128, - "placeholder": "512", - "unit": "MB" - } - }, - { - "name": "start_container", - "type": "bool", - "title": "Auto Start", - "required": false, - "default": true, - "description": "Start the container after creation" - } - ] - }, - { - "title": "Storage and Network", - "name": "storage-network", - "items": [ - { - "name": "rootfs_storage", - "type": "str", - "title": "Rootfs Storage", - "required": false, - "default": "local-lvm", - "description": "Storage pool for the root filesystem", - "config": { - "placeholder": "local-lvm" - } - }, - { - "name": "rootfs_size_gb", - "type": "int", - "title": "Rootfs Size", - "required": false, - "default": 256, - "description": "Root filesystem size in GB", - "config": { - "slider": true, - "min": 4, - "max": 4096, - "step": 1, - "placeholder": "256", - "unit": "GB" - } - }, - { - "name": "nameserver", - "type": "str", - "title": "Container DNS server", - "required": true, - "description": "DNS server used by the container.", - "config": { - "placeholder": "DNS_SERVER" - } - }, - { - "name": "searchdomain", - "type": "str", - "title": "Container search domain", - "required": false, - "default": "", - "description": "Search domain used by the container.", - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "eth0", - "config": { - "placeholder": "eth0" - } - }, - { - "name": "bridge", - "type": "str", - "title": "Proxmox bridge name", - "required": false, - "default": "vmbr1", - "description": "Bridge name to use in Proxmox.", - "config": { - "placeholder": "vmbr1" - } - }, - { - "name": "ip_address", - "type": "str", - "title": "Container IP address", - "required": true, - "config": { - "placeholder": "IP_ADDRESS" - } - } - ] - } - ] -} diff --git a/Terraform/proxmox-vm-qemu/files/main.tf b/Terraform/proxmox-vm-qemu/files/main.tf deleted file mode 100644 index 181444f..0000000 --- a/Terraform/proxmox-vm-qemu/files/main.tf +++ /dev/null @@ -1,77 +0,0 @@ -resource "proxmox_vm_qemu" "<< resource_name >>" { - name = "<< vm_name >>" -<%- if vm_id %> - vmid = "<< vm_id >>" -<%- endif %> -<%- if description %> - description = "<< description >>" -<%- endif %> -<%- if tags %> - tags = "<< tags >>" -<%- endif %> - agent = 1 - agent_timeout = 90 - target_node = "<< target_node >>" - - define_connection_info = false - - full_clone = << full_clone | lower >> - clone = "<< clone_template >>" - - onboot = << onboot | lower >> -<%- if startup %> - startup = "<< startup >>" -<%- endif %> - automatic_reboot = << automatic_reboot | lower >> - - qemu_os = "<< qemu_os >>" - bios = "<< bios >>" - - cpu { - cores = << cpu_cores >> - sockets = << cpu_sockets >> - type = "<< cpu_type >>" - } - - memory = << memory_mb >> - balloon = << memory_mb >> - - network { - id = 0 - bridge = "<< bridge >>" - model = "<< network_model >>" - } - - scsihw = "virtio-scsi-pci" - - disks { - ide { - ide0 { - cloudinit { - storage = "<< cloudinit_storage >>" - } - } - } - - virtio { - virtio0 { - disk { - storage = "<< disk_storage >>" - size = "<< disk_size_gb >>G" - iothread = << disk_iothread | lower >> - replicate = << disk_replicate | lower >> - } - } - } - } - - ipconfig0 = "<< ipconfig0 >>" -<%- if nameserver %> - nameserver = "<< nameserver >>" -<%- endif %> - ciuser = "<< ci_user >>" -<%- if ssh_key %> - sshkeys = "<< ssh_key >>" -<%- endif %> - -} diff --git a/Terraform/proxmox-vm-qemu/template.json b/Terraform/proxmox-vm-qemu/template.json deleted file mode 100644 index 53c7681..0000000 --- a/Terraform/proxmox-vm-qemu/template.json +++ /dev/null @@ -1,355 +0,0 @@ -{ - "slug": "proxmox-vm-qemu", - "kind": "terraform", - "metadata": { - "name": "Proxmox VM (QEMU)", - "description": "Creates a Proxmox virtual machine from a cloud-init-ready template with configurable clone, CPU, memory, disk, networking, and guest settings.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "proxmox" - }, - "draft": false, - "version": { - "name": "3.0.2-rc07", - "source_dep_name": "telmate/proxmox", - "source_dep_version": "3.0.2-rc07" - } - }, - "variables": [ - { - "title": "Terraform", - "name": "terraform", - "items": [ - { - "name": "resource_name", - "type": "str", - "title": "Resource Name", - "required": false, - "default": "vmqemu", - "config": { - "placeholder": "vmqemu" - } - } - ] - }, - { - "title": "VM Identity", - "name": "identity", - "items": [ - { - "name": "vm_name", - "type": "str", - "title": "Proxmox VM name", - "required": true, - "config": { - "placeholder": "servername" - } - }, - { - "name": "vm_id", - "type": "str", - "title": "Proxmox VMID", - "required": false, - "config": { - "placeholder": "20001" - } - }, - { - "name": "description", - "type": "str", - "title": "VM description", - "required": false, - "config": { - "placeholder": "Application server", - "textarea": true - } - }, - { - "name": "tags", - "type": "str", - "title": "Tags", - "required": false, - "config": { - "placeholder": "docker" - } - }, - { - "name": "target_node", - "type": "str", - "title": "Target Node", - "required": true, - "description": "Proxmox node that will host the VM.", - "config": { - "placeholder": "proxmox-node" - } - } - ] - }, - { - "title": "Clone Configuration", - "name": "clone", - "items": [ - { - "name": "clone_template", - "type": "str", - "title": "Template", - "required": true, - "description": "Source template name to clone", - "config": { - "placeholder": "pkr-ubuntu-noble-1" - } - }, - { - "name": "full_clone", - "type": "bool", - "title": "Full Clone", - "required": false, - "default": true, - "description": "Create a full clone instead of a linked clone" - } - ] - }, - { - "title": "Boot Settings", - "name": "guest", - "items": [ - { - "name": "onboot", - "type": "bool", - "title": "Auto Start", - "required": false, - "default": true, - "description": "Start the VM automatically with the node." - }, - { - "name": "startup", - "type": "str", - "title": "Startup", - "required": false, - "description": "Proxmox startup order and delay string", - "config": { - "placeholder": "order=1,up=10" - } - }, - { - "name": "automatic_reboot", - "type": "bool", - "title": "Auto Reboot", - "required": false, - "default": false, - "description": "Allow provider-triggered automatic reboot on change" - }, - { - "name": "ci_user", - "type": "str", - "title": "Cloud-init user", - "required": false, - "default": "admin", - "config": { - "placeholder": "admin" - } - }, - { - "name": "ssh_key", - "type": "str", - "title": "SSH Key", - "required": false, - "description": "SSH public key passed to cloud-init", - "config": { - "placeholder": "SSH public key", - "textarea": true - } - }, - { - "name": "ipconfig0", - "type": "str", - "title": "Network Config", - "required": false, - "default": "ip=dhcp", - "description": "Cloud-init network config for the first NIC", - "config": { - "placeholder": "ip=IP_ADDRESS/24,gw=GATEWAY" - } - }, - { - "name": "nameserver", - "type": "str", - "title": "Nameserver", - "required": false, - "description": "DNS server for guest cloud-init config", - "config": { - "placeholder": "DNS_SERVER" - } - } - ] - }, - { - "title": "Compute", - "name": "compute", - "items": [ - { - "name": "cpu_cores", - "type": "int", - "title": "CPU Cores", - "required": false, - "default": 2, - "config": { - "slider": true, - "min": 1, - "max": 32, - "step": 1, - "placeholder": "2", - "unit": "cores" - } - }, - { - "name": "cpu_sockets", - "type": "int", - "title": "CPU Sockets", - "required": false, - "default": 1, - "config": { - "slider": true, - "min": 1, - "max": 8, - "step": 1, - "placeholder": "1", - "unit": "sockets" - } - }, - { - "name": "cpu_type", - "type": "str", - "title": "Proxmox CPU type", - "required": false, - "default": "host", - "description": "CPU type to use in Proxmox.", - "config": { - "placeholder": "host" - } - }, - { - "name": "memory_mb", - "type": "int", - "title": "Memory", - "required": false, - "default": 4096, - "config": { - "slider": true, - "min": 512, - "max": 262144, - "step": 512, - "placeholder": "4096", - "unit": "MB" - } - }, - { - "name": "bios", - "type": "enum", - "title": "VM BIOS type", - "required": false, - "default": "seabios", - "description": "BIOS type for the VM.", - "config": { - "options": [ - "seabios", - "ovmf" - ] - } - }, - { - "name": "qemu_os", - "type": "str", - "title": "QEMU OS type", - "required": false, - "default": "other", - "description": "Guest OS type for QEMU.", - "config": { - "placeholder": "other" - } - } - ] - }, - { - "title": "Storage and Network", - "name": "storage-network", - "items": [ - { - "name": "bridge", - "type": "str", - "title": "Bridge", - "required": false, - "default": "vmbr1", - "description": "Proxmox bridge for the first NIC", - "config": { - "placeholder": "vmbr1" - } - }, - { - "name": "network_model", - "type": "str", - "title": "NIC model", - "required": false, - "default": "virtio", - "description": "Network adapter model.", - "config": { - "placeholder": "virtio" - } - }, - { - "name": "disk_storage", - "type": "str", - "title": "Disk Storage", - "required": false, - "default": "local-lvm", - "description": "Storage pool for the main disk", - "config": { - "placeholder": "local-lvm" - } - }, - { - "name": "cloudinit_storage", - "type": "str", - "title": "Cloud-init Storage", - "required": false, - "default": "local-lvm", - "description": "Storage pool for the cloud-init disk", - "config": { - "placeholder": "local-lvm" - } - }, - { - "name": "disk_size_gb", - "type": "int", - "title": "Disk Size", - "required": false, - "default": 32, - "description": "Main disk size in GB", - "config": { - "slider": true, - "min": 8, - "max": 4096, - "step": 1, - "placeholder": "32", - "unit": "GB" - } - }, - { - "name": "disk_iothread", - "type": "bool", - "title": "IO Thread", - "required": false, - "default": true - }, - { - "name": "disk_replicate", - "type": "bool", - "title": "Disk Replication", - "required": false, - "default": true - } - ] - } - ] -} diff --git a/helm/argocd/files/values.yaml b/helm/argocd/files/values.yaml deleted file mode 100644 index 0ffcb5b..0000000 --- a/helm/argocd/files/values.yaml +++ /dev/null @@ -1,79 +0,0 @@ -configs: - cm: - url: << public_url >> - kustomize.buildOptions: --enable-helm - params: - server.insecure: << server_insecure | lower >> - -controller: - replicas: << controller_replicas >> - metrics: - enabled: << controller_metrics_enabled | lower >> - <%- if metrics_service_monitor_enabled and controller_metrics_enabled %> - serviceMonitor: - enabled: true - <%- endif %> - -repoServer: - replicas: << repo_server_replicas >> - metrics: - enabled: << repo_server_metrics_enabled | lower >> - <%- if metrics_service_monitor_enabled and repo_server_metrics_enabled %> - serviceMonitor: - enabled: true - <%- endif %> - -server: - replicas: << server_replicas >> - metrics: - enabled: << server_metrics_enabled | lower >> - <%- if metrics_service_monitor_enabled and server_metrics_enabled %> - serviceMonitor: - enabled: true - <%- endif %> - <%- if ingress_enabled %> - ingress: - enabled: true - ingressClassName: << ingress_class_name >> - hostname: << ingress_hostname >> - path: << ingress_path >> - pathType: Prefix - annotations: - traefik.ingress.kubernetes.io/router.entrypoints: << ingress_entrypoints >> - <%- if ingress_middleware %> - traefik.ingress.kubernetes.io/router.middlewares: << ingress_middleware >> - <%- endif %> - <%- if ingress_tls_enabled %> - traefik.ingress.kubernetes.io/router.tls: "true" - <%- if ingress_cert_manager_enabled %> - cert-manager.io/cluster-issuer: << ingress_cluster_issuer >> - <%- endif %> - <%- endif %> - tls: << ingress_tls_enabled | lower >> - <%- if ingress_tls_enabled and not ingress_cert_manager_enabled %> - extraTls: - - hosts: - - << ingress_hostname >> - secretName: << ingress_tls_secret >> - <%- endif %> - <%- endif %> - -dex: - enabled: << dex_enabled | lower >> - metrics: - enabled: << dex_metrics_enabled | lower >> - <%- if metrics_service_monitor_enabled and dex_enabled and dex_metrics_enabled %> - serviceMonitor: - enabled: true - <%- endif %> - -redis: - enabled: << redis_enabled | lower >> - <%- if redis_enabled %> - metrics: - enabled: << redis_metrics_enabled | lower >> - <%- if metrics_service_monitor_enabled and redis_metrics_enabled %> - serviceMonitor: - enabled: true - <%- endif %> - <%- endif %> diff --git a/helm/argocd/template.json b/helm/argocd/template.json deleted file mode 100644 index e7cfd66..0000000 --- a/helm/argocd/template.json +++ /dev/null @@ -1,301 +0,0 @@ -{ - "slug": "argocd", - "kind": "helm", - "metadata": { - "name": "Argo CD", - "description": "Helm values template for Argo CD with ingress, TLS, controller or repo-server sizing, Dex, Redis, and metrics toggles for homelab GitOps clusters.", - "tags": [ - "gitops", - "kubernetes", - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "argo-cd" - }, - "draft": false, - "version": { - "name": "9.2.4", - "source_dep_name": "manual/argocd" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "public_url", - "type": "str", - "title": "Public URL", - "required": true, - "default": "https://argocd.home.arpa", - "description": "Public URL Argo CD should advertise to users and callbacks.", - "config": { - "placeholder": "https://argocd.home.arpa" - } - }, - { - "name": "server_insecure", - "type": "bool", - "title": "Server Insecure", - "required": false, - "default": true, - "description": "Let the ingress controller terminate TLS in front of `argocd-server`." - } - ] - }, - { - "title": "Ingress", - "toggle": "ingress_enabled", - "name": "ingress", - "items": [ - { - "name": "ingress_enabled", - "type": "bool", - "title": "Ingress", - "required": false, - "default": true, - "description": "Expose Argo CD through a Kubernetes ingress." - }, - { - "name": "ingress_class_name", - "type": "str", - "title": "Ingress Class", - "required": true, - "default": "traefik", - "description": "IngressClass name used for the Argo CD server ingress.", - "needs": [ - "ingress_enabled=true" - ], - "config": { - "placeholder": "traefik" - } - }, - { - "name": "ingress_hostname", - "type": "str", - "title": "Ingress Hostname", - "required": true, - "default": "argocd.home.arpa", - "needs": [ - "ingress_enabled=true" - ], - "config": { - "placeholder": "argocd.home.arpa" - } - }, - { - "name": "ingress_path", - "type": "str", - "title": "Ingress Path", - "required": true, - "default": "/", - "description": "Path exposed by the Argo CD ingress.", - "needs": [ - "ingress_enabled=true" - ], - "config": { - "placeholder": "/" - } - }, - { - "name": "ingress_entrypoints", - "type": "str", - "title": "Traefik Entrypoints", - "required": false, - "default": "websecure", - "description": "Traefik entrypoints annotation for the ingress.", - "needs": [ - "ingress_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "ingress_middleware", - "type": "str", - "title": "Traefik Middleware", - "required": false, - "default": "", - "description": "Optional Traefik middleware reference attached to the Argo CD ingress.", - "needs": [ - "ingress_enabled=true" - ], - "config": { - "placeholder": "traefik-dashboard-secured@kubernetescrd" - } - }, - { - "name": "ingress_tls_enabled", - "type": "bool", - "title": "Ingress TLS", - "required": false, - "default": true, - "needs": [ - "ingress_enabled=true" - ] - }, - { - "name": "ingress_tls_secret", - "type": "str", - "title": "TLS Secret", - "required": true, - "default": "argocd-server-tls", - "description": "TLS secret name used when cert-manager is not managing the ingress certificate.", - "needs": [ - "ingress_enabled=true", - "ingress_tls_enabled=true" - ], - "config": { - "placeholder": "argocd-server-tls" - } - }, - { - "name": "ingress_cert_manager_enabled", - "type": "bool", - "title": "Cert-Manager", - "required": false, - "default": false, - "description": "Annotate the ingress for cert-manager certificate issuance.", - "needs": [ - "ingress_enabled=true", - "ingress_tls_enabled=true" - ] - }, - { - "name": "ingress_cluster_issuer", - "type": "str", - "title": "ClusterIssuer", - "required": true, - "default": "letsencrypt-production", - "description": "ClusterIssuer used when cert-manager handles ingress certificates.", - "needs": [ - "ingress_enabled=true", - "ingress_tls_enabled=true", - "ingress_cert_manager_enabled=true" - ], - "config": { - "placeholder": "letsencrypt-production" - } - } - ] - }, - { - "title": "Components", - "name": "components", - "items": [ - { - "name": "controller_replicas", - "type": "int", - "title": "Controller Replicas", - "required": false, - "default": 1, - "description": "Number of Argo CD application controller replicas.", - "config": { - "placeholder": "1" - } - }, - { - "name": "repo_server_replicas", - "type": "int", - "title": "Repo Server Replicas", - "required": false, - "default": 1, - "description": "Number of Argo CD repo-server replicas.", - "config": { - "placeholder": "1" - } - }, - { - "name": "server_replicas", - "type": "int", - "title": "Server Replicas", - "required": false, - "default": 1, - "description": "Number of Argo CD API server replicas.", - "config": { - "placeholder": "1" - } - }, - { - "name": "dex_enabled", - "type": "bool", - "title": "Dex", - "required": false, - "default": true, - "description": "Deploy bundled Dex for SSO scenarios that still use the Argo CD Dex component." - }, - { - "name": "redis_enabled", - "type": "bool", - "title": "Bundled Redis", - "required": false, - "default": true, - "description": "Deploy bundled Redis. Disable only if you provide Redis separately." - } - ] - }, - { - "title": "Metrics", - "name": "metrics", - "items": [ - { - "name": "metrics_service_monitor_enabled", - "type": "bool", - "title": "ServiceMonitor", - "required": false, - "default": false, - "description": "Create ServiceMonitor resources for enabled component metrics." - }, - { - "name": "controller_metrics_enabled", - "type": "bool", - "title": "Controller Metrics", - "required": false, - "default": true, - "description": "Expose metrics from the application controller." - }, - { - "name": "repo_server_metrics_enabled", - "type": "bool", - "title": "Repo Server Metrics", - "required": false, - "default": true, - "description": "Expose metrics from the repo-server." - }, - { - "name": "server_metrics_enabled", - "type": "bool", - "title": "Server Metrics", - "required": false, - "default": true, - "description": "Expose metrics from the Argo CD API server." - }, - { - "name": "dex_metrics_enabled", - "type": "bool", - "title": "Dex Metrics", - "required": false, - "default": false, - "description": "Expose metrics from Dex when Dex is enabled.", - "needs": [ - "dex_enabled=true" - ] - }, - { - "name": "redis_metrics_enabled", - "type": "bool", - "title": "Redis Metrics", - "required": false, - "default": false, - "description": "Expose metrics from bundled Redis when Redis is enabled.", - "needs": [ - "redis_enabled=true" - ] - } - ] - } - ] -} diff --git a/helm/authentik/files/secrets.yaml b/helm/authentik/files/secrets.yaml deleted file mode 100644 index 3c86b42..0000000 --- a/helm/authentik/files/secrets.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- -authentik: - secret_key: << authentik_secret_key >> - postgresql: - password: << database_password >> -<%- if email_enabled %> - email: - password: << email_password >> -<%- endif %> -<%- if not database_external %> -postgresql: - auth: - password: << database_password >> -<%- endif %> diff --git a/helm/authentik/files/values.yaml b/helm/authentik/files/values.yaml deleted file mode 100644 index 4aac6d1..0000000 --- a/helm/authentik/files/values.yaml +++ /dev/null @@ -1,56 +0,0 @@ ---- -global: - image: - repository: "ghcr.io/goauthentik/server" - tag: "2026.2.2" - pullPolicy: IfNotPresent -authentik: - postgresql: - name: << database_name >> - user: << database_user >> -<%- if database_external %> - host: << database_host >> - port: << database_port >> -<%- endif %> -<%- if email_enabled %> - email: - host: << email_host >> - port: << email_port >> - username: << email_username >> - use_tls: << email_use_tls | lower >> - from: << email_from >> -<%- endif %> - error_reporting: - enabled: << authentik_error_reporting | lower >> - log_level: << authentik_log_level >> -server: - service: - type: << network_mode >> -<%- if traefik_enabled %> - ingress: - enabled: true - ingressClassName: traefik -<%- if traefik_tls_enabled and traefik_tls_certmanager %> - annotations: - cert-manager.io/cluster-issuer: << certmanager_issuer >> -<%- endif %> - hosts: - - << traefik_host >> -<%- if traefik_tls_enabled %> - tls: - - secretName: << traefik_tls_secret >> - hosts: - - << traefik_host >> -<%- endif %> -<%- endif %> -postgresql: -<%- if database_external %> - enabled: false -<%- else %> - enabled: true - auth: - database: << database_name >> - username: << database_user >> -<%- endif %> -redis: - enabled: true diff --git a/helm/authentik/template.json b/helm/authentik/template.json deleted file mode 100644 index ca15a07..0000000 --- a/helm/authentik/template.json +++ /dev/null @@ -1,273 +0,0 @@ -{ - "slug": "authentik-helm", - "kind": "helm", - "metadata": { - "name": "Authentik", - "description": "Helm chart for Authentik, an open-source Identity Provider supporting OAuth2, SAML, and LDAP for flexible single sign-on and authentication.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "authentik" - }, - "draft": false, - "version": { - "name": "2026.2.2", - "source_dep_name": "ghcr.io/goauthentik/server", - "source_dep_version": "2026.2.2" - } - }, - "variables": [ - { - "title": "Networking", - "name": "networking", - "items": [ - { - "name": "network_mode", - "type": "str", - "title": "Network Mode", - "required": false, - "default": "ClusterIP", - "config": { - "placeholder": "ClusterIP" - } - } - ] - }, - { - "title": "Authentik Configuration", - "name": "authentik", - "items": [ - { - "name": "authentik_secret_key", - "type": "secret", - "title": "Secret Key", - "required": false, - "config": { - "autogenerated": { - "kind": "base64", - "bytes": 60 - } - } - }, - { - "name": "authentik_log_level", - "type": "enum", - "title": "Authentik log level", - "required": false, - "default": "error", - "config": { - "options": [ - "trace", - "debug", - "info", - "warning", - "error" - ] - } - }, - { - "name": "authentik_error_reporting", - "type": "bool", - "title": "Error Reporting", - "required": false, - "default": false - } - ] - }, - { - "title": "Database Configuration", - "name": "database", - "items": [ - { - "name": "database_external", - "type": "bool", - "title": "External Database", - "required": false, - "default": false - }, - { - "name": "database_host", - "type": "str", - "title": "Database host", - "required": false, - "default": "authentik-postgresql", - "needs": [ - "database_external=true" - ], - "config": { - "placeholder": "authentik-postgresql" - } - }, - { - "name": "database_port", - "type": "int", - "title": "Database port", - "required": false, - "default": 5432, - "needs": [ - "database_external=true" - ], - "config": { - "placeholder": "5432" - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database name", - "required": false, - "default": "authentik", - "config": { - "placeholder": "authentik" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database user", - "required": false, - "default": "authentik", - "config": { - "placeholder": "authentik" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "PostgreSQL database password", - "required": false, - "config": { - "autogenerated": { - "kind": "base64", - "bytes": 36 - } - } - } - ] - }, - { - "title": "Email Configuration", - "name": "email", - "items": [ - { - "name": "email_enabled", - "type": "bool", - "title": "Email", - "required": false, - "default": false - }, - { - "name": "email_host", - "type": "str", - "title": "SMTP server hostname", - "required": false, - "config": { - "placeholder": "smtp.home.arpa" - } - }, - { - "name": "email_port", - "type": "int", - "title": "SMTP server port", - "required": false, - "default": 587, - "config": { - "placeholder": "587" - } - }, - { - "name": "email_username", - "type": "str", - "title": "SMTP username", - "required": false, - "default": "", - "config": { - "placeholder": "user@example.com" - } - }, - { - "name": "email_password", - "type": "secret", - "title": "SMTP password", - "required": false, - "default": "" - }, - { - "name": "email_from", - "type": "str", - "title": "From email address", - "required": false, - "config": { - "placeholder": "authentik@home.arpa" - } - }, - { - "name": "email_use_tls", - "type": "bool", - "title": "SMTP TLS", - "required": false, - "default": true - } - ] - }, - { - "title": "Traefik Configuration", - "name": "traefik", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Traefik hostname", - "required": true, - "config": { - "placeholder": "authentik.home.arpa" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_secret", - "type": "str", - "title": "TLS Secret", - "required": false, - "default": "authentik-tls", - "config": { - "placeholder": "authentik-tls" - } - }, - { - "name": "traefik_tls_certmanager", - "type": "bool", - "title": "Cert Manager", - "required": false, - "default": false - }, - { - "name": "certmanager_issuer", - "type": "str", - "title": "Issuer", - "required": false, - "default": "letsencrypt-prod", - "needs": [ - "traefik_tls_certmanager=true" - ], - "config": { - "placeholder": "letsencrypt-prod" - } - } - ] - } - ] -} diff --git a/helm/certmanager/files/values.yaml b/helm/certmanager/files/values.yaml deleted file mode 100644 index 3be6b54..0000000 --- a/helm/certmanager/files/values.yaml +++ /dev/null @@ -1,21 +0,0 @@ ---- -image: - repository: quay.io/jetstack/cert-manager-controller - tag: v1.20.2 -webhook: - image: - repository: quay.io/jetstack/cert-manager-webhook - tag: v1.20.2 -cainjector: - image: - repository: quay.io/jetstack/cert-manager-cainjector - tag: v1.20.2 - -crds: - enabled: true -<%- if dns_recursive_nameservers_only %> - -extraArgs: - - --dns01-recursive-nameservers-only - - --dns01-recursive-nameservers=<< dns_nameserver_1 >>,<< dns_nameserver_2 >> -<%- endif %> diff --git a/helm/certmanager/template.json b/helm/certmanager/template.json deleted file mode 100644 index cbc20d9..0000000 --- a/helm/certmanager/template.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "slug": "certmanager", - "kind": "helm", - "metadata": { - "name": "Cert-Manager", - "description": "Helm chart for cert-manager, a Kubernetes add-on that automates TLS certificate management and issuance from sources like Let's Encrypt.", - "tags": [], - "icon": { - "provider": "mdi", - "id": "certificate-outline" - }, - "draft": false, - "version": { - "name": "v1.20.2", - "source_dep_name": "quay.io/jetstack/cert-manager-controller", - "source_dep_version": "v1.20.2" - } - }, - "variables": [ - { - "title": "DNS Configuration", - "name": "dns", - "items": [ - { - "name": "dns_nameserver_1", - "type": "str", - "title": "Primary DNS", - "required": false, - "default": "1.1.1.1:53", - "description": "Primary DNS nameserver for DNS01 challenges", - "config": { - "placeholder": "1.1.1.1:53" - } - }, - { - "name": "dns_nameserver_2", - "type": "str", - "title": "Secondary DNS", - "required": false, - "default": "1.0.0.1:53", - "description": "Secondary DNS nameserver for DNS01 challenges", - "config": { - "placeholder": "1.0.0.1:53" - } - }, - { - "name": "dns_recursive_nameservers_only", - "type": "bool", - "title": "Recursive DNS", - "required": false, - "default": true - } - ] - } - ] -} diff --git a/helm/infisical/files/helm-secrets.yaml b/helm/infisical/files/helm-secrets.yaml deleted file mode 100644 index 7deb3b0..0000000 --- a/helm/infisical/files/helm-secrets.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -# Sensitive Helm values. Store this file securely and do not commit rendered real secrets. -<%- if not database_external %> -postgresql: - auth: - password: "<< database_password >>" -<%- endif %> -<%- if not redis_external %> -redis: - auth: - password: "<< redis_password >>" -<%- endif %> diff --git a/helm/infisical/files/namespace.yaml b/helm/infisical/files/namespace.yaml deleted file mode 100644 index c68d738..0000000 --- a/helm/infisical/files/namespace.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: << namespace >> - labels: - app.kubernetes.io/name: infisical - app.kubernetes.io/instance: << release_name >> diff --git a/helm/infisical/files/postgres-secret.yaml b/helm/infisical/files/postgres-secret.yaml deleted file mode 100644 index f48b4c4..0000000 --- a/helm/infisical/files/postgres-secret.yaml +++ /dev/null @@ -1,16 +0,0 @@ -<%- if database_external %> ---- -apiVersion: v1 -kind: Secret -metadata: - name: << database_secret_name >> - namespace: << namespace >> - labels: - app.kubernetes.io/name: infisical - app.kubernetes.io/instance: << release_name >> -type: Opaque -stringData: - DB_CONNECTION_URI: "<< database_connection_uri >>" -<%- else %> -# External PostgreSQL is disabled; the chart-managed PostgreSQL credentials are in helm-secrets.yaml. -<%- endif %> diff --git a/helm/infisical/files/secret.yaml b/helm/infisical/files/secret.yaml deleted file mode 100644 index 26aa8a4..0000000 --- a/helm/infisical/files/secret.yaml +++ /dev/null @@ -1,29 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: << infisical_secret_name >> - namespace: << namespace >> - labels: - app.kubernetes.io/name: infisical - app.kubernetes.io/instance: << release_name >> -type: Opaque -stringData: - AUTH_SECRET: "<< infisical_auth_secret >>" - ENCRYPTION_KEY: "<< infisical_encryption_key >>" - SITE_URL: "<< infisical_site_url >>" - <%- if redis_external %> - REDIS_URL: "<< redis_url >>" - <%- endif %> - <%- if email_enabled %> - SMTP_HOST: "<< email_host >>" - SMTP_PORT: "<< email_port >>" - SMTP_FROM_ADDRESS: "<< email_from_address >>" - SMTP_FROM_NAME: "<< email_from_name >>" - SMTP_USERNAME: "<< email_username >>" - SMTP_PASSWORD: "<< email_password >>" - SMTP_SECURE: "<< email_secure | lower >>" - SMTP_REQUIRE_TLS: "<< email_require_tls | lower >>" - SMTP_IGNORE_TLS: "<< email_ignore_tls | lower >>" - <%- endif %> - diff --git a/helm/infisical/files/values.yaml b/helm/infisical/files/values.yaml deleted file mode 100644 index 20fe224..0000000 --- a/helm/infisical/files/values.yaml +++ /dev/null @@ -1,110 +0,0 @@ ---- -# Infisical standalone Helm chart values. -# Chart repo: https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/ -# Install example: -# helm upgrade --install << release_name >> infisical-helm-charts/infisical-standalone \ -# --version 1.9.0 \ -# --namespace << namespace >> \ -# --values values.yaml \ -# --values helm-secrets.yaml - -infisical: - enabled: true - name: << release_name >> - replicaCount: << replica_count >> - - image: - repository: infisical/infisical - tag: "v0.158.0" - pullPolicy: IfNotPresent - - # This Kubernetes Secret must contain AUTH_SECRET, ENCRYPTION_KEY, SITE_URL, - # and optional SMTP/REDIS_URL keys. See secret.yaml. - kubeSecretRef: << infisical_secret_name >> - - service: - type: << service_type >> - - autoBootstrap: - enabled: false - - serviceAccount: - create: true - - resources: - requests: - cpu: << resources_cpu_request >> - memory: << resources_memory_request >> - limits: - memory: << resources_memory_limit >> - -<%- if ingress_enabled %> -ingress: - enabled: true - hostName: << ingress_host >> - ingressClassName: << ingress_class_name >> - nginx: - enabled: << ingress_nginx_enabled | lower >> - annotations: - <%- if traefik_entrypoint %> - traefik.ingress.kubernetes.io/router.entrypoints: << traefik_entrypoint >> - <%- endif %> - <%- if ingress_tls_enabled %> - traefik.ingress.kubernetes.io/router.tls: "true" - <%- endif %> - <%- if ingress_certmanager_enabled %> - cert-manager.io/cluster-issuer: << certmanager_issuer >> - <%- endif %> - <%- if ingress_tls_enabled %> - tls: - - secretName: << ingress_tls_secret >> - hosts: - - << ingress_host >> - <%- endif %> -<%- else %> -ingress: - enabled: false -<%- endif %> - -ingress-nginx: - enabled: << ingress_nginx_enabled | lower >> - -postgresql: -<%- if database_external %> - enabled: false - useExistingPostgresSecret: - enabled: true - existingConnectionStringSecret: - name: << database_secret_name >> - key: DB_CONNECTION_URI -<%- else %> - enabled: true - auth: - username: << database_user >> - database: << database_name >> -<%- endif %> - -redis: -<%- if redis_external %> - enabled: false -<%- else %> - enabled: true - architecture: standalone - usePassword: true - auth: - # Override the real password from helm-secrets.yaml. - password: "REPLACE_FROM_HELM_SECRETS_FILE" - master: - persistence: - enabled: << redis_persistence_enabled | lower >> - <%- if redis_persistence_enabled %> - storageClass: << redis_storage_class >> - size: << redis_storage_size >> - <%- endif %> - resources: - requests: - cpu: << redis_cpu_request >> - memory: << redis_memory_request >> - limits: - memory: << redis_memory_limit >> -<%- endif %> diff --git a/helm/infisical/template.json b/helm/infisical/template.json deleted file mode 100644 index c7596d5..0000000 --- a/helm/infisical/template.json +++ /dev/null @@ -1,758 +0,0 @@ -{ - "slug": "infisical-helm", - "kind": "helm", - "metadata": { - "name": "Infisical", - "description": "Helm values and Kubernetes secret manifests for deploying the Infisical standalone chart with external PostgreSQL, Redis, Traefik ingress, and homelab-friendly defaults.", - "tags": [ - "secrets", - "kubernetes", - "helm", - "postgresql", - "redis", - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "infisical", - "color": "amber" - }, - "draft": false, - "version": { - "name": "v0.158.0", - "source_dep_name": "infisical/infisical", - "source_dep_version": "v0.158.0" - } - }, - "variables": [ - { - "name": "general", - "title": "General", - "items": [ - { - "name": "release_name", - "type": "str", - "title": "Release Name", - "required": true, - "default": "infisical", - "description": "Helm release name.", - "config": { - "placeholder": "infisical" - } - }, - { - "name": "namespace", - "type": "str", - "title": "Namespace", - "required": true, - "default": "infisical", - "description": "Kubernetes namespace for Infisical resources.", - "config": { - "placeholder": "infisical" - } - }, - { - "name": "replica_count", - "type": "int", - "title": "Replicas", - "required": true, - "default": 1, - "description": "Number of Infisical application replicas. Keep one replica for initial bootstrap, then scale out after testing.", - "config": { - "placeholder": "1" - } - } - ] - }, - { - "name": "infisical", - "title": "Infisical", - "items": [ - { - "name": "infisical_site_url", - "type": "str", - "title": "Site URL", - "required": true, - "default": "https://infisical.home.arpa", - "config": { - "placeholder": "https://infisical.home.arpa" - } - }, - { - "name": "infisical_secret_name", - "type": "str", - "title": "Kubernetes Secret Name", - "required": true, - "default": "infisical-secrets", - "description": "Kubernetes Secret referenced by infisical.kubeSecretRef.", - "config": { - "placeholder": "infisical-secrets" - } - }, - { - "name": "infisical_encryption_key", - "type": "secret", - "title": "Encryption Key", - "required": true, - "description": "Infisical ENCRYPTION_KEY. Back this up securely; losing it makes stored secrets unrecoverable.", - "config": { - "autogenerated": { - "length": 32, - "characters": [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "a", - "b", - "c", - "d", - "e", - "f" - ] - } - } - }, - { - "name": "infisical_auth_secret", - "type": "secret", - "title": "Auth Secret", - "required": true, - "config": { - "autogenerated": { - "kind": "base64", - "bytes": 32 - } - } - } - ] - }, - { - "name": "networking", - "title": "Networking", - "items": [ - { - "name": "service_type", - "type": "enum", - "title": "Service Type", - "required": true, - "default": "ClusterIP", - "description": "Kubernetes Service type for the Infisical application.", - "config": { - "options": [ - "ClusterIP", - "NodePort", - "LoadBalancer" - ] - } - }, - { - "name": "ingress_enabled", - "type": "bool", - "title": "Ingress", - "required": false, - "default": true - }, - { - "name": "ingress_host", - "type": "str", - "title": "Ingress Host", - "required": true, - "default": "infisical.home.arpa", - "description": "FQDN for Infisical ingress.", - "needs": [ - "ingress_enabled=true" - ], - "config": { - "placeholder": "infisical.home.arpa" - } - }, - { - "name": "ingress_class_name", - "type": "str", - "title": "Ingress Class", - "required": true, - "default": "traefik", - "description": "Ingress class name.", - "needs": [ - "ingress_enabled=true" - ], - "config": { - "placeholder": "traefik" - } - }, - { - "name": "ingress_nginx_enabled", - "type": "bool", - "title": "Bundled NGINX Ingress", - "required": false, - "default": false, - "description": "Enable the chart's bundled ingress-nginx controller. Disable this when using an existing Traefik ingress controller.", - "needs": [ - "ingress_enabled=true" - ] - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "websecure", - "description": "Traefik router entrypoint annotation. Leave empty for non-Traefik ingress controllers.", - "needs": [ - "ingress_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "ingress_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": true, - "needs": [ - "ingress_enabled=true" - ] - }, - { - "name": "ingress_tls_secret", - "type": "str", - "title": "TLS Secret", - "required": true, - "default": "infisical-tls", - "description": "Kubernetes TLS secret name.", - "needs": [ - "ingress_enabled=true", - "ingress_tls_enabled=true" - ], - "config": { - "placeholder": "infisical-tls" - } - }, - { - "name": "ingress_certmanager_enabled", - "type": "bool", - "title": "Cert Manager Annotation", - "required": false, - "default": false, - "description": "Add cert-manager cluster issuer annotation to the Ingress.", - "needs": [ - "ingress_enabled=true", - "ingress_tls_enabled=true" - ] - }, - { - "name": "certmanager_issuer", - "type": "str", - "title": "ClusterIssuer", - "required": true, - "default": "letsencrypt-prod", - "description": "cert-manager ClusterIssuer name.", - "needs": [ - "ingress_enabled=true", - "ingress_tls_enabled=true", - "ingress_certmanager_enabled=true" - ], - "config": { - "placeholder": "letsencrypt-prod" - } - } - ] - }, - { - "name": "database", - "title": "PostgreSQL", - "items": [ - { - "name": "database_external", - "type": "bool", - "title": "External PostgreSQL", - "required": false, - "default": true - }, - { - "name": "database_secret_name", - "type": "str", - "title": "DB Secret Name", - "required": true, - "default": "infisical-postgres", - "description": "Kubernetes Secret containing DB_CONNECTION_URI for external PostgreSQL.", - "needs": [ - "database_external=true" - ], - "config": { - "placeholder": "infisical-postgres" - } - }, - { - "name": "database_connection_uri", - "type": "secret", - "title": "DB Connection URI", - "required": true, - "default": "postgresql://infisical:CHANGE_ME@postgres.example.internal:5432/infisical?sslmode=disable", - "description": "Full PostgreSQL connection URI for external databases. URL-encode special characters in usernames/passwords.", - "needs": [ - "database_external=true" - ], - "config": { - "placeholder": "postgresql://infisical:password@postgres.example.internal:5432/infisical?sslmode=disable" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": true, - "default": "infisical", - "needs": [ - "database_external=false" - ], - "config": { - "placeholder": "infisical" - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": true, - "default": "infisical", - "needs": [ - "database_external=false" - ], - "config": { - "placeholder": "infisical" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database Password", - "required": true, - "description": "PostgreSQL password for the bundled database, written to helm-secrets.yaml.", - "needs": [ - "database_external=false" - ], - "config": { - "autogenerated": { - "length": 32, - "characters": [ - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ] - } - } - } - ] - }, - { - "name": "redis", - "title": "Redis", - "items": [ - { - "name": "redis_external", - "type": "bool", - "title": "External Redis", - "required": false, - "default": false - }, - { - "name": "redis_url", - "type": "secret", - "title": "Redis URL", - "required": true, - "default": "redis://:CHANGE_ME@redis.example.internal:6379", - "description": "Full Redis URL for external Redis.", - "needs": [ - "redis_external=true" - ], - "config": { - "placeholder": "redis://:password@redis.example.internal:6379" - } - }, - { - "name": "redis_password", - "type": "secret", - "title": "Redis Password", - "required": true, - "description": "Redis password for the bundled Redis chart, written to helm-secrets.yaml.", - "needs": [ - "redis_external=false" - ], - "config": { - "autogenerated": { - "length": 32, - "characters": [ - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ] - } - } - }, - { - "name": "redis_persistence_enabled", - "type": "bool", - "title": "Redis Persistence", - "required": false, - "default": true, - "needs": [ - "redis_external=false" - ] - }, - { - "name": "redis_storage_class", - "type": "str", - "title": "Redis StorageClass", - "required": false, - "default": "ceph-rbd", - "description": "StorageClass for the bundled Redis PVC.", - "needs": [ - "redis_external=false", - "redis_persistence_enabled=true" - ], - "config": { - "placeholder": "ceph-rbd" - } - }, - { - "name": "redis_storage_size", - "type": "str", - "title": "Redis Storage Size", - "required": false, - "default": "2Gi", - "description": "PVC size for the bundled Redis chart.", - "needs": [ - "redis_external=false", - "redis_persistence_enabled=true" - ], - "config": { - "placeholder": "2Gi" - } - } - ] - }, - { - "name": "resources", - "title": "Resources", - "items": [ - { - "name": "resources_cpu_request", - "type": "str", - "title": "CPU Request", - "required": false, - "default": "250m", - "config": { - "placeholder": "250m" - } - }, - { - "name": "resources_memory_request", - "type": "str", - "title": "Memory Request", - "required": false, - "default": "512Mi", - "config": { - "placeholder": "512Mi" - } - }, - { - "name": "resources_memory_limit", - "type": "str", - "title": "Memory Limit", - "required": false, - "default": "1000Mi", - "config": { - "placeholder": "1000Mi" - } - }, - { - "name": "redis_cpu_request", - "type": "str", - "title": "Redis CPU Request", - "required": false, - "default": "50m", - "needs": [ - "redis_external=false" - ], - "config": { - "placeholder": "50m" - } - }, - { - "name": "redis_memory_request", - "type": "str", - "title": "Redis Memory Request", - "required": false, - "default": "128Mi", - "needs": [ - "redis_external=false" - ], - "config": { - "placeholder": "128Mi" - } - }, - { - "name": "redis_memory_limit", - "type": "str", - "title": "Redis Memory Limit", - "required": false, - "default": "256Mi", - "needs": [ - "redis_external=false" - ], - "config": { - "placeholder": "256Mi" - } - } - ] - }, - { - "name": "email", - "title": "Email", - "toggle": "email_enabled", - "items": [ - { - "name": "email_enabled", - "type": "bool", - "title": "SMTP Email", - "required": false, - "default": false, - "description": "Add SMTP keys to the Infisical Kubernetes Secret." - }, - { - "name": "email_host", - "type": "str", - "title": "SMTP Host", - "required": true, - "default": "smtp.home.arpa", - "needs": [ - "email_enabled=true" - ], - "config": { - "placeholder": "smtp.home.arpa" - } - }, - { - "name": "email_port", - "type": "int", - "title": "SMTP Port", - "required": true, - "default": 587, - "needs": [ - "email_enabled=true" - ], - "config": { - "placeholder": "587" - } - }, - { - "name": "email_from_address", - "type": "str", - "title": "From Address", - "required": true, - "default": "infisical@home.arpa", - "needs": [ - "email_enabled=true" - ], - "config": { - "placeholder": "infisical@home.arpa" - } - }, - { - "name": "email_from_name", - "type": "str", - "title": "From Name", - "required": false, - "default": "Infisical", - "needs": [ - "email_enabled=true" - ], - "config": { - "placeholder": "Infisical" - } - }, - { - "name": "email_username", - "type": "str", - "title": "SMTP Username", - "required": true, - "default": "", - "needs": [ - "email_enabled=true" - ], - "config": { - "placeholder": "user@example.com" - } - }, - { - "name": "email_password", - "type": "secret", - "title": "SMTP Password", - "required": false, - "default": "", - "needs": [ - "email_enabled=true" - ] - }, - { - "name": "email_secure", - "type": "bool", - "title": "SMTP Secure", - "required": false, - "default": false, - "needs": [ - "email_enabled=true" - ] - }, - { - "name": "email_require_tls", - "type": "bool", - "title": "Require TLS", - "required": false, - "default": true, - "needs": [ - "email_enabled=true" - ] - }, - { - "name": "email_ignore_tls", - "type": "bool", - "title": "Ignore TLS", - "required": false, - "default": false, - "needs": [ - "email_enabled=true" - ] - } - ] - } - ] -} diff --git a/helm/longhorn/files/values.yaml b/helm/longhorn/files/values.yaml deleted file mode 100644 index e1081ec..0000000 --- a/helm/longhorn/files/values.yaml +++ /dev/null @@ -1,51 +0,0 @@ ---- -image: - longhorn: - engine: - repository: "longhornio/longhorn-engine" - tag: "v1.11.2" - manager: - repository: "longhornio/longhorn-manager" - tag: "v1.11.2" - ui: - repository: "longhornio/longhorn-ui" - tag: "v1.11.2" - instanceManager: - repository: "longhornio/longhorn-instance-manager" - tag: "v1.11.2" - shareManager: - repository: "longhornio/longhorn-share-manager" - tag: "v1.11.2" - backingImageManager: - repository: "longhornio/backing-image-manager" - tag: "v1.11.2" - supportBundleKit: - repository: "longhornio/support-bundle-kit" - tag: "v0.0.84" - csi: - attacher: - repository: "longhornio/csi-attacher" - tag: "v4.11.0" - provisioner: - repository: "longhornio/csi-provisioner" - tag: "v5.3.0" - nodeDriverRegistrar: - repository: "longhornio/csi-node-driver-registrar" - tag: "v2.16.0" - resizer: - repository: "longhornio/csi-resizer" - tag: "v2.1.0" - snapshotter: - repository: "longhornio/csi-snapshotter" - tag: "v8.5.0" - livenessProbe: - repository: "longhornio/livenessprobe" - tag: "v2.18.0" - -longhornUI: - replicas: << ui_replicas >> -<%- if backup_enabled %> - -defaultSettings: - backupTarget: << backup_target >> -<%- endif %> diff --git a/helm/longhorn/template.json b/helm/longhorn/template.json deleted file mode 100644 index 3f5cd98..0000000 --- a/helm/longhorn/template.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "slug": "longhorn", - "kind": "helm", - "metadata": { - "name": "Longhorn", - "description": "Helm chart for Longhorn, a distributed block storage system for Kubernetes with built-in backup, snapshots, and disaster recovery.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "rancher-longhorn" - }, - "draft": false, - "version": { - "name": "v1.11.2", - "source_dep_name": "longhornio/longhorn-manager", - "source_dep_version": "v1.11.2" - } - }, - "variables": [ - { - "title": "Backup Configuration", - "name": "backup", - "items": [ - { - "name": "backup_enabled", - "type": "bool", - "title": "Backup", - "required": false, - "default": false - }, - { - "name": "backup_target", - "type": "str", - "title": "Backup Target", - "required": false, - "description": "Backup target URL (e.g., s3://bucket or nfs://server/path)", - "needs": [ - "backup_enabled=true" - ] - } - ] - }, - { - "title": "Longhorn UI", - "name": "ui", - "items": [ - { - "name": "ui_replicas", - "type": "int", - "title": "UI Replicas", - "required": false, - "default": 1, - "description": "Number of Longhorn UI replicas", - "config": { - "slider": true, - "min": 1, - "max": 10, - "step": 1, - "placeholder": "1", - "unit": "replicas" - } - } - ] - } - ] -} diff --git a/helm/netbox/files/values.yaml b/helm/netbox/files/values.yaml deleted file mode 100644 index 3335e8c..0000000 --- a/helm/netbox/files/values.yaml +++ /dev/null @@ -1,132 +0,0 @@ ---- -image: - repository: docker.io/netboxcommunity/netbox - tag: v4.5.10 - pullPolicy: IfNotPresent - -replicaCount: 1 - -superuser: - name: << netbox_superuser_name >> - email: << netbox_superuser_email >> - password: << netbox_superuser_password >> - apiToken: << netbox_superuser_api_token >> - -allowedHosts: - - "<< netbox_allowed_hosts >>" - -<%- if database_external %> -postgresql: - enabled: false - -externalDatabase: - host: << database_host >> - port: << database_port >> - database: << database_name >> - username: << database_user >> - password: << database_password >> -<%- else %> -postgresql: - enabled: true - auth: - database: << database_name >> - username: << database_user >> - password: << database_password >> -<%- endif %> - -<%- if redis_external %> -redis: - enabled: false - -externalRedis: - host: << redis_host >> - port: 6379 - database: 0 - password: << redis_password >> - -tasksRedis: - host: << redis_host >> - port: 6379 - database: 0 - password: << redis_password >> - -cachingRedis: - host: << redis_cache_host >> - port: 6379 - database: 1 - password: << redis_password >> -<%- else %> -redis: - enabled: true - architecture: standalone - auth: - enabled: true - password: << redis_password >> -<%- endif %> - -secretKey: << netbox_secret_key >> - -<%- if email_enabled %> -email: - server: << email_host >> - port: << email_port >> - username: << email_username >> - password: << email_password >> - from: << email_from >> - useSSL: << email_use_ssl | lower >> - useTLS: << email_use_tls | lower >> -<%- endif %> - -<%- if netbox_cors_enabled %> -cors: - originAllowAll: true - originWhitelist: - - << netbox_cors_origins >> -<%- endif %> - -<%- if netbox_metrics_enabled %> -metrics: - enabled: true - serviceMonitor: - enabled: false -<%- endif %> - -service: - type: << network_mode >> - -<%- if traefik_enabled %> -ingress: - enabled: true - className: traefik -<%- if traefik_tls_enabled and traefik_tls_certmanager %> - annotations: - cert-manager.io/cluster-issuer: << certmanager_issuer >> -<%- endif %> - hosts: - - host: << traefik_host >> - paths: - - path: / - pathType: Prefix -<%- if traefik_tls_enabled %> - tls: - - secretName: << traefik_tls_secret >> - hosts: - - << traefik_host >> -<%- endif %> -<%- endif %> - -persistence: - enabled: true - <%- if volumes_mode == 'existing-pvc' %> - existingClaim: << volumes_pvc_name >> - <%- else %> - storageClass: "" - size: 10Gi - <%- endif %> - -worker: - enabled: true - replicaCount: 1 - -housekeeping: - enabled: true diff --git a/helm/netbox/template.json b/helm/netbox/template.json deleted file mode 100644 index 5546723..0000000 --- a/helm/netbox/template.json +++ /dev/null @@ -1,418 +0,0 @@ -{ - "slug": "netbox-helm", - "kind": "helm", - "metadata": { - "name": "NetBox", - "description": "Helm chart for NetBox, an open-source network infrastructure management (IPAM/DCIM) solution and network automation source of truth.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "netbox" - }, - "draft": false, - "version": { - "name": "v4.5.10", - "source_dep_name": "docker.io/netboxcommunity/netbox", - "source_dep_version": "v4.5.10" - } - }, - "variables": [ - { - "title": "Database Configuration", - "name": "database", - "items": [ - { - "name": "database_external", - "type": "bool", - "title": "External Database", - "required": false, - "default": false - }, - { - "name": "database_host", - "type": "str", - "title": "Database host", - "required": false, - "default": "netbox-postgresql", - "needs": [ - "database_external=true" - ], - "config": { - "placeholder": "netbox-postgresql" - } - }, - { - "name": "database_port", - "type": "int", - "title": "Database port", - "required": false, - "default": 5432, - "needs": [ - "database_external=true" - ], - "config": { - "placeholder": "5432" - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database name", - "required": false, - "default": "netbox", - "config": { - "placeholder": "netbox" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database user", - "required": false, - "default": "netbox", - "config": { - "placeholder": "netbox" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database password", - "required": false, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - }, - { - "title": "Networking Configuration", - "name": "networking", - "items": [ - { - "name": "network_mode", - "type": "str", - "title": "Network Mode", - "required": false, - "default": "ClusterIP", - "config": { - "placeholder": "ClusterIP" - } - } - ] - }, - { - "title": "Redis Configuration", - "name": "redis", - "items": [ - { - "name": "redis_external", - "type": "bool", - "title": "External Redis", - "required": false, - "default": false - }, - { - "name": "redis_host", - "type": "str", - "title": "Redis Host", - "required": false, - "default": "netbox-redis-master", - "needs": [ - "redis_external=true" - ], - "config": { - "placeholder": "netbox-redis-master" - } - }, - { - "name": "redis_cache_host", - "type": "str", - "title": "Cache Host", - "required": false, - "default": "netbox-redis-master", - "needs": [ - "redis_external=true" - ], - "config": { - "placeholder": "netbox-redis-master" - } - }, - { - "name": "redis_password", - "type": "secret", - "title": "Redis password", - "required": false, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - }, - { - "title": "Email Configuration", - "name": "email", - "items": [ - { - "name": "email_enabled", - "type": "bool", - "title": "Email", - "required": false, - "default": false - }, - { - "name": "email_host", - "type": "str", - "title": "SMTP server hostname", - "required": false, - "config": { - "placeholder": "smtp.home.arpa" - } - }, - { - "name": "email_port", - "type": "int", - "title": "SMTP server port", - "required": false, - "default": 587, - "config": { - "placeholder": "587" - } - }, - { - "name": "email_username", - "type": "str", - "title": "SMTP username", - "required": false, - "default": "", - "config": { - "placeholder": "user@example.com" - } - }, - { - "name": "email_password", - "type": "secret", - "title": "SMTP password", - "required": false, - "needs": [ - "email_enabled=true" - ] - }, - { - "name": "email_from", - "type": "str", - "title": "From email address", - "required": false, - "config": { - "placeholder": "netbox@home.arpa" - } - }, - { - "name": "email_use_tls", - "type": "bool", - "title": "SMTP TLS", - "required": false, - "default": true - }, - { - "name": "email_use_ssl", - "type": "bool", - "title": "SMTP SSL", - "required": false, - "default": false - } - ] - }, - { - "title": "Traefik Configuration", - "name": "traefik", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Traefik hostname", - "required": true, - "config": { - "placeholder": "netbox.home.arpa" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_secret", - "type": "str", - "title": "TLS Secret", - "required": false, - "default": "netbox-tls", - "config": { - "placeholder": "netbox-tls" - } - }, - { - "name": "traefik_tls_certmanager", - "type": "bool", - "title": "Cert Manager", - "required": false, - "default": false - }, - { - "name": "certmanager_issuer", - "type": "str", - "title": "Issuer", - "required": false, - "default": "letsencrypt-prod", - "needs": [ - "traefik_tls_certmanager=true" - ], - "config": { - "placeholder": "letsencrypt-prod" - } - } - ] - }, - { - "title": "Volume Configuration", - "name": "volumes", - "items": [ - { - "name": "volumes_mode", - "type": "enum", - "title": "Persistence mode", - "required": false, - "default": "chart-managed", - "config": { - "options": [ - "chart-managed", - "existing-pvc" - ] - } - }, - { - "name": "volumes_pvc_name", - "type": "str", - "title": "PVC Name", - "required": false, - "default": "netbox-data", - "needs": [ - "volumes_mode=existing-pvc" - ], - "config": { - "placeholder": "netbox-data" - } - } - ] - }, - { - "title": "NetBox Configuration", - "name": "netbox", - "items": [ - { - "name": "netbox_secret_key", - "type": "secret", - "title": "Secret Key", - "required": false, - "config": { - "autogenerated": { - "length": 50 - } - } - }, - { - "name": "netbox_superuser_name", - "type": "str", - "title": "Initial superuser username", - "required": false, - "default": "admin", - "config": { - "placeholder": "admin" - } - }, - { - "name": "netbox_superuser_email", - "type": "str", - "title": "Initial superuser email", - "required": true, - "config": { - "placeholder": "admin@home.arpa" - } - }, - { - "name": "netbox_superuser_password", - "type": "secret", - "title": "Initial superuser password", - "required": false, - "config": { - "autogenerated": { - "length": 32 - } - } - }, - { - "name": "netbox_superuser_api_token", - "type": "secret", - "title": "API Token", - "required": false, - "config": { - "autogenerated": { - "length": 40 - } - } - }, - { - "name": "netbox_allowed_hosts", - "type": "str", - "title": "Allowed Hosts", - "required": false, - "default": "*", - "description": "Allowed hosts (comma-separated)", - "config": { - "placeholder": "*" - } - }, - { - "name": "netbox_metrics_enabled", - "type": "bool", - "title": "Metrics", - "required": false, - "default": false - }, - { - "name": "netbox_cors_enabled", - "type": "bool", - "title": "CORS", - "required": false, - "default": false - }, - { - "name": "netbox_cors_origins", - "type": "str", - "title": "Allowed CORS origins", - "required": false, - "default": "https://home.arpa", - "needs": [ - "netbox_cors_enabled=true" - ], - "config": { - "placeholder": "https://home.arpa" - } - } - ] - } - ] -} diff --git a/helm/portainer/files/values.yaml b/helm/portainer/files/values.yaml deleted file mode 100644 index c6bf156..0000000 --- a/helm/portainer/files/values.yaml +++ /dev/null @@ -1,29 +0,0 @@ ---- -image: - repository: portainer/portainer-ce - tag: 2.41.0 - pullPolicy: IfNotPresent - -service: - type: << network_mode >> -<%- if traefik_enabled %> - -ingress: - enabled: true - hosts: - - host: << traefik_host >> - paths: - - path: / - port: "9000" -<%- if traefik_tls_enabled %> - tls: - - secretName: << traefik_tls_secret >> - hosts: - - << traefik_host >> -<%- endif %> -<%- endif %> -<%- if volumes_mode == 'existing-pvc' %> - -persistence: - existingClaim: << volumes_pvc_name >> -<%- endif %> diff --git a/helm/portainer/template.json b/helm/portainer/template.json deleted file mode 100644 index 58c910a..0000000 --- a/helm/portainer/template.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "slug": "portainer-helm", - "kind": "helm", - "metadata": { - "name": "Portainer CE", - "description": "Helm chart for Portainer Community Edition, a web-based container management platform for Docker and Kubernetes environments.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "portainer" - }, - "draft": false, - "version": { - "name": "2.41.0", - "source_dep_name": "portainer/portainer-ce", - "source_dep_version": "2.41.0" - } - }, - "variables": [ - { - "title": "Networking", - "name": "networking", - "items": [ - { - "name": "network_mode", - "type": "str", - "title": "Network Mode", - "required": false, - "default": "ClusterIP", - "config": { - "placeholder": "ClusterIP" - } - } - ] - }, - { - "title": "Traefik Configuration", - "name": "traefik", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_host", - "type": "str", - "title": "Traefik hostname", - "required": true, - "config": { - "placeholder": "portainer.home.arpa" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_secret", - "type": "str", - "title": "TLS Secret", - "required": false, - "default": "portainer-tls", - "config": { - "placeholder": "portainer-tls" - } - } - ] - }, - { - "title": "Volume Configuration", - "name": "volumes", - "items": [ - { - "name": "volumes_mode", - "type": "enum", - "title": "Persistence mode", - "required": false, - "default": "chart-managed", - "config": { - "options": [ - "chart-managed", - "existing-pvc" - ] - } - }, - { - "name": "volumes_pvc_name", - "type": "str", - "title": "PVC Name", - "required": false, - "default": "portainer", - "needs": [ - "volumes_mode=existing-pvc" - ], - "config": { - "placeholder": "portainer" - } - } - ] - } - ] -} diff --git a/helm/traefik-helm/files/values.yaml b/helm/traefik-helm/files/values.yaml deleted file mode 100644 index c759878..0000000 --- a/helm/traefik-helm/files/values.yaml +++ /dev/null @@ -1,41 +0,0 @@ ---- -image: - repository: traefik - tag: v3.7.1 - pullPolicy: IfNotPresent -<%- if http_redirect_enabled %> - -ports: - web: - redirections: - entryPoint: - to: websecure - scheme: https - permanent: << http_redirect_permanent | lower >> -<%- endif %> -<%- if dashboard_enabled or accesslog_enabled or prometheus_enabled %> - -additionalArguments: -<%- if dashboard_enabled %> - - "--api.dashboard=true" -<%- endif %> -<%- if accesslog_enabled %> - - "--accesslog=true" -<%- endif %> -<%- if prometheus_enabled %> - - "--metrics.prometheus=true" -<%- endif %> -<%- endif %> -<%- if dashboard_ingressroute_enabled %> - -ingressRoute: - dashboard: - enabled: true - entryPoints: - - websecure - matchRule: Host(`<< dashboard_host >>`) - middlewares: - - name: << dashboard_middleware >> - tls: - secretName: << dashboard_tls_secret >> -<%- endif %> diff --git a/helm/traefik-helm/template.json b/helm/traefik-helm/template.json deleted file mode 100644 index 145806c..0000000 --- a/helm/traefik-helm/template.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "slug": "traefik-helm", - "kind": "helm", - "metadata": { - "name": "Traefik Ingress Controller", - "description": "Helm chart for Traefik v3, a modern HTTP reverse proxy and load balancer designed for microservices and Kubernetes environments.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "traefik" - }, - "draft": false, - "version": { - "name": "v3.7.1", - "source_dep_name": "traefik", - "source_dep_version": "v3.7.1" - } - }, - "variables": [ - { - "title": "Dashboard IngressRoute", - "name": "dashboard", - "items": [ - { - "name": "dashboard_host", - "type": "str", - "title": "Dashboard Host", - "required": false, - "description": "FQDN for the Traefik dashboard", - "needs": [ - "dashboard_ingressroute_enabled=true" - ] - }, - { - "name": "dashboard_ingressroute_enabled", - "type": "bool", - "title": "IngressRoute", - "required": false, - "default": false, - "description": "Create IngressRoute for Traefik dashboard" - }, - { - "name": "dashboard_middleware", - "type": "str", - "title": "Middleware", - "required": false, - "default": "traefik-dashboard-auth", - "description": "Authentication middleware name for dashboard protection", - "needs": [ - "dashboard_ingressroute_enabled=true" - ], - "config": { - "placeholder": "traefik-dashboard-auth" - } - }, - { - "name": "dashboard_tls_secret", - "type": "str", - "title": "TLS Secret", - "required": false, - "default": "traefik-dashboard-tls", - "needs": [ - "dashboard_ingressroute_enabled=true" - ], - "config": { - "placeholder": "traefik-dashboard-tls" - } - } - ] - }, - { - "title": "Redirect", - "name": "http-redirect", - "items": [ - { - "name": "http_redirect_enabled", - "type": "bool", - "title": "HTTP Redirect", - "required": false, - "default": true, - "description": "Automatically redirect HTTP traffic to HTTPS" - }, - { - "name": "http_redirect_permanent", - "type": "bool", - "title": "Permanent Redirect", - "required": false, - "default": true, - "needs": [ - "http_redirect_enabled=true" - ] - } - ] - }, - { - "title": "Traefik Settings", - "name": "traefik-config", - "items": [ - { - "name": "accesslog_enabled", - "type": "bool", - "title": "Access Log", - "required": false, - "default": false - }, - { - "name": "dashboard_enabled", - "type": "bool", - "title": "Dashboard", - "required": false, - "default": false - }, - { - "name": "prometheus_enabled", - "type": "bool", - "title": "Prometheus", - "required": false, - "default": false - } - ] - } - ] -} diff --git a/kubernetes/certmanager-certificate/files/main.yaml b/kubernetes/certmanager-certificate/files/main.yaml deleted file mode 100644 index 24fadeb..0000000 --- a/kubernetes/certmanager-certificate/files/main.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -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 %> diff --git a/kubernetes/certmanager-certificate/template.json b/kubernetes/certmanager-certificate/template.json deleted file mode 100644 index 1456487..0000000 --- a/kubernetes/certmanager-certificate/template.json +++ /dev/null @@ -1,207 +0,0 @@ -{ - "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" - ] - } - } - ] - } - ] -} diff --git a/kubernetes/certmanager-clusterissuer/files/main.yaml b/kubernetes/certmanager-clusterissuer/files/main.yaml deleted file mode 100644 index 1c0de18..0000000 --- a/kubernetes/certmanager-clusterissuer/files/main.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- -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 >> diff --git a/kubernetes/certmanager-clusterissuer/template.json b/kubernetes/certmanager-clusterissuer/template.json deleted file mode 100644 index 17b5ebe..0000000 --- a/kubernetes/certmanager-clusterissuer/template.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/certmanager-issuer/files/main.yaml b/kubernetes/certmanager-issuer/files/main.yaml deleted file mode 100644 index dd188f3..0000000 --- a/kubernetes/certmanager-issuer/files/main.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -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 >> diff --git a/kubernetes/certmanager-issuer/template.json b/kubernetes/certmanager-issuer/template.json deleted file mode 100644 index 19615eb..0000000 --- a/kubernetes/certmanager-issuer/template.json +++ /dev/null @@ -1,195 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-clusterrolebinding/files/main.yaml b/kubernetes/core-clusterrolebinding/files/main.yaml deleted file mode 100644 index eb8ba7a..0000000 --- a/kubernetes/core-clusterrolebinding/files/main.yaml +++ /dev/null @@ -1,14 +0,0 @@ -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 %> diff --git a/kubernetes/core-clusterrolebinding/template.json b/kubernetes/core-clusterrolebinding/template.json deleted file mode 100644 index 55d20d7..0000000 --- a/kubernetes/core-clusterrolebinding/template.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-configmap/files/main.yaml b/kubernetes/core-configmap/files/main.yaml deleted file mode 100644 index f365db0..0000000 --- a/kubernetes/core-configmap/files/main.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -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 diff --git a/kubernetes/core-configmap/template.json b/kubernetes/core-configmap/template.json deleted file mode 100644 index 6283fe4..0000000 --- a/kubernetes/core-configmap/template.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-cronjob/files/main.yaml b/kubernetes/core-cronjob/files/main.yaml deleted file mode 100644 index 15ad776..0000000 --- a/kubernetes/core-cronjob/files/main.yaml +++ /dev/null @@ -1,76 +0,0 @@ -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 %> diff --git a/kubernetes/core-cronjob/template.json b/kubernetes/core-cronjob/template.json deleted file mode 100644 index aceb88b..0000000 --- a/kubernetes/core-cronjob/template.json +++ /dev/null @@ -1,405 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-daemonset/files/main.yaml b/kubernetes/core-daemonset/files/main.yaml deleted file mode 100644 index d1e600c..0000000 --- a/kubernetes/core-daemonset/files/main.yaml +++ /dev/null @@ -1,79 +0,0 @@ -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 %> diff --git a/kubernetes/core-daemonset/template.json b/kubernetes/core-daemonset/template.json deleted file mode 100644 index 921274c..0000000 --- a/kubernetes/core-daemonset/template.json +++ /dev/null @@ -1,337 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-deployment/files/main.yaml b/kubernetes/core-deployment/files/main.yaml deleted file mode 100644 index 9ba96a3..0000000 --- a/kubernetes/core-deployment/files/main.yaml +++ /dev/null @@ -1,52 +0,0 @@ -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 %> diff --git a/kubernetes/core-deployment/template.json b/kubernetes/core-deployment/template.json deleted file mode 100644 index b3e46b2..0000000 --- a/kubernetes/core-deployment/template.json +++ /dev/null @@ -1,276 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-ingress/files/main.yaml b/kubernetes/core-ingress/files/main.yaml deleted file mode 100644 index e038e89..0000000 --- a/kubernetes/core-ingress/files/main.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -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 >> diff --git a/kubernetes/core-ingress/template.json b/kubernetes/core-ingress/template.json deleted file mode 100644 index 7542d95..0000000 --- a/kubernetes/core-ingress/template.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-ingressclass/files/main.yaml b/kubernetes/core-ingressclass/files/main.yaml deleted file mode 100644 index 9968b50..0000000 --- a/kubernetes/core-ingressclass/files/main.yaml +++ /dev/null @@ -1,11 +0,0 @@ ---- -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 >> diff --git a/kubernetes/core-ingressclass/template.json b/kubernetes/core-ingressclass/template.json deleted file mode 100644 index 824ca19..0000000 --- a/kubernetes/core-ingressclass/template.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-namespace/files/main.yaml b/kubernetes/core-namespace/files/main.yaml deleted file mode 100644 index 7b33c19..0000000 --- a/kubernetes/core-namespace/files/main.yaml +++ /dev/null @@ -1,12 +0,0 @@ -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 %> diff --git a/kubernetes/core-namespace/template.json b/kubernetes/core-namespace/template.json deleted file mode 100644 index 6ffdcda..0000000 --- a/kubernetes/core-namespace/template.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-networkpolicy/files/main.yaml b/kubernetes/core-networkpolicy/files/main.yaml deleted file mode 100644 index 8185222..0000000 --- a/kubernetes/core-networkpolicy/files/main.yaml +++ /dev/null @@ -1,78 +0,0 @@ -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 %> diff --git a/kubernetes/core-networkpolicy/template.json b/kubernetes/core-networkpolicy/template.json deleted file mode 100644 index 58afdcc..0000000 --- a/kubernetes/core-networkpolicy/template.json +++ /dev/null @@ -1,288 +0,0 @@ -{ - "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" - ] - } - } - ] - } - ] -} diff --git a/kubernetes/core-persistentvolume/files/main.yaml b/kubernetes/core-persistentvolume/files/main.yaml deleted file mode 100644 index 9ece5f0..0000000 --- a/kubernetes/core-persistentvolume/files/main.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -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 >> diff --git a/kubernetes/core-persistentvolume/template.json b/kubernetes/core-persistentvolume/template.json deleted file mode 100644 index 12890ed..0000000 --- a/kubernetes/core-persistentvolume/template.json +++ /dev/null @@ -1,195 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-persistentvolumeclaim/files/main.yaml b/kubernetes/core-persistentvolumeclaim/files/main.yaml deleted file mode 100644 index 9263917..0000000 --- a/kubernetes/core-persistentvolumeclaim/files/main.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -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 >> diff --git a/kubernetes/core-persistentvolumeclaim/template.json b/kubernetes/core-persistentvolumeclaim/template.json deleted file mode 100644 index 0b0e2fd..0000000 --- a/kubernetes/core-persistentvolumeclaim/template.json +++ /dev/null @@ -1,181 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-secret/files/main.yaml b/kubernetes/core-secret/files/main.yaml deleted file mode 100644 index 6d75b68..0000000 --- a/kubernetes/core-secret/files/main.yaml +++ /dev/null @@ -1,9 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: << resource_name >> - namespace: << namespace >> -type: << secret_type >> -stringData: - api-token: << api_token >> diff --git a/kubernetes/core-secret/template.json b/kubernetes/core-secret/template.json deleted file mode 100644 index 799ac5a..0000000 --- a/kubernetes/core-secret/template.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-service/files/main.yaml b/kubernetes/core-service/files/main.yaml deleted file mode 100644 index 501cab6..0000000 --- a/kubernetes/core-service/files/main.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -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 >> diff --git a/kubernetes/core-service/template.json b/kubernetes/core-service/template.json deleted file mode 100644 index 4bf077b..0000000 --- a/kubernetes/core-service/template.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "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)" - } - ] - } - ] -} diff --git a/kubernetes/core-serviceaccount/files/main.yaml b/kubernetes/core-serviceaccount/files/main.yaml deleted file mode 100644 index 7dd4866..0000000 --- a/kubernetes/core-serviceaccount/files/main.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: << resource_name >> - namespace: << namespace >> diff --git a/kubernetes/core-serviceaccount/template.json b/kubernetes/core-serviceaccount/template.json deleted file mode 100644 index 9245171..0000000 --- a/kubernetes/core-serviceaccount/template.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-statefulset/files/main.yaml b/kubernetes/core-statefulset/files/main.yaml deleted file mode 100644 index d8d99ae..0000000 --- a/kubernetes/core-statefulset/files/main.yaml +++ /dev/null @@ -1,76 +0,0 @@ -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 %> diff --git a/kubernetes/core-statefulset/template.json b/kubernetes/core-statefulset/template.json deleted file mode 100644 index af281dc..0000000 --- a/kubernetes/core-statefulset/template.json +++ /dev/null @@ -1,398 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/core-storageclass/files/main.yaml b/kubernetes/core-storageclass/files/main.yaml deleted file mode 100644 index af16290..0000000 --- a/kubernetes/core-storageclass/files/main.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: << resource_name >> -provisioner: << provisioner >> -volumeBindingMode: << volume_binding_mode >> -reclaimPolicy: << reclaim_policy >> diff --git a/kubernetes/core-storageclass/template.json b/kubernetes/core-storageclass/template.json deleted file mode 100644 index 1d8ee8f..0000000 --- a/kubernetes/core-storageclass/template.json +++ /dev/null @@ -1,174 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/flux-bootstrap/files/main.yaml b/kubernetes/flux-bootstrap/files/main.yaml deleted file mode 100644 index ce5b849..0000000 --- a/kubernetes/flux-bootstrap/files/main.yaml +++ /dev/null @@ -1,86 +0,0 @@ -<%- 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 %> diff --git a/kubernetes/flux-bootstrap/template.json b/kubernetes/flux-bootstrap/template.json deleted file mode 100644 index c3ffdf5..0000000 --- a/kubernetes/flux-bootstrap/template.json +++ /dev/null @@ -1,377 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/kube-vip/files/main.yaml b/kubernetes/kube-vip/files/main.yaml deleted file mode 100644 index 631c3ab..0000000 --- a/kubernetes/kube-vip/files/main.yaml +++ /dev/null @@ -1,147 +0,0 @@ ---- -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: {} diff --git a/kubernetes/kube-vip/template.json b/kubernetes/kube-vip/template.json deleted file mode 100644 index eb19602..0000000 --- a/kubernetes/kube-vip/template.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "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." - } - ] - } - ] -} diff --git a/kubernetes/metallb/files/main.yaml b/kubernetes/metallb/files/main.yaml deleted file mode 100644 index bd34286..0000000 --- a/kubernetes/metallb/files/main.yaml +++ /dev/null @@ -1,36 +0,0 @@ -<%- 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 %> diff --git a/kubernetes/metallb/template.json b/kubernetes/metallb/template.json deleted file mode 100644 index 93637d0..0000000 --- a/kubernetes/metallb/template.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/traefik-basicauth/files/main.yaml b/kubernetes/traefik-basicauth/files/main.yaml deleted file mode 100644 index 0c148dc..0000000 --- a/kubernetes/traefik-basicauth/files/main.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- -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 %> diff --git a/kubernetes/traefik-basicauth/template.json b/kubernetes/traefik-basicauth/template.json deleted file mode 100644 index 0d62b06..0000000 --- a/kubernetes/traefik-basicauth/template.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/traefik-buffering/files/main.yaml b/kubernetes/traefik-buffering/files/main.yaml deleted file mode 100644 index 41ee892..0000000 --- a/kubernetes/traefik-buffering/files/main.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -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 >> diff --git a/kubernetes/traefik-buffering/template.json b/kubernetes/traefik-buffering/template.json deleted file mode 100644 index dfb6f81..0000000 --- a/kubernetes/traefik-buffering/template.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/traefik-circuitbreaker/files/main.yaml b/kubernetes/traefik-circuitbreaker/files/main.yaml deleted file mode 100644 index d1fc44b..0000000 --- a/kubernetes/traefik-circuitbreaker/files/main.yaml +++ /dev/null @@ -1,9 +0,0 @@ ---- -apiVersion: traefik.io/v1alpha1 -kind: Middleware -metadata: - name: << resource_name >> - namespace: << namespace >> -spec: - circuitBreaker: - expression: "<< expression >>" diff --git a/kubernetes/traefik-circuitbreaker/template.json b/kubernetes/traefik-circuitbreaker/template.json deleted file mode 100644 index cc62939..0000000 --- a/kubernetes/traefik-circuitbreaker/template.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/traefik-forwardauth-middleware/files/main.yaml b/kubernetes/traefik-forwardauth-middleware/files/main.yaml deleted file mode 100644 index 6050376..0000000 --- a/kubernetes/traefik-forwardauth-middleware/files/main.yaml +++ /dev/null @@ -1,26 +0,0 @@ ---- -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 %> diff --git a/kubernetes/traefik-forwardauth-middleware/template.json b/kubernetes/traefik-forwardauth-middleware/template.json deleted file mode 100644 index ce0880d..0000000 --- a/kubernetes/traefik-forwardauth-middleware/template.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "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." - } - ] - } - ] -} diff --git a/kubernetes/traefik-ingressroute/files/main.yaml b/kubernetes/traefik-ingressroute/files/main.yaml deleted file mode 100644 index af019be..0000000 --- a/kubernetes/traefik-ingressroute/files/main.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -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 %> diff --git a/kubernetes/traefik-ingressroute/template.json b/kubernetes/traefik-ingressroute/template.json deleted file mode 100644 index 8f49a93..0000000 --- a/kubernetes/traefik-ingressroute/template.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/traefik-ingressroutetcp/files/main.yaml b/kubernetes/traefik-ingressroutetcp/files/main.yaml deleted file mode 100644 index 1d9594a..0000000 --- a/kubernetes/traefik-ingressroutetcp/files/main.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -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 %> diff --git a/kubernetes/traefik-ingressroutetcp/template.json b/kubernetes/traefik-ingressroutetcp/template.json deleted file mode 100644 index 0ba43de..0000000 --- a/kubernetes/traefik-ingressroutetcp/template.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/traefik-ipallowlist/files/main.yaml b/kubernetes/traefik-ipallowlist/files/main.yaml deleted file mode 100644 index 77e2b94..0000000 --- a/kubernetes/traefik-ipallowlist/files/main.yaml +++ /dev/null @@ -1,24 +0,0 @@ ---- -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 %> diff --git a/kubernetes/traefik-ipallowlist/template.json b/kubernetes/traefik-ipallowlist/template.json deleted file mode 100644 index 5bba523..0000000 --- a/kubernetes/traefik-ipallowlist/template.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/traefik-middleware/files/main.yaml b/kubernetes/traefik-middleware/files/main.yaml deleted file mode 100644 index fb77476..0000000 --- a/kubernetes/traefik-middleware/files/main.yaml +++ /dev/null @@ -1,27 +0,0 @@ ---- -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 %> diff --git a/kubernetes/traefik-middleware/template.json b/kubernetes/traefik-middleware/template.json deleted file mode 100644 index a25f0fa..0000000 --- a/kubernetes/traefik-middleware/template.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/traefik-retry/files/main.yaml b/kubernetes/traefik-retry/files/main.yaml deleted file mode 100644 index cf7dd1d..0000000 --- a/kubernetes/traefik-retry/files/main.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -apiVersion: traefik.io/v1alpha1 -kind: Middleware -metadata: - name: << resource_name >> - namespace: << namespace >> -spec: - retry: - attempts: << attempts >> -<%- if initial_interval %> - initialInterval: << initial_interval >> -<%- endif %> diff --git a/kubernetes/traefik-retry/template.json b/kubernetes/traefik-retry/template.json deleted file mode 100644 index 93434ab..0000000 --- a/kubernetes/traefik-retry/template.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/kubernetes/twingate-connector/files/main.yaml b/kubernetes/twingate-connector/files/main.yaml deleted file mode 100644 index 3d0798e..0000000 --- a/kubernetes/twingate-connector/files/main.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -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 >> diff --git a/kubernetes/twingate-connector/template.json b/kubernetes/twingate-connector/template.json deleted file mode 100644 index a61424c..0000000 --- a/kubernetes/twingate-connector/template.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "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" - } - } - ] - } - ] -} diff --git a/python/broken-link-crawler/files/main.py b/python/broken-link-crawler/files/main.py deleted file mode 100644 index 9b7b4a5..0000000 --- a/python/broken-link-crawler/files/main.py +++ /dev/null @@ -1,241 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import json -import sys -from collections import deque -from typing import Any -from urllib.parse import urljoin, urlparse - -import requests -from bs4 import BeautifulSoup -from requests import Response -from requests.exceptions import RequestException - - -WEBSITE_URL = r"""<< website_url >>""" -MAX_PAGES_DEFAULT = int(r"""<< max_pages >>""") -REQUEST_TIMEOUT_SECONDS_DEFAULT = int(r"""<< request_timeout_seconds >>""") -VERIFY_TLS_DEFAULT = r"""<< verify_tls >>""" -FOLLOW_REDIRECTS_DEFAULT = r"""<< follow_redirects >>""" -REQUEST_HEADERS_JSON_DEFAULT = r"""<< request_headers_json >>""" -USER_AGENT_DEFAULT = r"""<< user_agent >>""" - - -def str_to_bool(value: Any) -> bool: - return str(value).strip().lower() in {"1", "true", "yes", "y", "on"} - - -def parse_json_object(value: str, field_name: str) -> dict[str, Any]: - if not value.strip(): - return {} - try: - parsed = json.loads(value) - except json.JSONDecodeError as exc: - raise SystemExit(f"{field_name} must be valid JSON: {exc}") from exc - if not isinstance(parsed, dict): - raise SystemExit(f"{field_name} must be a JSON object.") - return parsed - - -def build_session(headers: dict[str, str], user_agent: str) -> requests.Session: - session = requests.Session() - session.headers.update({"User-Agent": user_agent}) - session.headers.update(headers) - return session - - -def sanitize_url(url: str) -> str | None: - parsed = urlparse(url) - if parsed.scheme in {"mailto", "javascript", "tel", "data"}: - return None - cleaned = parsed._replace(fragment="").geturl() - return cleaned or None - - -def same_host(url: str, website_host: str) -> bool: - host = (urlparse(url).hostname or "").lower() - return bool(host) and host == website_host - - -def is_html_response(response: Response) -> bool: - content_type = response.headers.get("Content-Type", "").lower() - return "text/html" in content_type or "application/xhtml+xml" in content_type - - -def probe_url( - session: requests.Session, - url: str, - timeout: int, - verify_tls: bool, - follow_redirects: bool, -) -> tuple[Response | None, str | None]: - try: - response = session.get( - url, - timeout=timeout, - verify=verify_tls, - allow_redirects=follow_redirects, - ) - return response, None - except RequestException as exc: - return None, str(exc) - - -def main() -> int: - website_url = WEBSITE_URL.strip() - if not website_url: - raise SystemExit("website_url is required.") - website_host = (urlparse(website_url).hostname or "").lower() - if not website_host: - raise SystemExit("website_url must include a valid hostname.") - - verify_tls = str_to_bool(VERIFY_TLS_DEFAULT) - follow_redirects = str_to_bool(FOLLOW_REDIRECTS_DEFAULT) - - request_headers = parse_json_object(REQUEST_HEADERS_JSON_DEFAULT, "request_headers_json") - session = build_session(request_headers, USER_AGENT_DEFAULT.strip()) - - queue: deque[tuple[str, str]] = deque([(website_url, website_url)]) - queued_urls = {website_url} - visited_pages: set[str] = set() - checked_resources: dict[str, dict[str, Any]] = {} - broken: dict[str, dict[str, Any]] = {} - - pages_crawled = 0 - - while queue and pages_crawled < MAX_PAGES_DEFAULT: - page_url, source = queue.popleft() - if page_url in visited_pages: - continue - visited_pages.add(page_url) - - response, error = probe_url( - session=session, - url=page_url, - timeout=REQUEST_TIMEOUT_SECONDS_DEFAULT, - verify_tls=verify_tls, - follow_redirects=follow_redirects, - ) - pages_crawled += 1 - - if error: - broken.setdefault( - page_url, - {"url": page_url, "kind": "page", "status_code": None, "error": error, "sources": []}, - )["sources"].append(source) - continue - - if response is None: - continue - - if response.status_code >= 400: - broken.setdefault( - page_url, - { - "url": page_url, - "kind": "page", - "status_code": response.status_code, - "error": f"HTTP {response.status_code}", - "sources": [], - }, - )["sources"].append(source) - continue - - if not is_html_response(response): - continue - - soup = BeautifulSoup(response.text, "html.parser") - - discovered: list[tuple[str, str]] = [] - for tag_name, attribute, kind in [ - ("a", "href", "link"), - ("img", "src", "asset"), - ("script", "src", "asset"), - ("link", "href", "asset"), - ]: - for tag in soup.find_all(tag_name): - raw_value = tag.get(attribute) - if not raw_value: - continue - normalized = sanitize_url(urljoin(page_url, raw_value)) - if not normalized: - continue - discovered.append((normalized, kind)) - - for discovered_url, kind in discovered: - if not same_host(discovered_url, website_host): - continue - - if kind == "link" and discovered_url not in visited_pages and discovered_url not in queued_urls: - queue.append((discovered_url, page_url)) - queued_urls.add(discovered_url) - - if discovered_url in checked_resources: - checked_resources[discovered_url]["sources"].add(page_url) - if discovered_url in broken: - broken[discovered_url]["sources"].append(page_url) - continue - - resource_response, resource_error = probe_url( - session=session, - url=discovered_url, - timeout=REQUEST_TIMEOUT_SECONDS_DEFAULT, - verify_tls=verify_tls, - follow_redirects=follow_redirects, - ) - - checked_resources[discovered_url] = { - "url": discovered_url, - "kind": kind, - "sources": {page_url}, - } - - if resource_error: - broken[discovered_url] = { - "url": discovered_url, - "kind": kind, - "status_code": None, - "error": resource_error, - "sources": [page_url], - } - continue - - if resource_response is not None and resource_response.status_code >= 400: - broken[discovered_url] = { - "url": discovered_url, - "kind": kind, - "status_code": resource_response.status_code, - "error": f"HTTP {resource_response.status_code}", - "sources": [page_url], - } - - for value in broken.values(): - value["sources"] = sorted(set(value["sources"])) - - summary = { - "pages_crawled": pages_crawled, - "urls_checked": len(set(checked_resources) | visited_pages), - "broken_urls": len(broken), - } - overall_status = "fail" if broken else "pass" - sorted_broken = sorted(broken.values(), key=lambda item: item["url"]) - - print(f"Broken Link Crawler: {overall_status.upper()}") - print(f"Website: {website_url}") - print(f"Pages crawled: {pages_crawled}") - print(f"URLs checked: {summary['urls_checked']}") - print(f"Broken URLs: {summary['broken_urls']}") - if sorted_broken: - print("") - print("Broken targets:") - for item in sorted_broken: - source = ", ".join(item["sources"][:3]) or "-" - print(f"- [{item['kind']}] {item['url']} | source={source} | error={item['error']}") - - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/python/broken-link-crawler/files/requirements.txt b/python/broken-link-crawler/files/requirements.txt deleted file mode 100644 index ae5d697..0000000 --- a/python/broken-link-crawler/files/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -beautifulsoup4==4.14.3 -requests==2.33.1 diff --git a/python/broken-link-crawler/template.json b/python/broken-link-crawler/template.json deleted file mode 100644 index af5e04e..0000000 --- a/python/broken-link-crawler/template.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "slug": "broken-link-crawler", - "kind": "python", - "metadata": { - "name": "Broken Link Crawler", - "description": "Standalone Python crawler for one website that walks same-host pages, checks discovered links and assets, and prints a stdout summary.", - "tags": [ - "crawler", - "links", - "website", - "audit", - "python" - ], - "icon": { - "provider": "simple-icons", - "id": "python", - "color": "emerald" - }, - "draft": false, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/broken-link-crawler" - } - }, - "variables": [ - { - "title": "Targets", - "name": "targets", - "items": [ - { - "name": "website_url", - "type": "str", - "title": "Website URL", - "required": true, - "default": "https://example.com", - "description": "Single crawl entrypoint. The crawler stays on this exact host.", - "config": { - "placeholder": "https://example.com" - } - } - ] - }, - { - "title": "Crawler", - "name": "crawler", - "items": [ - { - "name": "max_pages", - "type": "int", - "title": "Max Pages", - "required": true, - "default": 100, - "description": "Maximum number of HTML pages to crawl.", - "config": { - "placeholder": "100" - } - }, - { - "name": "request_timeout_seconds", - "type": "int", - "title": "Timeout Seconds", - "required": true, - "default": 10, - "description": "Timeout for each outbound HTTP request.", - "config": { - "placeholder": "10" - } - }, - { - "name": "verify_tls", - "type": "bool", - "title": "Verify TLS", - "required": false, - "default": true, - "description": "Validate remote TLS certificates during requests." - }, - { - "name": "follow_redirects", - "type": "bool", - "title": "Follow Redirects", - "required": false, - "default": true, - "description": "Follow redirects when checking URLs." - }, - { - "name": "request_headers_json", - "type": "str", - "title": "Request Headers JSON", - "required": false, - "default": "{}", - "description": "JSON object of headers added to every request.", - "config": { - "placeholder": "{\"Authorization\": \"Bearer replace-me\"}" - } - }, - { - "name": "user_agent", - "type": "str", - "title": "User Agent", - "required": false, - "default": "boilerplates-broken-link-crawler/1.0", - "description": "User-Agent header value used by the crawler.", - "config": { - "placeholder": "boilerplates-broken-link-crawler/1.0" - } - } - ] - } - ] -} diff --git a/python/server-disk-usage-monitor/files/main.py b/python/server-disk-usage-monitor/files/main.py deleted file mode 100644 index 5269cec..0000000 --- a/python/server-disk-usage-monitor/files/main.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import json -import socket -import subprocess -import sys -import urllib.request - - -MONITOR_PATH = r"""<< monitor_path >>""" -WARNING_PERCENT = int(r"""<< warning_percent >>""") - -DISCORD_WEBHOOK_URL = r"""<< discord_webhook_url >>""" -DISCORD_USERNAME = r"""<< discord_username >>""" - - -def fetch_disk_usage() -> dict[str, str | int]: - path = MONITOR_PATH.strip() or "/" - - if not 1 <= WARNING_PERCENT <= 100: - raise SystemExit("warning_percent must be between 1 and 100.") - - result = subprocess.run( - ["df", "-P", path], - capture_output=True, - text=True, - check=False, - ) - if result.returncode != 0: - detail = result.stderr.strip() or result.stdout.strip() or "unknown local error" - raise RuntimeError(f"Local df command failed with exit code {result.returncode}: {detail}") - - lines = [line.strip() for line in result.stdout.splitlines() if line.strip()] - if len(lines) < 2: - raise RuntimeError(f"Unexpected df output: {result.stdout!r}") - - parts = lines[-1].split(maxsplit=5) - if len(parts) != 6: - raise RuntimeError(f"Unable to parse df output line: {lines[-1]!r}") - - usage_raw = parts[4] - if not usage_raw.endswith("%"): - raise RuntimeError(f"Unable to parse disk usage percentage: {usage_raw!r}") - - return { - "filesystem": parts[0], - "blocks_kb": parts[1], - "used_kb": parts[2], - "available_kb": parts[3], - "usage_percent": int(usage_raw[:-1]), - "mounted_on": parts[5], - "path": path, - "host": socket.gethostname(), - } - - -def send_discord_warning(result: dict[str, str | int]) -> bool: - webhook_url = DISCORD_WEBHOOK_URL.strip() - if not webhook_url: - return False - - content = "\n".join( - [ - "Disk usage warning", - f"Host: {result['host']}", - f"Path: {result['path']}", - f"Mounted on: {result['mounted_on']}", - f"Filesystem: {result['filesystem']}", - f"Usage: {result['usage_percent']}% (threshold {WARNING_PERCENT}%)", - f"Available: {result['available_kb']} KB", - ] - ) - payload = json.dumps( - { - "username": DISCORD_USERNAME.strip() or "Disk Monitor", - "content": content[:1900], - } - ).encode("utf-8") - request = urllib.request.Request( - webhook_url, - data=payload, - headers={"Content-Type": "application/json"}, - method="POST", - ) - with urllib.request.urlopen(request, timeout=10) as response: # noqa: S310 - if response.status >= 400: - raise RuntimeError(f"Discord webhook returned HTTP {response.status}") - return True - - -def main() -> int: - result = fetch_disk_usage() - usage_percent = int(result["usage_percent"]) - status = "warn" if usage_percent >= WARNING_PERCENT else "pass" - alert_sent = False - - if status == "warn": - alert_sent = send_discord_warning(result) - - print(f"Server Disk Usage Monitor: {status.upper()}") - print(f"Host: {result['host']}") - print(f"Path: {result['path']}") - print(f"Mounted on: {result['mounted_on']}") - print(f"Filesystem: {result['filesystem']}") - print(f"Usage: {usage_percent}%") - print(f"Threshold: {WARNING_PERCENT}%") - print(f"Available: {result['available_kb']} KB") - print(f"Discord alert sent: {'yes' if alert_sent else 'no'}") - - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/python/server-disk-usage-monitor/files/requirements.txt b/python/server-disk-usage-monitor/files/requirements.txt deleted file mode 100644 index f84fa80..0000000 --- a/python/server-disk-usage-monitor/files/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -# No external dependencies required. diff --git a/python/server-disk-usage-monitor/template.json b/python/server-disk-usage-monitor/template.json deleted file mode 100644 index 49e5e8b..0000000 --- a/python/server-disk-usage-monitor/template.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "slug": "server-disk-usage-monitor", - "kind": "python", - "metadata": { - "name": "Server Disk Usage Monitor", - "description": "Standalone Python monitor that checks local disk usage for one path and sends a Discord warning when usage reaches a configurable threshold.", - "tags": [ - "disk", - "monitoring", - "discord", - "python" - ], - "icon": { - "provider": "simple-icons", - "id": "python", - "color": "emerald" - }, - "draft": false, - "version": { - "name": "1.0.0", - "source_dep_name": "manual/server-disk-usage-monitor" - } - }, - "variables": [ - { - "title": "Monitor", - "name": "monitor", - "items": [ - { - "name": "monitor_path", - "type": "str", - "title": "Monitor Path", - "required": true, - "default": "/", - "description": "Local path passed to `df -P`.", - "config": { - "placeholder": "/" - } - } - ] - }, - { - "title": "Alerting", - "name": "alerting", - "items": [ - { - "name": "warning_percent", - "type": "int", - "title": "Warning Threshold Percent", - "required": true, - "default": 80, - "description": "Send a warning when disk usage reaches or exceeds this percentage.", - "config": { - "slider": true, - "min": 50, - "max": 100, - "step": 1, - "placeholder": "80" - } - }, - { - "name": "discord_webhook_url", - "type": "secret", - "title": "Discord Webhook URL", - "required": false, - "default": "", - "description": "Optional Discord webhook endpoint for warning notifications." - }, - { - "name": "discord_username", - "type": "str", - "title": "Discord Username", - "required": false, - "default": "Disk Monitor", - "description": "Sender name used for Discord webhook messages.", - "config": { - "placeholder": "Disk Monitor" - } - } - ] - } - ] -} diff --git a/swarm/homepage/files/compose.yaml b/swarm/homepage/files/compose.yaml deleted file mode 100644 index 8203b98..0000000 --- a/swarm/homepage/files/compose.yaml +++ /dev/null @@ -1,97 +0,0 @@ -services: - << service_name >>: - image: ghcr.io/gethomepage/homepage:v1.12.3 - environment: - <%- if traefik_enabled %> - - HOMEPAGE_ALLOWED_HOSTS=<< traefik_host >>.<< traefik_domain >> - <%- else %> - - HOMEPAGE_ALLOWED_HOSTS=localhost:<< ports_http >>,127.0.0.1:<< ports_http >> - <%- endif %> - <%- if container_timezone %> - - TZ=<< container_timezone >> - <%- endif %> - <%- if container_loglevel %> - - LOG_LEVEL=<< container_loglevel >> - <%- endif %> - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if not traefik_enabled %> - ports: - - << ports_http >>:3000 - <%- endif %> - volumes: - <%- if volume_mode == 'local' %> - - << service_name >>_config:/app/config - - << service_name >>_images:/app/images - - << service_name >>_icons:/app/icons - <%- elif volume_mode == 'mount' %> - - << volume_mount_path >>/<< service_name >>/config:/app/config - - << volume_mount_path >>/<< service_name >>/images:/app/images - - << volume_mount_path >>/<< service_name >>/icons:/app/icons - <%- elif volume_mode == 'nfs' %> - - << service_name >>_config:/app/config - - << service_name >>_images:/app/images - - << service_name >>_icons:/app/icons - <%- endif %> - deploy: - <%- if swarm_placement_mode == 'replicated' %> - replicas: << swarm_replicas >> - <%- if swarm_placement_host %> - placement: - constraints: - - node.hostname == << swarm_placement_host >> - <%- endif %> - <%- else %> - mode: global - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadbalancer.server.port=3000 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>_config: - << service_name >>_images: - << service_name >>_icons: -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>_config: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/config" - << service_name >>_images: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/images" - << service_name >>_icons: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/icons" -<%- endif %> diff --git a/swarm/homepage/template.json b/swarm/homepage/template.json deleted file mode 100644 index 8338049..0000000 --- a/swarm/homepage/template.json +++ /dev/null @@ -1,284 +0,0 @@ -{ - "slug": "homepage-swarm", - "kind": "swarm", - "metadata": { - "name": "Homepage", - "description": "Modern, fully static, fast application dashboard with integrations for over 100 services and translations into multiple languages.", - "tags": [ - "traefik", - "volume_modes" - ], - "icon": { - "provider": "selfhst", - "id": "homepage" - }, - "draft": false, - "version": { - "name": "v1.12.3", - "source_dep_name": "ghcr.io/gethomepage/homepage", - "source_dep_version": "v1.12.3" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "The service name", - "required": true, - "default": "homepage", - "config": { - "placeholder": "homepage" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "The container timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "container_loglevel", - "type": "enum", - "title": "Log Level", - "required": false, - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - }, - { - "name": "swarm_placement_mode", - "type": "enum", - "title": "Swarm Placement Mode", - "required": true, - "default": "replicated", - "config": { - "options": [ - "replicated", - "global" - ] - } - }, - { - "name": "swarm_replicas", - "type": "int", - "title": "Swarm Replicas", - "required": false, - "default": 1, - "config": { - "slider": true, - "min": 1, - "max": 10, - "step": 1, - "placeholder": "1", - "unit": "replicas" - }, - "needs": [ - "swarm_placement_mode=replicated" - ] - }, - { - "name": "swarm_placement_host", - "type": "str", - "title": "Swarm Placement Host", - "required": false, - "default": "", - "needs": [ - "swarm_placement_mode=replicated" - ], - "config": { - "placeholder": "swarm-node-1" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "The HTTP port", - "required": true, - "default": 3000, - "needs": [ - "traefik_enabled=false" - ], - "config": { - "placeholder": "3000" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "homepage" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - } - ] - }, - { - "title": "Traefik TLS", - "name": "traefik-tls", - "toggle": "traefik_tls_enabled", - "items": [ - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - } - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/mnt/storage", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/mnt/storage" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "NFS Options", - "required": false, - "default": "nfsvers=4,soft,timeo=180,intr", - "config": { - "placeholder": "nfsvers=4,soft,timeo=180,intr" - }, - "needs": [ - "volume_mode=nfs" - ] - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "NFS Path", - "required": false, - "default": "", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/path/to/export" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "NFS Server", - "required": false, - "default": "", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "192.0.2.1" - } - } - ] - } - ] -} diff --git a/swarm/homer/files/assets/config.yml b/swarm/homer/files/assets/config.yml deleted file mode 100644 index 676c071..0000000 --- a/swarm/homer/files/assets/config.yml +++ /dev/null @@ -1,71 +0,0 @@ ---- -# Homepage configuration -# See https://fontawesome.com/icons for icons options - -title: "<< homer_title >>" -subtitle: "<< homer_subtitle >>" -logo: "<< homer_logo >>" -# icon: "fas fa-home" # Optional icon instead of logo - -header: true -footer: false # Set to "" to enable footer with a custom message - -# Optional theme customization -theme: default # Options: default, sui -# colors: -# light: -# highlight-primary: "#3367d6" -# highlight-secondary: "#4285f4" -# highlight-hover: "#5a95f5" -# background: "#f5f5f5" -# card-background: "#ffffff" -# text: "#363636" -# text-header: "#ffffff" -# dark: -# highlight-primary: "#3367d6" -# highlight-secondary: "#4285f4" -# highlight-hover: "#5a95f5" -# background: "#131313" -# card-background: "#2b2b2b" -# text: "#eaeaea" -# text-header: "#ffffff" - -# Optional message displayed at the top -# message: -# style: "is-dark" # Options: is-dark, is-warning, is-info, is-success, is-danger -# title: "Welcome!" -# icon: "fa fa-grin" -# content: "This is your Homer dashboard.
Add your services below." - -# Optional navbar links -# links: -# - name: "GitHub" -# icon: "fab fa-github" -# url: "https://github.com" -# target: "_blank" # optional: open in new tab -# - name: "Documentation" -# icon: "fas fa-book" -# url: "https://github.com/bastienwirtz/homer/blob/main/docs/configuration.md" - -# Services -# First level array represents a group. -# Leave only an "items" key if not using groups (group name, icon & tagstyle are optional) -services: - - name: "Applications" - icon: "fas fa-cloud" - # items: - # - name: "Example App" - # logo: "assets/tools/sample.png" # or use "icon: fas fa-server" - # subtitle: "Description of the app" - # tag: "app" # Optional tag - # tagstyle: "is-success" # Optional: is-success, is-warning, is-info, is-danger - # url: "https://example.com" - # target: "_blank" # optional: open in new tab - - # - name: "Monitoring" - # icon: "fas fa-chart-line" - # items: - # - name: "Grafana" - # icon: "fas fa-chart-area" - # subtitle: "Metrics & dashboards" - # url: "https://grafana.example.com" diff --git a/swarm/homer/files/compose.yaml b/swarm/homer/files/compose.yaml deleted file mode 100644 index dc4780c..0000000 --- a/swarm/homer/files/compose.yaml +++ /dev/null @@ -1,60 +0,0 @@ -services: - << service_name >>: - image: docker.io/b4bz/homer:v26.4.2 - <%- if container_timezone %> - environment: - - TZ=<< container_timezone >> - <%- endif %> - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if not traefik_enabled %> - ports: - - target: 8080 - published: << ports_http >> - protocol: tcp - mode: host - <%- endif %> - volumes: - - ./assets:/www/assets - deploy: - mode: << swarm_placement_mode >> - <%- if swarm_placement_mode == 'replicated' %> - replicas: << swarm_replicas >> - <%- endif %> - <%- if swarm_placement_host %> - placement: - constraints: - - node.hostname == << swarm_placement_host >> - <%- endif %> - restart_policy: - condition: on-failure - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=8080 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if authentik_enabled %> - - traefik.http.routers.<< service_name >>-http.middlewares=<< authentik_traefik_middleware >> - <%- endif %> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- if authentik_enabled %> - - traefik.http.routers.<< service_name >>-https.middlewares=<< authentik_traefik_middleware >> - <%- endif %> - <%- endif %> - <%- endif %> - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/swarm/homer/template.json b/swarm/homer/template.json deleted file mode 100644 index e834431..0000000 --- a/swarm/homer/template.json +++ /dev/null @@ -1,259 +0,0 @@ -{ - "slug": "homer-swarm", - "kind": "swarm", - "metadata": { - "name": "Homer", - "description": "Simple static homepage for your server to keep your services on hand, configured through a single YAML file.", - "tags": [ - "traefik", - "authentik" - ], - "icon": { - "provider": "selfhst", - "id": "homer" - }, - "draft": false, - "version": { - "name": "v26.4.2", - "source_dep_name": "docker.io/b4bz/homer", - "source_dep_version": "v26.4.2" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "homer", - "config": { - "placeholder": "homer" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "homer_title", - "type": "str", - "title": "Dashboard title", - "required": false, - "default": "Dashboard", - "config": { - "placeholder": "Dashboard" - } - }, - { - "name": "homer_subtitle", - "type": "str", - "title": "Dashboard subtitle", - "required": false, - "default": "Dashboard", - "config": { - "placeholder": "Dashboard" - } - }, - { - "name": "homer_logo", - "type": "str", - "title": "Logo Path", - "required": false, - "default": "logo-file.png", - "description": "Logo file path (relative to assets/)", - "config": { - "placeholder": "logo-file.png" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 8080, - "config": { - "placeholder": "8080" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "dashboard" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - } - ] - }, - { - "title": "Traefik Tls", - "name": "traefik-tls", - "toggle": "traefik_tls_enabled", - "items": [ - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - } - } - ] - }, - { - "title": "Docker Swarm", - "name": "swarm", - "items": [ - { - "name": "swarm_placement_mode", - "type": "enum", - "title": "Swarm Placement Mode", - "required": true, - "default": "replicated", - "config": { - "options": [ - "replicated", - "global" - ] - } - }, - { - "name": "swarm_replicas", - "type": "int", - "title": "Swarm Replicas", - "required": true, - "default": 1, - "needs": [ - "swarm_placement_mode=replicated" - ], - "config": { - "slider": true, - "min": 1, - "max": 10, - "step": 1, - "placeholder": "1", - "unit": "replicas" - } - }, - { - "name": "swarm_placement_host", - "type": "str", - "title": "Swarm Placement Host", - "required": false, - "default": "", - "needs": [ - "swarm_placement_mode=replicated" - ], - "config": { - "placeholder": "swarm-node-1" - } - } - ] - }, - { - "title": "Authentik SSO", - "name": "authentik", - "toggle": "authentik_enabled", - "items": [ - { - "name": "authentik_traefik_middleware", - "type": "str", - "title": "Authentik Traefik Middleware", - "required": true, - "default": "middleware@file", - "needs": [ - "traefik_enabled=true" - ], - "config": { - "placeholder": "middleware@file" - } - }, - { - "name": "authentik_enabled", - "type": "bool", - "title": "Authentik SSO", - "required": false, - "default": false - } - ] - } - ] -} diff --git a/swarm/komodo/files/compose.yaml b/swarm/komodo/files/compose.yaml deleted file mode 100644 index b349027..0000000 --- a/swarm/komodo/files/compose.yaml +++ /dev/null @@ -1,127 +0,0 @@ ---- -services: - << service_name >>: - image: ghcr.io/moghtech/komodo-core:2.1.2 - hostname: << container_hostname >> - <%- if network_mode == 'host' %> - network_mode: host - <%- else %> - networks: - <%- if traefik_enabled %> - << traefik_network >>: - <%- endif %> - <%- if network_mode == 'macvlan' %> - << network_name >>: - ipv4_address: << network_macvlan_ipv4_address >> - <%- elif network_mode == 'bridge' %> - << network_name >>: - <%- endif %> - <%- endif %> - <%- if network_mode == 'bridge' and not traefik_enabled %> - ports: - - target: 9120 - published: << ports_http >> - protocol: tcp - mode: host - <%- endif %> - <%- if environment_enabled %> - environment: - KOMODO_DATABASE_ADDRESS: "<< environment_database_address >>" - KOMODO_DATABASE_DB_NAME: "<< environment_database_name >>" - <%- if environment_database_username %> - KOMODO_DATABASE_USERNAME: "<< environment_database_username >>" - <%- endif %> - <%- if environment_database_password %> - KOMODO_DATABASE_PASSWORD: "<< environment_database_password >>" - <%- endif %> - <%- if environment_jwt_secret %> - KOMODO_JWT_SECRET: "<< environment_jwt_secret >>" - <%- endif %> - LOG_LEVEL: "<< environment_log_level >>" - <%- endif %> - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/data:/app/data:rw - - << volume_mount_path >>/repos:/app/repos:rw - <%- elif volume_mode == 'local' or volume_mode == 'nfs' %> - - << service_name >>-data:/app/data - - << service_name >>-repos:/app/repos - <%- endif %> - deploy: - mode: replicated - replicas: 1 - restart_policy: - condition: on-failure - <%- if resources_enabled %> - resources: - limits: - cpus: '<< resources_cpu_limit >>' - memory: << resources_memory_limit >> - reservations: - cpus: '<< resources_cpu_reservation >>' - memory: << resources_memory_reservation >> - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=9120 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>-data: - driver: local - << service_name >>-repos: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>-data: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/data" - << service_name >>-repos: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/repos" -<%- endif %> - -<%- if network_mode != 'host' %> -networks: - << network_name >>: - <%- if network_external %> - external: true - <%- else %> - <%- if network_mode == 'macvlan' %> - driver: macvlan - driver_opts: - parent: << network_macvlan_parent_interface >> - ipam: - config: - - subnet: << network_macvlan_subnet >> - gateway: << network_macvlan_gateway >> - name: << network_name >> - <%- else %> - driver: overlay - attachable: true - <%- endif %> - <%- endif %> - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> -<%- endif %> diff --git a/swarm/komodo/template.json b/swarm/komodo/template.json deleted file mode 100644 index b65c153..0000000 --- a/swarm/komodo/template.json +++ /dev/null @@ -1,460 +0,0 @@ -{ - "slug": "komodo-swarm", - "kind": "swarm", - "metadata": { - "name": "Komodo", - "description": "Build and deployment automation tool for managing Docker deployments, stacks, and builds across multiple servers. Features real-time container monitoring, batch operations, and a web-based management interface.", - "tags": [ - "traefik", - "deployment", - "automation" - ], - "icon": { - "provider": "selfhst", - "id": "komodo" - }, - "draft": true, - "version": { - "name": "2.1.2", - "source_dep_name": "ghcr.io/moghtech/komodo-core", - "source_dep_version": "2.1.2" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "komodo", - "config": { - "placeholder": "komodo" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false, - "default": "komodo", - "config": { - "placeholder": "komodo" - } - }, - { - "name": "network_mode", - "type": "enum", - "title": "Network Mode", - "required": false, - "default": "bridge", - "config": { - "options": [ - "bridge", - "macvlan", - "host" - ] - } - }, - { - "name": "network_macvlan_ipv4_address", - "type": "str", - "title": "IPv4 Address", - "required": false, - "default": "", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "192.0.2.10" - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - }, - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": false, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": false, - "default": "", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw,nolock,soft" - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": false, - "default": "", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/path/to/storage" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": false, - "default": "", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "192.0.2.1" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": false, - "default": "", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/path/to/export" - } - }, - { - "name": "network_macvlan_subnet", - "type": "str", - "title": "Subnet", - "required": false, - "default": "", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "192.0.2.0/24" - } - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "komodo_network", - "config": { - "placeholder": "komodo_network" - } - }, - { - "name": "network_macvlan_parent_interface", - "type": "str", - "title": "Parent Interface", - "required": false, - "default": "", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "eth0" - } - }, - { - "name": "network_macvlan_gateway", - "type": "str", - "title": "Gateway", - "required": false, - "default": "", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "192.0.2.1" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Entrypoint", - "required": true, - "default": "web", - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "komodo" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - } - ] - }, - { - "title": "Traefik TLS", - "name": "traefik-tls", - "toggle": "traefik_tls_enabled", - "items": [ - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "TLS Entrypoint", - "required": true, - "default": "websecure", - "config": { - "placeholder": "websecure" - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 9120, - "needs": [ - "traefik_enabled=false", - "network_mode=bridge" - ], - "config": { - "placeholder": "9120" - } - } - ] - }, - { - "title": "Resource Limits", - "name": "resources", - "toggle": "resources_enabled", - "items": [ - { - "name": "resources_enabled", - "type": "bool", - "title": "Resources Enabled", - "required": false, - "default": false - }, - { - "name": "resources_cpu_limit", - "type": "str", - "title": "Resources Cpu Limit", - "required": true, - "default": 1, - "config": { - "placeholder": "1" - } - }, - { - "name": "resources_cpu_reservation", - "type": "str", - "title": "Resources Cpu Reservation", - "required": true, - "default": 0.25, - "config": { - "placeholder": "0.25" - } - }, - { - "name": "resources_memory_limit", - "type": "str", - "title": "Resources Memory Limit", - "required": true, - "default": "1G", - "config": { - "placeholder": "1G" - } - }, - { - "name": "resources_memory_reservation", - "type": "str", - "title": "Resources Memory Reservation", - "required": true, - "default": "512M", - "config": { - "placeholder": "512M" - } - } - ] - }, - { - "title": "Environment Variables", - "name": "environment", - "toggle": "environment_enabled", - "items": [ - { - "name": "environment_enabled", - "type": "bool", - "title": "Environment", - "required": false, - "default": true, - "description": "Configure environment variables (required)" - }, - { - "name": "environment_database_address", - "type": "str", - "title": "Database Address", - "required": false, - "default": "mongodb://database:27017", - "description": "Database connection address (MongoDB or FerretDB)", - "needs": [ - "environment_enabled=true" - ], - "config": { - "placeholder": "mongodb://database:27017" - } - }, - { - "name": "environment_database_name", - "type": "str", - "title": "Database name", - "required": false, - "default": "komodo", - "needs": [ - "environment_enabled=true" - ], - "config": { - "placeholder": "komodo" - } - }, - { - "name": "environment_database_username", - "type": "str", - "title": "DB User", - "required": false, - "default": "", - "description": "Database username (optional)", - "needs": [ - "environment_enabled=true" - ], - "config": { - "placeholder": "komodo" - } - }, - { - "name": "environment_database_password", - "type": "secret", - "title": "DB Password", - "required": false, - "default": "", - "description": "Database password (optional)", - "needs": [ - "environment_enabled=true" - ] - }, - { - "name": "environment_jwt_secret", - "type": "secret", - "title": "JWT Secret", - "required": false, - "description": "JWT secret for authentication (auto-generated if empty)", - "needs": [ - "environment_enabled=true" - ], - "config": { - "autogenerated": { - "length": 64 - } - } - }, - { - "name": "environment_log_level", - "type": "enum", - "title": "Log level", - "required": false, - "default": "info", - "needs": [ - "environment_enabled=true" - ], - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - } - ] - } - ] -} diff --git a/swarm/n8n/files/compose.yaml b/swarm/n8n/files/compose.yaml deleted file mode 100644 index 3b5a8ca..0000000 --- a/swarm/n8n/files/compose.yaml +++ /dev/null @@ -1,263 +0,0 @@ -services: -<%- if queue_enabled and not queue_redis_external -%> - redis: - image: redis:8-alpine - volumes: - - redis_data:/data - <%- if network_mode == 'bridge' -%> - networks: - - << network_name >> - <%- else -%> - network_mode: << network_mode >> - <%- endif -%> - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 5s - timeout: 3s - retries: 5 - deploy: - replicas: 1 - placement: - constraints: - - node.role == manager - - <%- endif -%> - << service_name >>: - image: n8nio/n8n:2.20.0 - environment: - - N8N_LOG_LEVEL=<< container_loglevel >> - - GENERIC_TIMEZONE=<< container_timezone >> - - TZ=<< container_timezone >> - - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true - - N8N_RUNNERS_ENABLED=true - <%- if traefik_enabled -%> - - N8N_HOST=<< traefik_host >>.<< traefik_domain >> - <%- if traefik_tls_enabled -%> - - N8N_PROTOCOL=https - - N8N_EDITOR_BASE_URL=https://<< traefik_host >>.<< traefik_domain >> - <%- else -%> - - N8N_PROTOCOL=http - - N8N_EDITOR_BASE_URL=http://<< traefik_host >>.<< traefik_domain >> - <%- endif -%> - <%- endif -%> - - NODE_ENV=production - <%- if database_enabled -%> - <%- if database_type == 'postgres' -%> - - DB_TYPE=postgresdb - - DB_POSTGRESDB_HOST=<< database_host >> - - DB_POSTGRESDB_PORT=<< database_port >> - - DB_POSTGRESDB_DATABASE=<< database_name >> - - DB_POSTGRESDB_USER=<< database_user >> - - DB_POSTGRESDB_PASSWORD_FILE=/run/secrets/<< database_password_secret_name >> - <%- elif database_type == 'mysql' -%> - - DB_TYPE=mysqldb - - DB_MYSQLDB_HOST=<< database_host >> - - DB_MYSQLDB_PORT=<< database_port >> - - DB_MYSQLDB_DATABASE=<< database_name >> - - DB_MYSQLDB_USER=<< database_user >> - - DB_MYSQLDB_PASSWORD_FILE=/run/secrets/<< database_password_secret_name >> - <%- endif -%> - <%- endif -%> - - N8N_ENCRYPTION_KEY_FILE=/run/secrets/<< encryption_key_secret_name >> - <%- if webhook_url -%> - - WEBHOOK_URL=<< webhook_url >> - <%- endif -%> - - N8N_PROXY_HOPS=<< proxy_hops >> - <%- if metrics_enabled -%> - - N8N_METRICS=true - <%- if metrics_detailed -%> - - N8N_METRICS_INCLUDE_WORKFLOW_ID_LABELS=true - - N8N_METRICS_INCLUDE_NODE_TYPE_LABEL=true - - N8N_METRICS_INCLUDE_API_ENDPOINTS=true - - N8N_METRICS_INCLUDE_API_STATUS_CODE_LABELS=true - - N8N_METRICS_INCLUDE_CREDENTIAL_TYPE_LABEL=true - <%- endif -%> - <%- endif -%> - - EXECUTIONS_DATA_SAVE_ON_ERROR=<< execution_save_on_error >> - - EXECUTIONS_DATA_SAVE_ON_SUCCESS=<< execution_save_on_success >> - <%- if queue_enabled -%> - - EXECUTIONS_MODE=queue - - QUEUE_BULL_REDIS_HOST=<< queue_redis_host >> - - QUEUE_BULL_REDIS_PORT=<< queue_redis_port >> - - QUEUE_HEALTH_CHECK_ACTIVE=true - <%- if metrics_enabled -%> - - N8N_METRICS_INCLUDE_QUEUE_METRICS=true - <%- endif -%> - <%- endif -%> - volumes: - - /etc/localtime:/etc/localtime:ro - - data:/home/node/.n8n - <%- if network_mode == 'bridge' -%> - networks: - <%- if traefik_enabled -%> - - << traefik_network >> - <%- endif -%> - - << network_name >> - <%- else -%> - network_mode: << network_mode >> - <%- endif -%> - <%- if not traefik_enabled and network_mode == 'bridge' -%> - ports: - - target: 5678 - published: << ports_http >> - protocol: tcp - mode: host - <%- endif -%> - <%- if queue_enabled and not queue_redis_external -%> - depends_on: - redis: - condition: service_healthy - <%- endif -%> - <%- if traefik_enabled -%> - labels: - - traefik.enable=true - <%- if network_mode == 'bridge' -%> - - traefik.docker.network=<< traefik_network >> - <%- endif -%> - <%- if traefik_webhook_host -%> - - traefik.http.routers.<< service_name >>.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) || Host(`<< traefik_webhook_host >>`) - <%- else -%> - - traefik.http.routers.<< service_name >>.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - <%- endif -%> - <%- if traefik_tls_enabled -%> - - traefik.http.routers.<< service_name >>.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>.tls=true - - traefik.http.routers.<< service_name >>.tls.certresolver=<< traefik_tls_certresolver >> - <%- else -%> - - traefik.http.routers.<< service_name >>.entrypoints=<< traefik_entrypoint >> - <%- endif -%> - - traefik.http.services.<< service_name >>-web.loadbalancer.server.port=5678 - - traefik.http.routers.<< service_name >>.service=<< service_name >>-web - <%- endif -%> - deploy: - replicas: << swarm_replicas >> - <%- if swarm_placement_host -%> - placement: - constraints: - - node.hostname == << swarm_placement_host >> - <%- endif -%> - <%- if traefik_enabled -%> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - <%- if traefik_webhook_host -%> - - traefik.http.routers.<< service_name >>.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) || Host(`<< traefik_webhook_host >>`) - <%- else -%> - - traefik.http.routers.<< service_name >>.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - <%- endif -%> - <%- if traefik_tls_enabled -%> - - traefik.http.routers.<< service_name >>.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>.tls=true - - traefik.http.routers.<< service_name >>.tls.certresolver=<< traefik_tls_certresolver >> - <%- else -%> - - traefik.http.routers.<< service_name >>.entrypoints=<< traefik_entrypoint >> - <%- endif -%> - - traefik.http.services.<< service_name >>-web.loadbalancer.server.port=5678 - - traefik.http.routers.<< service_name >>.service=<< service_name >>-web - <%- endif -%> - secrets: - - << encryption_key_secret_name >> - <%- if database_enabled -%> - - << database_password_secret_name >> - <%- endif -%> -<%- if queue_enabled and queue_embedded_worker -%> - - << service_name >>-worker: - image: n8nio/n8n:2.20.0 - command: worker - environment: - - N8N_LOG_LEVEL=<< container_loglevel >> - - GENERIC_TIMEZONE=<< container_timezone >> - - TZ=<< container_timezone >> - <%- if database_enabled -%> - <%- if database_type == 'postgres' -%> - - DB_TYPE=postgresdb - - DB_POSTGRESDB_HOST=<< database_host >> - - DB_POSTGRESDB_PORT=<< database_port >> - - DB_POSTGRESDB_DATABASE=<< database_name >> - - DB_POSTGRESDB_USER=<< database_user >> - - DB_POSTGRESDB_PASSWORD_FILE=/run/secrets/<< database_password_secret_name >> - <%- elif database_type == 'mysql' -%> - - DB_TYPE=mysqldb - - DB_MYSQLDB_HOST=<< database_host >> - - DB_MYSQLDB_PORT=<< database_port >> - - DB_MYSQLDB_DATABASE=<< database_name >> - - DB_MYSQLDB_USER=<< database_user >> - - DB_MYSQLDB_PASSWORD_FILE=/run/secrets/<< database_password_secret_name >> - <%- endif -%> - <%- endif -%> - - N8N_ENCRYPTION_KEY_FILE=/run/secrets/<< encryption_key_secret_name >> - - EXECUTIONS_MODE=queue - - QUEUE_BULL_REDIS_HOST=<< queue_redis_host >> - - QUEUE_BULL_REDIS_PORT=<< queue_redis_port >> - - QUEUE_HEALTH_CHECK_ACTIVE=true - <%- if metrics_enabled -%> - - N8N_METRICS=true - <%- if metrics_detailed -%> - - N8N_METRICS_INCLUDE_WORKFLOW_ID_LABELS=true - - N8N_METRICS_INCLUDE_NODE_TYPE_LABEL=true - <%- endif -%> - <%- endif -%> - volumes: - - /etc/localtime:/etc/localtime:ro - - data:/home/node/.n8n - <%- if network_mode == 'bridge' -%> - networks: - - << network_name >> - <%- else -%> - network_mode: << network_mode >> - <%- endif -%> - <%- if not queue_redis_external -%> - depends_on: - redis: - condition: service_healthy - <%- endif -%> - deploy: - replicas: 1 - <%- if swarm_placement_host -%> - placement: - constraints: - - node.hostname == << swarm_placement_host >> - <%- endif -%> - secrets: - - << encryption_key_secret_name >> - <%- if database_enabled -%> - - << database_password_secret_name >> - <%- endif -%> -<%- endif -%> - -volumes: - data: - driver: local -<%- if queue_enabled and not queue_redis_external -%> - redis_data: - driver: local -<%- endif -%> - -<%- if network_mode == 'bridge' -%> -networks: - << network_name >>: - <%- if network_external -%> - external: true - <%- else -%> - driver: overlay - attachable: true - <%- endif -%> - <%- if traefik_enabled -%> - << traefik_network >>: - <%- if traefik_network_external -%> - external: true - <%- else -%> - driver: overlay - attachable: true - <%- endif -%> - <%- endif -%> -<%- endif -%> - -secrets: - << encryption_key_secret_name >>: - external: true - <%- if database_enabled -%> - << database_password_secret_name >>: - external: true - <%- endif -%> diff --git a/swarm/n8n/template.json b/swarm/n8n/template.json deleted file mode 100644 index fcd95eb..0000000 --- a/swarm/n8n/template.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "slug": "n8n-swarm", - "kind": "swarm", - "metadata": { - "name": "N8N", - "description": "Source-available workflow automation tool that connects apps and services to automate tasks through a visual drag-and-drop node editor.", - "tags": [ - "traefik", - "database" - ], - "icon": { - "provider": "selfhst", - "id": "n8n" - }, - "draft": true, - "version": { - "name": "2.20.0", - "source_dep_name": "n8nio/n8n", - "source_dep_version": "2.20.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "n8n", - "config": { - "placeholder": "n8n" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "container_loglevel", - "type": "enum", - "title": "Log Level", - "required": false, - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "", - "needs": [ - "traefik_enabled=true", - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "database_password_secret_name", - "type": "str", - "title": "DB Password Secret", - "required": false, - "default": "", - "needs": [ - "database_enabled=true" - ], - "config": { - "placeholder": "n8n-db-password" - } - }, - { - "name": "encryption_key_secret_name", - "type": "str", - "title": "Encryption Key Secret", - "required": false, - "default": "", - "config": { - "placeholder": "n8n-encryption-key" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "", - "needs": [ - "traefik_enabled=true", - "traefik_tls_enabled=false" - ], - "config": { - "placeholder": "web" - } - } - ] - }, - { - "title": "Queue Mode", - "name": "queue", - "toggle": "queue_enabled", - "items": [ - { - "name": "queue_enabled", - "type": "bool", - "title": "Queue Mode", - "required": false, - "default": false, - "description": "Enable queue mode (requires Redis)" - }, - { - "name": "queue_redis_external", - "type": "bool", - "title": "External Redis", - "required": false, - "default": false, - "needs": [ - "queue_enabled=true" - ] - }, - { - "name": "queue_redis_host", - "type": "str", - "title": "Redis host", - "required": false, - "default": "redis", - "needs": [ - "queue_enabled=true" - ], - "config": { - "placeholder": "redis" - } - }, - { - "name": "queue_redis_port", - "type": "int", - "title": "Redis port", - "required": false, - "default": 6379, - "needs": [ - "queue_enabled=true" - ], - "config": { - "placeholder": "6379" - } - }, - { - "name": "queue_embedded_worker", - "type": "bool", - "title": "Embedded Worker", - "required": false, - "default": false, - "description": "Include embedded worker in this deployment", - "needs": [ - "queue_enabled=true" - ] - } - ] - }, - { - "title": "Database", - "name": "database", - "toggle": "database_enabled", - "items": [ - { - "name": "database_enabled", - "type": "bool", - "title": "External Database", - "required": false, - "default": false - }, - { - "name": "database_type", - "type": "enum", - "title": "Database type", - "required": false, - "default": "postgres", - "needs": [ - "database_enabled=true" - ], - "config": { - "options": [ - "postgres", - "mysql" - ] - } - }, - { - "name": "database_host", - "type": "str", - "title": "Database host", - "required": false, - "default": "postgres", - "needs": [ - "database_enabled=true" - ], - "config": { - "placeholder": "postgres" - } - }, - { - "name": "database_port", - "type": "int", - "title": "Database port", - "required": false, - "default": 5432, - "needs": [ - "database_enabled=true" - ], - "config": { - "placeholder": "5432" - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database name", - "required": false, - "default": "n8n", - "needs": [ - "database_enabled=true" - ], - "config": { - "placeholder": "n8n" - } - }, - { - "name": "database_user", - "type": "str", - "title": "Database username", - "required": false, - "default": "n8n", - "needs": [ - "database_enabled=true" - ], - "config": { - "placeholder": "n8n" - } - }, - { - "name": "database_password", - "type": "secret", - "title": "Database password", - "required": false, - "needs": [ - "database_enabled=true" - ] - } - ] - }, - { - "title": "Security", - "name": "security", - "items": [ - { - "name": "encryption_key", - "type": "secret", - "title": "Encryption Key", - "required": false, - "config": { - "autogenerated": { - "length": 64 - } - } - }, - { - "name": "proxy_hops", - "type": "int", - "title": "Proxy Hops", - "required": false, - "default": 1, - "description": "Number of proxy hops (X-Forwarded-For)", - "config": { - "placeholder": "1", - "unit": "hops" - } - } - ] - }, - { - "title": "Webhooks", - "name": "webhooks", - "items": [ - { - "name": "webhook_url", - "type": "str", - "title": "Webhook base URL", - "required": false, - "default": "", - "description": "Base URL used for webhooks.", - "config": { - "placeholder": "https://n8n.home.arpa/" - } - } - ] - }, - { - "title": "Metrics", - "name": "metrics", - "toggle": "metrics_enabled", - "items": [ - { - "name": "metrics_enabled", - "type": "bool", - "title": "Prometheus", - "required": false, - "default": false - }, - { - "name": "metrics_detailed", - "type": "bool", - "title": "Detailed Metrics", - "required": false, - "default": false, - "description": "Include detailed metrics (workflows, nodes, API endpoints)", - "needs": [ - "metrics_enabled=true" - ] - } - ] - }, - { - "title": "Execution Settings", - "name": "execution", - "items": [ - { - "name": "execution_save_on_error", - "type": "enum", - "title": "Save on Error", - "required": false, - "default": "all", - "description": "Save execution data on error", - "config": { - "options": [ - "all", - "none" - ] - } - }, - { - "name": "execution_save_on_success", - "type": "enum", - "title": "Save on Success", - "required": false, - "default": "none", - "description": "Save execution data on success", - "config": { - "options": [ - "all", - "none" - ] - } - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_mode", - "type": "enum", - "title": "Network Mode", - "required": false, - "default": "bridge", - "config": { - "options": [ - "bridge", - "host" - ] - } - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "n8n_network", - "config": { - "placeholder": "n8n_network" - }, - "needs": [ - "network_mode=bridge" - ] - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false, - "needs": [ - "network_mode=bridge" - ] - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik Enabled", - "required": false, - "default": false, - "needs": [ - "network_mode=bridge" - ] - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "n8n" - } - }, - { - "name": "traefik_webhook_host", - "type": "str", - "title": "Webhook Host", - "required": false, - "default": "", - "description": "Separate hostname for webhooks (optional)", - "needs": [ - "traefik_enabled=true" - ], - "config": { - "placeholder": "hooks.n8n.home.arpa" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Traefik network name", - "required": false, - "default": "traefik", - "needs": [ - "traefik_enabled=true" - ], - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_network_external", - "type": "bool", - "title": "External Traefik Network", - "required": false, - "default": true, - "needs": [ - "traefik_enabled=true" - ] - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "External HTTP port", - "required": false, - "default": 5678, - "needs": [ - "traefik_enabled=false", - "network_mode=bridge" - ], - "config": { - "placeholder": "5678" - } - } - ] - }, - { - "title": "Swarm", - "name": "swarm", - "items": [ - { - "name": "swarm_replicas", - "type": "int", - "title": "Replicas", - "required": false, - "default": 1, - "config": { - "slider": true, - "min": 1, - "max": 20, - "step": 1, - "placeholder": "1", - "unit": "replicas" - } - }, - { - "name": "swarm_placement_host", - "type": "str", - "title": "Placement Host", - "required": false, - "default": "", - "description": "Target hostname for placement constraint", - "config": { - "placeholder": "swarm-node-1" - } - } - ] - }, - { - "title": "Traefik TLS", - "name": "traefik-tls", - "toggle": "traefik_tls_enabled", - "items": [ - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - } - ] - } - ] -} diff --git a/swarm/nextcloud/files/compose.yaml b/swarm/nextcloud/files/compose.yaml deleted file mode 100644 index 074c09e..0000000 --- a/swarm/nextcloud/files/compose.yaml +++ /dev/null @@ -1,147 +0,0 @@ -services: - << service_name >>-app: - image: docker.io/library/nextcloud:33.0.3-apache - environment: - - TZ=<< container_timezone >> - - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER} - - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD} - - REDIS_HOST=<< service_name >>-redis - <%- if database_type == 'mysql' %> - - MYSQL_PASSWORD=${MYSQL_PASSWORD} - - MYSQL_DATABASE=<< database_name >> - - MYSQL_USER=<< database_user >> - - MYSQL_HOST=<< service_name >>-db - <%- elif database_type == 'postgres' %> - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - - POSTGRES_DB=<< database_name >> - - POSTGRES_USER=<< database_user >> - - POSTGRES_HOST=<< service_name >>-db - <%- endif %> - <%- if traefik_enabled %> - - NEXTCLOUD_TRUSTED_DOMAINS=<< traefik_host >>.<< traefik_domain >> - - OVERWRITEHOST=<< traefik_host >>.<< traefik_domain >> - <%- if traefik_tls_enabled %> - - OVERWRITEPROTOCOL=https - <%- else %> - - OVERWRITEPROTOCOL=http - <%- endif %> - <%- endif %> - <%- if not traefik_enabled %> - ports: - - target: 80 - published: << ports_http >> - protocol: tcp - mode: host - <%- endif %> - volumes: - - nextcloud-data:/var/www/html - networks: - - << service_name >>-backend - <%- if traefik_enabled %> - - << traefik_network >> - <%- endif %> - depends_on: - - << service_name >>-db - - << service_name >>-redis - deploy: - replicas: << swarm_replicas >> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadbalancer.server.port=80 - - traefik.http.routers.<< service_name >>-web-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-web-http.entrypoints=<< traefik_entrypoint >> - - traefik.http.routers.<< service_name >>-web-http.service=<< service_name >>-web - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-web-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-web-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-web-https.tls=true - - traefik.http.routers.<< service_name >>-web-https.tls.certresolver=<< traefik_tls_certresolver >> - - traefik.http.routers.<< service_name >>-web-https.service=<< service_name >>-web - <%- endif %> - <%- endif %> - - << service_name >>-cron: - image: docker.io/library/nextcloud:33.0.3-apache - entrypoint: /cron.sh - environment: - - TZ=<< container_timezone >> - - REDIS_HOST=<< service_name >>-redis - <%- if database_type == 'mysql' %> - - MYSQL_PASSWORD=${MYSQL_PASSWORD} - - MYSQL_DATABASE=<< database_name >> - - MYSQL_USER=<< database_user >> - - MYSQL_HOST=<< service_name >>-db - <%- elif database_type == 'postgres' %> - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - - POSTGRES_DB=<< database_name >> - - POSTGRES_USER=<< database_user >> - - POSTGRES_HOST=<< service_name >>-db - <%- endif %> - volumes: - - nextcloud-data:/var/www/html - networks: - - << service_name >>-backend - depends_on: - - << service_name >>-app - deploy: - replicas: 1 - - << service_name >>-redis: - image: docker.io/library/redis:8-alpine - command: redis-server --appendonly yes - volumes: - - nextcloud-redis:/data - networks: - - << service_name >>-backend - deploy: - replicas: 1 - - << service_name >>-db: - <%- if database_type == 'mysql' %> - # See compatibility matrix for Nextcloud 31 - # https://docs.nextcloud.com/server/31/admin_manual/installation/system_requirements.html - image: docker.io/library/mariadb:10.11.16 - command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW - environment: - - TZ=<< container_timezone >> - - MYSQL_RANDOM_ROOT_PASSWORD=true - - MYSQL_PASSWORD=${MYSQL_PASSWORD} - - MYSQL_DATABASE=<< database_name >> - - MYSQL_USER=<< database_user >> - volumes: - - nextcloud-db:/var/lib/mysql - networks: - - << service_name >>-backend - <%- elif database_type == 'postgres' %> - image: docker.io/library/postgres:17.9 - environment: - - TZ=<< container_timezone >> - - POSTGRES_USER=<< database_user >> - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - - POSTGRES_DB=<< database_name >> - volumes: - - nextcloud-db:/var/lib/postgresql/data - networks: - - << service_name >>-backend - <%- endif %> - deploy: - replicas: 1 - -volumes: - nextcloud-data: - driver: local - nextcloud-db: - driver: local - nextcloud-redis: - driver: local - -networks: - << service_name >>-backend: - driver: overlay - attachable: true - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> diff --git a/swarm/nextcloud/template.json b/swarm/nextcloud/template.json deleted file mode 100644 index e2362a9..0000000 --- a/swarm/nextcloud/template.json +++ /dev/null @@ -1,239 +0,0 @@ -{ - "slug": "nextcloud-swarm", - "kind": "swarm", - "metadata": { - "name": "Nextcloud", - "description": "Self-hosted file sync and share platform, similar to Dropbox, with built-in collaboration tools, calendar, contacts, and extensible app ecosystem.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "nextcloud" - }, - "draft": false, - "version": { - "name": "33.0.3-apache", - "source_dep_name": "docker.io/library/nextcloud", - "source_dep_version": "33.0.3-apache" - } - }, - "variables": [ - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_type", - "type": "enum", - "title": "Database Type", - "required": false, - "default": "postgres", - "config": { - "options": [ - "postgres", - "mysql" - ] - } - }, - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": true - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": true - }, - { - "name": "database_password", - "type": "secret", - "title": "Database Password", - "required": true - } - ] - }, - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "nextcloud", - "config": { - "placeholder": "nextcloud" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": true, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "", - "needs": [ - "traefik_enabled=true" - ], - "config": { - "placeholder": "web" - } - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "", - "needs": [ - "traefik_enabled=true", - "traefik_tls_enabled=true" - ], - "config": { - "placeholder": "websecure" - } - }, - { - "name": "swarm_replicas", - "type": "int", - "title": "Swarm Replicas", - "required": false, - "default": 1, - "config": { - "slider": true, - "min": 1, - "max": 10, - "step": 1, - "placeholder": "1", - "unit": "replicas" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 80, - "config": { - "placeholder": "80" - }, - "needs": [ - "traefik_enabled=false" - ] - } - ] - }, - { - "title": "Nextcloud", - "name": "nextcloud", - "items": [ - { - "name": "admin_user", - "type": "str", - "title": "Nextcloud admin username", - "required": false, - "default": "admin", - "config": { - "placeholder": "admin" - } - }, - { - "name": "admin_password", - "type": "secret", - "title": "Nextcloud admin password", - "required": false, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "nextcloud" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - } - ] - }, - { - "title": "Traefik TLS", - "name": "traefik-tls", - "toggle": "traefik_tls_enabled", - "items": [ - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - } - ] - } - ] -} diff --git a/swarm/nginx/files/compose.yaml b/swarm/nginx/files/compose.yaml deleted file mode 100644 index 241d33c..0000000 --- a/swarm/nginx/files/compose.yaml +++ /dev/null @@ -1,53 +0,0 @@ -services: - << service_name >>: - image: docker.io/library/nginx:1.30.0-alpine - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if not traefik_enabled %> - ports: - - target: 80 - published: << ports_http >> - protocol: tcp - mode: host - - target: 443 - published: << ports_https >> - protocol: tcp - mode: host - <%- endif %> - # volumes: - # - ./config/default.conf:/etc/nginx/conf.d/default.conf:ro - # - ./data:/usr/share/nginx/html:ro - deploy: - mode: << swarm_placement_mode >> - <%- if swarm_placement_mode == 'replicated' %> - replicas: << swarm_replicas >> - <%- endif %> - <%- if swarm_placement_host %> - placement: - constraints: - - node.hostname == << swarm_placement_host >> - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadbalancer.server.port=80 - - traefik.http.routers.<< service_name >>-web-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-web-http.entrypoints=<< traefik_entrypoint >> - - traefik.http.routers.<< service_name >>-web-http.service=<< service_name >>-web - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-web-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-web-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-web-https.tls=true - - traefik.http.routers.<< service_name >>-web-https.tls.certresolver=<< traefik_tls_certresolver >> - - traefik.http.routers.<< service_name >>-web-https.service=<< service_name >>-web - <%- endif %> - <%- endif %> - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/swarm/nginx/files/config/default.conf b/swarm/nginx/files/config/default.conf deleted file mode 100644 index 9f61a69..0000000 --- a/swarm/nginx/files/config/default.conf +++ /dev/null @@ -1,9 +0,0 @@ -server { - listen 80; - server_name _; - location / { - root /usr/share/nginx/html; - index index.html; - access_log on; - } -} diff --git a/swarm/nginx/files/data/index.html b/swarm/nginx/files/data/index.html deleted file mode 100644 index 7a4b3a6..0000000 --- a/swarm/nginx/files/data/index.html +++ /dev/null @@ -1 +0,0 @@ -this is a test website... diff --git a/swarm/nginx/template.json b/swarm/nginx/template.json deleted file mode 100644 index 703a692..0000000 --- a/swarm/nginx/template.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "slug": "nginx-swarm", - "kind": "swarm", - "metadata": { - "name": "Nginx", - "description": "High-performance web server, reverse proxy, and load balancer known for stability, low resource consumption, and simple configuration.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "simple-icons", - "id": "nginx" - }, - "draft": false, - "version": { - "name": "1.30.0-alpine", - "source_dep_name": "docker.io/library/nginx", - "source_dep_version": "1.30.0-alpine" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "nginx", - "config": { - "placeholder": "nginx" - } - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_enabled=true", - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": false, - "default": "", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_enabled=true", - "traefik_tls_enabled=true" - ] - }, - { - "name": "swarm_replicas", - "type": "int", - "title": "Replicas", - "required": false, - "default": 1, - "description": "Number of replicas for Swarm mode", - "config": { - "slider": true, - "min": 1, - "max": 20, - "step": 1, - "placeholder": "1", - "unit": "replicas" - } - }, - { - "name": "swarm_placement_host", - "type": "str", - "title": "The placement host", - "required": false, - "default": "", - "config": { - "placeholder": "swarm-node-1" - } - }, - { - "name": "swarm_placement_mode", - "type": "enum", - "title": "The placement mode", - "required": false, - "default": "replicated", - "description": "Placement mode for the service.", - "config": { - "options": [ - "replicated", - "global" - ] - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 8080, - "config": { - "placeholder": "8080" - }, - "needs": [ - "traefik_enabled=false" - ] - }, - { - "name": "ports_https", - "type": "int", - "title": "HTTPS Port", - "required": false, - "default": 8443, - "config": { - "placeholder": "8443" - }, - "needs": [ - "traefik_enabled=false" - ] - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik Enabled", - "required": false, - "default": false - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": false, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "nginx" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "web", - "config": { - "placeholder": "web" - }, - "needs": [ - "traefik_enabled=true" - ] - } - ] - }, - { - "title": "Traefik TLS", - "toggle": "traefik_tls_enabled", - "name": "traefik-tls", - "items": [ - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - } - ] - } - ] -} diff --git a/swarm/pihole/files/.env.secret.webpassword b/swarm/pihole/files/.env.secret.webpassword deleted file mode 100644 index 541eb40..0000000 --- a/swarm/pihole/files/.env.secret.webpassword +++ /dev/null @@ -1 +0,0 @@ -<< webpassword >> diff --git a/swarm/pihole/files/compose.yaml b/swarm/pihole/files/compose.yaml deleted file mode 100644 index bca8106..0000000 --- a/swarm/pihole/files/compose.yaml +++ /dev/null @@ -1,157 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/pihole/pihole:2026.04.1 - - <%- if container_hostname %> - hostname: << container_hostname >> - <%- endif %> - - environment: - - TZ=<< container_timezone >> - - PIHOLE_UID=<< user_uid >> - - PIHOLE_GID=<< user_gid >> - - WEBPASSWORD_FILE=<< service_name >>_webpassword - <%- if network_mode == 'bridge' %> - - FTLCONF_dns_listeningMode=all - <%- endif %> - - <%- if network_mode == 'host' %> - network_mode: host - <%- elif network_mode == 'bridge' or network_mode == 'macvlan' or traefik_enabled %> - networks: - <%- if traefik_enabled %> - << traefik_network >>: - <%- endif %> - <%- if network_mode == 'macvlan' %> - << network_name >>: - ipv4_address: << network_macvlan_ipv4_address >> - <%- elif network_mode == 'bridge' %> - << network_name >>: - <%- endif %> - <%- endif %> - - <%- if network_mode == '' or network_mode == 'bridge' or traefik_enabled %> - ports: - <%- if not traefik_enabled %> - - target: 80 - published: << ports_http >> - protocol: tcp - mode: host - - target: 443 - published: << ports_https >> - protocol: tcp - mode: host - <%- endif %> - - target: 53 - published: << ports_dns >> - protocol: tcp - mode: host - - target: 53 - published: << ports_dns >> - protocol: udp - mode: host - - target: 123 - published: << ports_ntp >> - protocol: udp - mode: host - <%- endif %> - - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/dnsmasq:/etc/dnsmasq.d:rw - - << volume_mount_path >>/pihole:/etc/pihole:rw - <%- else %> - - << service_name >>-dnsmasq:/etc/dnsmasq.d - - << service_name >>-pihole:/etc/pihole - <%- endif %> - - cap_add: - - NET_ADMIN - - SYS_TIME - - secrets: - - << service_name >>_webpassword - - deploy: - mode: replicated - replicas: 1 - placement: - constraints: - - node.hostname == << swarm_placement_host >> - restart_policy: - condition: on-failure - - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>-web.loadBalancer.server.port=80 - - traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - - -secrets: - << service_name >>_webpassword: - file: ./.env.secret.webpassword - - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>-dnsmasq: - driver: local - << service_name >>-pihole: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>-dnsmasq: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/dnsmasq" - << service_name >>-pihole: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/pihole" -<%- endif %> - - -<%- if network_mode == 'bridge' or network_mode == 'macvlan' or traefik_enabled %> -networks: - <%- if network_mode == 'bridge' or network_mode == 'macvlan' %> - << network_name >>: - <%- if network_external %> - external: true - <%- else %> - <%- if network_mode == 'macvlan' %> - driver: macvlan - driver_opts: - parent: << network_macvlan_parent_interface >> - ipam: - config: - - subnet: << network_macvlan_subnet >> - gateway: << network_macvlan_gateway >> - name: << network_name >> - <%- else %> - driver: overlay - attachable: true - <%- endif %> - <%- endif %> - <%- endif %> - <%- if traefik_enabled %> - << traefik_network >>: - external: true - <%- endif %> -<%- endif %> diff --git a/swarm/pihole/template.json b/swarm/pihole/template.json deleted file mode 100644 index f965898..0000000 --- a/swarm/pihole/template.json +++ /dev/null @@ -1,407 +0,0 @@ -{ - "slug": "pihole-swarm", - "kind": "swarm", - "metadata": { - "name": "Pihole", - "description": "Network-wide DNS-based ad and tracker blocker that acts as a DNS sinkhole. Filters content at the DNS level for all devices on your network.", - "tags": [ - "traefik", - "network", - "volume" - ], - "icon": { - "provider": "selfhst", - "id": "pi-hole" - }, - "draft": false, - "version": { - "name": "2026.04.1", - "source_dep_name": "docker.io/pihole/pihole", - "source_dep_version": "2026.04.1" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "pihole", - "config": { - "placeholder": "pihole" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": true, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "user_uid", - "type": "int", - "title": "User Uid", - "required": false, - "default": 1000, - "config": { - "placeholder": "1000" - } - }, - { - "name": "user_gid", - "type": "int", - "title": "User Gid", - "required": false, - "default": 1000, - "config": { - "placeholder": "1000" - } - } - ] - }, - { - "title": "Admin Settings", - "name": "admin-settings", - "items": [ - { - "name": "webpassword", - "type": "secret", - "title": "Admin Password", - "required": false, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_dns", - "type": "int", - "title": "DNS Port", - "required": true, - "default": 53, - "config": { - "placeholder": "53" - } - }, - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 80, - "config": { - "placeholder": "80" - } - }, - { - "name": "ports_https", - "type": "int", - "title": "HTTPS Port", - "required": false, - "default": 443, - "config": { - "placeholder": "443" - } - }, - { - "name": "ports_ntp", - "type": "int", - "title": "External NTP port", - "required": true, - "default": 123, - "config": { - "placeholder": "123" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "pihole" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "web", - "config": { - "placeholder": "web" - }, - "needs": [ - "traefik_enabled=true" - ] - } - ] - }, - { - "title": "Traefik TLS", - "name": "traefik-tls", - "toggle": "traefik_tls_enabled", - "items": [ - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_mode", - "type": "enum", - "title": "Network Mode", - "required": false, - "default": "bridge", - "config": { - "options": [ - "bridge", - "host", - "macvlan" - ] - } - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "pihole_network", - "config": { - "placeholder": "pihole_network" - } - }, - { - "name": "network_macvlan_ipv4_address", - "type": "str", - "title": "IPv4 Address", - "required": true, - "default": "IP_ADDRESS", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "IP_ADDRESS" - } - }, - { - "name": "network_macvlan_parent_interface", - "type": "str", - "title": "Parent Interface", - "required": true, - "default": "eth0", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "eth0" - } - }, - { - "name": "network_macvlan_subnet", - "type": "str", - "title": "Subnet", - "required": true, - "default": "IP_RANGE", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "IP_RANGE" - } - }, - { - "name": "network_macvlan_gateway", - "type": "str", - "title": "Gateway", - "required": true, - "default": "GATEWAY", - "needs": [ - "network_mode=macvlan" - ], - "config": { - "placeholder": "GATEWAY" - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - } - ] - }, - { - "title": "Docker Swarm", - "name": "swarm", - "items": [ - { - "name": "swarm_placement_host", - "type": "str", - "title": "Swarm Placement Host", - "required": true, - "config": { - "placeholder": "swarm-node-1" - } - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/data", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/data" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": true, - "default": "NFS_SERVER", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "NFS_SERVER" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": true, - "default": "/export", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/export" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": true, - "default": "rw,nolock,soft", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw,nolock,soft" - } - } - ] - } - ] -} diff --git a/swarm/portainer/files/compose.yaml b/swarm/portainer/files/compose.yaml deleted file mode 100644 index 53fd3ca..0000000 --- a/swarm/portainer/files/compose.yaml +++ /dev/null @@ -1,68 +0,0 @@ -services: - << service_name >>: - image: docker.io/portainer/portainer-ce:2.41.0-alpine - environment: - - TZ=<< container_timezone >> - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - ports: - <%- if not traefik_enabled %> - - "<< ports_http >>:9000" - - "<< ports_https >>:9443" - <%- endif %> - - "<< ports_edge >>:8000" - volumes: - - /run/docker.sock:/var/run/docker.sock - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>/data:/data - <%- else %> - - << service_name >>_data:/data - <%- endif %> - deploy: - mode: replicated - replicas: 1 - <%- if swarm_placement_host %> - placement: - constraints: - - node.hostname == << swarm_placement_host >> - <%- endif %> - restart_policy: - condition: on-failure - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>_web.loadBalancer.server.port=9000 - - traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web - - traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>_https.tls=true - - traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>_data: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>_data: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>/data" -<%- endif %> - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/swarm/portainer/template.json b/swarm/portainer/template.json deleted file mode 100644 index 3bfacbb..0000000 --- a/swarm/portainer/template.json +++ /dev/null @@ -1,266 +0,0 @@ -{ - "slug": "portainer", - "kind": "swarm", - "metadata": { - "name": "Portainer", - "description": "Web-based management UI for Docker and Kubernetes environments. Simplifies container, image, network, and volume management through an intuitive interface.", - "tags": [ - "traefik", - "volumes" - ], - "icon": { - "provider": "selfhst", - "id": "portainer" - }, - "draft": false, - "version": { - "name": "2.41.0-alpine", - "source_dep_name": "docker.io/portainer/portainer-ce", - "source_dep_version": "2.41.0-alpine" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "portainer", - "config": { - "placeholder": "portainer" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": true, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "swarm_placement_host", - "type": "str", - "title": "Placement Host", - "required": false, - "default": "", - "description": "Target hostname for placement constraint", - "config": { - "placeholder": "swarm-node-1" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 9000, - "config": { - "placeholder": "9000" - }, - "needs": [ - "traefik_enabled=false" - ] - }, - { - "name": "ports_https", - "type": "int", - "title": "HTTPS Port", - "required": false, - "default": 9443, - "config": { - "placeholder": "9443" - }, - "needs": [ - "traefik_enabled=false" - ] - }, - { - "name": "ports_edge", - "type": "int", - "title": "Edge Port", - "required": true, - "default": 8000, - "config": { - "placeholder": "8000" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "portainer" - } - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik", - "required": false, - "default": false - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "web", - "config": { - "placeholder": "web" - }, - "needs": [ - "traefik_enabled=true" - ] - } - ] - }, - { - "title": "Traefik TLS", - "name": "traefik-tls", - "toggle": "traefik_tls_enabled", - "items": [ - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": true, - "default": "cloudflare", - "config": { - "placeholder": "cloudflare" - } - }, - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "websecure", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Volume Mount Path", - "required": true, - "default": "/data", - "needs": [ - "volume_mode=mount" - ], - "config": { - "placeholder": "/data" - } - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "Volume Nfs Server", - "required": true, - "default": "NFS_SERVER", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "NFS_SERVER" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "Volume Nfs Path", - "required": true, - "default": "/export", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/export" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "Volume Nfs Options", - "required": true, - "default": "rw,nolock,soft", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "rw,nolock,soft" - } - } - ] - } - ] -} diff --git a/swarm/postgres/files/compose.yaml b/swarm/postgres/files/compose.yaml deleted file mode 100644 index 3b0cc01..0000000 --- a/swarm/postgres/files/compose.yaml +++ /dev/null @@ -1,71 +0,0 @@ -services: - << service_name >>: - image: docker.io/library/postgres:18.3 - hostname: << container_hostname >> - environment: - - POSTGRES_INITDB_ARGS=<< postgres_initdb_args >> - <%- if postgres_host_auth_method %> - - POSTGRES_HOST_AUTH_METHOD=<< postgres_host_auth_method >> - <%- endif %> - - POSTGRES_USER=<< database_user >> - - POSTGRES_PASSWORD=<< database_password >> - - POSTGRES_DB=<< database_name >> - - TZ=<< container_timezone >> - <%- if network_mode == 'bridge' or network_mode == '' %> - networks: - << network_name >>: - <%- endif %> - <%- if network_mode == 'bridge' or network_mode == '' %> - ports: - - target: 5432 - published: << ports_postgres >> - protocol: tcp - mode: host - <%- endif %> - volumes: - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>:/var/lib/postgresql:rw - <%- else %> - - << service_name >>-data:/var/lib/postgresql - <%- endif %> - healthcheck: - test: ["CMD-SHELL", "pg_isready -U << database_user >>"] - start_period: 30s - interval: 10s - timeout: 10s - retries: 5 - deploy: - mode: replicated - replicas: 1 - <%- if swarm_placement_host %> - placement: - constraints: - - node.hostname == << swarm_placement_host >> - <%- endif %> - restart_policy: - condition: on-failure - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>-data: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>-data: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>" -<%- endif %> - -<%- if network_mode == 'bridge' or network_mode == '' %> -networks: - << network_name >>: - <%- if network_external %> - external: true - <%- else %> - driver: overlay - attachable: true - <%- endif %> -<%- endif %> diff --git a/swarm/postgres/template.json b/swarm/postgres/template.json deleted file mode 100644 index c897209..0000000 --- a/swarm/postgres/template.json +++ /dev/null @@ -1,238 +0,0 @@ -{ - "slug": "postgres-swarm", - "kind": "swarm", - "metadata": { - "name": "PostgreSQL", - "description": "Powerful open-source object-relational database system with over 35 years of active development, known for reliability, feature robustness, and performance.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "postgresql" - }, - "draft": false, - "version": { - "name": "18.3", - "source_dep_name": "docker.io/library/postgres", - "source_dep_version": "18.3" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "postgres", - "config": { - "placeholder": "postgres" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": true - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": true, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "postgres_initdb_args", - "type": "str", - "title": "Postgres Initdb Args", - "required": true, - "default": "", - "config": { - "placeholder": "--data-checksums" - } - }, - { - "name": "postgres_host_auth_method", - "type": "str", - "title": "Host Auth", - "required": false, - "default": "", - "config": { - "placeholder": "scram-sha-256" - } - }, - { - "name": "swarm_placement_host", - "type": "str", - "title": "The placement host", - "required": false, - "default": "", - "config": { - "placeholder": "swarm-node-1" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_postgres", - "type": "int", - "title": "PostgreSQL port", - "required": false, - "default": 5432, - "config": { - "placeholder": "5432" - }, - "needs": [ - "network_mode=bridge" - ] - } - ] - }, - { - "title": "Network", - "name": "network", - "items": [ - { - "name": "network_mode", - "type": "enum", - "title": "Network Mode", - "required": false, - "default": "bridge", - "config": { - "options": [ - "bridge", - "host" - ] - } - }, - { - "name": "network_name", - "type": "str", - "title": "Network Name", - "required": false, - "default": "postgres_network", - "config": { - "placeholder": "postgres_network" - } - }, - { - "name": "network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - } - ] - }, - { - "title": "Volume", - "name": "volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": false, - "default": "local", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Bind Path", - "required": false, - "default": "/var/lib/postgresql/data", - "config": { - "placeholder": "/var/lib/postgresql/data" - }, - "needs": [ - "volume_mode=mount" - ] - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "NFS Server", - "required": false, - "default": "", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "192.0.2.1" - } - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "NFS Path", - "required": false, - "default": "", - "needs": [ - "volume_mode=nfs" - ], - "config": { - "placeholder": "/path/to/export" - } - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "NFS Options", - "required": false, - "default": "rw", - "config": { - "placeholder": "rw" - }, - "needs": [ - "volume_mode=nfs" - ] - } - ] - }, - { - "title": "Database", - "name": "database", - "items": [ - { - "name": "database_name", - "type": "str", - "title": "Database Name", - "required": true - }, - { - "name": "database_user", - "type": "str", - "title": "Database User", - "required": true - }, - { - "name": "database_password", - "type": "secret", - "title": "Database password", - "required": true, - "config": { - "autogenerated": { - "length": 32 - } - } - } - ] - } - ] -} diff --git a/swarm/renovate/files/compose.yaml b/swarm/renovate/files/compose.yaml deleted file mode 100644 index eef945f..0000000 --- a/swarm/renovate/files/compose.yaml +++ /dev/null @@ -1,64 +0,0 @@ ---- -services: - << service_name >>: - image: ghcr.io/mend/renovate-ce:14.5.0-full - hostname: << container_hostname >> - <%- if traefik_enabled %> - networks: - << traefik_network >>: - <%- endif %> - <%- if not traefik_enabled %> - ports: - - "<< ports_http >>:8080" - <%- endif %> - environment: - - MEND_RNV_ACCEPT_TOS=y - - MEND_RNV_LICENSE_KEY=<< license_key >> - - MEND_RNV_PLATFORM=<< renovate_platform >> - - MEND_RNV_ENDPOINT=<< renovate_endpoint >> - - MEND_RNV_GITLAB_PAT=<< git_token >> - - MEND_RNV_WEBHOOK_SECRET=<< webhook_secret >> - - MEND_RNV_SERVER_PORT=8080 - - RENOVATE_AUTODISCOVER=<< renovate_autodiscover | lower >> - <%- if container_timezone %> - - TZ=<< container_timezone >> - <%- endif %> - <%- if container_loglevel %> - - LOG_LEVEL=<< container_loglevel >> - <%- endif %> - deploy: - mode: << swarm_placement_mode >> - <%- if swarm_placement_mode == 'replicated' %> - replicas: << swarm_replicas >> - <%- endif %> - <%- if swarm_placement_host %> - placement: - constraints: - - node.hostname == << swarm_placement_host >> - <%- endif %> - <%- if traefik_enabled %> - labels: - - traefik.enable=true - - traefik.docker.network=<< traefik_network >> - - traefik.http.services.<< service_name >>.loadbalancer.server.port=8080 - - traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >> - <%- if traefik_tls_enabled %> - - traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`) - - traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >> - - traefik.http.routers.<< service_name >>-https.tls=true - - traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >> - <%- endif %> - <%- endif %> - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - -<%- if traefik_enabled %> -networks: - << traefik_network >>: - external: true -<%- endif %> diff --git a/swarm/renovate/template.json b/swarm/renovate/template.json deleted file mode 100644 index 5362b2c..0000000 --- a/swarm/renovate/template.json +++ /dev/null @@ -1,301 +0,0 @@ -{ - "slug": "renovate-swarm", - "kind": "swarm", - "metadata": { - "name": "Renovate", - "description": "Self-hosted Mend Renovate CE worker for GitLab that scans repositories and opens dependency update merge requests.", - "tags": [ - "traefik" - ], - "icon": { - "provider": "selfhst", - "id": "mend-renovate" - }, - "draft": false, - "version": { - "name": "14.5.0-full", - "source_dep_name": "ghcr.io/mend/renovate-ce", - "source_dep_version": "14.5.0-full" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "renovate", - "config": { - "placeholder": "renovate" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false, - "default": "renovate", - "config": { - "placeholder": "renovate" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": false, - "default": "UTC", - "config": { - "placeholder": "UTC" - } - }, - { - "name": "container_loglevel", - "type": "enum", - "title": "Log Level", - "required": false, - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - }, - { - "name": "traefik_tls_certresolver", - "type": "str", - "title": "Cert Resolver", - "required": false, - "default": "", - "config": { - "placeholder": "cloudflare" - }, - "needs": [ - "traefik_enabled=true", - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_entrypoint", - "type": "str", - "title": "Traefik Tls Entrypoint", - "required": false, - "default": "", - "config": { - "placeholder": "websecure" - }, - "needs": [ - "traefik_enabled=true", - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "title": "Renovate Settings", - "name": "renovate-settings", - "items": [ - { - "name": "renovate_platform", - "type": "enum", - "title": "Git Platform", - "required": false, - "default": "gitlab", - "config": { - "options": [ - "gitlab" - ] - } - }, - { - "name": "renovate_endpoint", - "type": "str", - "title": "Git Endpoint", - "required": false, - "default": "https://gitlab.com/api/v4/", - "config": { - "placeholder": "https://gitlab.com/api/v4/" - } - }, - { - "name": "renovate_autodiscover", - "type": "bool", - "title": "Auto-discover repositories", - "required": false, - "default": false - } - ] - }, - { - "title": "Authentication", - "name": "authentication", - "items": [ - { - "name": "git_token", - "type": "secret", - "title": "Git Token", - "required": true - }, - { - "name": "license_key", - "type": "secret", - "title": "License Key", - "required": true, - "description": "Mend Renovate CE License Key" - }, - { - "name": "webhook_secret", - "type": "secret", - "title": "Webhook Secret", - "required": false, - "default": "renovate", - "description": "Webhook secret for platform integration", - "config": { - "placeholder": "renovate" - } - } - ] - }, - { - "title": "Ports", - "name": "ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": false, - "default": 8080, - "config": { - "placeholder": "8080" - } - } - ] - }, - { - "title": "Traefik", - "name": "traefik", - "toggle": "traefik_enabled", - "items": [ - { - "name": "traefik_enabled", - "type": "bool", - "title": "Traefik Enabled", - "required": false, - "default": false - }, - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": false, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_host", - "type": "str", - "title": "Host", - "required": true, - "config": { - "placeholder": "renovate" - } - }, - { - "name": "traefik_domain", - "type": "str", - "title": "Domain", - "required": true, - "config": { - "placeholder": "home.arpa" - } - }, - { - "name": "traefik_entrypoint", - "type": "str", - "title": "Traefik Entrypoint", - "required": false, - "default": "web", - "config": { - "placeholder": "web" - }, - "needs": [ - "traefik_enabled=true" - ] - } - ] - }, - { - "title": "Traefik TLS", - "toggle": "traefik_tls_enabled", - "name": "traefik-tls", - "items": [ - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - } - ] - }, - { - "title": "Swarm", - "name": "swarm", - "items": [ - { - "name": "swarm_placement_mode", - "type": "enum", - "title": "Swarm Placement Mode", - "required": false, - "default": "replicated", - "config": { - "options": [ - "replicated", - "global" - ] - } - }, - { - "name": "swarm_replicas", - "type": "int", - "title": "Swarm Replicas", - "required": false, - "default": 1, - "needs": [ - "swarm_placement_mode=replicated" - ], - "config": { - "slider": true, - "min": 1, - "max": 10, - "step": 1, - "placeholder": "1", - "unit": "replicas" - } - }, - { - "name": "swarm_placement_host", - "type": "str", - "title": "Swarm Placement Host", - "required": false, - "default": "", - "needs": [ - "swarm_placement_mode=replicated" - ], - "config": { - "placeholder": "swarm-node-1" - } - } - ] - } - ] -} diff --git a/swarm/traefik/files/.env.secret.aws_credentials b/swarm/traefik/files/.env.secret.aws_credentials deleted file mode 100644 index 055a929..0000000 --- a/swarm/traefik/files/.env.secret.aws_credentials +++ /dev/null @@ -1,5 +0,0 @@ -<%- if traefik_tls_certresolver == 'route53' %> -[default] -aws_access_key_id = << traefik_tls_acme_token >> -aws_secret_access_key = << traefik_tls_acme_secret_key >> -<%- endif %> diff --git a/swarm/traefik/files/.env.secret.consumer_key b/swarm/traefik/files/.env.secret.consumer_key deleted file mode 100644 index 300f414..0000000 --- a/swarm/traefik/files/.env.secret.consumer_key +++ /dev/null @@ -1 +0,0 @@ -<%- if traefik_tls_acme_consumer_key %><< traefik_tls_acme_consumer_key >><%- endif %> diff --git a/swarm/traefik/files/.env.secret.token b/swarm/traefik/files/.env.secret.token deleted file mode 100644 index 8432029..0000000 --- a/swarm/traefik/files/.env.secret.token +++ /dev/null @@ -1 +0,0 @@ -<%- if traefik_tls_acme_token and traefik_tls_certresolver != 'route53' %><< traefik_tls_acme_token >><%- endif %> diff --git a/swarm/traefik/files/.env.secret.token_key b/swarm/traefik/files/.env.secret.token_key deleted file mode 100644 index 8519c6a..0000000 --- a/swarm/traefik/files/.env.secret.token_key +++ /dev/null @@ -1 +0,0 @@ -<%- if traefik_tls_acme_secret_key and traefik_tls_certresolver != 'route53' %><< traefik_tls_acme_secret_key >><%- endif %> diff --git a/swarm/traefik/files/compose.yaml b/swarm/traefik/files/compose.yaml deleted file mode 100644 index 67f61f6..0000000 --- a/swarm/traefik/files/compose.yaml +++ /dev/null @@ -1,189 +0,0 @@ ---- -services: - << service_name >>: - image: docker.io/library/traefik:v3.6.15 - command: - - "--global.checkNewVersion=false" - - "--global.sendAnonymousUsage=false" - - "--log.level=<< container_loglevel >>" - - "--ping=true" - - "--ping.entryPoint=ping" - <%- if accesslog_enabled %> - - "--accesslog=true" - <%- endif %> - <%- if dashboard_enabled %> - - "--api.dashboard=true" - - "--api.insecure=true" - <%- endif %> - <%- if prometheus_enabled %> - - "--metrics.prometheus=true" - - "--metrics.prometheus.entryPoint=metrics" - - "--metrics.prometheus.addRoutersLabels=true" - <%- endif %> - - "--entrypoints.ping.address=:8082" - <%- if prometheus_enabled %> - - "--entrypoints.metrics.address=:9090" - <%- endif %> - - "--entrypoints.web.address=:80" - - "--entrypoints.web.http.encodedCharacters.allowEncodedSlash=true" - <%- if traefik_tls_enabled and traefik_tls_redirect %> - - "--entrypoints.web.http.redirections.entryPoint.to=websecure" - - "--entrypoints.web.http.redirections.entryPoint.scheme=https" - <%- endif %> - <%- if traefik_tls_enabled %> - - "--entrypoints.websecure.address=:443" - - "--entrypoints.websecure.http.encodedCharacters.allowEncodedSlash=true" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.email=<< traefik_tls_acme_email >>" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.caServer=https://acme-v02.api.letsencrypt.org/directory" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.storage=/var/traefik/certs/acme.json" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.dnsChallenge.provider=<< traefik_tls_certresolver >>" - - "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.dnsChallenge.resolvers=1.1.1.1:53,8.8.8.8:53" - - "--tls.options.default.minVersion=<< traefik_tls_min_version >>" - <%- endif %> - <%- if traefik_tls_secure_ciphers %> - - "--tls.options.default.cipherSuites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256" - <%- endif %> - <%- if traefik_tls_skipverify %> - - "--serversTransport.insecureSkipVerify=true" - <%- endif %> - - "--providers.swarm.endpoint=unix:///var/run/docker.sock" - - "--providers.swarm.exposedByDefault=false" - - "--providers.swarm.network=<< traefik_network >>" - ports: - - target: 80 - published: << ports_http >> - protocol: tcp - mode: << ports_publish_mode >> - - target: 443 - published: << ports_https >> - protocol: tcp - mode: << ports_publish_mode >> - <%- if dashboard_enabled %> - - target: 8080 - published: << ports_dashboard >> - protocol: tcp - mode: << ports_publish_mode >> - <%- endif %> - <%- if prometheus_enabled %> - - target: 9090 - published: << ports_metrics >> - protocol: tcp - mode: << ports_publish_mode >> - <%- endif %> - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - <%- if volume_mode == 'mount' %> - - << volume_mount_path >>:/var/traefik/certs:rw - <%- elif volume_mode == 'local' or volume_mode == 'nfs' %> - - << service_name >>_certs:/var/traefik/certs:rw - <%- endif %> - environment: - - TZ=<< container_timezone >> - <%- if traefik_tls_enabled %> - <%- if traefik_tls_certresolver == 'cloudflare' %> - - CF_DNS_API_TOKEN_FILE=/run/secrets/<< service_name >>_token - <%- elif traefik_tls_certresolver == 'porkbun' %> - - PORKBUN_API_KEY_FILE=/run/secrets/<< service_name >>_token - - PORKBUN_SECRET_API_KEY_FILE=/run/secrets/<< service_name >>_token_key - <%- elif traefik_tls_certresolver == 'route53' %> - - AWS_SHARED_CREDENTIALS_FILE=/run/secrets/<< service_name >>_aws_credentials - - AWS_REGION=<< traefik_tls_acme_region >> - <%- elif traefik_tls_certresolver == 'digitalocean' %> - - DO_AUTH_TOKEN_FILE=/run/secrets/<< service_name >>_token - <%- elif traefik_tls_certresolver == 'godaddy' %> - - GODADDY_API_KEY_FILE=/run/secrets/<< service_name >>_token - - GODADDY_API_SECRET_FILE=/run/secrets/<< service_name >>_token_key - <%- elif traefik_tls_certresolver == 'azure' %> - - AZURE_CLIENT_ID_FILE=/run/secrets/<< service_name >>_token - - AZURE_CLIENT_SECRET_FILE=/run/secrets/<< service_name >>_token_key - - AZURE_TENANT_ID=<< traefik_tls_acme_tenant_id >> - - AZURE_SUBSCRIPTION_ID=<< traefik_tls_acme_subscription_id >> - - AZURE_RESOURCE_GROUP=<< traefik_tls_acme_resource_group >> - <%- elif traefik_tls_certresolver == 'namecheap' %> - - NAMECHEAP_API_KEY_FILE=/run/secrets/<< service_name >>_token - - NAMECHEAP_API_USER=<< traefik_tls_acme_username >> - <%- elif traefik_tls_certresolver == 'ovh' %> - - OVH_ENDPOINT=<< traefik_tls_acme_endpoint >> - - OVH_APPLICATION_KEY_FILE=/run/secrets/<< service_name >>_token - - OVH_APPLICATION_SECRET_FILE=/run/secrets/<< service_name >>_token_key - - OVH_CONSUMER_KEY_FILE=/run/secrets/<< service_name >>_consumer_key - <%- endif %> - <%- endif %> - healthcheck: - test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8082/ping"] - interval: 30s - timeout: 5s - retries: 3 - start_period: 10s - networks: - - << traefik_network >> - <%- if traefik_tls_enabled %> - secrets: - <%- if traefik_tls_certresolver == 'route53' %> - - << service_name >>_aws_credentials - <%- else %> - - << service_name >>_token - <%- if traefik_tls_certresolver == 'azure' or traefik_tls_certresolver == 'godaddy' or traefik_tls_certresolver == 'ovh' or traefik_tls_certresolver == 'porkbun' %> - - << service_name >>_token_key - <%- endif %> - <%- if traefik_tls_certresolver == 'ovh' %> - - << service_name >>_consumer_key - <%- endif %> - <%- endif %> - <%- endif %> - deploy: - mode: << swarm_placement_mode >> - <%- if swarm_placement_mode == 'replicated' %> - replicas: << swarm_replicas >> - <%- endif %> - placement: - constraints: - - node.role == manager - <%- if swarm_placement_host %> - - node.hostname == << swarm_placement_host >> - <%- endif %> - restart_policy: - condition: any - -<%- if traefik_tls_enabled %> -secrets: - <%- if traefik_tls_certresolver == 'route53' %> - << service_name >>_aws_credentials: - file: ./.env.secret.aws_credentials - <%- else %> - << service_name >>_token: - file: ./.env.secret.token - <%- if traefik_tls_certresolver == 'azure' or traefik_tls_certresolver == 'godaddy' or traefik_tls_certresolver == 'ovh' or traefik_tls_certresolver == 'porkbun' %> - << service_name >>_token_key: - file: ./.env.secret.token_key - <%- endif %> - <%- if traefik_tls_certresolver == 'ovh' %> - << service_name >>_consumer_key: - file: ./.env.secret.consumer_key - <%- endif %> - <%- endif %> -<%- endif %> - -networks: - << traefik_network >>: - <%- if traefik_network_external %> - external: true - <%- else %> - driver: overlay - attachable: true - name: << traefik_network >> - <%- endif %> - -<%- if volume_mode == 'local' %> -volumes: - << service_name >>_certs: - driver: local -<%- elif volume_mode == 'nfs' %> -volumes: - << service_name >>_certs: - driver: local - driver_opts: - type: nfs - o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >> - device: ":<< volume_nfs_path >>" -<%- endif %> diff --git a/swarm/traefik/template.json b/swarm/traefik/template.json deleted file mode 100644 index 2f056e7..0000000 --- a/swarm/traefik/template.json +++ /dev/null @@ -1,513 +0,0 @@ -{ - "slug": "traefik-swarm", - "kind": "swarm", - "metadata": { - "name": "Traefik", - "description": "Swarm-only Traefik reverse proxy and load balancer with Docker Swarm service discovery, optional Let's Encrypt DNS challenge TLS, dashboard, and metrics support. For Traefik-managed ACME certificates, run a single replica; Traefik OSS ACME storage is not safe for active-active writes from multiple instances. References: Traefik Swarm provider https://doc.traefik.io/traefik/providers/swarm/ and Traefik ACME storage notes https://doc.traefik.io/traefik/https/acme/.", - "tags": [ - "reverse-proxy", - "traefik" - ], - "icon": { - "provider": "devicon", - "id": "traefikproxy", - "color": "sky" - }, - "draft": false, - "version": { - "name": "v3.6.15", - "source_dep_name": "docker.io/library/traefik", - "source_dep_version": "v3.6.15" - } - }, - "variables": [ - { - "name": "general", - "title": "General", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "traefik", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": true, - "default": "UTC", - "config": { - "placeholder": "UTC" - } - }, - { - "name": "container_loglevel", - "type": "enum", - "title": "Log Level", - "required": false, - "default": "info", - "description": "Traefik log level.", - "config": { - "options": [ - "debug", - "info", - "warn", - "error" - ] - } - } - ] - }, - { - "name": "ports", - "title": "Ports", - "items": [ - { - "name": "ports_http", - "type": "int", - "title": "HTTP Port", - "required": true, - "default": 80, - "description": "Published port for the web entrypoint.", - "config": { - "placeholder": "80" - } - }, - { - "name": "ports_https", - "type": "int", - "title": "HTTPS Port", - "required": true, - "default": 443, - "description": "Published port for the websecure entrypoint.", - "config": { - "placeholder": "443" - } - }, - { - "name": "ports_dashboard", - "type": "int", - "title": "Dashboard Port", - "required": true, - "default": 8080, - "description": "Published port for the insecure dashboard/API.", - "config": { - "placeholder": "8080" - }, - "needs": [ - "dashboard_enabled=true" - ] - }, - { - "name": "ports_metrics", - "type": "int", - "title": "Metrics Port", - "required": true, - "default": 9090, - "description": "Published port for Prometheus metrics.", - "config": { - "placeholder": "9090" - }, - "needs": [ - "prometheus_enabled=true" - ] - }, - { - "name": "ports_publish_mode", - "type": "enum", - "title": "Publish Mode", - "required": true, - "default": "host", - "description": "Swarm port publishing mode. Host mode is recommended for edge proxies.", - "config": { - "options": [ - "host", - "ingress" - ] - } - } - ] - }, - { - "name": "traefik", - "title": "Traefik", - "items": [ - { - "name": "traefik_network", - "type": "str", - "title": "Network", - "required": true, - "default": "traefik", - "description": "Overlay network Traefik uses to reach routed Swarm services.", - "config": { - "placeholder": "traefik" - } - }, - { - "name": "traefik_network_external", - "type": "bool", - "title": "External Network", - "required": false, - "default": false - }, - { - "name": "accesslog_enabled", - "type": "bool", - "title": "Access Log", - "required": false, - "default": false - }, - { - "name": "dashboard_enabled", - "type": "bool", - "title": "Dashboard", - "required": false, - "default": false, - "description": "Enable the insecure Traefik dashboard/API. Do not expose this in production." - }, - { - "name": "prometheus_enabled", - "type": "bool", - "title": "Prometheus", - "required": false, - "default": false - } - ] - }, - { - "name": "traefik-tls", - "title": "Traefik TLS", - "toggle": "traefik_tls_enabled", - "items": [ - { - "name": "traefik_tls_enabled", - "type": "bool", - "title": "TLS", - "required": false, - "default": false - }, - { - "name": "traefik_tls_certresolver", - "type": "enum", - "title": "DNS Provider", - "required": true, - "default": "cloudflare", - "description": "ACME DNS challenge provider.", - "config": { - "options": [ - "cloudflare", - "porkbun", - "godaddy", - "digitalocean", - "route53", - "azure", - "namecheap", - "ovh" - ] - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_acme_email", - "type": "str", - "title": "ACME Email", - "required": true, - "description": "Email address used for ACME registration.", - "config": { - "placeholder": "admin@example.com" - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_acme_token", - "type": "secret", - "title": "API Token / ID", - "required": true, - "description": "DNS provider API token or access/client ID. Stored as a Swarm secret.", - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=azure,cloudflare,digitalocean,godaddy,namecheap,ovh,porkbun,route53" - ] - }, - { - "name": "traefik_tls_acme_secret_key", - "type": "secret", - "title": "Secret Key", - "required": true, - "description": "DNS provider secret key. Stored as a Swarm secret.", - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=azure,godaddy,ovh,porkbun,route53" - ] - }, - { - "name": "traefik_tls_acme_consumer_key", - "type": "secret", - "title": "Consumer Key", - "required": true, - "description": "OVH consumer key. Stored as a Swarm secret.", - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=ovh" - ] - }, - { - "name": "traefik_tls_acme_username", - "type": "str", - "title": "Username", - "required": true, - "description": "Namecheap API username.", - "config": { - "placeholder": "namecheap-user" - }, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=namecheap" - ] - }, - { - "name": "traefik_tls_acme_region", - "type": "str", - "title": "AWS Region", - "required": true, - "default": "us-east-1", - "description": "AWS region for Route53.", - "config": { - "placeholder": "us-east-1" - }, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=route53" - ] - }, - { - "name": "traefik_tls_acme_endpoint", - "type": "str", - "title": "OVH Endpoint", - "required": false, - "default": "ovh-eu", - "description": "OVH API endpoint.", - "config": { - "placeholder": "ovh-eu" - }, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=ovh" - ] - }, - { - "name": "traefik_tls_acme_tenant_id", - "type": "str", - "title": "Azure Tenant ID", - "required": true, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=azure" - ] - }, - { - "name": "traefik_tls_acme_subscription_id", - "type": "str", - "title": "Azure Subscription ID", - "required": true, - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=azure" - ] - }, - { - "name": "traefik_tls_acme_resource_group", - "type": "str", - "title": "Azure Resource Group", - "required": true, - "description": "Azure DNS resource group.", - "needs": [ - "traefik_tls_enabled=true", - "traefik_tls_certresolver=azure" - ] - }, - { - "name": "traefik_tls_redirect", - "type": "bool", - "title": "HTTP Redirect", - "required": false, - "default": true, - "description": "Redirect all HTTP traffic to HTTPS.", - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_min_version", - "type": "enum", - "title": "Minimum TLS Version", - "required": false, - "default": "VersionTLS12", - "config": { - "options": [ - "VersionTLS12", - "VersionTLS13" - ] - }, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_secure_ciphers", - "type": "bool", - "title": "Strict Ciphers", - "required": false, - "default": false, - "needs": [ - "traefik_tls_enabled=true" - ] - }, - { - "name": "traefik_tls_skipverify", - "type": "bool", - "title": "Skip Backend Verify", - "required": false, - "default": false, - "description": "Skip TLS verification for backend servers.", - "needs": [ - "traefik_tls_enabled=true" - ] - } - ] - }, - { - "name": "swarm", - "title": "Docker Swarm", - "items": [ - { - "name": "swarm_placement_mode", - "type": "enum", - "title": "Placement Mode", - "required": true, - "default": "replicated", - "description": "Swarm deployment mode. Traefik is constrained to manager nodes because the Swarm provider reads service state through the local Docker socket. Use replicated with one replica when Traefik manages ACME certificates. Global mode runs one task per eligible manager node, but Traefik OSS cannot safely coordinate active-active ACME writes to a shared acme.json. See https://doc.traefik.io/traefik/providers/swarm/ and https://doc.traefik.io/traefik/https/acme/.", - "config": { - "options": [ - "global", - "replicated" - ] - } - }, - { - "name": "swarm_replicas", - "type": "int", - "title": "Replicas", - "required": false, - "default": 1, - "description": "Number of replicas when placement mode is replicated. Keep this at 1 when Traefik manages ACME certificates; use multiple replicas only with external/static certificate management.", - "config": { - "placeholder": "1", - "unit": "replicas", - "slider": true, - "min": 1, - "max": 10, - "step": 1 - }, - "needs": [ - "swarm_placement_mode=replicated" - ] - }, - { - "name": "swarm_placement_host", - "type": "str", - "title": "Placement Host", - "required": false, - "default": "", - "description": "Optional manager-node hostname constraint. The selected node must be a Swarm manager.", - "config": { - "placeholder": "swarm-node-1" - } - } - ] - }, - { - "name": "volume", - "title": "Volume", - "items": [ - { - "name": "volume_mode", - "type": "enum", - "title": "Volume Mode", - "required": true, - "default": "local", - "description": "Storage mode for ACME certificate data. Shared storage allows file access from multiple nodes, but it does not make Traefik-managed ACME safe with multiple active Traefik writers. Use one Traefik replica for ACME, or use external/static certificate management for multi-replica Traefik. See https://doc.traefik.io/traefik/https/acme/.", - "config": { - "options": [ - "local", - "mount", - "nfs" - ] - } - }, - { - "name": "volume_mount_path", - "type": "str", - "title": "Bind Mount Path", - "required": true, - "default": "/data/traefik/certs", - "description": "Host path used for certificate storage.", - "config": { - "placeholder": "/data/traefik/certs" - }, - "needs": [ - "volume_mode=mount" - ] - }, - { - "name": "volume_nfs_server", - "type": "str", - "title": "NFS Server", - "required": true, - "default": "NFS_SERVER", - "config": { - "placeholder": "NFS_SERVER" - }, - "needs": [ - "volume_mode=nfs" - ] - }, - { - "name": "volume_nfs_path", - "type": "str", - "title": "NFS Path", - "required": true, - "default": "/export/traefik/certs", - "config": { - "placeholder": "/export/traefik/certs" - }, - "needs": [ - "volume_mode=nfs" - ] - }, - { - "name": "volume_nfs_options", - "type": "str", - "title": "NFS Options", - "required": true, - "default": "rw,nolock,soft", - "config": { - "placeholder": "rw,nolock,soft" - }, - "needs": [ - "volume_mode=nfs" - ] - } - ] - } - ] -} diff --git a/swarm/twingate-connector/files/compose.yaml b/swarm/twingate-connector/files/compose.yaml deleted file mode 100644 index 0b31453..0000000 --- a/swarm/twingate-connector/files/compose.yaml +++ /dev/null @@ -1,39 +0,0 @@ -services: - << service_name >>: - image: docker.io/twingate/connector:1.88.0 - hostname: << container_hostname >> - environment: - - TZ=<< container_timezone >> - - TWINGATE_NETWORK=<< twingate_network >> - - TWINGATE_ACCESS_TOKEN=<< twingate_access_token >> - - TWINGATE_REFRESH_TOKEN=<< twingate_refresh_token >> - - TWINGATE_LOG_ANALYTICS=v2 - - TWINGATE_LOG_LEVEL=<< twingate_log_level >> - <%- if twingate_dns %> - - TWINGATE_DNS=<< twingate_dns >> - <%- endif %> - sysctls: - net.ipv4.ping_group_range: "0 2147483647" - deploy: - <%- if swarm_placement_mode == 'replicated' %> - mode: replicated - replicas: << swarm_replicas >> - <%- if swarm_placement_host %> - placement: - constraints: - - node.hostname == << swarm_placement_host >> - <%- endif %> - <%- else %> - mode: global - <%- endif %> - restart_policy: - condition: on-failure - <%- if resources_enabled %> - resources: - limits: - cpus: '<< resources_cpu_limit >>' - memory: << resources_memory_limit >> - reservations: - cpus: '<< resources_cpu_reservation >>' - memory: << resources_memory_reservation >> - <%- endif %> diff --git a/swarm/twingate-connector/template.json b/swarm/twingate-connector/template.json deleted file mode 100644 index db71f0b..0000000 --- a/swarm/twingate-connector/template.json +++ /dev/null @@ -1,206 +0,0 @@ -{ - "slug": "twingate-connector", - "kind": "swarm", - "metadata": { - "name": "Twingate_Connector", - "description": "Lightweight agent that establishes secure zero-trust connections between your private network and the Twingate service, allowing authorized users to access internal resources without a VPN.", - "tags": [], - "icon": { - "provider": "selfhst", - "id": "twingate" - }, - "draft": false, - "version": { - "name": "1.88.0", - "source_dep_name": "docker.io/twingate/connector", - "source_dep_version": "1.88.0" - } - }, - "variables": [ - { - "title": "General", - "name": "general", - "items": [ - { - "name": "service_name", - "type": "str", - "title": "Service Name", - "required": false, - "default": "twingate", - "config": { - "placeholder": "twingate" - } - }, - { - "name": "container_hostname", - "type": "str", - "title": "Container Hostname", - "required": false, - "default": "twingate-connector", - "config": { - "placeholder": "twingate-connector" - } - }, - { - "name": "container_timezone", - "type": "str", - "title": "Container Timezone", - "required": true, - "config": { - "placeholder": "Europe/Berlin" - } - }, - { - "name": "swarm_placement_mode", - "type": "enum", - "title": "Swarm Placement Mode", - "required": true, - "default": "replicated", - "config": { - "options": [ - "replicated", - "global" - ] - } - }, - { - "name": "swarm_replicas", - "type": "int", - "title": "Swarm Replicas", - "required": false, - "default": 1, - "config": { - "slider": true, - "min": 1, - "max": 10, - "step": 1, - "placeholder": "1", - "unit": "replicas" - }, - "needs": [ - "swarm_placement_mode=replicated" - ] - }, - { - "name": "swarm_placement_host", - "type": "str", - "title": "Swarm Placement Host", - "required": false, - "default": "", - "needs": [ - "swarm_placement_mode=replicated" - ], - "config": { - "placeholder": "swarm-node-1" - } - } - ] - }, - { - "title": "Twingate Configuration", - "name": "twingate", - "items": [ - { - "name": "twingate_network", - "type": "str", - "title": "Network Name", - "required": true - }, - { - "name": "twingate_access_token", - "type": "secret", - "title": "Access Token", - "required": true, - "description": "Connector access token from Twingate." - }, - { - "name": "twingate_refresh_token", - "type": "secret", - "title": "Refresh Token", - "required": true, - "description": "Connector refresh token from Twingate." - }, - { - "name": "twingate_log_level", - "type": "int", - "title": "Log Level", - "required": false, - "default": 1, - "description": "Log level (1=ERROR, 2=WARN, 3=INFO, 4=DEBUG)", - "config": { - "slider": true, - "min": 1, - "max": 4, - "step": 1, - "placeholder": "1" - } - }, - { - "name": "twingate_dns", - "type": "str", - "title": "DNS Server", - "required": false, - "default": "", - "description": "Local DNS server IP (optional, leave empty to use default)", - "config": { - "placeholder": "192.0.2.53" - } - } - ] - }, - { - "title": "Resource Limits", - "name": "resources", - "toggle": "resources_enabled", - "items": [ - { - "name": "resources_enabled", - "type": "bool", - "title": "Resources Enabled", - "required": false, - "default": false - }, - { - "name": "resources_cpu_limit", - "type": "str", - "title": "Resources Cpu Limit", - "required": true, - "default": 1, - "config": { - "placeholder": "1" - } - }, - { - "name": "resources_cpu_reservation", - "type": "str", - "title": "Resources Cpu Reservation", - "required": true, - "default": 0.25, - "config": { - "placeholder": "0.25" - } - }, - { - "name": "resources_memory_limit", - "type": "str", - "title": "Resources Memory Limit", - "required": true, - "default": "1G", - "config": { - "placeholder": "1G" - } - }, - { - "name": "resources_memory_reservation", - "type": "str", - "title": "Resources Memory Reservation", - "required": true, - "default": "512M", - "config": { - "placeholder": "512M" - } - } - ] - } - ] -}