Env: configure urls and help documents

Change-Id: I9522e074575e0c1e67735462ac4cc266ab1ebb8c
diff --git a/core/installer/tasks/infra.go b/core/installer/tasks/infra.go
index 91d0fd9..e71de44 100644
--- a/core/installer/tasks/infra.go
+++ b/core/installer/tasks/infra.go
@@ -277,6 +277,42 @@
 	)
 }
 
+func SetupLauncher(env installer.EnvConfig, st *state) Task {
+	t := newLeafTask("Setup", func() error {
+		user := fmt.Sprintf("%s-launcher", env.Id)
+		keys, err := installer.NewSSHKeyPair(user)
+		if err != nil {
+			return err
+		}
+		if err := st.ssClient.AddUser(user, keys.AuthorizedKey()); err != nil {
+			return err
+		}
+		if err := st.ssClient.AddReadWriteCollaborator("config", user); err != nil {
+			return err
+		}
+		app, err := installer.FindEnvApp(st.appsRepo, "launcher")
+		if err != nil {
+			return err
+		}
+		instanceId := app.Slug()
+		appDir := fmt.Sprintf("/apps/%s", instanceId)
+		namespace := fmt.Sprintf("%s%s", env.NamespacePrefix, app.Namespace())
+		if _, err := st.appManager.Install(app, instanceId, appDir, namespace, map[string]any{
+			"repoAddr":      st.ssClient.GetRepoAddress("config"),
+			"sshPrivateKey": string(keys.RawPrivateKey()),
+		}); err != nil {
+			return err
+		}
+		return nil
+	})
+	return newSequentialParentTask(
+		"Launcher",
+		false,
+		&t,
+		waitForAddr(st.httpClient, fmt.Sprintf("https://launcher.%s", env.Domain)),
+	)
+}
+
 func SetupHeadscale(env installer.EnvConfig, st *state) Task {
 	t := newLeafTask("Setup", func() error {
 		app, err := installer.FindEnvApp(st.appsRepo, "headscale")
@@ -370,37 +406,6 @@
 	return &t
 }
 
-func SetupLauncher(env installer.EnvConfig, st *state) Task {
-	t := newLeafTask("Application Launcher", func() error {
-		user := fmt.Sprintf("%s-launcher", env.Id)
-		keys, err := installer.NewSSHKeyPair(user)
-		if err != nil {
-			return err
-		}
-		if err := st.ssClient.AddUser(user, keys.AuthorizedKey()); err != nil {
-			return err
-		}
-		if err := st.ssClient.AddReadWriteCollaborator("config", user); err != nil { //TODO(gio): add read only
-			return err
-		}
-		app, err := installer.FindEnvApp(st.appsRepo, "launcher") // TODO(giolekva): configure
-		if err != nil {
-			return err
-		}
-		instanceId := app.Name()
-		appDir := fmt.Sprintf("/apps/%s", instanceId)
-		namespace := fmt.Sprintf("%s%s", env.NamespacePrefix, app.Namespace())
-		if _, err := st.appManager.Install(app, instanceId, appDir, namespace, map[string]any{
-			"repoAddr":      st.ssClient.GetRepoAddress("config"),
-			"sshPrivateKey": string(keys.RawPrivateKey()),
-		}); err != nil {
-			return err
-		}
-		return nil
-	})
-	return &t
-}
-
 // TODO(gio-dns): remove
 type DNSSecKey struct {
 	Basename string `json:"basename,omitempty"`