package main import ( "context" _ "embed" "log/slog" "net/http" "git.leonardobishop.net/instancer/pkg/auth" "git.leonardobishop.net/instancer/pkg/deployer" "git.leonardobishop.net/instancer/pkg/janitor" "git.leonardobishop.net/instancer/pkg/registry" "git.leonardobishop.net/instancer/web" "github.com/caarlos0/env/v11" ) type Config struct { ContainerRegistryURL string `env:"CONTAINER_REGISTRY_URL,notEmpty,required"` ContainerRegistryUsername string `env:"CONTAINER_REGISTRY_USERNAME"` ContainerRegistryPassword string `env:"CONTAINER_REGISTRY_PASSWORD"` InstancerDomain string `env:"INSTANCER_DOMAIN"` ImagePrefix string `env:"IMAGE_PREFIX"` ProxyContainerName string `env:"PROXY_CONTAINER_NAME"` OidcClientId string `env:"OIDC_CLIENT_ID"` OidcClientSecret string `env:"OIDC_CLIENT_SECRET"` OidcDiscoveryEndpoint string `env:"OIDC_DISCOVERY_ENDPOINT"` OidcIdPName string `env:"OIDC_IDP_NAME" envDefault:"OIDC"` OidcCallbackProtocol string `env:"OIDC_CALLBACK_PROTOCOL" envDefault:"https"` } //go:embed startup.txt var startupMessage string func main() { var config Config if err := env.Parse(&config); err != nil { panic(err) } registryClient := registry.RegistryClient{ URL: config.ContainerRegistryURL, Username: config.ContainerRegistryUsername, Password: config.ContainerRegistryPassword, } dockerDeployer, err := deployer.New( config.ContainerRegistryURL, config.ContainerRegistryUsername, config.ContainerRegistryPassword, config.InstancerDomain, config.ImagePrefix, config.ProxyContainerName, ) if err != nil { panic(err) } oidcAuthProvider, err := auth.NewOIDCAuthProvider(config.OidcIdPName, config.OidcClientId, config.OidcClientSecret, config.OidcDiscoveryEndpoint, config.OidcCallbackProtocol+"://"+config.InstancerDomain+"/auth/callback") if err != nil { panic(err) } slog.Info(startupMessage) slog.Info("staring janitor job") go janitor.StartJanitor(context.Background(), &dockerDeployer) slog.Info("starting http server") err = http.ListenAndServe(":8080", web.NewMux(®istryClient, &dockerDeployer, &oidcAuthProvider)) slog.Error("http server closing", "reason", err.Error()) slog.Info("so long and goodnight; so long and goodnight...") }