diff --git a/package.json b/package.json index 1a55697..6484688 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cosmos-server", - "version": "0.9.0-unstable3", + "version": "0.9.0-unstable4", "description": "", "main": "test-server.js", "bugs": { @@ -67,7 +67,7 @@ "build": "sh build.sh", "dev": "npm run build && npm run start", "dockerdevbuild": "sh build.sh && docker build -f dockerfile.local --tag cosmos-dev .", - "dockerdevrun": "docker stop cosmos-dev; docker rm cosmos-dev; docker run -d -p 80:80 -p 443:443 -e DOCKER_HOST=tcp://host.docker.internal:2375 -e COSMOS_MONGODB=$MONGODB -e COSMOS_LOG_LEVEL=DEBUG -v /:/mnt/host --restart=unless-stopped -h cosmos-dev --name cosmos-dev cosmos-dev", + "dockerdevrun": "docker stop cosmos-dev; docker rm cosmos-dev; docker run -d -p 7200:443 -p 80:80 -p 443:443 -e DOCKER_HOST=tcp://host.docker.internal:2375 -e COSMOS_MONGODB=$MONGODB -e COSMOS_LOG_LEVEL=DEBUG -v /:/mnt/host --restart=unless-stopped -h cosmos-dev --name cosmos-dev cosmos-dev", "dockerdev": "npm run dockerdevbuild && npm run dockerdevrun", "dockerdevclient": "npm run client-build && npm run dockerdevbuild && npm run dockerdevrun", "demo": "vite build --base=/cosmos-ui/ --mode demo", diff --git a/src/docker/api_blueprint.go b/src/docker/api_blueprint.go index 37bef51..f319938 100644 --- a/src/docker/api_blueprint.go +++ b/src/docker/api_blueprint.go @@ -214,6 +214,7 @@ func CreateService(serviceRequest DockerServiceCreateRequest, OnLog func(string) utils.Log("Starting creation of new service...") OnLog("Starting creation of new service...\n") + needsHTTPRestart := false config := utils.ReadConfigFromFile() configRoutes := config.HTTPConfig.ProxyConfig.Routes @@ -326,6 +327,7 @@ func CreateService(serviceRequest DockerServiceCreateRequest, OnLog func(string) OnLog(fmt.Sprintf("Image %s pulled\n", container.Image)) } + // Create containers for serviceName, container := range serviceRequest.Services { utils.Log(fmt.Sprintf("Checking service %s...", serviceName)) @@ -583,6 +585,7 @@ func CreateService(serviceRequest DockerServiceCreateRequest, OnLog func(string) } } if !exists { + needsHTTPRestart = true configRoutes = append([]utils.ProxyRouteConfig{(utils.ProxyRouteConfig)(route)}, configRoutes...) } else { utils.Error("CreateService: Rolling back changes because of -- Route already exist", nil) @@ -707,7 +710,10 @@ func CreateService(serviceRequest DockerServiceCreateRequest, OnLog func(string) // Save the route configs config.HTTPConfig.ProxyConfig.Routes = configRoutes utils.SaveConfigTofile(config) - utils.RestartHTTPServer() + + if needsHTTPRestart { + utils.RestartHTTPServer() + } // After all operations utils.Log("CreateService: Operation succeeded. SERVICE STARTED") diff --git a/src/docker/checkPorts.go b/src/docker/checkPorts.go index 0c6847e..c95d0c7 100644 --- a/src/docker/checkPorts.go +++ b/src/docker/checkPorts.go @@ -69,17 +69,18 @@ func CheckPorts() error { // Get the ports ports := map[string]struct{}{} + finalPorts := []string{} + for containerPort, hostConfig := range inspect.NetworkSettings.Ports { utils.Debug("Container port: " + containerPort.Port()) for _, hostPort := range hostConfig { utils.Debug("Host port: " + hostPort.HostPort) ports[hostPort.HostPort] = struct{}{} + finalPorts = append(finalPorts, hostPort.HostPort + ":" + containerPort.Port()) } } - finalPorts := []string{} - hasChanged := false utils.Debug("Expected ports: " + strings.Join(expectedPorts, ", ")) @@ -94,21 +95,18 @@ func CheckPorts() error { finalPorts = append(finalPorts, port + ":" + expectedPort) hasChanged = true } - } else { - finalPorts = append(finalPorts, port + ":" + expectedPort) } } if hasChanged { - finalPorts = append(finalPorts, config.HTTPConfig.HTTPPort + ":" + config.HTTPConfig.HTTPPort) - finalPorts = append(finalPorts, config.HTTPConfig.HTTPSPort + ":" + config.HTTPConfig.HTTPSPort) - utils.Log("Port mapping changed. Needs update.") utils.Log("New ports: " + strings.Join(finalPorts, ", ")) UpdatePorts(finalPorts) + return nil } + utils.Log("Port mapping not changed.") return nil } @@ -121,11 +119,12 @@ func UpdatePorts(finalPorts []string) error { return errors.New("SelUpdatePorts - not using Docker") } + containerName := os.Getenv("HOSTNAME") + utils.Log("SelUpdatePorts - Container name: " + containerName) + // make sure to remove resiude of old self updater RemoveSelfUpdater() - containerName := os.Getenv("HOSTNAME") - version := "latest" // if arm @@ -159,6 +158,8 @@ func UpdatePorts(finalPorts []string) error { }, }; + utils.Log("SelUpdatePorts - Creating updater service") + err := CreateService(service, func (msg string) {}) if err != nil { diff --git a/src/httpServer.go b/src/httpServer.go index ab4293e..1eff9ce 100644 --- a/src/httpServer.go +++ b/src/httpServer.go @@ -38,11 +38,11 @@ func startHTTPServer(router *mux.Router) { Handler: router, DisableGeneralOptionsHandler: true, } - - utils.Log("Listening to HTTP on : 0.0.0.0:" + serverPortHTTP) - + docker.CheckPorts() - + + utils.Log("Listening to HTTP on : 0.0.0.0:" + serverPortHTTP) + errServ = HTTPServer.ListenAndServe() if errServ != nil && errServ != http.ErrServerClosed { @@ -201,11 +201,11 @@ func InitServer() *mux.Router { var tlsCert = HTTPConfig.TLSCert var tlsKey= HTTPConfig.TLSKey - domains := utils.GetAllHostnames(true, false) + domains := utils.GetAllHostnames(true, true) oldDomains := baseMainConfig.HTTPConfig.TLSKeyHostsCached falledBack := false - NeedsRefresh := baseMainConfig.HTTPConfig.ForceHTTPSCertificateRenewal || (tlsCert == "" || tlsKey == "") || !utils.StringArrayEquals(domains, oldDomains) || !CertificateIsValid(baseMainConfig.HTTPConfig.TLSValidUntil) + NeedsRefresh := baseMainConfig.HTTPConfig.ForceHTTPSCertificateRenewal || (tlsCert == "" || tlsKey == "") || !utils.HasAnyNewItem(domains, oldDomains) || !CertificateIsValid(baseMainConfig.HTTPConfig.TLSValidUntil) // If we have a certificate, we can fallback to it if necessary CanFallback := tlsCert != "" && tlsKey != "" && @@ -414,5 +414,5 @@ func RestartServer() { HTTPServer.Shutdown(context.Background()) }() - utils.Log("HTTP Server stopped. Restarting...") + utils.Log("HTTPServer shutdown.") } diff --git a/src/utils/utils.go b/src/utils/utils.go index 77393d1..5bc2ff5 100644 --- a/src/utils/utils.go +++ b/src/utils/utils.go @@ -327,6 +327,11 @@ func LetsEncryptValidOnly(hostnames []string, acceptWildcard bool) []string { func GetAllHostnames(applyWildCard bool, removePorts bool) []string { mainHostname := GetMainConfig().HTTPConfig.Hostname + + if removePorts { + mainHostname = strings.Split(mainHostname, ":")[0] + } + hostnames := []string{ mainHostname, } @@ -401,6 +406,15 @@ func StringArrayEquals(a []string, b []string) bool { return true } +func HasAnyNewItem(after []string, before []string) bool { + for _, value := range after { + if !StringArrayContains(before, value) { + return true + } + } + return false +} + func StringArrayContains(a []string, b string) bool { for _, value := range a { if value == b {