using System.Text; using DashCaddy.Desktop.Models; namespace DashCaddy.Desktop.Services; public class CaddyConfigGenerator { private const string CaddyfilePath = @"E:\dockerdata\dashcaddy\caddy\Caddyfile"; public void RegenerateConfig(List services) { var sb = new StringBuilder(); // Global options sb.AppendLine("{"); sb.AppendLine(" admin :2019"); sb.AppendLine(" email admin@example.com"); sb.AppendLine("}"); sb.AppendLine(); // Each service gets a site block foreach (var svc in services.Where(s => s.Health != "unhealthy")) { var domain = ExtractDomain(svc.Url); if (string.IsNullOrEmpty(domain)) continue; sb.AppendLine($"{domain} {{"); sb.AppendLine($" reverse_proxy {svc.Host}:{svc.Port}"); sb.AppendLine(" tls internal"); sb.AppendLine("}"); sb.AppendLine(); } File.WriteAllText(CaddyfilePath, sb.ToString()); } public async Task ReloadCaddyAsync() { // Call Caddy admin API to reload config using var http = new HttpClient(); await http.PostAsync("http://localhost:2019/load", new StringContent(File.ReadAllText(CaddyfilePath), Encoding.UTF8, "text/caddyfile")); } private string ExtractDomain(string url) { try { var uri = new Uri(url); return uri.Host; } catch { return null; } } }