@topgroup/diginext
Version:
A BUILD SERVER & CLI to deploy apps to any Kubernetes clusters.
225 lines (224 loc) • 9.07 kB
JavaScript
;
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;