#!/usr/bin/env node const fs = require('fs').promises; const path = require('path'); // Cron Setup and Backup Usage Guide const cronGuide = { // Show cron setup instructions showCronSetup() { console.log('⏰ CRON JOB SETUP GUIDE'); console.log('=======================\n'); console.log('1. 📝 EDIT CRONTAB:'); console.log(' crontab -e'); console.log(''); console.log('2. 📋 ADD BACKUP JOB (choose one):'); console.log(''); console.log(' # Daily backup at 2 AM'); console.log(' 0 2 * * * cd /Users/hongchangyu/Downloads/App\\ Projects/Cultural\\ Shift\\ Sandbox/deploy/backend && node comprehensive-backup.js'); console.log(''); console.log(' # Weekly backup on Sunday at 3 AM'); console.log(' 0 3 * * 0 cd /Users/hongchangyu/Downloads/App\\ Projects/Cultural\\ Shift\\ Sandbox/deploy/backend && node comprehensive-backup.js'); console.log(''); console.log(' # Every 6 hours'); console.log(' 0 */6 * * * cd /Users/hongchangyu/Downloads/App\\ Projects/Cultural\\ Shift\\ Sandbox/deploy/backend && node comprehensive-backup.js'); console.log(''); console.log('3. ✅ VERIFY CRON JOBS:'); console.log(' crontab -l'); console.log(''); console.log('4. 📊 CHECK CRON LOGS:'); console.log(' tail -f /var/log/cron'); console.log(' or'); console.log(' grep CRON /var/log/syslog'); console.log(''); }, // Show backup usage instructions showBackupUsage() { console.log('💾 BACKUP USAGE GUIDE'); console.log('=====================\n'); console.log('📋 CHECK AVAILABLE BACKUPS:'); console.log(' node simple-automated-backup.js'); console.log(' # Lists all backups with details'); console.log(''); console.log('🔍 VERIFY BACKUP INTEGRITY:'); console.log(' node comprehensive-backup.js'); console.log(' # Creates new backup and verifies integrity'); console.log(''); console.log('📊 BACKUP CONTENTS:'); console.log(' - Database: All collections (subtitles, source texts, users)'); console.log(' - Code: Frontend and backend files'); console.log(' - Configuration: package.json, Dockerfile, etc.'); console.log(' - Manifest: Backup metadata and verification info'); console.log(''); console.log('🔄 RESTORE FROM BACKUP:'); console.log(' # Database only (safe)'); console.log(' node restore-database.js '); console.log(''); console.log(' # Full restore (including code)'); console.log(' node restore-comprehensive.js '); console.log(''); }, // Show cron job examples showCronExamples() { console.log('📝 CRON JOB EXAMPLES'); console.log('====================\n'); console.log('⏰ TIME FORMAT: minute hour day month day-of-week command'); console.log(''); console.log('📅 COMMON SCHEDULES:'); console.log(' 0 2 * * * # Daily at 2 AM'); console.log(' 0 */6 * * * # Every 6 hours'); console.log(' 0 3 * * 0 # Weekly on Sunday at 3 AM'); console.log(' 0 1 1 * * # Monthly on 1st at 1 AM'); console.log(' */30 * * * * # Every 30 minutes'); console.log(''); console.log('🔧 BACKUP COMMANDS:'); console.log(' # Simple data backup'); console.log(' node simple-automated-backup.js'); console.log(''); console.log(' # Comprehensive backup (data + code)'); console.log(' node comprehensive-backup.js'); console.log(''); console.log(' # With logging'); console.log(' node comprehensive-backup.js >> backup.log 2>&1'); console.log(''); }, // Show backup locations showBackupLocations() { console.log('📁 BACKUP LOCATIONS'); console.log('===================\n'); const backupDir = path.join(__dirname, 'backups'); console.log(`📂 Local backups: ${backupDir}`); console.log(''); console.log('📋 BACKUP STRUCTURE:'); console.log(' backups/'); console.log(' ├── comprehensive-backup-2025-08-05T.../'); console.log(' │ ├── database.json # All database data'); console.log(' │ ├── code/ # All source code'); console.log(' │ │ ├── backend/ # Backend files'); console.log(' │ │ ├── frontend/ # Frontend files'); console.log(' │ │ └── root/ # Root config'); console.log(' │ ├── config/ # Configuration files'); console.log(' │ └── manifest.json # Backup metadata'); console.log(' └── auto-backup-2025-08-05T.../'); console.log(' └── database.json # Data only'); console.log(''); console.log('💾 BACKUP TYPES:'); console.log(' - comprehensive-backup-* : Data + Code + Config'); console.log(' - auto-backup-* : Data only (faster)'); console.log(''); }, // Show how to check backup contents async showBackupContents() { console.log('🔍 CHECKING BACKUP CONTENTS'); console.log('===========================\n'); const backupDir = path.join(__dirname, 'backups'); try { const backups = await fs.readdir(backupDir); if (backups.length === 0) { console.log('❌ No backups found'); return; } console.log('📋 Available backups:'); for (const backup of backups) { const backupPath = path.join(backupDir, backup); const stats = await fs.stat(backupPath); if (stats.isDirectory()) { console.log(` 📦 ${backup} (${stats.mtime.toLocaleString()})`); // Check if it's a comprehensive backup const manifestPath = path.join(backupPath, 'manifest.json'); try { await fs.access(manifestPath); console.log(` ✅ Comprehensive backup (data + code)`); } catch { console.log(` 📊 Data backup only`); } } } } catch (error) { console.log('❌ Could not read backup directory:', error.message); } console.log(''); console.log('🔍 TO EXAMINE A SPECIFIC BACKUP:'); console.log(' ls -la backups/comprehensive-backup-*/'); console.log(' cat backups/comprehensive-backup-*/manifest.json'); console.log(''); } }; // Main function const main = async () => { console.log('🚀 CRON & BACKUP GUIDE'); console.log('======================\n'); // Show all guides cronGuide.showCronSetup(); cronGuide.showBackupUsage(); cronGuide.showCronExamples(); cronGuide.showBackupLocations(); await cronGuide.showBackupContents(); console.log('🎯 QUICK START:'); console.log('1. Set up cron: crontab -e'); console.log('2. Add: 0 2 * * * cd /path/to/backend && node comprehensive-backup.js'); console.log('3. Check backups: node simple-automated-backup.js'); console.log('4. Restore if needed: node restore-database.js '); console.log(''); console.log('📞 NEED HELP?'); console.log('- Check cron logs: tail -f /var/log/cron'); console.log('- Test backup: node comprehensive-backup.js'); console.log('- List backups: node simple-automated-backup.js'); }; // Run the guide main();