![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/backups/lavocat.quebec/backup-20250730-021618/scripts/ |
#!/usr/bin/env node
// Database Backup Script for lavocat.quebec
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const BACKUP_DIR = '/var/backups/lavocat.quebec';
const DB_PATH = '/var/www/lavocat.quebec/production.db';
const DOMAIN = 'lavocat.quebec';
console.log('๐พ Starting database backup for lavocat.quebec...');
// Create backup directory if it doesn't exist
if (!fs.existsSync(BACKUP_DIR)) {
fs.mkdirSync(BACKUP_DIR, { recursive: true });
console.log('โ
Created backup directory');
}
// Generate backup filename with timestamp
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
const backupFilename = `production-${timestamp}.db`;
const backupPath = path.join(BACKUP_DIR, backupFilename);
try {
// Check if database file exists
if (!fs.existsSync(DB_PATH)) {
console.error('โ Database file not found:', DB_PATH);
console.log('๐ก Make sure the application is deployed and running');
process.exit(1);
}
// Create backup
console.log('๐ Creating database backup...');
execSync(`cp "${DB_PATH}" "${backupPath}"`, { stdio: 'inherit' });
// Get file size
const stats = fs.statSync(backupPath);
const fileSizeInMB = (stats.size / (1024 * 1024)).toFixed(2);
console.log('โ
Database backup completed successfully!');
console.log(`๐ Backup file: ${backupPath}`);
console.log(`๐ File size: ${fileSizeInMB} MB`);
// Clean up old backups (keep last 10)
console.log('๐งน Cleaning up old backups...');
const files = fs.readdirSync(BACKUP_DIR)
.filter(file => file.startsWith('production-') && file.endsWith('.db'))
.map(file => ({
name: file,
path: path.join(BACKUP_DIR, file),
mtime: fs.statSync(path.join(BACKUP_DIR, file)).mtime
}))
.sort((a, b) => b.mtime - a.mtime);
// Keep only the last 10 backups
if (files.length > 10) {
const filesToDelete = files.slice(10);
filesToDelete.forEach(file => {
fs.unlinkSync(file.path);
console.log(`๐๏ธ Deleted old backup: ${file.name}`);
});
}
console.log(`๐ Total backups: ${files.length}`);
} catch (error) {
console.error('โ Backup failed:', error.message);
process.exit(1);
}
// Optional: Create a compressed backup
const createCompressedBackup = () => {
try {
const compressedFilename = `production-${timestamp}.db.gz`;
const compressedPath = path.join(BACKUP_DIR, compressedFilename);
console.log('๐๏ธ Creating compressed backup...');
execSync(`gzip -c "${backupPath}" > "${compressedPath}"`, { stdio: 'inherit' });
const stats = fs.statSync(compressedPath);
const fileSizeInMB = (stats.size / (1024 * 1024)).toFixed(2);
console.log('โ
Compressed backup created!');
console.log(`๐ Compressed file: ${compressedPath}`);
console.log(`๐ Compressed size: ${fileSizeInMB} MB`);
// Clean up uncompressed backup
fs.unlinkSync(backupPath);
console.log('๐๏ธ Removed uncompressed backup');
} catch (error) {
console.error('โ Compressed backup failed:', error.message);
}
};
// Create compressed backup if requested
if (process.argv.includes('--compress')) {
createCompressedBackup();
}
console.log('\n๐ Backup completed successfully!');
console.log('๐ก To restore from backup:');
console.log(` cp "${backupPath}" "${DB_PATH}"`);
console.log('๐ก To create compressed backup:');
console.log(' node scripts/backup-database.js --compress');