handlers/db/backup.js (view raw)
1const chalk = require("chalk");
2const S3Client = require("../../libs/s3/client");
3const execPsqlCommand = require("../../libs/psql/shellCmd");
4const getPsqlConfig = require("../../libs/psql/getConfig");
5const getS3Config = require("../../libs/s3/getConfig");
6const { splitPsqlParts } = require("./_utils");
7
8const DUMP_DIR = "/tmp/";
9
10const bckp = async params => {
11 const { s3Name } = params;
12 const { psqlName, dbName } = splitPsqlParts(params["psqlName/dbName"]);
13 const psqlConfig = getPsqlConfig(psqlName);
14 const s3Config = getS3Config(s3Name);
15 const date = new Date().toISOString();
16 const fileName = `${dbName}.${psqlName}.${date}.bak`;
17 const dumpPath = `${DUMP_DIR}${fileName}`;
18
19 try {
20 console.log(
21 chalk.greenBright(
22 `Dumping ${dbName} database from ${psqlName} to ${dumpPath}`
23 )
24 );
25 await dumpDatabase(dumpPath, dbName, psqlConfig);
26 console.log(
27 chalk.greenBright(`Uploading ${fileName} to ${s3Config.name} S3 server`)
28 );
29 await pushToS3(s3Config, { dumpPath, fileName });
30 console.log(chalk.greenBright("Done."));
31 } catch (error) {
32 console.error(chalk.redBright(error));
33 }
34};
35
36const dumpDatabase = (dumpPath, dbName, psqlConfig) =>
37 execPsqlCommand(`pg_dump -Fc -f "${dumpPath}" ${dbName}`, psqlConfig);
38
39const pushToS3 = async (s3Config, { dumpPath, fileName }) =>
40 S3Client(s3Config).push({ dumpPath, fileName });
41
42module.exports = bckp;