database-backup
Version:
A NestJS dynamic module for backing up PostgreSQL databases using pg_dump.
91 lines • 4.16 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var BackupService_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BackupService = void 0;
const common_1 = require("@nestjs/common");
const child_process_1 = require("child_process");
const events_1 = require("events");
const path = require("path");
const pg_1 = require("pg");
let BackupService = BackupService_1 = class BackupService {
backupConfig;
logger = new common_1.Logger(BackupService_1.name);
constructor(backupConfig) {
this.backupConfig = backupConfig;
}
async backupSingleDatabase(databaseName) {
try {
if (!this.backupConfig.databaseUsername ||
!this.backupConfig.databasePassword ||
!this.backupConfig.host) {
throw new Error('Database config variables are missing');
}
const client = new pg_1.Client({
host: this.backupConfig.host,
user: this.backupConfig.databaseUsername,
password: this.backupConfig.databasePassword,
port: this.backupConfig.port,
database: databaseName,
});
await client.connect();
const result = await client.query('SELECT 1 FROM pg_database WHERE datname = $1', [databaseName]);
await client.end();
if (result.rowCount === 0) {
throw new Error(`Database "${databaseName}" does not exist`);
}
this.logger.log(`Database "${databaseName}" found. Starting backup...`);
const env = {
PGPASSWORD: this.backupConfig.databasePassword,
};
const backupFilename = `${databaseName}-backup-${Date.now()}.sql`;
const backupDir = this.backupConfig.backupDir || process.cwd();
const filePath = path.join(backupDir, backupFilename);
const args = [
'-U',
this.backupConfig.databaseUsername,
'-h',
this.backupConfig.host,
'-p',
this.backupConfig.port,
'-d',
databaseName,
'-f',
backupFilename,
];
const pgDumpCommand = this.backupConfig.pgDumpPath || 'pg_dump';
const dump = (0, child_process_1.spawn)(pgDumpCommand, args, { env });
let errorOutput = '';
dump.stderr.on('data', (data) => {
errorOutput += data.toString();
});
const [exitCode] = await (0, events_1.once)(dump, 'close');
if (exitCode !== 0) {
throw new Error(`pg_dump failed: ${errorOutput}`);
}
this.logger.log(`Backup completed for Database "${databaseName}"`);
return { filePath, databaseName: databaseName, success: true };
}
catch (error) {
throw new Error(error);
}
}
};
exports.BackupService = BackupService;
exports.BackupService = BackupService = BackupService_1 = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, common_1.Inject)('BACKUP_CONFIG')),
__metadata("design:paramtypes", [Object])
], BackupService);
//# sourceMappingURL=backup.service.js.map
;