memberships: run api service on a different port from ui (#118)

* memberships: run api service on different port

* memberships: add api service to chart

* installer: use membership api endpoint instead

---------

Co-authored-by: Giorgi Lekveishvili <lekva@gl-mbp-m1-max.local>
diff --git a/core/auth/memberships/Makefile b/core/auth/memberships/Makefile
index 1defe7d..5959f01 100644
--- a/core/auth/memberships/Makefile
+++ b/core/auth/memberships/Makefile
@@ -7,7 +7,7 @@
 
 
 clean:
-	rm -f memberships*
+	rm -f memberships memberships_*
 
 build: clean
 	/usr/local/go/bin/go build -o memberships *.go
diff --git a/core/auth/memberships/main.go b/core/auth/memberships/main.go
index 0a2bda4..bc8f384 100644
--- a/core/auth/memberships/main.go
+++ b/core/auth/memberships/main.go
@@ -19,7 +19,8 @@
 	"github.com/gorilla/mux"
 )
 
-var port = flag.Int("port", 8080, "ort to listen on")
+var port = flag.Int("port", 8080, "Port to listen on")
+var apiPort = flag.Int("api-port", 8081, "Port to listen on for API requests")
 var dbPath = flag.String("db-path", "memberships.db", "Path to SQLite file")
 
 //go:embed index.html
@@ -477,17 +478,25 @@
 	Member
 )
 
-func (s *Server) Start() {
-	router := mux.NewRouter()
-	router.PathPrefix("/static/").Handler(http.FileServer(http.FS(staticResources)))
-	router.HandleFunc("/group/{group-name}", s.groupHandler)
-	router.HandleFunc("/create-group", s.createGroupHandler)
-	router.HandleFunc("/add-user", s.addUserHandler)
-	router.HandleFunc("/add-child-group", s.addChildGroupHandler)
-	router.HandleFunc("/api/init", s.apiInitHandler)
-	router.HandleFunc("/api/user/{username}", s.apiMemberOfHandler)
-	router.HandleFunc("/", s.homePageHandler)
-	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), router))
+func (s *Server) Start() error {
+	e := make(chan error)
+	go func() {
+		r := mux.NewRouter()
+		r.PathPrefix("/static/").Handler(http.FileServer(http.FS(staticResources)))
+		r.HandleFunc("/group/{group-name}", s.groupHandler)
+		r.HandleFunc("/create-group", s.createGroupHandler)
+		r.HandleFunc("/add-user", s.addUserHandler)
+		r.HandleFunc("/add-child-group", s.addChildGroupHandler)
+		r.HandleFunc("/", s.homePageHandler)
+		e <- http.ListenAndServe(fmt.Sprintf(":%d", *port), r)
+	}()
+	go func() {
+		r := mux.NewRouter()
+		r.HandleFunc("/api/init", s.apiInitHandler)
+		r.HandleFunc("/api/user/{username}", s.apiMemberOfHandler)
+		e <- http.ListenAndServe(fmt.Sprintf(":%d", *apiPort), r)
+	}()
+	return <-e
 }
 
 type GroupData struct {
@@ -807,5 +816,5 @@
 		panic(err)
 	}
 	s := Server{store}
-	s.Start()
+	log.Fatal(s.Start())
 }
diff --git a/core/installer/app.go b/core/installer/app.go
index e91174a..8457fe2 100644
--- a/core/installer/app.go
+++ b/core/installer/app.go
@@ -188,7 +188,7 @@
 						upstream: "\(inp.serviceName).\(release.namespace).svc.cluster.local"
 						whoAmIAddr: "https://accounts.\(global.domain)/sessions/whoami"
 						loginAddr: "https://accounts-ui.\(global.domain)/login"
-						membershipAddr: "http://memberships.\(global.id)-core-auth-memberships.svc.cluster.local/api/user"
+						membershipAddr: "http://memberships-api.\(global.id)-core-auth-memberships.svc.cluster.local/api/user"
 						groups: inp.auth.groups
 						portName: _authProxyHTTPPortName
 					}
diff --git a/core/installer/values-tmpl/welcome.cue b/core/installer/values-tmpl/welcome.cue
index f94a77f..725b799 100644
--- a/core/installer/values-tmpl/welcome.cue
+++ b/core/installer/values-tmpl/welcome.cue
@@ -38,7 +38,7 @@
 			sshPrivateKey: base64.Encode(null, input.sshPrivateKey)
 			createAccountAddr: "http://api.\(global.namespacePrefix)core-auth.svc.cluster.local/identities"
 			loginAddr: "https://accounts-ui.\(global.domain)"
-			membershipsInitAddr: "http://memberships.\(global.namespacePrefix)core-auth-memberships.svc.cluster.local/api/init"
+			membershipsInitAddr: "http://memberships-api.\(global.namespacePrefix)core-auth-memberships.svc.cluster.local/api/init"
 			ingress: {
 				className: _ingressPublic
 				domain: "welcome.\(global.domain)"