diff --git a/docker-compose-no-mongo.yml b/docker-compose-no-mongo.yml new file mode 100644 index 0000000..2d89b36 --- /dev/null +++ b/docker-compose-no-mongo.yml @@ -0,0 +1,13 @@ +version: '3' + +services: + app: + container_name: mydrive-node-no-mongo + restart: always + build: . + ports: + - '3000:3000' + - '8080:8080' + env_file: + - docker-variables.env + \ No newline at end of file diff --git a/package.json b/package.json index 999bf6c..1fcb413 100755 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "start": "NODE_ENV=production node dist/server/serverStart.js --env production", "create-indexes-database": "env-cmd -f ./config/prod.env node serverUtils/createIndexes.js", "create-indexes-database:dev": "env-cmd -f ./config/dev.env node serverUtils/createIndexes.js", - "init": "node serverUtils/initServer.js", + "setup": "node serverUtils/setupServer.js", "debug": "env-cmd -f ./config/prod.env node --expose-gc --inspect=9222 dist/server/serverStart.js --env production", "heroku-postbuild": "npm run build" }, diff --git a/serverUtils/initServer.js b/serverUtils/initServer.js deleted file mode 100644 index 403d280..0000000 --- a/serverUtils/initServer.js +++ /dev/null @@ -1,148 +0,0 @@ -const prompts = require("prompts"); -const fs = require("fs"); -const crypto = require("crypto"); - -const initServer = async() => { - - console.log("Initializing Server...\n"); - - await fs.mkdir("./config", async() => { - - const getClientPortNumber = await prompts({ - type: 'text', - message: "Enter Client Port Number (Default 3000):", - name: "value" - }) - const clientPortNumber = getClientPortNumber.value || "3000"; - - const getClientUrl = await prompts({ - type: 'text', - message: "\nEnter Client URL (Add Port Number If Needed, Default http://localhost:3000):", - name: "value" - }) - - const clientURL = getClientUrl.value || "http://localhost:3000" - - const getClientTranscode = await prompts({ - type: 'text', - message: "\nEnable Transcode Video (Default False)", - name: "value" - }) - const clientTranscode = getClientTranscode.value || "false"; - - let fullInfoClient = "PORT=" + clientPortNumber + "\n" - + "REMOTE_URL=" + clientURL - - console.log("client transcode", clientTranscode); - - if (clientTranscode.toLowerCase() === "true") { - - fullInfoClient = fullInfoClient + "\n" - + "ENABLE_VIDEO_TRANSCODING=true" - } - - console.log("\nClient Into Completed, Getting Server Info...\n") - - const getSeverMongoURL = await prompts({ - type: 'text', - message: "\nEnter MongoDB URL (Default mongodb://127.0.0.1:27017/personal-drive):", - name: "value" - }) - - const serverMongoURL = getSeverMongoURL.value || "mongodb://127.0.0.1:27017/personal-drive" - - let randomPassword = crypto.randomBytes(16); - randomPassword = randomPassword.toString("hex"); - - - const getServerPassword = await prompts({ - type: 'text', - message: `\nEnter Server JSON Token Password (Default Random Password ${randomPassword}): `, - name: "value" - }) - const serverPassword = getServerPassword.value || randomPassword; - - - const getServerHttpPort = await prompts({ - type: 'text', - message: `\nEnter Server Http Port (Default 3000): `, - name: "value" - }) - const serverHttpPort = getServerHttpPort.value || "3000"; - - - const getServerHttpsPort = await prompts({ - type: 'text', - message: `\nEnter Server Https Port (Default 8080): `, - name: "value" - }) - const serverHttpsPort = getServerHttpsPort.value || "8080" - - const getServerUrl = await prompts({ - type: 'text', - message: `\nEnter Server URL (Do Not Include Port, Default localhost):`, - name: "value" - }) - const serverURL = getServerUrl.value || "localhost" - - const getServerFullUrl = await prompts({ - type: 'text', - message: `\nEnter Full Server URL (Include Port If Needed, Default http://localhost:3000):`, - name: "value" - }) - const serverFullURL = getServerFullUrl.value || "http://localhost:3000"; - - const getServerRoot = await prompts({ - type: 'text', - message: `\nEnter Path For Storage Size Check (Default /):`, - name: "value" - }) - const serverRoot = getServerRoot.value || "/"; - - const fullServerInfo = "MONGODB_URL=" + serverMongoURL + "\n" - + "PASSWORD=" + serverPassword + "\n" - + "HTTP_PORT=" + serverHttpPort + "\n" - + "HTTPS_PORT=" + serverHttpsPort + "\n" - + "URL=" + serverURL + "\n" - + "FULL_URL=" + serverFullURL + "\n" - + "ROOT=" + serverRoot + "\n"; - - console.log("\nServer Info Finished, Displaying Results...\n"); - - console.log("Client Info:\n", fullInfoClient) - - console.log("\nServer Info:\n", fullServerInfo) - - const getConfimation = await prompts({ - type: 'text', - message: `Would You Like To Save These Files (Yes/No): `, - name: "value" - }) - - if (!getConfimation.value || getConfimation.value.toLowerCase() !== "yes") { - console.log("Exiting...") - process.exit() - return; - } - - await fs.writeFile("./.env.production", fullInfoClient, async(err) => { - - if (err) { - console.log("Error", err); - process.exit(); - } - - await fs.writeFile("./config/prod.env", fullServerInfo, (err2) => { - - if (err2) { - console.log("Error", err2); - process.exit(); - } - }) - - }) - - }); -} - -initServer(); \ No newline at end of file diff --git a/serverUtils/setupServer.js b/serverUtils/setupServer.js new file mode 100644 index 0000000..fe1c251 --- /dev/null +++ b/serverUtils/setupServer.js @@ -0,0 +1,340 @@ +const prompts = require("prompts"); +const fs = require("fs"); +const crypto = require("crypto"); + +const awaitcreateDir = (path) => { + + return new Promise((resolve, reject) => { + + fs.mkdir(path, () => { + resolve(); + }) + }) +} + +const awaitWriteFile = (path, data) => { + + return new Promise((resolve, reject) => { + + fs.writeFile(path, data, async(err) => { + + if (err) { + console.log("file write error", err); + reject(); + } + + resolve(); + }) + }) +} + +const initServer = async() => { + + console.log("Setting Up Server...\n"); + + await awaitcreateDir("./config"); + + const getDocker = await prompts({ + type: 'toggle', + name: 'value', + message: 'Use Docker With myDrive?', + initial: true, + active: 'yes', + inactive: 'no' + }) + + const docker = getDocker.value; + + + if (docker) { + + let stringBuilder = ''; + + const getUsingMongo = await prompts({ + type: 'toggle', + name: 'value', + message: "Include MongoDB In The Docker Image? (Select No If You're Using MongoDB Atlas)", + initial: true, + active: 'yes', + inactive: 'no' + }) + + const mongo = getUsingMongo.value; + + let mongoURL = "mongodb://mongo:27017/personal-drive"; + + if (!mongo) { + + const getMongoURL = await prompts({ + type: 'text', + message: "Enter The MongoDB URL", + name: "value" + }) + + mongoURL = getMongoURL.value; + } + + stringBuilder += "MONGODB_URL=" + mongoURL + "\n" + + const getKeyType = await prompts({ + type: 'toggle', + name: 'value', + message: "Use WebUI For Encryption Key (Recommended, Selecting No Will Require You To Enter An Encryption Key Now, Which Is Less Secure)", + initial: true, + active: 'yes', + inactive: 'no' + }) + + let keyType = getKeyType.value; + + if (!keyType) { + + const getKey = await prompts({ + type: 'password', + message: "Enter The Encryption Key", + name: "value" + }) + + const key = getKey.value; + + stringBuilder += "KEY=" + key + "\n"; + } + + const getClientURL = await prompts({ + type: 'text', + message: "Enter The Client URL/IP Address (Must Be A Valid Link)", + name: "value" + }) + + const clientURL = getClientURL.value; + + stringBuilder += "REMOTE_URL=" + clientURL + "\n"; + + const getChunkDB = await prompts({ + type: 'select', + name: 'value', + message: 'Pick A Database To Store File Chunks', + choices: [ + { title: 'Amazon S3', value: 's3'}, + { title: 'FileSystem', value: 'fs'}, + { title: 'MongoDB', value: 'mongo' }, + ], + initial: 1 + }) + + const chunkDB = getChunkDB.value; + + stringBuilder += "DB_TYPE=" + chunkDB + "\n"; + + if (chunkDB === "s3") { + + const gets3ID = await prompts({ + type: 'text', + message: "Enter The S3 ID", + name: "value" + }) + + const s3ID = gets3ID.value; + + stringBuilder += "S3_ID=" + s3ID + "\n"; + + const gets3Key = await prompts({ + type: 'password', + message: "Enter The S3 Key", + name: "value" + }) + + const s3Key = gets3Key.value; + + stringBuilder += "S3_KEY=" + s3Key + "\n"; + + const gets3Bucket = await prompts({ + type: 'text', + message: "Enter The S3 Bucket", + name: "value" + }) + + const s3Bucket = gets3Bucket.value; + + stringBuilder += "S3_BUCKET=" + s3Bucket + "\n"; + + } else if (chunkDB === "fs") { + + const getFSPath = await prompts({ + type: 'text', + message: "Enter The FileSystem Path", + name: "value" + }) + + const fsPath = getFSPath.value; + + stringBuilder += "FS_DIRECTORY=" + fsPath + "\n"; + } + + const getJWTSecret = await prompts({ + type: 'password', + message: "Enter JWT Secret", + name: "value", + }) + + const JWTsecret = getJWTSecret.value; + + stringBuilder += "PASSWORD=" + JWTsecret + "\n"; + + stringBuilder += "DISABLE_STORAGE=true\n"; + stringBuilder += "DOCKER=true\n"; + stringBuilder += "NODE_ENV=production\n"; + stringBuilder += "PORT=3000\n"; + stringBuilder += "HTTP_PORT=3000\n"; + stringBuilder += "HTTPS_PORT=8080\n" + + await awaitWriteFile("./docker-variables.env", stringBuilder); + + } else { + + } + + + + return; + + await fs.mkdir("./config", async() => { + + const getClientPortNumber = await prompts({ + type: 'text', + message: "Enter Client Port Number (Default 3000):", + name: "value" + }) + const clientPortNumber = getClientPortNumber.value || "3000"; + + const getClientUrl = await prompts({ + type: 'text', + message: "\nEnter Client URL (Add Port Number If Needed, Default http://localhost:3000):", + name: "value" + }) + + const clientURL = getClientUrl.value || "http://localhost:3000" + + const getClientTranscode = await prompts({ + type: 'text', + message: "\nEnable Transcode Video (Default False)", + name: "value" + }) + const clientTranscode = getClientTranscode.value || "false"; + + let fullInfoClient = "PORT=" + clientPortNumber + "\n" + + "REMOTE_URL=" + clientURL + + console.log("client transcode", clientTranscode); + + if (clientTranscode.toLowerCase() === "true") { + + fullInfoClient = fullInfoClient + "\n" + + "ENABLE_VIDEO_TRANSCODING=true" + } + + console.log("\nClient Into Completed, Getting Server Info...\n") + + const getSeverMongoURL = await prompts({ + type: 'text', + message: "\nEnter MongoDB URL (Default mongodb://127.0.0.1:27017/personal-drive):", + name: "value" + }) + + const serverMongoURL = getSeverMongoURL.value || "mongodb://127.0.0.1:27017/personal-drive" + + let randomPassword = crypto.randomBytes(16); + randomPassword = randomPassword.toString("hex"); + + + const getServerPassword = await prompts({ + type: 'text', + message: `\nEnter Server JSON Token Password (Default Random Password ${randomPassword}): `, + name: "value" + }) + const serverPassword = getServerPassword.value || randomPassword; + + + const getServerHttpPort = await prompts({ + type: 'text', + message: `\nEnter Server Http Port (Default 3000): `, + name: "value" + }) + const serverHttpPort = getServerHttpPort.value || "3000"; + + + const getServerHttpsPort = await prompts({ + type: 'text', + message: `\nEnter Server Https Port (Default 8080): `, + name: "value" + }) + const serverHttpsPort = getServerHttpsPort.value || "8080" + + const getServerUrl = await prompts({ + type: 'text', + message: `\nEnter Server URL (Do Not Include Port, Default localhost):`, + name: "value" + }) + const serverURL = getServerUrl.value || "localhost" + + const getServerFullUrl = await prompts({ + type: 'text', + message: `\nEnter Full Server URL (Include Port If Needed, Default http://localhost:3000):`, + name: "value" + }) + const serverFullURL = getServerFullUrl.value || "http://localhost:3000"; + + const getServerRoot = await prompts({ + type: 'text', + message: `\nEnter Path For Storage Size Check (Default /):`, + name: "value" + }) + const serverRoot = getServerRoot.value || "/"; + + const fullServerInfo = "MONGODB_URL=" + serverMongoURL + "\n" + + "PASSWORD=" + serverPassword + "\n" + + "HTTP_PORT=" + serverHttpPort + "\n" + + "HTTPS_PORT=" + serverHttpsPort + "\n" + + "URL=" + serverURL + "\n" + + "FULL_URL=" + serverFullURL + "\n" + + "ROOT=" + serverRoot + "\n"; + + console.log("\nServer Info Finished, Displaying Results...\n"); + + console.log("Client Info:\n", fullInfoClient) + + console.log("\nServer Info:\n", fullServerInfo) + + const getConfimation = await prompts({ + type: 'text', + message: `Would You Like To Save These Files (Yes/No): `, + name: "value" + }) + + if (!getConfimation.value || getConfimation.value.toLowerCase() !== "yes") { + console.log("Exiting...") + process.exit() + return; + } + + await fs.writeFile("./.env.production", fullInfoClient, async(err) => { + + if (err) { + console.log("Error", err); + process.exit(); + } + + await fs.writeFile("./config/prod.env", fullServerInfo, (err2) => { + + if (err2) { + console.log("Error", err2); + process.exit(); + } + }) + + }) + + }); +} + +initServer(); \ No newline at end of file