20dd43c093
Mirror to GitHub / mirror (push) Successful in 28s
Test and Lint / backend-test (push) Successful in 1m26s
continuous-integration/drone/push Build is failing
Test and Lint / frontend-test (push) Failing after 2m18s
Version and Release / version-bump (push) Successful in 42s
Version and Release / trigger-drone (push) Successful in 3s
- Add S3/MinIO storage adapter with multipart upload support - Implement database backup service for SQLite and PostgreSQL - Create backup manifest generator for tracking backup contents - Enhance backup service with S3 integration and incremental backups - Add restore service with safety measures and rollback capability - Create comprehensive test suite for all backup functionality - Add admin API endpoints for backup/restore management - Implement frontend UI with dashboard, configuration, and restore wizard - Add roadmap section to README with implemented backup feature This implementation provides: - Multiple backup destinations (local, rsync, S3/MinIO) - Intelligent change detection to minimize backup frequency - Full database backups with compression - Manifest-based restore with integrity validation - Pre-restore safety backups with rollback - Comprehensive error handling and monitoring - User-friendly admin interface 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
147 lines
5.1 KiB
JavaScript
147 lines
5.1 KiB
JavaScript
/**
|
|
* Database Backup Service Usage Examples
|
|
*
|
|
* This service provides comprehensive database backup functionality
|
|
* with support for both SQLite and PostgreSQL databases.
|
|
*/
|
|
|
|
const { databaseBackupService } = require('./databaseBackup');
|
|
|
|
// Example 1: Manual backup with default settings
|
|
async function manualBackup() {
|
|
try {
|
|
const result = await databaseBackupService.backup();
|
|
console.log('Backup completed:', result);
|
|
// Result includes: path, size, duration, checksum, compressionRatio
|
|
} catch (error) {
|
|
console.error('Backup failed:', error);
|
|
}
|
|
}
|
|
|
|
// Example 2: Backup with custom options
|
|
async function customBackup() {
|
|
try {
|
|
const result = await databaseBackupService.backup({
|
|
destinationPath: '/custom/backup/path',
|
|
compress: true, // Enable gzip compression
|
|
validateIntegrity: true, // Validate backup after creation
|
|
includeChecksums: true, // Calculate table checksums
|
|
noTransaction: false // Use transaction for consistency (PostgreSQL)
|
|
});
|
|
console.log('Custom backup completed:', result);
|
|
} catch (error) {
|
|
console.error('Backup failed:', error);
|
|
}
|
|
}
|
|
|
|
// Example 3: Check backup progress (useful for long-running backups)
|
|
async function backupWithProgress() {
|
|
// Start backup asynchronously
|
|
const backupPromise = databaseBackupService.backup();
|
|
|
|
// Poll for progress
|
|
const progressInterval = setInterval(() => {
|
|
const progress = databaseBackupService.getProgress();
|
|
if (progress) {
|
|
console.log(`Progress: ${progress.message}`, progress.details);
|
|
}
|
|
}, 1000);
|
|
|
|
try {
|
|
const result = await backupPromise;
|
|
clearInterval(progressInterval);
|
|
console.log('Backup completed:', result);
|
|
} catch (error) {
|
|
clearInterval(progressInterval);
|
|
console.error('Backup failed:', error);
|
|
}
|
|
}
|
|
|
|
// Example 4: Get backup history
|
|
async function getBackupHistory() {
|
|
const history = await databaseBackupService.getBackupHistory(10);
|
|
|
|
history.forEach(backup => {
|
|
console.log(`Backup ${backup.id}:`);
|
|
console.log(` Started: ${backup.started_at}`);
|
|
console.log(` Status: ${backup.status}`);
|
|
console.log(` Size: ${(backup.file_size_bytes / 1024 / 1024).toFixed(2)} MB`);
|
|
console.log(` Duration: ${backup.duration_seconds}s`);
|
|
});
|
|
}
|
|
|
|
// Example 5: Clean up old backups
|
|
async function cleanupBackups() {
|
|
// Delete backups older than 30 days
|
|
await databaseBackupService.cleanupOldBackups(30);
|
|
console.log('Old backups cleaned up');
|
|
}
|
|
|
|
// Example 6: Get table checksums (useful for monitoring changes)
|
|
async function getTableChecksums() {
|
|
const checksums = await databaseBackupService.getTableChecksums();
|
|
|
|
console.log('Table Checksums:');
|
|
Object.entries(checksums).forEach(([table, info]) => {
|
|
console.log(` ${table}: ${info.rowCount} rows, checksum: ${info.checksum}`);
|
|
});
|
|
}
|
|
|
|
// Example 7: Using the scheduled backup service
|
|
const { startScheduledBackups, stopScheduledBackups } = require('./databaseBackup');
|
|
|
|
async function setupScheduledBackups() {
|
|
// Start scheduled backups (reads schedule from database config)
|
|
await startScheduledBackups();
|
|
console.log('Scheduled backups started');
|
|
|
|
// Later, if needed, stop scheduled backups
|
|
// stopScheduledBackups();
|
|
}
|
|
|
|
// Example 8: Admin API endpoints available
|
|
/*
|
|
GET /api/admin/database-backup/status - Get backup status and config
|
|
PUT /api/admin/database-backup/config - Update backup configuration
|
|
POST /api/admin/database-backup/backup - Trigger manual backup
|
|
GET /api/admin/database-backup/progress - Get current backup progress
|
|
GET /api/admin/database-backup/history - Get backup history with pagination
|
|
DELETE /api/admin/database-backup/cleanup - Delete old backup files
|
|
POST /api/admin/database-backup/test - Test backup configuration
|
|
GET /api/admin/database-backup/checksums - Get current table checksums
|
|
*/
|
|
|
|
// Example 9: Configuration options stored in database
|
|
/*
|
|
database_backup_enabled: boolean - Enable/disable scheduled backups
|
|
database_backup_schedule: string - Cron schedule (default: '0 3 * * *')
|
|
database_backup_destination_path: string - Where to store backups
|
|
database_backup_compress: boolean - Enable gzip compression
|
|
database_backup_validate_integrity: boolean - Validate after backup
|
|
database_backup_include_checksums: boolean - Calculate table checksums
|
|
database_backup_retention_days: number - Days to keep old backups
|
|
database_backup_email_on_failure: boolean - Send email on failure
|
|
database_backup_email_on_success: boolean - Send email on success
|
|
*/
|
|
|
|
// Example 10: Production considerations
|
|
/*
|
|
1. Ensure destination path has sufficient space
|
|
2. For large databases, backups may take significant time
|
|
3. PostgreSQL backups use single-transaction mode by default
|
|
4. Compression typically reduces size by 70-90%
|
|
5. Schedule backups during low-traffic periods
|
|
6. Monitor backup history for failures
|
|
7. Test restore procedures regularly
|
|
8. Consider replication for real-time redundancy
|
|
*/
|
|
|
|
module.exports = {
|
|
manualBackup,
|
|
customBackup,
|
|
backupWithProgress,
|
|
getBackupHistory,
|
|
cleanupBackups,
|
|
getTableChecksums,
|
|
setupScheduledBackups
|
|
}; |