all repos — dbee @ main

Move PostgreSQL backups using S3

libs/s3/client.js (view raw)

 1const Minio = require("minio");
 2const chalk = require("chalk");
 3
 4module.exports = s3Config => {
 5  const minio = getMinioClient(s3Config);
 6
 7  return {
 8    push: push(minio, s3Config),
 9    pull: pull(minio, s3Config),
10    list: list(minio, s3Config),
11    remove: remove(minio, s3Config),
12  };
13};
14
15const getMinioClient = s3Config =>
16  new Minio.Client({
17    endPoint: s3Config.host,
18    port: s3Config.port,
19    useSSL: s3Config.useSSL,
20    accessKey: s3Config.accessKey,
21    secretKey: s3Config.secretKey,
22  });
23
24const push = (minio, s3Config) => async ({ dumpPath, fileName }) => {
25  await upsertBucket(minio, s3Config);
26  return minio.fPutObject(s3Config.bucket, fileName, dumpPath);
27};
28
29const pull = (minio, s3Config) => async ({ dumpPath, fileName }) =>
30  minio.fGetObject(s3Config.bucket, fileName, dumpPath);
31
32const list = (minio, s3Config) => async () => {
33  await upsertBucket(minio, s3Config);
34  return new Promise((resolve, reject) => {
35    const stream = minio.listObjectsV2(s3Config.bucket);
36    let files = [];
37    stream.on("data", obj => files.push(obj));
38    stream.on("end", () => resolve(files));
39    stream.on("error", reject);
40  });
41};
42
43const remove = (minio, s3Config) => async fileName =>
44  minio.removeObject(s3Config.bucket, fileName);
45
46const upsertBucket = async (minio, s3Config) => {
47  const bucketExists = await minio.bucketExists(s3Config.bucket);
48
49  if (!bucketExists) {
50    await minio.makeBucket(s3Config.bucket);
51    console.log(chalk.blue(`Bucket ${s3Config.bucket} created on S3 server`));
52  }
53};