UNPKG

@topgroup/diginext

Version:

A BUILD SERVER & CLI to deploy apps to any Kubernetes clusters.

225 lines (224 loc) 9.07 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createNewDatabase = exports.addDefaultUser = exports.addUser = exports.connect = exports.restore = exports.backup = exports.checkConnection = void 0; /* eslint-disable prettier/prettier */ const makeDaySlug_1 = require("diginext-utils/dist/string/makeDaySlug"); const log_1 = require("diginext-utils/dist/xconsole/log"); const fs_1 = require("fs"); const generate_password_1 = __importDefault(require("generate-password")); const mongodb_1 = require("mongodb"); const path_1 = __importDefault(require("path")); const const_1 = require("../../config/const"); let currentDB; // import { execaSync } from "execa"; const checkConnection = async (options) => { const { execa, execaCommand, execaSync } = await Promise.resolve().then(() => __importStar(require("execa"))); try { if (options.url) { const { stdout, stderr } = execaSync(`mongosh`, [options.url, "--eval", "db.version()"]); if (options.isDebugging) console.log("[MONGODB] Connected :>> ", stdout); } else { const { stdout, stderr } = execaSync(`mongosh`, [ "--host", `${options.host}:${options.port || 27017}`, "--username", options.user || "root", "--password", options.pass, "--eval", "db.version()", ]); if (options.isDebugging) console.log("[MONGODB] Connected :>> ", stdout); } return true; } catch (e) { console.error("[MONGODB]", e); return false; } }; exports.checkConnection = checkConnection; const backup = async (options) => { const { execa, execaCommand, execaSync } = await Promise.resolve().then(() => __importStar(require("execa"))); const bkName = `mongodb-backup-${(0, makeDaySlug_1.makeDaySlug)()}`; const mongoBackupDir = path_1.default.resolve(const_1.STORAGE_DIR, `mongodb`); if (!options.outDir) options.outDir = path_1.default.resolve(mongoBackupDir, bkName); if (!(0, fs_1.existsSync)(options.outDir)) (0, fs_1.mkdirSync)(options.outDir, { recursive: true }); console.log("[MONGODB] backup > options :>> ", options); if (options.url) { const { stdout, stderr } = await execa(`mongodump`, ["--uri", options.url, "--out", options.outDir]); if (stderr) (0, log_1.logError)(stderr); if (options.isDebugging) console.log("[MONGODB] Backup successfully :>> ", stdout); } else { const { stdout, stderr } = await execa(`mongodump`, [ "--host", `${options.host}:${options.port || 27017}`, "--username", options.user || "root", "--password", options.pass, "--authenticationDatabase", options.authDb || "admin", options.dbName ? `--db=${options.dbName}` : "", "--out", options.outDir, ]); if (stderr) (0, log_1.logError)(stderr); if (options.isDebugging) console.log("[MONGODB] Backup successfully :>> ", stdout); } // compress backup folder const compressedBackupName = `${bkName}.tar.gz`; const { stdout } = await execa("tar", ["-czf", compressedBackupName, bkName], { cwd: mongoBackupDir }); if (options.isDebugging) console.log("Compressing backup directory :>> ", stdout); // keep the compressed file, remove the directory to save disk space... const childBackupDir = path_1.default.join(mongoBackupDir, bkName); if ((0, fs_1.existsSync)(childBackupDir)) (0, fs_1.rmSync)(childBackupDir, { recursive: true, force: true }); return { name: bkName, path: path_1.default.join(mongoBackupDir, compressedBackupName) }; }; exports.backup = backup; const restore = async (options) => { const { execa, execaCommand, execaSync } = await Promise.resolve().then(() => __importStar(require("execa"))); if (!options.dir) { options.dir = path_1.default.resolve(const_1.CLI_DIR, `storage/mongodb/mongodb-backup-${(0, makeDaySlug_1.makeDaySlug)()}`); } if (!(0, fs_1.existsSync)(options.dir)) (0, fs_1.mkdirSync)(options.dir, { recursive: true }); try { if (options.url) { const { stdout, stderr } = execaSync(`mongorestore`, ["--uri", options.url, options.dbName ? `--db=${options.dbName}` : ""]); if (options.isDebugging) console.log("[MONGODB] Restore successfully :>> ", stdout); } else { const { stdout, stderr } = execaSync(`mongorestore`, [ "--host", `${options.host}:${options.port || 27017}`, "--username", options.user || "root", "--password", options.pass, "--authenticationDatabase", options.authDb || "admin", options.dbName ? `--db=${options.dbName}` : "", "--out", options.dir, ]); if (options.isDebugging) console.log("[MONGODB] Restore successfully :>> ", stdout); } return true; } catch (e) { return false; } }; exports.restore = restore; const connect = async ({ dbName, env = "dev", provider = "digitalocean" }) => { if (currentDB) return currentDB; if (!dbName) (0, log_1.logError)("Thiếu database name."); let client; const dbInfo = { auth: "", host: "" }; // config[provider].database.mongo[env] || config[provider].database.mongo.default; let auth = dbInfo.auth; let host = dbInfo.host; let connectionStr = `mongodb://${auth}@${host}/${dbName}?authSource=admin`; try { client = await mongodb_1.MongoClient.connect(connectionStr); } catch (err) { (0, log_1.logError)(err); } const db = client.db(dbName); currentDB = db; return db; }; exports.connect = connect; const addUser = async ({ dbName, env = "dev", name, pass }) => { const db = await (0, exports.connect)({ dbName, env }); try { await db.addUser(name, pass, { roles: [ { role: "dbOwner", db: dbName, }, ], }); } catch (e) { (0, log_1.logError)(e); } }; exports.addUser = addUser; const addDefaultUser = async ({ dbName, env = "dev" }) => { const pass = env == "dev" ? "Top@123#" : generate_password_1.default.generate({ length: 10, numbers: true, }); await (0, exports.addUser)({ dbName, env, name: "admin", pass }); return { dbName, env, name: "admin", pass }; }; exports.addDefaultUser = addDefaultUser; const createNewDatabase = async ({ env = "dev", dbName = "cli-test-1", provider = "digitalocean" }) => { const db = await (0, exports.connect)({ dbName, env, provider }); // create initial collection: try { await db.createCollection("logs"); } catch (e) { if (e.codeName == "NamespaceExists") { (0, log_1.logError)(`Database '${dbName}' đã tồn tại, vui lòng chọn tên khác.`); } } // add users let host = ""; //TODO: find host // config.database.mongo[env].host; const { name, pass } = await (0, exports.addDefaultUser)({ env, dbName }); (0, log_1.logSuccess)(`Connection string:`, `mongodb://${name}:${encodeURIComponent(pass)}@${host}/${dbName}?authSource=${dbName}`); process.exit(1); }; exports.createNewDatabase = createNewDatabase; const MongoShell = { checkConnection: exports.checkConnection, backup: exports.backup, restore: exports.restore }; exports.default = MongoShell;