dbdock 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +596 -0
- package/dist/alerts/alert-templates.d.ts +3 -0
- package/dist/alerts/alert-templates.js +95 -0
- package/dist/alerts/alert-templates.js.map +1 -0
- package/dist/alerts/alert.module.d.ts +2 -0
- package/dist/alerts/alert.module.js +23 -0
- package/dist/alerts/alert.module.js.map +1 -0
- package/dist/alerts/alert.service.d.ts +23 -0
- package/dist/alerts/alert.service.js +210 -0
- package/dist/alerts/alert.service.js.map +1 -0
- package/dist/alerts/alert.types.d.ts +24 -0
- package/dist/alerts/alert.types.js +11 -0
- package/dist/alerts/alert.types.js.map +1 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +34 -0
- package/dist/app.module.js.map +1 -0
- package/dist/backup/backup.module.d.ts +2 -0
- package/dist/backup/backup.module.js +26 -0
- package/dist/backup/backup.module.js.map +1 -0
- package/dist/backup/backup.service.d.ts +23 -0
- package/dist/backup/backup.service.js +303 -0
- package/dist/backup/backup.service.js.map +1 -0
- package/dist/backup/backup.types.d.ts +42 -0
- package/dist/backup/backup.types.js +16 -0
- package/dist/backup/backup.types.js.map +1 -0
- package/dist/backup/compression.service.d.ts +6 -0
- package/dist/backup/compression.service.js +30 -0
- package/dist/backup/compression.service.js.map +1 -0
- package/dist/cli/commands/backup.d.ts +8 -0
- package/dist/cli/commands/backup.js +198 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/cleanup.d.ts +6 -0
- package/dist/cli/commands/cleanup.js +160 -0
- package/dist/cli/commands/cleanup.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +6 -0
- package/dist/cli/commands/delete.js +252 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.js +534 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +8 -0
- package/dist/cli/commands/list.js +288 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/restore.d.ts +1 -0
- package/dist/cli/commands/restore.js +637 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/schedule.d.ts +1 -0
- package/dist/cli/commands/schedule.js +197 -0
- package/dist/cli/commands/schedule.js.map +1 -0
- package/dist/cli/commands/start.d.ts +7 -0
- package/dist/cli/commands/start.js +267 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +46 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/test.d.ts +1 -0
- package/dist/cli/commands/test.js +212 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +78 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/config.d.ts +80 -0
- package/dist/cli/utils/config.js +29 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +7 -0
- package/dist/cli/utils/logger.js +15 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/cli/utils/progress.d.ts +21 -0
- package/dist/cli/utils/progress.js +130 -0
- package/dist/cli/utils/progress.js.map +1 -0
- package/dist/cli/utils/retention.d.ts +26 -0
- package/dist/cli/utils/retention.js +118 -0
- package/dist/cli/utils/retention.js.map +1 -0
- package/dist/config/config.module.d.ts +2 -0
- package/dist/config/config.module.js +29 -0
- package/dist/config/config.module.js.map +1 -0
- package/dist/config/config.schema.d.ts +56 -0
- package/dist/config/config.schema.js +219 -0
- package/dist/config/config.schema.js.map +1 -0
- package/dist/config/config.service.d.ts +13 -0
- package/dist/config/config.service.js +160 -0
- package/dist/config/config.service.js.map +1 -0
- package/dist/crypto/crypto.module.d.ts +2 -0
- package/dist/crypto/crypto.module.js +21 -0
- package/dist/crypto/crypto.module.js.map +1 -0
- package/dist/crypto/crypto.service.d.ts +22 -0
- package/dist/crypto/crypto.service.js +187 -0
- package/dist/crypto/crypto.service.js.map +1 -0
- package/dist/dbdock.d.ts +10 -0
- package/dist/dbdock.js +36 -0
- package/dist/dbdock.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +10 -0
- package/dist/main.js.map +1 -0
- package/dist/scheduler/schedule-manager.d.ts +22 -0
- package/dist/scheduler/schedule-manager.js +126 -0
- package/dist/scheduler/schedule-manager.js.map +1 -0
- package/dist/scheduler/scheduler.module.d.ts +2 -0
- package/dist/scheduler/scheduler.module.js +25 -0
- package/dist/scheduler/scheduler.module.js.map +1 -0
- package/dist/scheduler/scheduler.service.d.ts +28 -0
- package/dist/scheduler/scheduler.service.js +171 -0
- package/dist/scheduler/scheduler.service.js.map +1 -0
- package/dist/standalone/backup-standalone.d.ts +14 -0
- package/dist/standalone/backup-standalone.js +364 -0
- package/dist/standalone/backup-standalone.js.map +1 -0
- package/dist/storage/adapters/cloudinary.adapter.d.ts +23 -0
- package/dist/storage/adapters/cloudinary.adapter.js +215 -0
- package/dist/storage/adapters/cloudinary.adapter.js.map +1 -0
- package/dist/storage/adapters/local.adapter.d.ts +20 -0
- package/dist/storage/adapters/local.adapter.js +214 -0
- package/dist/storage/adapters/local.adapter.js.map +1 -0
- package/dist/storage/adapters/r2.adapter.d.ts +10 -0
- package/dist/storage/adapters/r2.adapter.js +33 -0
- package/dist/storage/adapters/r2.adapter.js.map +1 -0
- package/dist/storage/adapters/s3.adapter.d.ts +26 -0
- package/dist/storage/adapters/s3.adapter.js +199 -0
- package/dist/storage/adapters/s3.adapter.js.map +1 -0
- package/dist/storage/storage.interface.d.ts +38 -0
- package/dist/storage/storage.interface.js +3 -0
- package/dist/storage/storage.interface.js.map +1 -0
- package/dist/storage/storage.module.d.ts +2 -0
- package/dist/storage/storage.module.js +21 -0
- package/dist/storage/storage.module.js.map +1 -0
- package/dist/storage/storage.service.d.ts +10 -0
- package/dist/storage/storage.service.js +89 -0
- package/dist/storage/storage.service.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.js +41 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/stream.pipe.d.ts +17 -0
- package/dist/utils/stream.pipe.js +54 -0
- package/dist/utils/stream.pipe.js.map +1 -0
- package/dist/wal/postgres-config.helper.d.ts +5 -0
- package/dist/wal/postgres-config.helper.js +117 -0
- package/dist/wal/postgres-config.helper.js.map +1 -0
- package/dist/wal/retention.service.d.ts +23 -0
- package/dist/wal/retention.service.js +158 -0
- package/dist/wal/retention.service.js.map +1 -0
- package/dist/wal/retention.types.d.ts +20 -0
- package/dist/wal/retention.types.js +3 -0
- package/dist/wal/retention.types.js.map +1 -0
- package/dist/wal/wal-archiver.service.d.ts +28 -0
- package/dist/wal/wal-archiver.service.js +263 -0
- package/dist/wal/wal-archiver.service.js.map +1 -0
- package/dist/wal/wal.module.d.ts +2 -0
- package/dist/wal/wal.module.js +26 -0
- package/dist/wal/wal.module.js.map +1 -0
- package/dist/wal/wal.types.d.ts +27 -0
- package/dist/wal/wal.types.js +11 -0
- package/dist/wal/wal.types.js.map +1 -0
- package/package.json +155 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.testCommand = testCommand;
|
|
40
|
+
const ora_1 = __importDefault(require("ora"));
|
|
41
|
+
const config_1 = require("../utils/config");
|
|
42
|
+
const logger_1 = require("../utils/logger");
|
|
43
|
+
const child_process_1 = require("child_process");
|
|
44
|
+
const fs_1 = require("fs");
|
|
45
|
+
const common_1 = require("@nestjs/common");
|
|
46
|
+
common_1.Logger.overrideLogger(false);
|
|
47
|
+
async function testCommand() {
|
|
48
|
+
logger_1.logger.info('Testing DBDock configuration...\n');
|
|
49
|
+
const spinner = (0, ora_1.default)('Loading configuration...').start();
|
|
50
|
+
try {
|
|
51
|
+
const config = (0, config_1.loadConfig)();
|
|
52
|
+
spinner.succeed('Configuration loaded');
|
|
53
|
+
spinner.start('Testing database connection...');
|
|
54
|
+
await testDatabaseConnection(config);
|
|
55
|
+
spinner.succeed('Database connection successful');
|
|
56
|
+
spinner.start('Testing storage configuration...');
|
|
57
|
+
await testStorageConfiguration(config);
|
|
58
|
+
spinner.succeed('Storage configuration valid');
|
|
59
|
+
if (config.alerts?.email?.enabled) {
|
|
60
|
+
spinner.start('Testing email configuration...');
|
|
61
|
+
await testEmailConfiguration(config);
|
|
62
|
+
spinner.succeed('Email configuration valid');
|
|
63
|
+
}
|
|
64
|
+
logger_1.logger.success('\nAll tests passed! Your configuration is ready to use.');
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
spinner.fail('Test failed');
|
|
68
|
+
logger_1.logger.error(error instanceof Error ? error.message : String(error));
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function testDatabaseConnection(config) {
|
|
73
|
+
const dbConfig = config.database;
|
|
74
|
+
if (dbConfig.type === 'sqlite') {
|
|
75
|
+
if (!(0, fs_1.existsSync)(dbConfig.sqlitePath)) {
|
|
76
|
+
throw new Error(`SQLite database not found at ${dbConfig.sqlitePath}`);
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const psqlArgs = [
|
|
81
|
+
'-h', dbConfig.host || 'localhost',
|
|
82
|
+
'-p', String(dbConfig.port || 5432),
|
|
83
|
+
'-U', dbConfig.username || 'postgres',
|
|
84
|
+
'-d', dbConfig.database || 'postgres',
|
|
85
|
+
'-c', 'SELECT 1',
|
|
86
|
+
'--no-password',
|
|
87
|
+
];
|
|
88
|
+
const env = {
|
|
89
|
+
...process.env,
|
|
90
|
+
PGPASSWORD: dbConfig.password,
|
|
91
|
+
};
|
|
92
|
+
return new Promise((resolve, reject) => {
|
|
93
|
+
const psqlProcess = (0, child_process_1.spawn)('psql', psqlArgs, { env });
|
|
94
|
+
let hasError = false;
|
|
95
|
+
psqlProcess.stderr.on('data', (data) => {
|
|
96
|
+
const message = data.toString();
|
|
97
|
+
if (!message.includes('NOTICE')) {
|
|
98
|
+
hasError = true;
|
|
99
|
+
reject(new Error(`Database connection failed: ${message}`));
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
psqlProcess.on('close', (code) => {
|
|
103
|
+
if (!hasError) {
|
|
104
|
+
if (code === 0) {
|
|
105
|
+
resolve();
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
reject(new Error(`Database connection failed with exit code ${code}`));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
psqlProcess.on('error', (error) => {
|
|
113
|
+
reject(new Error(`Failed to execute psql: ${error.message}`));
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
async function testStorageConfiguration(config) {
|
|
118
|
+
const storageConfig = config.storage;
|
|
119
|
+
if (storageConfig.provider === 'local') {
|
|
120
|
+
const path = storageConfig.local?.path || './backups';
|
|
121
|
+
if (!(0, fs_1.existsSync)(path)) {
|
|
122
|
+
throw new Error(`Local storage path does not exist: ${path}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else if (storageConfig.provider === 's3' || storageConfig.provider === 'r2') {
|
|
126
|
+
if (!storageConfig.s3?.bucket) {
|
|
127
|
+
throw new Error('S3/R2 bucket name is required');
|
|
128
|
+
}
|
|
129
|
+
if (!storageConfig.s3?.region) {
|
|
130
|
+
throw new Error('S3/R2 region is required');
|
|
131
|
+
}
|
|
132
|
+
if (!storageConfig.s3?.accessKeyId) {
|
|
133
|
+
throw new Error('S3/R2 access key ID is required');
|
|
134
|
+
}
|
|
135
|
+
if (!storageConfig.s3?.secretAccessKey) {
|
|
136
|
+
throw new Error('S3/R2 secret access key is required');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else if (storageConfig.provider === 'cloudinary') {
|
|
140
|
+
if (!storageConfig.cloudinary?.cloudName) {
|
|
141
|
+
throw new Error('Cloudinary cloud name is required');
|
|
142
|
+
}
|
|
143
|
+
if (!storageConfig.cloudinary?.apiKey) {
|
|
144
|
+
throw new Error('Cloudinary API key is required');
|
|
145
|
+
}
|
|
146
|
+
if (!storageConfig.cloudinary?.apiSecret) {
|
|
147
|
+
throw new Error('Cloudinary API secret is required');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async function testEmailConfiguration(config) {
|
|
152
|
+
const emailConfig = config.alerts?.email;
|
|
153
|
+
if (!emailConfig) {
|
|
154
|
+
throw new Error('Email configuration is missing');
|
|
155
|
+
}
|
|
156
|
+
if (!emailConfig.smtp?.host) {
|
|
157
|
+
throw new Error('SMTP host is required');
|
|
158
|
+
}
|
|
159
|
+
if (!emailConfig.smtp?.port) {
|
|
160
|
+
throw new Error('SMTP port is required');
|
|
161
|
+
}
|
|
162
|
+
if (!emailConfig.smtp?.auth?.user) {
|
|
163
|
+
throw new Error('SMTP username is required');
|
|
164
|
+
}
|
|
165
|
+
if (!emailConfig.smtp?.auth?.pass) {
|
|
166
|
+
throw new Error('SMTP password is required');
|
|
167
|
+
}
|
|
168
|
+
if (!emailConfig.from) {
|
|
169
|
+
throw new Error('From email address is required');
|
|
170
|
+
}
|
|
171
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
172
|
+
if (!emailRegex.test(emailConfig.from)) {
|
|
173
|
+
throw new Error(`Invalid from email address: ${emailConfig.from}`);
|
|
174
|
+
}
|
|
175
|
+
if (!emailConfig.to || emailConfig.to.length === 0) {
|
|
176
|
+
throw new Error('At least one recipient email address is required');
|
|
177
|
+
}
|
|
178
|
+
for (const email of emailConfig.to) {
|
|
179
|
+
if (!emailRegex.test(email)) {
|
|
180
|
+
throw new Error(`Invalid recipient email address: ${email}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const nodemailer = await Promise.resolve().then(() => __importStar(require('nodemailer')));
|
|
184
|
+
const transporter = nodemailer.default.createTransport({
|
|
185
|
+
host: emailConfig.smtp.host,
|
|
186
|
+
port: emailConfig.smtp.port,
|
|
187
|
+
secure: emailConfig.smtp.secure,
|
|
188
|
+
auth: {
|
|
189
|
+
user: emailConfig.smtp.auth.user,
|
|
190
|
+
pass: emailConfig.smtp.auth.pass,
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
try {
|
|
194
|
+
await transporter.verify();
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
198
|
+
if (errorMessage.includes('Invalid login')) {
|
|
199
|
+
throw new Error('SMTP authentication failed. Please check your username and password');
|
|
200
|
+
}
|
|
201
|
+
else if (errorMessage.includes('ECONNREFUSED')) {
|
|
202
|
+
throw new Error(`Cannot connect to SMTP server at ${emailConfig.smtp.host}:${emailConfig.smtp.port}`);
|
|
203
|
+
}
|
|
204
|
+
else if (errorMessage.includes('ETIMEDOUT')) {
|
|
205
|
+
throw new Error(`Connection timeout to SMTP server at ${emailConfig.smtp.host}:${emailConfig.smtp.port}`);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
throw new Error(`SMTP connection failed: ${errorMessage}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../../src/cli/commands/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const init_1 = require("./commands/init");
|
|
6
|
+
const backup_1 = require("./commands/backup");
|
|
7
|
+
const restore_1 = require("./commands/restore");
|
|
8
|
+
const test_1 = require("./commands/test");
|
|
9
|
+
const schedule_1 = require("./commands/schedule");
|
|
10
|
+
const list_1 = require("./commands/list");
|
|
11
|
+
const delete_1 = require("./commands/delete");
|
|
12
|
+
const cleanup_1 = require("./commands/cleanup");
|
|
13
|
+
const status_1 = require("./commands/status");
|
|
14
|
+
process.on('SIGINT', () => {
|
|
15
|
+
console.log('\n\nOperation cancelled by user');
|
|
16
|
+
process.exit(0);
|
|
17
|
+
});
|
|
18
|
+
process.on('SIGTERM', () => {
|
|
19
|
+
console.log('\n\nOperation terminated');
|
|
20
|
+
process.exit(0);
|
|
21
|
+
});
|
|
22
|
+
const program = new commander_1.Command();
|
|
23
|
+
program
|
|
24
|
+
.name('dbdock')
|
|
25
|
+
.description('Enterprise-grade database backup and restore tool')
|
|
26
|
+
.version('1.0.0');
|
|
27
|
+
program
|
|
28
|
+
.command('init')
|
|
29
|
+
.description('Initialize DBDock configuration')
|
|
30
|
+
.action(init_1.initCommand);
|
|
31
|
+
program
|
|
32
|
+
.command('backup')
|
|
33
|
+
.description('Create a database backup')
|
|
34
|
+
.option('--encrypt', 'Enable encryption for this backup')
|
|
35
|
+
.option('--no-encrypt', 'Disable encryption for this backup')
|
|
36
|
+
.option('--compress', 'Enable compression for this backup')
|
|
37
|
+
.option('--no-compress', 'Disable compression for this backup')
|
|
38
|
+
.option('--encryption-key <key>', 'Encryption key (32 bytes hex)')
|
|
39
|
+
.option('--compression-level <level>', 'Compression level (0-11)', parseInt)
|
|
40
|
+
.action(backup_1.backupCommand);
|
|
41
|
+
program
|
|
42
|
+
.command('restore')
|
|
43
|
+
.description('Restore from a backup')
|
|
44
|
+
.action(restore_1.restoreCommand);
|
|
45
|
+
program
|
|
46
|
+
.command('test')
|
|
47
|
+
.description('Test database and storage configuration')
|
|
48
|
+
.action(test_1.testCommand);
|
|
49
|
+
program
|
|
50
|
+
.command('schedule')
|
|
51
|
+
.description('Manage backup schedules')
|
|
52
|
+
.action(schedule_1.scheduleCommand);
|
|
53
|
+
program
|
|
54
|
+
.command('list')
|
|
55
|
+
.description('List all available backups')
|
|
56
|
+
.option('--recent <number>', 'Show most recent N backups', parseInt)
|
|
57
|
+
.option('--search <keyword>', 'Search backups by keyword')
|
|
58
|
+
.option('--days <number>', 'Show backups from last N days', parseInt)
|
|
59
|
+
.option('--limit <number>', 'Limit number of results', parseInt)
|
|
60
|
+
.action(list_1.listCommand);
|
|
61
|
+
program
|
|
62
|
+
.command('delete')
|
|
63
|
+
.description('Delete backup(s)')
|
|
64
|
+
.option('--all', 'Delete all backups')
|
|
65
|
+
.option('--key <key>', 'Delete specific backup by key')
|
|
66
|
+
.action(delete_1.deleteCommand);
|
|
67
|
+
program
|
|
68
|
+
.command('cleanup')
|
|
69
|
+
.description('Clean up old backups based on retention policy')
|
|
70
|
+
.option('--dry-run', 'Preview what will be deleted without deleting')
|
|
71
|
+
.option('--force', 'Delete without confirmation')
|
|
72
|
+
.action(cleanup_1.cleanupCommand);
|
|
73
|
+
program
|
|
74
|
+
.command('status')
|
|
75
|
+
.description('View configured backup schedules')
|
|
76
|
+
.action(status_1.statusCommand);
|
|
77
|
+
program.parse();
|
|
78
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export declare const CONFIG_FILE = "dbdock.config.json";
|
|
2
|
+
export interface CLIConfig {
|
|
3
|
+
database: {
|
|
4
|
+
type: string;
|
|
5
|
+
host?: string;
|
|
6
|
+
port?: number;
|
|
7
|
+
username?: string;
|
|
8
|
+
password?: string;
|
|
9
|
+
database?: string;
|
|
10
|
+
};
|
|
11
|
+
storage: {
|
|
12
|
+
provider: string;
|
|
13
|
+
local?: {
|
|
14
|
+
path: string;
|
|
15
|
+
};
|
|
16
|
+
s3?: {
|
|
17
|
+
bucket: string;
|
|
18
|
+
region: string;
|
|
19
|
+
accessKeyId: string;
|
|
20
|
+
secretAccessKey: string;
|
|
21
|
+
endpoint?: string;
|
|
22
|
+
};
|
|
23
|
+
r2?: {
|
|
24
|
+
accountId: string;
|
|
25
|
+
bucket: string;
|
|
26
|
+
accessKeyId: string;
|
|
27
|
+
secretAccessKey: string;
|
|
28
|
+
};
|
|
29
|
+
cloudinary?: {
|
|
30
|
+
cloudName: string;
|
|
31
|
+
apiKey: string;
|
|
32
|
+
apiSecret: string;
|
|
33
|
+
folder?: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
backup?: {
|
|
37
|
+
format?: 'custom' | 'plain' | 'directory' | 'tar';
|
|
38
|
+
compression?: {
|
|
39
|
+
enabled: boolean;
|
|
40
|
+
level?: number;
|
|
41
|
+
};
|
|
42
|
+
encryption?: {
|
|
43
|
+
enabled: boolean;
|
|
44
|
+
key?: string;
|
|
45
|
+
};
|
|
46
|
+
retention?: {
|
|
47
|
+
enabled: boolean;
|
|
48
|
+
maxBackups?: number;
|
|
49
|
+
maxAgeDays?: number;
|
|
50
|
+
minBackups?: number;
|
|
51
|
+
runAfterBackup?: boolean;
|
|
52
|
+
};
|
|
53
|
+
schedules?: Array<{
|
|
54
|
+
name: string;
|
|
55
|
+
cron: string;
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
}>;
|
|
58
|
+
};
|
|
59
|
+
alerts?: {
|
|
60
|
+
email?: {
|
|
61
|
+
enabled: boolean;
|
|
62
|
+
smtp: {
|
|
63
|
+
host: string;
|
|
64
|
+
port: number;
|
|
65
|
+
secure: boolean;
|
|
66
|
+
auth: {
|
|
67
|
+
user: string;
|
|
68
|
+
pass: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
from: string;
|
|
72
|
+
to: string[];
|
|
73
|
+
customTemplate?: string;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export declare function getConfigPath(): string;
|
|
78
|
+
export declare function configExists(): boolean;
|
|
79
|
+
export declare function loadConfig(): CLIConfig;
|
|
80
|
+
export declare function saveConfig(config: CLIConfig): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONFIG_FILE = void 0;
|
|
4
|
+
exports.getConfigPath = getConfigPath;
|
|
5
|
+
exports.configExists = configExists;
|
|
6
|
+
exports.loadConfig = loadConfig;
|
|
7
|
+
exports.saveConfig = saveConfig;
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path_1 = require("path");
|
|
10
|
+
exports.CONFIG_FILE = 'dbdock.config.json';
|
|
11
|
+
function getConfigPath() {
|
|
12
|
+
return process.env.DBDOCK_CONFIG_PATH || (0, path_1.join)(process.cwd(), exports.CONFIG_FILE);
|
|
13
|
+
}
|
|
14
|
+
function configExists() {
|
|
15
|
+
return (0, fs_1.existsSync)(getConfigPath());
|
|
16
|
+
}
|
|
17
|
+
function loadConfig() {
|
|
18
|
+
const configPath = getConfigPath();
|
|
19
|
+
if (!(0, fs_1.existsSync)(configPath)) {
|
|
20
|
+
throw new Error(`Config file not found at ${configPath}`);
|
|
21
|
+
}
|
|
22
|
+
const content = (0, fs_1.readFileSync)(configPath, 'utf-8');
|
|
23
|
+
return JSON.parse(content);
|
|
24
|
+
}
|
|
25
|
+
function saveConfig(config) {
|
|
26
|
+
const configPath = getConfigPath();
|
|
27
|
+
(0, fs_1.writeFileSync)(configPath, JSON.stringify(config, null, 2));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":";;;AA+EA,sCAEC;AAED,oCAEC;AAED,gCAOC;AAED,gCAGC;AAnGD,2BAA6D;AAC7D,+BAA4B;AAEf,QAAA,WAAW,GAAG,oBAAoB,CAAC;AA4EhD,SAAgB,aAAa;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAW,CAAC,CAAC;AAC5E,CAAC;AAED,SAAgB,YAAY;IAC1B,OAAO,IAAA,eAAU,EAAC,aAAa,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,SAAgB,UAAU,CAAC,MAAiB;IAC1C,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAA,kBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.logger = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
exports.logger = {
|
|
9
|
+
success: (message) => console.log(chalk_1.default.green('✓'), message),
|
|
10
|
+
error: (message) => console.log(chalk_1.default.red('✗'), message),
|
|
11
|
+
info: (message) => console.log(chalk_1.default.blue('ℹ'), message),
|
|
12
|
+
warn: (message) => console.log(chalk_1.default.yellow('⚠'), message),
|
|
13
|
+
log: (message) => console.log(message),
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/cli/utils/logger.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAEb,QAAA,MAAM,GAAG;IACpB,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACpE,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAChE,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAChE,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAClE,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;CAC/C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare class ProgressTracker {
|
|
2
|
+
private bar;
|
|
3
|
+
private startTime;
|
|
4
|
+
private lastUpdate;
|
|
5
|
+
private updateInterval;
|
|
6
|
+
start(total: number, label?: string): void;
|
|
7
|
+
update(current: number, label?: string): void;
|
|
8
|
+
stop(label?: string): void;
|
|
9
|
+
fail(message: string): void;
|
|
10
|
+
}
|
|
11
|
+
export declare class MultiStepProgress {
|
|
12
|
+
private steps;
|
|
13
|
+
private currentStep;
|
|
14
|
+
private startTime;
|
|
15
|
+
constructor(steps: string[]);
|
|
16
|
+
start(): void;
|
|
17
|
+
private showAllSteps;
|
|
18
|
+
nextStep(message?: string): void;
|
|
19
|
+
complete(): void;
|
|
20
|
+
fail(error: string): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MultiStepProgress = exports.ProgressTracker = void 0;
|
|
7
|
+
const cli_progress_1 = __importDefault(require("cli-progress"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
class ProgressTracker {
|
|
10
|
+
bar = null;
|
|
11
|
+
startTime = 0;
|
|
12
|
+
lastUpdate = 0;
|
|
13
|
+
updateInterval = 100;
|
|
14
|
+
start(total, label = 'Progress') {
|
|
15
|
+
this.startTime = Date.now();
|
|
16
|
+
this.lastUpdate = Date.now();
|
|
17
|
+
this.bar = new cli_progress_1.default.SingleBar({
|
|
18
|
+
format: chalk_1.default.cyan('{bar}') +
|
|
19
|
+
' | {percentage}% | {value}/{total} MB | Speed: {speed} MB/s | ETA: {eta}s | {label}',
|
|
20
|
+
barCompleteChar: '\u2588',
|
|
21
|
+
barIncompleteChar: '\u2591',
|
|
22
|
+
hideCursor: true,
|
|
23
|
+
clearOnComplete: false,
|
|
24
|
+
stopOnComplete: true,
|
|
25
|
+
}, cli_progress_1.default.Presets.shades_classic);
|
|
26
|
+
this.bar.start(total, 0, {
|
|
27
|
+
speed: '0.00',
|
|
28
|
+
label,
|
|
29
|
+
eta: '?',
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
update(current, label) {
|
|
33
|
+
if (!this.bar)
|
|
34
|
+
return;
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
if (now - this.lastUpdate < this.updateInterval && current > 0) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this.lastUpdate = now;
|
|
40
|
+
const elapsed = (now - this.startTime) / 1000;
|
|
41
|
+
const speed = elapsed > 0 ? (current / elapsed).toFixed(2) : '0.00';
|
|
42
|
+
const eta = current > 0 && elapsed > 0
|
|
43
|
+
? Math.ceil((this.bar.getTotal() - current) / (current / elapsed))
|
|
44
|
+
: '?';
|
|
45
|
+
this.bar.update(current, {
|
|
46
|
+
speed,
|
|
47
|
+
label: label || 'Processing',
|
|
48
|
+
eta: eta.toString(),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
stop(label) {
|
|
52
|
+
if (!this.bar)
|
|
53
|
+
return;
|
|
54
|
+
const elapsed = (Date.now() - this.startTime) / 1000;
|
|
55
|
+
const avgSpeed = (this.bar.getTotal() / elapsed).toFixed(2);
|
|
56
|
+
this.bar.update(this.bar.getTotal(), {
|
|
57
|
+
speed: avgSpeed,
|
|
58
|
+
label: label || 'Complete',
|
|
59
|
+
eta: '0',
|
|
60
|
+
});
|
|
61
|
+
this.bar.stop();
|
|
62
|
+
this.bar = null;
|
|
63
|
+
}
|
|
64
|
+
fail(message) {
|
|
65
|
+
if (this.bar) {
|
|
66
|
+
this.bar.stop();
|
|
67
|
+
this.bar = null;
|
|
68
|
+
}
|
|
69
|
+
console.error(chalk_1.default.red(`✖ ${message}`));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.ProgressTracker = ProgressTracker;
|
|
73
|
+
class MultiStepProgress {
|
|
74
|
+
steps = [];
|
|
75
|
+
currentStep = 0;
|
|
76
|
+
startTime = 0;
|
|
77
|
+
constructor(steps) {
|
|
78
|
+
this.steps = steps;
|
|
79
|
+
this.startTime = Date.now();
|
|
80
|
+
}
|
|
81
|
+
start() {
|
|
82
|
+
console.log(chalk_1.default.bold('\nProgress:'));
|
|
83
|
+
console.log(chalk_1.default.gray('─'.repeat(60)));
|
|
84
|
+
this.showAllSteps();
|
|
85
|
+
}
|
|
86
|
+
showAllSteps() {
|
|
87
|
+
this.steps.forEach((step, index) => {
|
|
88
|
+
if (index < this.currentStep) {
|
|
89
|
+
console.log(chalk_1.default.green(` ✔ ${step}`));
|
|
90
|
+
}
|
|
91
|
+
else if (index === this.currentStep) {
|
|
92
|
+
console.log(chalk_1.default.cyan(` ⟳ ${step}...`));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.log(chalk_1.default.gray(` ○ ${step}`));
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
nextStep(message) {
|
|
100
|
+
if (this.currentStep < this.steps.length) {
|
|
101
|
+
process.stdout.moveCursor(0, -(this.steps.length - this.currentStep));
|
|
102
|
+
process.stdout.clearScreenDown();
|
|
103
|
+
console.log(chalk_1.default.green(` ✔ ${this.steps[this.currentStep]}`));
|
|
104
|
+
this.currentStep++;
|
|
105
|
+
for (let i = this.currentStep; i < this.steps.length; i++) {
|
|
106
|
+
if (i === this.currentStep) {
|
|
107
|
+
console.log(chalk_1.default.cyan(` ⟳ ${this.steps[i]}${message ? ' - ' + message : ''}...`));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
console.log(chalk_1.default.gray(` ○ ${this.steps[i]}`));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
complete() {
|
|
116
|
+
process.stdout.moveCursor(0, -(this.steps.length - this.currentStep));
|
|
117
|
+
process.stdout.clearScreenDown();
|
|
118
|
+
this.steps.forEach((step) => {
|
|
119
|
+
console.log(chalk_1.default.green(` ✔ ${step}`));
|
|
120
|
+
});
|
|
121
|
+
const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(2);
|
|
122
|
+
console.log(chalk_1.default.gray('─'.repeat(60)));
|
|
123
|
+
console.log(chalk_1.default.green(`✔ All steps completed in ${elapsed}s\n`));
|
|
124
|
+
}
|
|
125
|
+
fail(error) {
|
|
126
|
+
console.log(chalk_1.default.red(`\n ✖ Failed: ${error}\n`));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.MultiStepProgress = MultiStepProgress;
|
|
130
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../src/cli/utils/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { IStorageAdapter } from '../../storage/storage.interface';
|
|
2
|
+
export interface RetentionConfig {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
maxBackups?: number;
|
|
5
|
+
maxAgeDays?: number;
|
|
6
|
+
minBackups?: number;
|
|
7
|
+
runAfterBackup?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface RetentionStats {
|
|
10
|
+
totalBackups: number;
|
|
11
|
+
keptBackups: number;
|
|
12
|
+
deletedBackups: number;
|
|
13
|
+
spaceReclaimed: number;
|
|
14
|
+
errors: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface BackupInfo {
|
|
17
|
+
key: string;
|
|
18
|
+
size: number;
|
|
19
|
+
lastModified: Date;
|
|
20
|
+
shouldDelete: boolean;
|
|
21
|
+
reason?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function evaluateRetention(adapter: IStorageAdapter, config: RetentionConfig, storageProvider: string): Promise<BackupInfo[]>;
|
|
24
|
+
export declare function applyRetention(adapter: IStorageAdapter, config: RetentionConfig, storageProvider: string, dryRun?: boolean): Promise<RetentionStats>;
|
|
25
|
+
export declare function getDefaultRetentionConfig(): RetentionConfig;
|
|
26
|
+
export declare function formatRetentionStats(stats: RetentionStats): string;
|