feat: add backup size metadata to response

This commit add backup size to response object using bash script.

This will also remove minio package as it changed to bash script
instead.
This commit is contained in:
Methapon2001 2024-07-16 13:34:15 +07:00
parent c963c040ef
commit 4fde3a7988
4 changed files with 57 additions and 233 deletions

View file

@ -1,5 +1,4 @@
import { Body, Controller, Delete, Get, Post, Route, Security } from "tsoa";
import { Client as MinioClient, BucketItem } from "minio";
import HttpError from "../interfaces/http-error";
import HttpStatus from "../interfaces/http-status";
@ -14,6 +13,7 @@ const WINDMILL_WORKSPACE = getEnvVar("WINDMILL_WORKSPACE");
const WINDMILL_BACKUP_FLOW_PATH = getEnvVar("WINDMILL_BACKUP_FLOW_PATH");
const WINDMILL_RESTORE_FLOW_PATH = getEnvVar("WINDMILL_RESTORE_FLOW_PATH");
const WINDMILL_BACKUP_DELETE_SCRIPT_PATH = getEnvVar("WINDMILL_BACKUP_DELETE_SCRIPT_PATH");
const WINDMILL_BACKUP_LIST_SCRIPT_PATH = getEnvVar("WINDMILL_BACKUP_LIST_SCRIPT_PATH");
const WINDMILL_API_KEY = getEnvVar("WINDMILL_API_KEY");
const DB_HOST = getEnvVar("DB_HOST");
const DB_PORT = process.env.DB_PORT;
@ -33,37 +33,46 @@ const BACKUP_MINIO_ACCESS_KEY = getEnvVar("BACKUP_MINIO_ACCESS_KEY");
const BACKUP_MINIO_SECRET_KEY = getEnvVar("BACKUP_MINIO_SECRET_KEY");
const BACKUP_MINIO_BUCKET = getEnvVar("BACKUP_MINIO_BUCKET");
const minio = new MinioClient({
useSSL: BACKUP_MINIO_USE_SSL === "true",
endPoint: BACKUP_MINIO_HOST,
port: +(BACKUP_MINIO_PORT || "9000"),
accessKey: BACKUP_MINIO_ACCESS_KEY,
secretKey: BACKUP_MINIO_SECRET_KEY,
});
@Route("/api/v1/backup")
@Security("keycloak")
export class BackupController extends Controller {
@Get()
async listBackup() {
return await new Promise((resolve, reject) => {
const data: BucketItem[] = [];
const stream = minio.listObjectsV2(BACKUP_MINIO_BUCKET);
stream.on("data", (obj) => data.unshift(obj));
stream.on("end", () =>
resolve(
data.flatMap((v) =>
"prefix" in v
? []
: {
name: v.name.replace(".sql.gz", ""),
timestamp: v.lastModified,
},
),
),
);
stream.on("error", (err) => reject(err));
const data = await fetch(
`${WINDMILL_URL}/api/w/${WINDMILL_WORKSPACE}/jobs/run_wait_result/p/${WINDMILL_BACKUP_LIST_SCRIPT_PATH}`,
{
method: "POST",
headers: {
Authorization: `Bearer ${WINDMILL_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
s3_backup_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`,
s3_backup_access: BACKUP_MINIO_ACCESS_KEY,
s3_backup_secret: BACKUP_MINIO_SECRET_KEY,
s3_backup_bucket: BACKUP_MINIO_BUCKET,
}),
},
).then(async (r) => {
const data = await r.json();
if (typeof data === "object" && "error" in data) {
console.error(data);
throw new Error("Cannot get status.");
}
return JSON.parse(data) as { database: Record<string, any>[]; bucket: Record<string, any>[] };
});
return data.database.flatMap((a) =>
a.type === "file"
? {
name: a.key as string,
databaseSize: a.size as number,
storageSize: data.bucket.find((b) => a.key.replace(".sql.gz", "") === b.prefix)
?.size as number,
timestamp: a.lastModified as string,
}
: [],
);
}
@Get("backup-running-list")