package main import ( "log" "net/http" "sync-live/internal/config" "sync-live/internal/server" ) func main() { cfg := config.Load() if err := cfg.Validate(); err != nil { log.Fatalf("config invalid: %v", err) } srv := server.New(cfg) defer func() { if err := srv.Close(); err != nil { log.Printf("[warn] db close: %v", err) } }() if err := srv.StartGRPC(); err != nil { log.Printf("[warn] grpc control plane failed to start: %v", err) } addr := ":" + cfg.HTTPPort log.Printf("sync-live ready: http://localhost:%s (grpc :%s)", cfg.HTTPPort, cfg.GRPCPort) log.Printf("backends (primary first): %v", cfg.ProviderList()) log.Printf("cloudflare configured: %v", cfg.CFAppID != "" && cfg.CFAppSecret != "") log.Printf("embedded db: %s", cfg.DatabaseURL) if err := http.ListenAndServe(addr, srv.Handler()); err != nil { log.Fatalf("http server error: %v", err) } }