# Automated Backup with Cron (Linux/Production) ## Quick Setup ### Option 1: Automated Setup (Recommended) ```bash cd backend chmod +x setup_cron.sh ./setup_cron.sh ``` Then select: - **Option 1**: Every 1 minute (for testing) - **Option 2**: Weekly (Sunday 2 AM) - after testing works ### Option 2: Manual Setup #### 1. Make script executable ```bash cd backend chmod +x run_backup.sh ``` #### 2. Edit crontab ```bash crontab -e ``` #### 3. Add one of these lines: **For Testing (every 1 minute):** ```bash * * * * * cd /path/to/backend && ./run_backup.sh ``` **For Production (weekly - Sunday 2 AM):** ```bash 0 2 * * 0 cd /path/to/backend && ./run_backup.sh ``` **For Daily (2 AM):** ```bash 0 2 * * * cd /path/to/backend && ./run_backup.sh ``` Replace `/path/to/backend` with your actual path, e.g.: ```bash * * * * * cd /home/user/my-recipes/backend && ./run_backup.sh ``` #### 4. Save and exit - Press `Ctrl+X`, then `Y`, then `Enter` (if using nano) - Or `:wq` (if using vim) ## Verify It's Working ### 1. Check if cron job is installed ```bash crontab -l | grep backup ``` ### 2. Wait 2-3 minutes (for 1-minute test) ### 3. Check the log ```bash cd backend tail -f backup.log ``` Expected output: ``` [2025-12-21 15:30:45] Starting backup... [2025-12-21 15:30:47] Creating database dump... [2025-12-21 15:30:49] Compressing file... [2025-12-21 15:30:51] Uploading to R2... [2025-12-21 15:30:53] ✅ Backup completed: recipes_db_20251221_153045.sql.gz ``` ### 4. Check R2 bucket - Should see new backup files appearing - Files named: `recipes_db_YYYYMMDD_HHMMSS.sql.gz` ## Change from Testing to Weekly ### Method 1: Using setup script ```bash cd backend ./setup_cron.sh ``` Select option 2 (Weekly) ### Method 2: Manual edit ```bash crontab -e ``` Change this line: ```bash * * * * * cd /path/to/backend && ./run_backup.sh ``` To this: ```bash 0 2 * * 0 cd /path/to/backend && ./run_backup.sh ``` Save and exit. ## Cron Schedule Reference ``` * * * * * command │ │ │ │ │ │ │ │ │ └─── Day of week (0-7, 0 and 7 are Sunday) │ │ │ └───── Month (1-12) │ │ └─────── Day of month (1-31) │ └───────── Hour (0-23) └─────────── Minute (0-59) ``` **Examples:** - `* * * * *` - Every minute - `0 2 * * *` - Daily at 2:00 AM - `0 2 * * 0` - Weekly on Sunday at 2:00 AM - `0 2 * * 1` - Weekly on Monday at 2:00 AM - `0 */6 * * *` - Every 6 hours ## Troubleshooting ### Cron job not running **1. Check cron service is running:** ```bash sudo systemctl status cron # or sudo systemctl status crond ``` **2. Check cron logs:** ```bash # Ubuntu/Debian grep CRON /var/log/syslog # CentOS/RHEL tail -f /var/log/cron ``` **3. Test script manually:** ```bash cd backend ./run_backup.sh cat backup.log ``` ### No backup.log file **Check permissions:** ```bash ls -la run_backup.sh # Should be: -rwxr-xr-x chmod +x run_backup.sh ``` **Test Python script:** ```bash cd backend python3 backup_db.py ``` ### Script runs but backup fails **Check backup.log for errors:** ```bash cat backup.log ``` Common issues: - Database credentials wrong (check `.env`) - R2 credentials wrong (check `.env`) - `pg_dump` not installed: `sudo apt install postgresql-client` - Python packages missing: `pip install boto3` ## Remove Cron Job ```bash crontab -e ``` Delete the line with `run_backup.sh`, save and exit. ## Docker/Container Environment If running in Docker, add to your docker-compose.yml or Dockerfile: ```yaml # docker-compose.yml services: backend: # ... other config command: > sh -c " echo '0 2 * * 0 cd /app && python backup_db.py >> backup.log 2>&1' | crontab - && crond -f -l 2 " ``` Or use a separate container with a cron image. ## Production Recommendations 1. **Use weekly backups** - Daily can consume too much storage 2. **Monitor logs** - Set up log monitoring/alerts 3. **Test restore** - Periodically test restoring from backups 4. **Set up retention** - Automatically delete old backups (not implemented yet) 5. **Use separate backup server** - Don't backup to same server as database ## Success Checklist - ✅ `run_backup.sh` is executable - ✅ Cron job is installed (`crontab -l` shows it) - ✅ Test run completed successfully - ✅ `backup.log` shows successful backup - ✅ R2 bucket contains backup files - ✅ Changed from 1-minute to weekly schedule