Owner decision pending (STATE.md DC-100 tick): adopt/ship/park. Preserved from fragile git stash to named branch 2026-08-23. NOTE: requires a Windows build machine (WinUI XAML compiler + MSIX do not cross-build on Linux) — see WINDOWS_APP_BUILD.md in this tree. Secret-scanned clean 2026-08-23 (no keys/tokens/PEM in tree).
57 lines
1.5 KiB
C#
57 lines
1.5 KiB
C#
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<ServiceModel> 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;
|
|
}
|
|
}
|
|
} |