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,23 @@
|
|
|
1
|
+
import { DBDockConfigService } from '../config/config.service';
|
|
2
|
+
import { StorageService } from '../storage/storage.service';
|
|
3
|
+
import { BackupService } from '../backup/backup.service';
|
|
4
|
+
import { WalArchiverService } from './wal-archiver.service';
|
|
5
|
+
import { RetentionPolicy, CleanupResult, BackupRetentionInfo } from './retention.types';
|
|
6
|
+
export declare class RetentionService {
|
|
7
|
+
private configService;
|
|
8
|
+
private storageService;
|
|
9
|
+
private backupService;
|
|
10
|
+
private walArchiverService;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(configService: DBDockConfigService, storageService: StorageService, backupService: BackupService, walArchiverService: WalArchiverService);
|
|
13
|
+
getDefaultRetentionPolicy(): RetentionPolicy;
|
|
14
|
+
applyRetentionPolicy(policy?: RetentionPolicy): Promise<CleanupResult>;
|
|
15
|
+
private cleanupOldBackups;
|
|
16
|
+
private evaluateBackupRetention;
|
|
17
|
+
getRetentionReport(): Promise<{
|
|
18
|
+
backups: BackupRetentionInfo[];
|
|
19
|
+
totalBackups: number;
|
|
20
|
+
backupsToDelete: number;
|
|
21
|
+
spaceToReclaim: number;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var RetentionService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.RetentionService = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const config_service_1 = require("../config/config.service");
|
|
16
|
+
const storage_service_1 = require("../storage/storage.service");
|
|
17
|
+
const backup_service_1 = require("../backup/backup.service");
|
|
18
|
+
const wal_archiver_service_1 = require("./wal-archiver.service");
|
|
19
|
+
const backup_types_1 = require("../backup/backup.types");
|
|
20
|
+
let RetentionService = RetentionService_1 = class RetentionService {
|
|
21
|
+
configService;
|
|
22
|
+
storageService;
|
|
23
|
+
backupService;
|
|
24
|
+
walArchiverService;
|
|
25
|
+
logger = new common_1.Logger(RetentionService_1.name);
|
|
26
|
+
constructor(configService, storageService, backupService, walArchiverService) {
|
|
27
|
+
this.configService = configService;
|
|
28
|
+
this.storageService = storageService;
|
|
29
|
+
this.backupService = backupService;
|
|
30
|
+
this.walArchiverService = walArchiverService;
|
|
31
|
+
}
|
|
32
|
+
getDefaultRetentionPolicy() {
|
|
33
|
+
const pitrConfig = this.configService.get('pitr');
|
|
34
|
+
return {
|
|
35
|
+
backupRetentionDays: pitrConfig.retentionDays || 30,
|
|
36
|
+
walRetentionDays: pitrConfig.retentionDays || 30,
|
|
37
|
+
minBackupsToKeep: 3,
|
|
38
|
+
maxBackupsToKeep: undefined,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async applyRetentionPolicy(policy) {
|
|
42
|
+
const retentionPolicy = policy || this.getDefaultRetentionPolicy();
|
|
43
|
+
this.logger.log('Starting retention policy enforcement');
|
|
44
|
+
this.logger.log(`Backup retention: ${retentionPolicy.backupRetentionDays} days`);
|
|
45
|
+
this.logger.log(`WAL retention: ${retentionPolicy.walRetentionDays} days`);
|
|
46
|
+
this.logger.log(`Min backups to keep: ${retentionPolicy.minBackupsToKeep}`);
|
|
47
|
+
const result = {
|
|
48
|
+
backupsDeleted: 0,
|
|
49
|
+
walFilesDeleted: 0,
|
|
50
|
+
spaceSaved: 0,
|
|
51
|
+
errors: [],
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
const backupsDeleted = await this.cleanupOldBackups(retentionPolicy);
|
|
55
|
+
result.backupsDeleted = backupsDeleted.count;
|
|
56
|
+
result.spaceSaved += backupsDeleted.spaceSaved;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
this.logger.error(`Error cleaning up backups: ${error.message}`);
|
|
60
|
+
result.errors.push(`Backup cleanup: ${error.message}`);
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const walFilesDeleted = await this.walArchiverService.cleanupOldWalFiles(retentionPolicy.walRetentionDays);
|
|
64
|
+
result.walFilesDeleted = walFilesDeleted;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
this.logger.error(`Error cleaning up WAL files: ${error.message}`);
|
|
68
|
+
result.errors.push(`WAL cleanup: ${error.message}`);
|
|
69
|
+
}
|
|
70
|
+
this.logger.log(`Retention policy complete: ${result.backupsDeleted} backups, ${result.walFilesDeleted} WAL files deleted`);
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
async cleanupOldBackups(policy) {
|
|
74
|
+
const allBackups = await this.backupService.listBackups();
|
|
75
|
+
const completedBackups = allBackups
|
|
76
|
+
.filter((b) => b.status === backup_types_1.BackupStatus.COMPLETED)
|
|
77
|
+
.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());
|
|
78
|
+
const retentionInfo = this.evaluateBackupRetention(completedBackups, policy);
|
|
79
|
+
const backupsToDelete = retentionInfo.filter((info) => info.shouldDelete);
|
|
80
|
+
let deletedCount = 0;
|
|
81
|
+
let spaceSaved = 0;
|
|
82
|
+
const storageAdapter = this.storageService.getAdapter();
|
|
83
|
+
for (const backupInfo of backupsToDelete) {
|
|
84
|
+
try {
|
|
85
|
+
const backup = completedBackups.find((b) => b.id === backupInfo.id);
|
|
86
|
+
if (!backup)
|
|
87
|
+
continue;
|
|
88
|
+
await storageAdapter.deleteObject({ key: backup.storageKey });
|
|
89
|
+
await storageAdapter.deleteObject({
|
|
90
|
+
key: `${backup.storageKey}.metadata.json`,
|
|
91
|
+
});
|
|
92
|
+
deletedCount++;
|
|
93
|
+
spaceSaved += backupInfo.size;
|
|
94
|
+
this.logger.log(`Deleted backup: ${backup.id} (${backupInfo.reason})`);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
this.logger.error(`Failed to delete backup ${backupInfo.id}: ${error.message}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { count: deletedCount, spaceSaved };
|
|
101
|
+
}
|
|
102
|
+
evaluateBackupRetention(backups, policy) {
|
|
103
|
+
const cutoffDate = new Date();
|
|
104
|
+
cutoffDate.setDate(cutoffDate.getDate() - policy.backupRetentionDays);
|
|
105
|
+
return backups.map((backup, index) => {
|
|
106
|
+
const backupDate = new Date(backup.startTime);
|
|
107
|
+
const info = {
|
|
108
|
+
id: backup.id,
|
|
109
|
+
database: backup.database,
|
|
110
|
+
createdAt: backupDate,
|
|
111
|
+
size: backup.compressedSize || backup.size || 0,
|
|
112
|
+
shouldDelete: false,
|
|
113
|
+
};
|
|
114
|
+
if (index < policy.minBackupsToKeep) {
|
|
115
|
+
info.shouldDelete = false;
|
|
116
|
+
info.reason = 'Within minimum backups to keep';
|
|
117
|
+
return info;
|
|
118
|
+
}
|
|
119
|
+
if (policy.maxBackupsToKeep &&
|
|
120
|
+
index >= policy.maxBackupsToKeep) {
|
|
121
|
+
info.shouldDelete = true;
|
|
122
|
+
info.reason = 'Exceeds maximum backups to keep';
|
|
123
|
+
return info;
|
|
124
|
+
}
|
|
125
|
+
if (backupDate < cutoffDate) {
|
|
126
|
+
info.shouldDelete = true;
|
|
127
|
+
info.reason = `Older than ${policy.backupRetentionDays} days`;
|
|
128
|
+
return info;
|
|
129
|
+
}
|
|
130
|
+
return info;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async getRetentionReport() {
|
|
134
|
+
const policy = this.getDefaultRetentionPolicy();
|
|
135
|
+
const allBackups = await this.backupService.listBackups();
|
|
136
|
+
const completedBackups = allBackups
|
|
137
|
+
.filter((b) => b.status === backup_types_1.BackupStatus.COMPLETED)
|
|
138
|
+
.sort((a, b) => b.startTime.getTime() - a.startTime.getTime());
|
|
139
|
+
const retentionInfo = this.evaluateBackupRetention(completedBackups, policy);
|
|
140
|
+
const backupsToDelete = retentionInfo.filter((info) => info.shouldDelete);
|
|
141
|
+
const spaceToReclaim = backupsToDelete.reduce((sum, info) => sum + info.size, 0);
|
|
142
|
+
return {
|
|
143
|
+
backups: retentionInfo,
|
|
144
|
+
totalBackups: completedBackups.length,
|
|
145
|
+
backupsToDelete: backupsToDelete.length,
|
|
146
|
+
spaceToReclaim,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
exports.RetentionService = RetentionService;
|
|
151
|
+
exports.RetentionService = RetentionService = RetentionService_1 = __decorate([
|
|
152
|
+
(0, common_1.Injectable)(),
|
|
153
|
+
__metadata("design:paramtypes", [config_service_1.DBDockConfigService,
|
|
154
|
+
storage_service_1.StorageService,
|
|
155
|
+
backup_service_1.BackupService,
|
|
156
|
+
wal_archiver_service_1.WalArchiverService])
|
|
157
|
+
], RetentionService);
|
|
158
|
+
//# sourceMappingURL=retention.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.service.js","sourceRoot":"","sources":["../../src/wal/retention.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface RetentionPolicy {
|
|
2
|
+
backupRetentionDays: number;
|
|
3
|
+
walRetentionDays: number;
|
|
4
|
+
minBackupsToKeep: number;
|
|
5
|
+
maxBackupsToKeep?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface CleanupResult {
|
|
8
|
+
backupsDeleted: number;
|
|
9
|
+
walFilesDeleted: number;
|
|
10
|
+
spaceSaved: number;
|
|
11
|
+
errors: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface BackupRetentionInfo {
|
|
14
|
+
id: string;
|
|
15
|
+
database: string;
|
|
16
|
+
createdAt: Date;
|
|
17
|
+
size: number;
|
|
18
|
+
shouldDelete: boolean;
|
|
19
|
+
reason?: string;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.types.js","sourceRoot":"","sources":["../../src/wal/retention.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { DBDockConfigService } from '../config/config.service';
|
|
3
|
+
import { StorageService } from '../storage/storage.service';
|
|
4
|
+
import { CryptoService } from '../crypto/crypto.service';
|
|
5
|
+
import { CompressionService } from '../backup/compression.service';
|
|
6
|
+
import { WalMetadata, WalArchiveOptions, WalArchiveResult } from './wal.types';
|
|
7
|
+
import { Readable } from 'stream';
|
|
8
|
+
export declare class WalArchiverService implements OnModuleInit {
|
|
9
|
+
private configService;
|
|
10
|
+
private storageService;
|
|
11
|
+
private cryptoService;
|
|
12
|
+
private compressionService;
|
|
13
|
+
private readonly logger;
|
|
14
|
+
private pitrEnabled;
|
|
15
|
+
constructor(configService: DBDockConfigService, storageService: StorageService, cryptoService: CryptoService, compressionService: CompressionService);
|
|
16
|
+
onModuleInit(): Promise<void>;
|
|
17
|
+
private setupWalArchiving;
|
|
18
|
+
archiveWalFile(options: WalArchiveOptions): Promise<WalArchiveResult>;
|
|
19
|
+
private createHashStream;
|
|
20
|
+
private extractTimeline;
|
|
21
|
+
private extractLogSegmentNumber;
|
|
22
|
+
private generateWalStorageKey;
|
|
23
|
+
private saveWalMetadata;
|
|
24
|
+
listWalFiles(timeline?: number): Promise<WalMetadata[]>;
|
|
25
|
+
getWalFile(walFile: string): Promise<Readable>;
|
|
26
|
+
private getWalMetadata;
|
|
27
|
+
cleanupOldWalFiles(retentionDays: number): Promise<number>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,263 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
var WalArchiverService_1;
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.WalArchiverService = void 0;
|
|
47
|
+
const common_1 = require("@nestjs/common");
|
|
48
|
+
const config_service_1 = require("../config/config.service");
|
|
49
|
+
const storage_service_1 = require("../storage/storage.service");
|
|
50
|
+
const crypto_service_1 = require("../crypto/crypto.service");
|
|
51
|
+
const compression_service_1 = require("../backup/compression.service");
|
|
52
|
+
const logger_1 = require("../utils/logger");
|
|
53
|
+
const stream_pipe_1 = require("../utils/stream.pipe");
|
|
54
|
+
const wal_types_1 = require("./wal.types");
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const stream_1 = require("stream");
|
|
57
|
+
const crypto_1 = require("crypto");
|
|
58
|
+
let WalArchiverService = WalArchiverService_1 = class WalArchiverService {
|
|
59
|
+
configService;
|
|
60
|
+
storageService;
|
|
61
|
+
cryptoService;
|
|
62
|
+
compressionService;
|
|
63
|
+
logger = new logger_1.DBDockLogger(WalArchiverService_1.name);
|
|
64
|
+
pitrEnabled;
|
|
65
|
+
constructor(configService, storageService, cryptoService, compressionService) {
|
|
66
|
+
this.configService = configService;
|
|
67
|
+
this.storageService = storageService;
|
|
68
|
+
this.cryptoService = cryptoService;
|
|
69
|
+
this.compressionService = compressionService;
|
|
70
|
+
const pitrConfig = this.configService.get('pitr');
|
|
71
|
+
this.pitrEnabled = pitrConfig.enabled;
|
|
72
|
+
}
|
|
73
|
+
async onModuleInit() {
|
|
74
|
+
if (this.pitrEnabled) {
|
|
75
|
+
this.logger.log('WAL archiver initialized - PITR enabled');
|
|
76
|
+
await this.setupWalArchiving();
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
this.logger.log('WAL archiver disabled - PITR not enabled');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async setupWalArchiving() {
|
|
83
|
+
const pgConfig = this.configService.get('postgres');
|
|
84
|
+
this.logger.log(`WAL archiving configured for database: ${pgConfig.database}`);
|
|
85
|
+
this.logger.log('Note: Ensure PostgreSQL archive_mode is enabled and archive_command is configured');
|
|
86
|
+
}
|
|
87
|
+
async archiveWalFile(options) {
|
|
88
|
+
const { walFile, walPath } = options;
|
|
89
|
+
this.logger.logWalArchive(walFile);
|
|
90
|
+
if (!fs.existsSync(walPath)) {
|
|
91
|
+
throw new Error(`WAL file not found: ${walPath}`);
|
|
92
|
+
}
|
|
93
|
+
const metadata = {
|
|
94
|
+
fileName: walFile,
|
|
95
|
+
timeline: this.extractTimeline(walFile),
|
|
96
|
+
logSegmentNumber: this.extractLogSegmentNumber(walFile),
|
|
97
|
+
status: wal_types_1.WalStatus.ARCHIVING,
|
|
98
|
+
archiveTime: new Date(),
|
|
99
|
+
size: 0,
|
|
100
|
+
storageKey: this.generateWalStorageKey(walFile),
|
|
101
|
+
};
|
|
102
|
+
try {
|
|
103
|
+
const fileStream = fs.createReadStream(walPath);
|
|
104
|
+
const streams = [fileStream];
|
|
105
|
+
const counterStream = new stream_pipe_1.CounterStream();
|
|
106
|
+
streams.push(counterStream);
|
|
107
|
+
const hashStream = this.createHashStream();
|
|
108
|
+
streams.push(hashStream);
|
|
109
|
+
const compressStream = this.compressionService.createCompressStream();
|
|
110
|
+
streams.push(compressStream);
|
|
111
|
+
if (this.cryptoService.isEnabled()) {
|
|
112
|
+
const { stream: encryptStream, metadata: encryptionMetadata } = this.cryptoService.createEncryptStream();
|
|
113
|
+
streams.push(encryptStream);
|
|
114
|
+
}
|
|
115
|
+
const combinedStream = streams.reduce((prev, curr) => prev.pipe(curr), streams[0]);
|
|
116
|
+
const storageAdapter = this.storageService.getAdapter();
|
|
117
|
+
await storageAdapter.uploadStream(combinedStream, {
|
|
118
|
+
key: metadata.storageKey,
|
|
119
|
+
metadata: {
|
|
120
|
+
walFile: walFile,
|
|
121
|
+
timeline: metadata.timeline.toString(),
|
|
122
|
+
archiveTime: metadata.archiveTime.toISOString(),
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
metadata.size = counterStream.getBytesProcessed();
|
|
126
|
+
metadata.checksum = hashStream.getHash();
|
|
127
|
+
metadata.status = wal_types_1.WalStatus.ARCHIVED;
|
|
128
|
+
await this.saveWalMetadata(metadata);
|
|
129
|
+
this.logger.log(`WAL file archived: ${walFile} (${metadata.size} bytes)`);
|
|
130
|
+
return {
|
|
131
|
+
success: true,
|
|
132
|
+
fileName: walFile,
|
|
133
|
+
storageKey: metadata.storageKey,
|
|
134
|
+
size: metadata.size,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
metadata.status = wal_types_1.WalStatus.FAILED;
|
|
139
|
+
metadata.error = error.message;
|
|
140
|
+
this.logger.logWalArchiveError(walFile, error);
|
|
141
|
+
await this.saveWalMetadata(metadata);
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
createHashStream() {
|
|
146
|
+
const hash = (0, crypto_1.createHash)('sha256');
|
|
147
|
+
let hashValue = '';
|
|
148
|
+
const stream = new stream_1.Readable({
|
|
149
|
+
read() { },
|
|
150
|
+
});
|
|
151
|
+
stream.on('data', (chunk) => {
|
|
152
|
+
hash.update(chunk);
|
|
153
|
+
});
|
|
154
|
+
stream.on('end', () => {
|
|
155
|
+
hashValue = hash.digest('hex');
|
|
156
|
+
});
|
|
157
|
+
stream.getHash = () => hashValue;
|
|
158
|
+
return stream;
|
|
159
|
+
}
|
|
160
|
+
extractTimeline(walFile) {
|
|
161
|
+
const timelineHex = walFile.substring(0, 8);
|
|
162
|
+
return parseInt(timelineHex, 16);
|
|
163
|
+
}
|
|
164
|
+
extractLogSegmentNumber(walFile) {
|
|
165
|
+
return walFile.substring(8);
|
|
166
|
+
}
|
|
167
|
+
generateWalStorageKey(walFile) {
|
|
168
|
+
const database = this.configService.get('postgres').database;
|
|
169
|
+
const timeline = this.extractTimeline(walFile);
|
|
170
|
+
return `wal/${database}/timeline-${timeline}/${walFile}.br`;
|
|
171
|
+
}
|
|
172
|
+
async saveWalMetadata(metadata) {
|
|
173
|
+
const storageAdapter = this.storageService.getAdapter();
|
|
174
|
+
const metadataKey = `${metadata.storageKey}.metadata.json`;
|
|
175
|
+
const metadataStream = stream_1.Readable.from([JSON.stringify(metadata, null, 2)]);
|
|
176
|
+
await storageAdapter.uploadStream(metadataStream, {
|
|
177
|
+
key: metadataKey,
|
|
178
|
+
contentType: 'application/json',
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
async listWalFiles(timeline) {
|
|
182
|
+
const storageAdapter = this.storageService.getAdapter();
|
|
183
|
+
const database = this.configService.get('postgres').database;
|
|
184
|
+
const prefix = timeline
|
|
185
|
+
? `wal/${database}/timeline-${timeline}/`
|
|
186
|
+
: `wal/${database}/`;
|
|
187
|
+
const objects = await storageAdapter.listObjects({ prefix });
|
|
188
|
+
const metadataObjects = objects.filter((obj) => obj.key.endsWith('.metadata.json'));
|
|
189
|
+
const metadataPromises = metadataObjects.map(async (obj) => {
|
|
190
|
+
const stream = await storageAdapter.downloadStream({ key: obj.key });
|
|
191
|
+
const chunks = [];
|
|
192
|
+
for await (const chunk of stream) {
|
|
193
|
+
chunks.push(chunk);
|
|
194
|
+
}
|
|
195
|
+
const metadataJson = Buffer.concat(chunks).toString('utf-8');
|
|
196
|
+
return JSON.parse(metadataJson);
|
|
197
|
+
});
|
|
198
|
+
return Promise.all(metadataPromises);
|
|
199
|
+
}
|
|
200
|
+
async getWalFile(walFile) {
|
|
201
|
+
const storageKey = this.generateWalStorageKey(walFile);
|
|
202
|
+
const storageAdapter = this.storageService.getAdapter();
|
|
203
|
+
let stream = await storageAdapter.downloadStream({ key: storageKey });
|
|
204
|
+
if (this.cryptoService.isEnabled()) {
|
|
205
|
+
const metadata = await this.getWalMetadata(walFile);
|
|
206
|
+
if (metadata && metadata.status === wal_types_1.WalStatus.ARCHIVED) {
|
|
207
|
+
const decryptStream = this.cryptoService.createDecryptStream({
|
|
208
|
+
algorithm: 'aes-256-gcm',
|
|
209
|
+
salt: '',
|
|
210
|
+
iv: '',
|
|
211
|
+
});
|
|
212
|
+
stream = stream.pipe(decryptStream);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const decompressStream = this.compressionService.createDecompressStream();
|
|
216
|
+
stream = stream.pipe(decompressStream);
|
|
217
|
+
return stream;
|
|
218
|
+
}
|
|
219
|
+
async getWalMetadata(walFile) {
|
|
220
|
+
const storageKey = this.generateWalStorageKey(walFile);
|
|
221
|
+
const metadataKey = `${storageKey}.metadata.json`;
|
|
222
|
+
try {
|
|
223
|
+
const storageAdapter = this.storageService.getAdapter();
|
|
224
|
+
const stream = await storageAdapter.downloadStream({ key: metadataKey });
|
|
225
|
+
const chunks = [];
|
|
226
|
+
for await (const chunk of stream) {
|
|
227
|
+
chunks.push(chunk);
|
|
228
|
+
}
|
|
229
|
+
const metadataJson = Buffer.concat(chunks).toString('utf-8');
|
|
230
|
+
return JSON.parse(metadataJson);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
async cleanupOldWalFiles(retentionDays) {
|
|
237
|
+
const walFiles = await this.listWalFiles();
|
|
238
|
+
const cutoffDate = new Date();
|
|
239
|
+
cutoffDate.setDate(cutoffDate.getDate() - retentionDays);
|
|
240
|
+
let deletedCount = 0;
|
|
241
|
+
const storageAdapter = this.storageService.getAdapter();
|
|
242
|
+
for (const walFile of walFiles) {
|
|
243
|
+
if (new Date(walFile.archiveTime) < cutoffDate) {
|
|
244
|
+
await storageAdapter.deleteObject({ key: walFile.storageKey });
|
|
245
|
+
await storageAdapter.deleteObject({
|
|
246
|
+
key: `${walFile.storageKey}.metadata.json`,
|
|
247
|
+
});
|
|
248
|
+
deletedCount++;
|
|
249
|
+
this.logger.log(`Deleted old WAL file: ${walFile.fileName}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return deletedCount;
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
exports.WalArchiverService = WalArchiverService;
|
|
256
|
+
exports.WalArchiverService = WalArchiverService = WalArchiverService_1 = __decorate([
|
|
257
|
+
(0, common_1.Injectable)(),
|
|
258
|
+
__metadata("design:paramtypes", [config_service_1.DBDockConfigService,
|
|
259
|
+
storage_service_1.StorageService,
|
|
260
|
+
crypto_service_1.CryptoService,
|
|
261
|
+
compression_service_1.CompressionService])
|
|
262
|
+
], WalArchiverService);
|
|
263
|
+
//# sourceMappingURL=wal-archiver.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wal-archiver.service.js","sourceRoot":"","sources":["../../src/wal/wal-archiver.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.WalModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const wal_archiver_service_1 = require("./wal-archiver.service");
|
|
12
|
+
const retention_service_1 = require("./retention.service");
|
|
13
|
+
const storage_module_1 = require("../storage/storage.module");
|
|
14
|
+
const crypto_module_1 = require("../crypto/crypto.module");
|
|
15
|
+
const backup_module_1 = require("../backup/backup.module");
|
|
16
|
+
let WalModule = class WalModule {
|
|
17
|
+
};
|
|
18
|
+
exports.WalModule = WalModule;
|
|
19
|
+
exports.WalModule = WalModule = __decorate([
|
|
20
|
+
(0, common_1.Module)({
|
|
21
|
+
imports: [storage_module_1.StorageModule, crypto_module_1.CryptoModule, backup_module_1.BackupModule],
|
|
22
|
+
providers: [wal_archiver_service_1.WalArchiverService, retention_service_1.RetentionService],
|
|
23
|
+
exports: [wal_archiver_service_1.WalArchiverService, retention_service_1.RetentionService],
|
|
24
|
+
})
|
|
25
|
+
], WalModule);
|
|
26
|
+
//# sourceMappingURL=wal.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wal.module.js","sourceRoot":"","sources":["../../src/wal/wal.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,iEAA4D;AAC5D,2DAAuD;AACvD,8DAA0D;AAC1D,2DAAuD;AACvD,2DAAuD;AAOhD,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IALrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,8BAAa,EAAE,4BAAY,EAAE,4BAAY,CAAC;QACpD,SAAS,EAAE,CAAC,yCAAkB,EAAE,oCAAgB,CAAC;QACjD,OAAO,EAAE,CAAC,yCAAkB,EAAE,oCAAgB,CAAC;KAChD,CAAC;GACW,SAAS,CAAG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare enum WalStatus {
|
|
2
|
+
PENDING = "pending",
|
|
3
|
+
ARCHIVING = "archiving",
|
|
4
|
+
ARCHIVED = "archived",
|
|
5
|
+
FAILED = "failed"
|
|
6
|
+
}
|
|
7
|
+
export interface WalMetadata {
|
|
8
|
+
fileName: string;
|
|
9
|
+
timeline: number;
|
|
10
|
+
logSegmentNumber: string;
|
|
11
|
+
status: WalStatus;
|
|
12
|
+
archiveTime: Date;
|
|
13
|
+
size: number;
|
|
14
|
+
storageKey: string;
|
|
15
|
+
checksum?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface WalArchiveOptions {
|
|
19
|
+
walFile: string;
|
|
20
|
+
walPath: string;
|
|
21
|
+
}
|
|
22
|
+
export interface WalArchiveResult {
|
|
23
|
+
success: boolean;
|
|
24
|
+
fileName: string;
|
|
25
|
+
storageKey: string;
|
|
26
|
+
size: number;
|
|
27
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WalStatus = void 0;
|
|
4
|
+
var WalStatus;
|
|
5
|
+
(function (WalStatus) {
|
|
6
|
+
WalStatus["PENDING"] = "pending";
|
|
7
|
+
WalStatus["ARCHIVING"] = "archiving";
|
|
8
|
+
WalStatus["ARCHIVED"] = "archived";
|
|
9
|
+
WalStatus["FAILED"] = "failed";
|
|
10
|
+
})(WalStatus || (exports.WalStatus = WalStatus = {}));
|
|
11
|
+
//# sourceMappingURL=wal.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wal.types.js","sourceRoot":"","sources":["../../src/wal/wal.types.ts"],"names":[],"mappings":";;;AAAA,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,gCAAmB,CAAA;IACnB,oCAAuB,CAAA;IACvB,kCAAqB,CAAA;IACrB,8BAAiB,CAAA;AACnB,CAAC,EALW,SAAS,yBAAT,SAAS,QAKpB"}
|