365 lines
9.8 KiB
JavaScript
365 lines
9.8 KiB
JavaScript
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 (Enter The Client URL/IP Address (Must Be A Valid Link, Include Port With IP Address If Needed)",
|
|
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";
|
|
|
|
const getUseSSL = await prompts({
|
|
type: 'toggle',
|
|
name: 'value',
|
|
message: "Use SSL? (Will Require SSL Certificate certificate.crt, certificate.ca-bundle, And certificate.key At Root Of The Project)",
|
|
initial: true,
|
|
active: 'yes',
|
|
inactive: 'no'
|
|
})
|
|
|
|
const useSSL = getUseSSL.value;
|
|
|
|
if (useSSL) {
|
|
|
|
stringBuilder += "SSL=true\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);
|
|
|
|
console.log("\nCreated Docker Env File");
|
|
|
|
} else {
|
|
|
|
let stringBuilderClient = '';
|
|
let stringBuilderServer = '';
|
|
|
|
const getMongoURL = await prompts({
|
|
type: 'text',
|
|
message: "Enter The MongoDB URL",
|
|
name: "value"
|
|
})
|
|
|
|
const mongoURL = getMongoURL.value;
|
|
|
|
stringBuilderServer += "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;
|
|
|
|
stringBuilderServer += "KEY=" + key + "\n";
|
|
}
|
|
|
|
const getClientURL = await prompts({
|
|
type: 'text',
|
|
message: "Enter The Client URL/IP Address (Must Be A Valid Link, Include Port With IP Address If Needed)",
|
|
name: "value"
|
|
})
|
|
|
|
const clientURL = getClientURL.value;
|
|
|
|
stringBuilderClient += "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;
|
|
|
|
stringBuilderServer += "DB_TYPE=" + chunkDB + "\n";
|
|
|
|
if (chunkDB === "s3") {
|
|
|
|
const gets3ID = await prompts({
|
|
type: 'text',
|
|
message: "Enter The S3 ID",
|
|
name: "value"
|
|
})
|
|
|
|
const s3ID = gets3ID.value;
|
|
|
|
stringBuilderServer += "S3_ID=" + s3ID + "\n";
|
|
|
|
const gets3Key = await prompts({
|
|
type: 'password',
|
|
message: "Enter The S3 Key",
|
|
name: "value"
|
|
})
|
|
|
|
const s3Key = gets3Key.value;
|
|
|
|
stringBuilderServer += "S3_KEY=" + s3Key + "\n";
|
|
|
|
const gets3Bucket = await prompts({
|
|
type: 'text',
|
|
message: "Enter The S3 Bucket",
|
|
name: "value"
|
|
})
|
|
|
|
const s3Bucket = gets3Bucket.value;
|
|
|
|
stringBuilderServer += "S3_BUCKET=" + s3Bucket + "\n";
|
|
stringBuilderClient += "DISABLE_STORAGE=true\n";
|
|
|
|
} else if (chunkDB === "fs") {
|
|
|
|
const getFSPath = await prompts({
|
|
type: 'text',
|
|
message: "Enter The FileSystem Path",
|
|
name: "value"
|
|
})
|
|
|
|
const fsPath = getFSPath.value;
|
|
|
|
stringBuilderServer += "FS_DIRECTORY=" + fsPath + "\n";
|
|
stringBuilderServer += "ROOT=" + fsPath + "\n";
|
|
|
|
} else {
|
|
|
|
stringBuilderClient += "DISABLE_STORAGE=true\n";
|
|
}
|
|
|
|
const getJWTSecret = await prompts({
|
|
type: 'password',
|
|
message: "Enter JWT Secret",
|
|
name: "value",
|
|
})
|
|
|
|
const JWTsecret = getJWTSecret.value;
|
|
|
|
stringBuilderServer += "PASSWORD=" + JWTsecret + "\n";
|
|
|
|
const getUseSSL = await prompts({
|
|
type: 'toggle',
|
|
name: 'value',
|
|
message: "Use SSL? (Will Require SSL Certificate certificate.crt, certificate.ca-bundle, And certificate.key At Root Of The Project)",
|
|
initial: true,
|
|
active: 'yes',
|
|
inactive: 'no'
|
|
})
|
|
|
|
const useSSL = getUseSSL.value;
|
|
|
|
if (useSSL) {
|
|
|
|
stringBuilderServer += "SSL=true\n";
|
|
}
|
|
|
|
stringBuilderServer += "NODE_ENV=production\n";
|
|
stringBuilderClient += "PORT=3000\n";
|
|
stringBuilderServer += "HTTP_PORT=3000\n";
|
|
stringBuilderServer += "HTTPS_PORT=8080\n"
|
|
|
|
await awaitWriteFile("./.env.production", stringBuilderClient);
|
|
await awaitWriteFile("./config/prod.env", stringBuilderServer);
|
|
|
|
console.log("\nServer And Client Env Files Created");
|
|
}
|
|
}
|
|
|
|
initServer(); |