chart: extract hydra maester chart out of auth/charts/hydra.tar.gz (#96)

* chart: extract hydra maester chart out of auth/charts/hydra.tar.gz

* auth: install shared hydra maester during bootstrap

* hydra-maester: fix chart name typo

* hydra-maester: fix charts repo namespace

---------

Co-authored-by: Giorgi Lekveishvili <lekva@gl-mbp-m1-max.local>
diff --git a/core/installer/bootstrapper.go b/core/installer/bootstrapper.go
index c5de23d..e496709 100644
--- a/core/installer/bootstrapper.go
+++ b/core/installer/bootstrapper.go
@@ -97,6 +97,10 @@
 	if err := b.installEnvManager(ss, repoIO, nsGen, b.ns, env); err != nil {
 		return err
 	}
+	fmt.Println("Installing Ory Hydra Maester")
+	if err := b.installOryHydraMaester(ss, repoIO, nsGen, b.ns, env); err != nil {
+		return err
+	}
 	fmt.Println("Environment ready to use")
 	return nil
 }
@@ -521,6 +525,36 @@
 	return repo.InstallApp(app, filepath.Join("/infrastructure", app.Name()), derived.Values, derived)
 }
 
+func (b Bootstrapper) installOryHydraMaester(ss *soft.Client, repo RepoIO, nsGen NamespaceGenerator, nsCreator NamespaceCreator, env EnvConfig) error {
+	appRepo := NewInMemoryAppRepository(CreateAllApps())
+	app, err := appRepo.Find("hydra-maester")
+	if err != nil {
+		return err
+	}
+	namespaces := make([]string, len(app.Namespaces()))
+	for i, n := range app.Namespaces() {
+		namespaces[i], err = nsGen.Generate(n)
+		if err != nil {
+			return err
+		}
+	}
+	for _, n := range namespaces {
+		if err := nsCreator.Create(n); err != nil {
+			return err
+		}
+	}
+	derived := Derived{
+		Global: Values{
+			PCloudEnvName: env.Name,
+		},
+		Values: map[string]any{},
+	}
+	if len(namespaces) > 0 {
+		derived.Release.Namespace = namespaces[0]
+	}
+	return repo.InstallApp(app, filepath.Join("/infrastructure", app.Name()), derived.Values, derived)
+}
+
 func (b Bootstrapper) installDNSZoneManager(ss *soft.Client, repo RepoIO, nsGen NamespaceGenerator, nsCreator NamespaceCreator, env EnvConfig) error {
 	const (
 		volumeClaimName = "dns-zone-configs"