---
name: generate_compose_traefik
kind: function
lang: go
domain: infra
version: "1.0.0"
purity: pure
signature: "func GenerateComposeTraefik(cfg ComposeTraefikConfig) string"
description: "Genera el texto YAML de un docker-compose.yml para una app Go desplegada behind Traefik + Coolify. Replica el patron de apps/registry_api/docker-compose.yml. Determinista: orden de EnvVars sigue el orden de entrada."
tags: [docker, compose, traefik, coolify, yaml, infra, deploy, generator]
uses_functions: []
uses_types: [ComposeTraefikConfig_go_infra]
returns: []
returns_optional: false
error_type: ""
imports: [fmt, strings]
params:
  - name: cfg
    desc: "configuracion del compose: nombre de proyecto/servicio, contexto de build, puerto, volume, env vars y red de Coolify"
output: "texto YAML completo del docker-compose.yml listo para escribir a disco"
tested: true
tests:
  - "render con volume y multiples envs"
  - "render sin volume"
  - "render sin envs"
  - "project name con guion"
  - "snapshot YAML completo replica patron registry_api"
test_file_path: "functions/infra/generate_compose_traefik_test.go"
file_path: "functions/infra/generate_compose_traefik.go"
---

## Ejemplo

```go
cfg := ComposeTraefikConfig{
    ProjectName:  "kanban",
    ServiceName:  "kanban",
    BuildContext: "../../",
    Dockerfile:   "apps/kanban/Dockerfile",
    Port:         8421,
    VolumeName:   "kanban_data",
    EnvVars:      []string{"KANBAN_TOKEN"},
    Network:      "coolify",
}
yaml := GenerateComposeTraefik(cfg)
os.WriteFile("apps/kanban/docker-compose.yml", []byte(yaml), 0644)
```

## Notas

Funcion pura: dado el mismo `ComposeTraefikConfig` siempre produce el mismo YAML. Si `VolumeName` es `""` se omite la seccion `volumes:` y el mount. Si `EnvVars` es nil/vacio se omite la seccion `environment:`. Los env vars se generan con la sintaxis `${KEY:-}` (passthrough con fallback vacio) para que el contenedor arranque sin el `.env` si la variable no es critica.
