Files
picpeak/backend/src/services/databaseBackup.example.js
T
paul 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
feat: implement comprehensive backup and restore system with S3 support
- 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>
2025-07-22 09:05:52 +02:00

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
};