--- 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.