# 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
