my-recipes/backend/CRON_SETUP.md

227 lines
4.4 KiB
Markdown

# 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