---
name: generate_traefik_dynamic
kind: function
lang: go
domain: infra
version: "1.0.0"
purity: pure
signature: "func GenerateTraefikDynamic(cfg TraefikDynamicConfig) string"
description: "Genera el texto YAML de un traefik-dynamic.yml para el file provider de Traefik (Coolify). Replica el patron de apps/registry_api/traefik-dynamic.yml con routers HTTP/HTTPS, redirect, basicAuth opcional y gzip opcional."
tags: [traefik, yaml, infra, deploy, generator, basicauth, tls, coolify]
uses_functions: []
uses_types: [TraefikDynamicConfig_go_infra]
returns: []
returns_optional: false
error_type: ""
imports: [fmt, strings]
params:
  - name: cfg
    desc: "configuracion del dynamic config: nombre (prefix), dominio, upstream URL, linea htpasswd opcional, flag de gzip y cert resolver"
output: "texto YAML completo del traefik-dynamic.yml listo para escribir a disco y recargar en Traefik"
tested: true
tests:
  - "render con auth y gzip"
  - "render sin auth"
  - "render sin gzip"
  - "certResolver custom"
  - "certResolver vacio usa letsencrypt por defecto"
  - "snapshot YAML completo replica patron registry_api"
test_file_path: "functions/infra/generate_traefik_dynamic_test.go"
file_path: "functions/infra/generate_traefik_dynamic.go"
---

## Ejemplo

```go
line, _ := BcryptHtpasswd("lucas", "s3cr3t", 10)
cfg := TraefikDynamicConfig{
    Name:          "kanban",
    Domain:        "kanban.organic-machine.com",
    UpstreamURL:   "http://kanban:8421",
    BasicAuthLine: line,
    EnableGzip:    true,
    CertResolver:  "letsencrypt",
}
yaml := GenerateTraefikDynamic(cfg)
os.WriteFile("apps/kanban/traefik-dynamic.yml", []byte(yaml), 0644)
```

## Notas

Funcion pura: dado el mismo `TraefikDynamicConfig` siempre produce el mismo YAML. Si `BasicAuthLine` es vacio se omite el router middleware `<name>-auth` y la seccion `basicAuth`. Si `EnableGzip` es false se omite el middleware `<name>-gzip`. El redirect HTTP→HTTPS siempre esta presente. `CertResolver` por defecto es `"letsencrypt"`. El output usa `$` simple (file provider), no `$$` (Docker labels). Combinar con `BcryptHtpasswd` para generar la linea de auth.
