fix traefik template: use splitList instead of split
All checks were successful
ci/woodpecker/push/infra-ci Pipeline was successful
ci/woodpecker/push/deploy Pipeline was successful
ci/woodpecker/push/ci Pipeline was successful

Sprig split() returns map[string]string, and ranging over it outputs
map keys into the YAML, corrupting the rendered config. splitList()
returns []string which ranges correctly. Also removed unused
rate-limit middleware.
This commit is contained in:
kert
2026-02-28 19:28:39 -05:00
parent caccae3e64
commit d269695ad1

View File

@@ -1,51 +1,29 @@
{{/* ═══════════════════════════════════════════════════════════════
REEF — the single source of truth for all routing.
To add a service: add one entry to $reef below.
FQDN pattern: {name}.{DOMAIN} (DOMAIN from env, e.g. homelab.fhirworx.io)
Adding a service to the reef:
1. compose.yml — add service block
2. Here — add 1 line to $reef dict
3. prometheus/targets/services.yml — add 4 lines (if metrics)
4. nginx/index.html — add tile with data-subdomain (optional)
═══════════════════════════════════════════════════════════════ */}}
{{- $domain := env "DOMAIN" | default "homelab.fhirworx.io" -}} {{- $domain := env "DOMAIN" | default "homelab.fhirworx.io" -}}
{{/* ── The Reef: one router + one backend per service ───────────── */}}
{{- $reef := dict {{- $reef := dict
"dashboard" (dict "port" "80" "theme" true "extra_hosts" (list $domain) "mw" "secure-headers") "dashboard" (dict "port" "80" "theme" true "extra_hosts" (list $domain) "mw" "secure-headers")
"gitea" (dict "port" "3000" "theme" true "mw" "secure-headers,rate-limit") "gitea" (dict "port" "3000" "theme" true "mw" "secure-headers")
"woodpecker-server" (dict "port" "8000" "theme" true "subdomain" "ci" "mw" "local-only,secure-headers,rate-limit") "woodpecker-server" (dict "port" "8000" "theme" true "subdomain" "ci" "mw" "local-only,secure-headers")
"notebooks" (dict "port" "2718" "theme" true "mw" "local-only,secure-headers") "notebooks" (dict "port" "2718" "theme" true "mw" "local-only,secure-headers")
"zotero" (dict "port" "8080" "theme" true "mw" "secure-headers") "zotero" (dict "port" "8080" "theme" true "mw" "secure-headers")
"nessie" (dict "port" "19120" "theme" false "mw" "local-only,infra-headers") "nessie" (dict "port" "19120" "theme" false "mw" "local-only,infra-headers")
"trino" (dict "port" "8080" "theme" true "mw" "local-only,infra-headers") "trino" (dict "port" "8080" "theme" true "mw" "local-only,infra-headers")
"polaris" (dict "port" "8181" "theme" false "mw" "local-only,infra-headers") "polaris" (dict "port" "8181" "theme" false "mw" "local-only,infra-headers")
"grafana" (dict "port" "3000" "theme" true "mw" "local-only,secure-headers") "grafana" (dict "port" "3000" "theme" true "mw" "local-only,secure-headers")
"prometheus" (dict "port" "9090" "theme" true "mw" "local-only,infra-headers") "prometheus" (dict "port" "9090" "theme" true "mw" "local-only,infra-headers")
"jaeger" (dict "port" "16686" "theme" true "mw" "local-only,infra-headers") "jaeger" (dict "port" "16686" "theme" true "mw" "local-only,infra-headers")
"loki" (dict "port" "3100" "theme" false "mw" "local-only,infra-headers") "loki" (dict "port" "3100" "theme" false "mw" "local-only,infra-headers")
-}} -}}
{{/* ── Multi-endpoint services ─────────────────────────────────── */}}
{{- $multi := dict {{- $multi := dict
"rustfs-api" (dict "container" "rustfs" "port" "9000" "subdomain" "s3" "theme" false "mw" "local-only,infra-headers") "rustfs-api" (dict "container" "rustfs" "port" "9000" "subdomain" "s3" "theme" false "mw" "local-only,infra-headers")
"rustfs-console" (dict "container" "rustfs" "port" "9001" "subdomain" "s3console" "theme" true "mw" "local-only,infra-headers") "rustfs-console" (dict "container" "rustfs" "port" "9001" "subdomain" "s3console" "theme" true "mw" "local-only,infra-headers")
-}} -}}
http: http:
{{/* ── Middlewares (inlined — no separate middlewares.yml) ──────── */}}
middlewares: middlewares:
secure-headers: secure-headers:
headers: headers:
frameDeny: true frameDeny: true
browserXssFilter: true browserXssFilter: true
contentTypeNosniff: true contentTypeNosniff: true
rate-limit:
rateLimit:
average: 100
burst: 50
local-only: local-only:
ipAllowList: ipAllowList:
sourceRange: sourceRange:
@@ -68,8 +46,6 @@ http:
rewrites: rewrites:
- regex: "</head>" - regex: "</head>"
replacement: '<link rel="icon" type="image/svg+xml" href="http://{{ $domain }}/favicon.svg"><link rel="stylesheet" type="text/css" href="http://{{ $domain }}/throwback.css"></head>' replacement: '<link rel="icon" type="image/svg+xml" href="http://{{ $domain }}/favicon.svg"><link rel="stylesheet" type="text/css" href="http://{{ $domain }}/throwback.css"></head>'
{{/* ── Generated routers ─────────────────────────────────────── */}}
routers: routers:
{{- range $name, $svc := $reef }} {{- range $name, $svc := $reef }}
{{ $name }}: {{ $name }}:
@@ -80,7 +56,7 @@ http:
{{- $mwList := list -}} {{- $mwList := list -}}
{{- if get $svc "theme" }}{{ $mwList = append $mwList "inject-throwback" }}{{ end -}} {{- if get $svc "theme" }}{{ $mwList = append $mwList "inject-throwback" }}{{ end -}}
{{- $extra := get $svc "mw" | default "" -}} {{- $extra := get $svc "mw" | default "" -}}
{{- if ne $extra "" }}{{ range split "," $extra }}{{ $mwList = append $mwList (trim .) }}{{ end }}{{ end -}} {{- if ne $extra "" }}{{ range splitList "," $extra }}{{ $mwList = append $mwList (trim .) }}{{ end }}{{ end -}}
{{- if $mwList }} {{- if $mwList }}
middlewares: middlewares:
{{- range $mwList }} {{- range $mwList }}
@@ -97,7 +73,7 @@ http:
{{- $mwList := list -}} {{- $mwList := list -}}
{{- if get $svc "theme" }}{{ $mwList = append $mwList "inject-throwback" }}{{ end -}} {{- if get $svc "theme" }}{{ $mwList = append $mwList "inject-throwback" }}{{ end -}}
{{- $extra := get $svc "mw" | default "" -}} {{- $extra := get $svc "mw" | default "" -}}
{{- if ne $extra "" }}{{ range split "," $extra }}{{ $mwList = append $mwList (trim .) }}{{ end }}{{ end -}} {{- if ne $extra "" }}{{ range splitList "," $extra }}{{ $mwList = append $mwList (trim .) }}{{ end }}{{ end -}}
{{- if $mwList }} {{- if $mwList }}
middlewares: middlewares:
{{- range $mwList }} {{- range $mwList }}
@@ -114,8 +90,6 @@ http:
- inject-throwback - inject-throwback
- local-only - local-only
- infra-headers - infra-headers
{{/* ── Generated services ────────────────────────────────────── */}}
services: services:
{{- range $name, $svc := $reef }} {{- range $name, $svc := $reef }}
{{ $name }}: {{ $name }}: