diff --git a/client/src/pages/config/users/usermanagement.jsx b/client/src/pages/config/users/usermanagement.jsx index a275161..7a8bb08 100644 --- a/client/src/pages/config/users/usermanagement.jsx +++ b/client/src/pages/config/users/usermanagement.jsx @@ -139,6 +139,7 @@ const UserManagement = () => { }).then(() => { setOpenCreateForm(false); refresh(); + sendlink(document.getElementById('c-nickname').value, 'create'); }); }}>Create diff --git a/client/src/pages/servapps/servapps.jsx b/client/src/pages/servapps/servapps.jsx index be8b779..bd82d4e 100644 --- a/client/src/pages/servapps/servapps.jsx +++ b/client/src/pages/servapps/servapps.jsx @@ -59,12 +59,12 @@ const ServeApps = () => { } const getContainersRoutes = (containerName) => { - return config && config.HTTPConfig && config.HTTPConfig.ProxyConfig.Routes.filter((route) => { + return (config && config.HTTPConfig && config.HTTPConfig.ProxyConfig.Routes.filter((route) => { return route.Mode == "SERVAPP" && ( route.Target.startsWith(containerName) || route.Target.split('://')[1].startsWith(containerName) ) - }) + })) || []; } useEffect(() => { diff --git a/package.json b/package.json index 3fea4f3..4276018 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cosmos-server", - "version": "0.1.0", + "version": "0.1.1", "description": "", "main": "test-server.js", "bugs": { @@ -55,7 +55,7 @@ "build": " sh build.sh", "dev": "npm run build && npm run start", "dockerdevbuild": "sh build.sh && npm run client-build && docker build --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_HOSTNAME=localhost -e COSMOS_MONGODB=$MONGODB -e COSMOS_LOG_LEVEL=DEBUG --name cosmos-dev 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_HOSTNAME=localhost -e COSMOS_MONGODB=$MONGODB -e COSMOS_LOG_LEVEL=DEBUG --restart=unless-stopped --name cosmos-dev cosmos-dev", "dockerdev": "npm run dockerdevbuild && npm run dockerdevrun" }, "eslintConfig": { diff --git a/readme.md b/readme.md index 8860590..548f6c8 100644 --- a/readme.md +++ b/readme.md @@ -1,9 +1,14 @@ -![banner](./banner.png) + +

+Logo Banner +

+

Cosmos-Server

+

Secure and Easy Self-Hosted Platform.

+ +--- [![DiscordLink](https://img.shields.io/discord/1083875833824944188?label=Discord&logo=Discord&style=flat-square)](https://discord.gg/PwMWwsrwHA) ![CircleCI](https://img.shields.io/circleci/build/github/azukaar/Cosmos-Server?token=6efd010d0f82f97175f04a6acf2dae2bbcc4063c&style=flat-square) -# Cosmos Server - Cosmos is a self-hosted platform for running server applications securely and with built-in privacy features. It acts as a secure gateway to your application, as well as a server manager. It aims to solve the increasingly worrying problem of vulnerable self-hosted applications and personnal servers. ![screenshot1](./screenshot1.png) diff --git a/screenshot1.png b/screenshot1.png index 826b390..b9e2e7a 100644 Binary files a/screenshot1.png and b/screenshot1.png differ diff --git a/src/docker/docker.go b/src/docker/docker.go index 0284d50..1c12f57 100644 --- a/src/docker/docker.go +++ b/src/docker/docker.go @@ -202,7 +202,5 @@ func Test() error { // fmt.Println(jellyfin.NetworkSettings) - - return nil } \ No newline at end of file diff --git a/src/docker/network.go b/src/docker/network.go index 69d98d8..ed78d4b 100644 --- a/src/docker/network.go +++ b/src/docker/network.go @@ -45,6 +45,7 @@ func CreateCosmosNetwork() (string, error) { } //if running in Docker, connect to main network + utils.Debug("HOSTNAME: " + os.Getenv("HOSTNAME")) if os.Getenv("HOSTNAME") != "" { err := DockerClient.NetworkConnect(DockerContext, newNeworkName, os.Getenv("HOSTNAME"), &network.EndpointSettings{}) @@ -146,6 +147,14 @@ func IsConnectedToASecureCosmosNetwork(containerConfig types.ContainerJSON) (boo for name, _ := range containerConfig.NetworkSettings.Networks { if name == GetLabel(containerConfig, "cosmos-network-name") { + if os.Getenv("HOSTNAME") != "" { + // TODO: Check if connected to network first + DockerClient.NetworkConnect(DockerContext, name, os.Getenv("HOSTNAME"), &network.EndpointSettings{}) + // if err != nil { + // utils.Error("Docker Network Connect EXISTING ", err) + // return false, err + // } + } return true, nil } } diff --git a/src/docker/run.go b/src/docker/run.go index 150dcd2..a681ad0 100644 --- a/src/docker/run.go +++ b/src/docker/run.go @@ -7,12 +7,19 @@ import ( // "github.com/docker/docker/client" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/mount" ) +type VolumeMount struct { + Destination string + Volume *types.Volume +} + func NewDB() (string, error) { + id := utils.GenerateRandomString(3) mongoUser := "cosmos-" + utils.GenerateRandomString(5) mongoPass := utils.GenerateRandomString(24) - monHost := "cosmos-mongo-" + utils.GenerateRandomString(3) + monHost := "cosmos-mongo-" + id err := RunContainer( "mongo:latest", @@ -21,6 +28,20 @@ func NewDB() (string, error) { "MONGO_INITDB_ROOT_USERNAME=" + mongoUser, "MONGO_INITDB_ROOT_PASSWORD=" + mongoPass, }, + []VolumeMount{ + { + Destination: "/data/db", + Volume: &types.Volume{ + Name: "cosmos-mongo-data-" + id, + }, + }, + { + Destination: "/data/configdb", + Volume: &types.Volume{ + Name: "cosmos-mongo-config-" + id, + }, + }, + }, ) if err != nil { @@ -30,7 +51,7 @@ func NewDB() (string, error) { return "mongodb://"+mongoUser+":"+mongoPass+"@"+monHost+":27017", nil } -func RunContainer(imagename string, containername string, inputEnv []string) error { +func RunContainer(imagename string, containername string, inputEnv []string, volumes []VolumeMount) error { errD := Connect() if errD != nil { utils.Error("Docker Connect", errD) @@ -44,6 +65,16 @@ func RunContainer(imagename string, containername string, inputEnv []string) err } io.Copy(os.Stdout, pull) + var mounts []mount.Mount + + for _, volume := range volumes { + mount := mount.Mount{ + Type: mount.TypeVolume, + Source: volume.Volume.Name, + Target: volume.Destination, + } + mounts = append(mounts, mount) + } // Define a PORT opening // newport, err := natting.NewPort("tcp", port) @@ -63,6 +94,7 @@ func RunContainer(imagename string, containername string, inputEnv []string) err // }, // }, // }, + Mounts : mounts, RestartPolicy: container.RestartPolicy{ Name: "always", }, diff --git a/src/newInstall.go b/src/newInstall.go index 7abeb81..ee32e16 100644 --- a/src/newInstall.go +++ b/src/newInstall.go @@ -28,10 +28,10 @@ type NewInstallJSON struct { TLSKey string `json:"tlsKey"` Nickname string `json:"nickname"` Password string `json:"password"` - Email string `json:"email"` + Email string `json:"omitempty,email"` Hostname string `json:"hostname"` Step string `json:"step"` - SSLEmail string `json:"sslEmail",validate:"if=HTTPSCertificateMode==LetsEncrypt,email"` + SSLEmail string `json:"sslEmail",validate:"omitempty,email"` } type AdminJSON struct { diff --git a/src/user/create.go b/src/user/create.go index cfde478..9e6b38b 100644 --- a/src/user/create.go +++ b/src/user/create.go @@ -14,7 +14,7 @@ import ( type CreateRequestJSON struct { Nickname string `validate:"required,min=3,max=32,alphanum"` - Email string `validate:"email"` + Email string `validate:"omitempty,email"` } func UserCreate(w http.ResponseWriter, req *http.Request) { diff --git a/src/utils/utils.go b/src/utils/utils.go index 122bd25..f08ec4e 100644 --- a/src/utils/utils.go +++ b/src/utils/utils.go @@ -22,7 +22,7 @@ var DefaultConfig = Config{ GenerateMissingAuthCert: true, HTTPPort: "80", HTTPSPort: "443", - Hostname: "0.0.0.0", + Hostname: "localhost", ProxyConfig: ProxyConfig{ Routes: []ProxyRouteConfig{}, },