all repos — dbee @ b22378184073ce48c49767ed1031a99e1e83166c

Move PostgreSQL backups using S3

handlers/db/init.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, splitS3Parts } = require("./_utils");
 7
 8const DUMP_DIR = "/tmp/";
 9
10const init = async params => {
11  const { s3Name, fileName } = splitS3Parts(params["s3Name/fileName"]);
12  const { psqlName, dbName } = splitPsqlParts(params["psqlName/dbName"]);
13  const psqlConfig = getPsqlConfig(psqlName);
14  const s3Config = getS3Config(s3Name);
15  const dumpPath = `${DUMP_DIR}${fileName}`;
16
17  try {
18    console.log(
19      chalk.greenBright(`Downloading ${fileName} from ${s3Name} server`)
20    );
21    await downloadDump(s3Config, { dumpPath, fileName });
22    console.log(
23      chalk.greenBright(
24        `Restoring ${dbName} database to ${psqlName} from ${fileName}`
25      )
26    );
27    await restoreDatabase(dumpPath, dbName, psqlConfig);
28    console.log(chalk.greenBright("Done."));
29  } catch (error) {
30    console.error(chalk.redBright(error));
31  }
32};
33
34const downloadDump = async (s3Config, { dumpPath, fileName }) =>
35  S3Client(s3Config).pull({ dumpPath, fileName });
36
37const restoreDatabase = async (dumpPath, dbName, psqlConfig) => {
38  await execPsqlCommand(`psql -c 'CREATE DATABASE ${dbName}'`, psqlConfig);
39
40  if (psqlConfig.timescale) {
41    await execPsqlCommand(
42      `psql -c 'SELECT timescaledb_pre_restore();' -d ${dbName}`,
43      psqlConfig
44    );
45  }
46
47  await execPsqlCommand(
48    `pg_restore -Fc -d ${dbName} "${dumpPath}"`,
49    psqlConfig
50  );
51
52  if (psqlConfig.timescale) {
53    await execPsqlCommand(
54      `psql -c 'SELECT timescaledb_post_restore();' -d ${dbName}`,
55      psqlConfig
56    );
57  }
58};
59
60module.exports = init;