-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.ts
115 lines (103 loc) · 2.94 KB
/
app.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import "dotenv/config";
import { CronJob } from "cron";
import {
DatabaseConfiguration,
DriverMap,
S3Configuration,
} from "./drivers/BackupDriver";
import MySQLBackupDriver from "./drivers/mysql";
import ClickhouseBackupDriver from "./drivers/clickhouse";
import { validate } from "./utils/validate";
import PostgreSQLBackupDriver from "./drivers/postgresql";
const {
S3_BUCKET,
DB_NUMBER,
S3_ACCESS_KEY,
S3_SECRET_KEY,
S3_ENDPOINT,
S3_SSL,
S3_FORCE_PATH_STYLE,
RUN_ON_START,
} = process.env;
if (
!validate([
S3_BUCKET,
DB_NUMBER,
S3_ACCESS_KEY,
S3_SECRET_KEY,
S3_ENDPOINT,
S3_SSL,
S3_FORCE_PATH_STYLE,
])
) {
console.error("Missing env properties! Check documentation and try again.");
process.exit(1);
}
const s3Config: S3Configuration = {
endpoint: S3_ENDPOINT || "",
secure: S3_SSL === "true",
secretKey: S3_SECRET_KEY || "",
accessKey: S3_ACCESS_KEY || "",
bucket: S3_BUCKET || "",
forcePathStyle: S3_FORCE_PATH_STYLE === "true",
};
const driverMap: DriverMap = {
mysql: new MySQLBackupDriver(s3Config),
clickhouse: new ClickhouseBackupDriver(s3Config),
postgresql: new PostgreSQLBackupDriver(s3Config),
};
for (let i = 0; i < Number(DB_NUMBER || 1); i++) {
if (
!validate([
process.env[`DB_NAME_${i}`],
process.env[`DB_HOST_${i}`],
process.env[`DB_PORT_${i}`],
process.env[`DB_USER_${i}`],
process.env[`DB_PASS_${i}`],
process.env[`DB_CRON_PATTERN_${i}`],
process.env[`DB_TYPE_${i}`],
])
) {
console.error(
`Missing env properties for database (${i})! Check documentation and try again.`,
);
process.exit(1);
}
const name = process.env[`DB_NAME_${i}`] || "";
const host = process.env[`DB_HOST_${i}`] || "";
const port = Number(process.env[`DB_PORT_${i}`]);
const user = process.env[`DB_USER_${i}`] || "";
const password = process.env[`DB_PASS_${i}`] || "";
const cronPattern = process.env[`DB_CRON_PATTERN_${i}`] || "0 */6 * * *";
const databaseType = process.env[`DB_TYPE_${i}`] || "";
const skipTables = Object.hasOwn(process.env, `DB_SKIP_TABLES_${i}`)
? process.env[`DB_SKIP_TABLES_${i}`]
: "";
const dbConfig: DatabaseConfiguration = {
name,
password,
user,
port,
host,
skipTables: skipTables ? skipTables.split(",") : [],
};
if (!driverMap.hasOwnProperty(databaseType)) {
console.error("Invalid database type! Check documentation and try again.");
process.exit(1);
}
const backup = () => {
driverMap[databaseType]
.prepareBackup({ database: dbConfig })
.catch((err) => {
console.error("Error while preparing backup", err);
});
};
const cron = new CronJob(cronPattern, backup);
cron.start();
if (RUN_ON_START === "true") {
backup();
}
console.info(
`Starting backup worker. Cron set to "${cronPattern}" for database ${databaseType}:"${name}" and S3 bucket: "${s3Config.bucket}". Next backup at ${cron.nextDate()}`,
);
}