233 lines
6.9 KiB
Markdown
233 lines
6.9 KiB
Markdown
|
|
# BMC Hub Backup System - Environment Configuration Guide
|
||
|
|
|
||
|
|
## Quick Start
|
||
|
|
|
||
|
|
Add these lines to your `.env` file to enable the backup system:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# ===== BACKUP SYSTEM =====
|
||
|
|
|
||
|
|
# Safety switches (start with safe defaults)
|
||
|
|
BACKUP_ENABLED=true # Enable backup system (default: false)
|
||
|
|
BACKUP_DRY_RUN=false # Disable dry-run to actually perform backups (default: true)
|
||
|
|
BACKUP_READ_ONLY=false # Allow restore operations (default: true)
|
||
|
|
|
||
|
|
# Backup formats
|
||
|
|
DB_DAILY_FORMAT=dump # Compressed format for daily backups (default: dump)
|
||
|
|
DB_MONTHLY_FORMAT=sql # Plain SQL for monthly backups (default: sql)
|
||
|
|
|
||
|
|
# Backup scope
|
||
|
|
BACKUP_INCLUDE_UPLOADS=true # Include uploads/ directory (default: true)
|
||
|
|
BACKUP_INCLUDE_LOGS=true # Include logs/ directory (default: true)
|
||
|
|
BACKUP_INCLUDE_DATA=true # Include data/ directory (default: true)
|
||
|
|
|
||
|
|
# Storage configuration
|
||
|
|
BACKUP_STORAGE_PATH=/opt/backups # Production path (default: /opt/backups)
|
||
|
|
# BACKUP_STORAGE_PATH=./backups # Use this for local development
|
||
|
|
BACKUP_MAX_SIZE_GB=50 # Maximum storage size (default: 50)
|
||
|
|
STORAGE_WARNING_THRESHOLD_PCT=80 # Warn at 80% usage (default: 80)
|
||
|
|
|
||
|
|
# Retention policy
|
||
|
|
RETENTION_DAYS=30 # Keep daily backups for 30 days (default: 30)
|
||
|
|
MONTHLY_KEEP_MONTHS=12 # Keep monthly backups for 12 months (default: 12)
|
||
|
|
|
||
|
|
# Offsite uploads (SFTP/SSH)
|
||
|
|
OFFSITE_ENABLED=false # Disable until configured (default: false)
|
||
|
|
OFFSITE_WEEKLY_DAY=sunday # Day for weekly upload (default: sunday)
|
||
|
|
OFFSITE_RETRY_MAX_ATTEMPTS=3 # Max retry attempts (default: 3)
|
||
|
|
OFFSITE_RETRY_DELAY_HOURS=1 # Hours between retries (default: 1)
|
||
|
|
|
||
|
|
# SFTP/SSH connection (configure when enabling offsite)
|
||
|
|
SFTP_HOST=backup.example.com
|
||
|
|
SFTP_PORT=22
|
||
|
|
SFTP_USER=bmc_backup
|
||
|
|
SFTP_PASSWORD= # Leave empty if using SSH key
|
||
|
|
SSH_KEY_PATH=/path/to/id_rsa # Path to SSH private key (preferred)
|
||
|
|
SFTP_REMOTE_PATH=/backups/bmc_hub
|
||
|
|
|
||
|
|
# Mattermost notifications
|
||
|
|
MATTERMOST_ENABLED=false # Disable until webhook configured (default: false)
|
||
|
|
MATTERMOST_WEBHOOK_URL=https://mattermost.example.com/hooks/xxx
|
||
|
|
MATTERMOST_CHANNEL=backups
|
||
|
|
NOTIFY_ON_FAILURE=true # Send alerts on failures (default: true)
|
||
|
|
NOTIFY_ON_SUCCESS_OFFSITE=true # Send alerts on successful offsite uploads (default: true)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Configuration Steps
|
||
|
|
|
||
|
|
### 1. Basic Setup (Local Development)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
BACKUP_ENABLED=true
|
||
|
|
BACKUP_DRY_RUN=false
|
||
|
|
BACKUP_READ_ONLY=false
|
||
|
|
BACKUP_STORAGE_PATH=./backups
|
||
|
|
```
|
||
|
|
|
||
|
|
Restart the application:
|
||
|
|
```bash
|
||
|
|
docker-compose restart api
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Enable Offsite Uploads
|
||
|
|
|
||
|
|
#### Using SSH Key (Recommended)
|
||
|
|
```bash
|
||
|
|
OFFSITE_ENABLED=true
|
||
|
|
SFTP_HOST=your-backup-server.com
|
||
|
|
SFTP_USER=backup_user
|
||
|
|
SSH_KEY_PATH=/path/to/id_rsa
|
||
|
|
SFTP_REMOTE_PATH=/backups/bmc_hub
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Using Password
|
||
|
|
```bash
|
||
|
|
OFFSITE_ENABLED=true
|
||
|
|
SFTP_HOST=your-backup-server.com
|
||
|
|
SFTP_USER=backup_user
|
||
|
|
SFTP_PASSWORD=your_secure_password
|
||
|
|
SFTP_REMOTE_PATH=/backups/bmc_hub
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Enable Mattermost Notifications
|
||
|
|
|
||
|
|
1. Create an incoming webhook in Mattermost
|
||
|
|
2. Copy the webhook URL
|
||
|
|
3. Add to `.env`:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
MATTERMOST_ENABLED=true
|
||
|
|
MATTERMOST_WEBHOOK_URL=https://your-mattermost.com/hooks/xxxxxxxxxxxxx
|
||
|
|
MATTERMOST_CHANNEL=backups
|
||
|
|
```
|
||
|
|
|
||
|
|
## Scheduled Jobs
|
||
|
|
|
||
|
|
When `BACKUP_ENABLED=true`, the system automatically schedules:
|
||
|
|
|
||
|
|
- **Daily Backup**: 02:00 CET - Full backup (database + files) in compressed format
|
||
|
|
- **Monthly Backup**: 1st day at 02:00 CET - Full backup in plain SQL format
|
||
|
|
- **Weekly Offsite**: Sunday at 03:00 CET - Upload all pending backups to offsite
|
||
|
|
- **Backup Rotation**: Daily at 01:00 CET - Delete expired backups
|
||
|
|
- **Storage Check**: Daily at 01:30 CET - Check disk usage
|
||
|
|
|
||
|
|
## Manual Operations
|
||
|
|
|
||
|
|
### Via UI Dashboard
|
||
|
|
Visit: `http://localhost:8000/backups`
|
||
|
|
|
||
|
|
Features:
|
||
|
|
- Create manual backups (database, files, or full)
|
||
|
|
- View backup history with sizes and checksums
|
||
|
|
- Restore from backup (with confirmation)
|
||
|
|
- Manual offsite upload
|
||
|
|
- View notifications
|
||
|
|
- Monitor storage usage
|
||
|
|
|
||
|
|
### Via API
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Create manual backup
|
||
|
|
curl -X POST http://localhost:8000/api/v1/backups \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{"job_type": "full", "is_monthly": false}'
|
||
|
|
|
||
|
|
# List backups
|
||
|
|
curl http://localhost:8000/api/v1/backups/jobs
|
||
|
|
|
||
|
|
# Get backup details
|
||
|
|
curl http://localhost:8000/api/v1/backups/jobs/1
|
||
|
|
|
||
|
|
# Restore from backup (⚠️ DANGER - enters maintenance mode)
|
||
|
|
curl -X POST http://localhost:8000/api/v1/backups/restore/1 \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{"confirmation": true}'
|
||
|
|
|
||
|
|
# Upload to offsite
|
||
|
|
curl -X POST http://localhost:8000/api/v1/backups/offsite/1
|
||
|
|
|
||
|
|
# Check storage
|
||
|
|
curl http://localhost:8000/api/v1/backups/storage
|
||
|
|
|
||
|
|
# Check maintenance mode
|
||
|
|
curl http://localhost:8000/api/v1/backups/maintenance
|
||
|
|
```
|
||
|
|
|
||
|
|
## Database Migration
|
||
|
|
|
||
|
|
Migration has already been applied. If you need to re-run:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker-compose exec -T postgres psql -U bmc_hub -d bmc_hub < migrations/024_backup_system.sql
|
||
|
|
```
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Backup not running
|
||
|
|
- Check `BACKUP_ENABLED=true` in `.env`
|
||
|
|
- Check logs: `docker-compose logs api | grep backup`
|
||
|
|
- Verify scheduler status via API: `curl http://localhost:8000/api/v1/backups/scheduler/status`
|
||
|
|
|
||
|
|
### Offsite upload failing
|
||
|
|
- Verify SFTP credentials
|
||
|
|
- Test SSH connection: `ssh -i /path/to/key user@host`
|
||
|
|
- Check retry count in backup history
|
||
|
|
- Review notifications in dashboard
|
||
|
|
|
||
|
|
### Storage full
|
||
|
|
- Increase `BACKUP_MAX_SIZE_GB`
|
||
|
|
- Reduce `RETENTION_DAYS`
|
||
|
|
- Manually delete old backups via UI
|
||
|
|
- Enable offsite uploads to move backups off-server
|
||
|
|
|
||
|
|
### Restore not working
|
||
|
|
- Set `BACKUP_READ_ONLY=false` in `.env`
|
||
|
|
- Restart API: `docker-compose restart api`
|
||
|
|
- Verify backup file exists on disk
|
||
|
|
- Check maintenance mode overlay appears during restore
|
||
|
|
|
||
|
|
## Safety Features
|
||
|
|
|
||
|
|
The system includes multiple safety switches:
|
||
|
|
|
||
|
|
1. **BACKUP_ENABLED** - Master switch, disabled by default
|
||
|
|
2. **BACKUP_DRY_RUN** - Logs operations without executing
|
||
|
|
3. **BACKUP_READ_ONLY** - Blocks destructive restore operations
|
||
|
|
4. **OFFSITE_ENABLED** - Disables external uploads until configured
|
||
|
|
5. **MATTERMOST_ENABLED** - Prevents notification spam
|
||
|
|
|
||
|
|
Always test with `BACKUP_DRY_RUN=true` first!
|
||
|
|
|
||
|
|
## Production Checklist
|
||
|
|
|
||
|
|
- [ ] Set strong SFTP credentials
|
||
|
|
- [ ] Configure SSH key authentication
|
||
|
|
- [ ] Test restore procedure (on test system first!)
|
||
|
|
- [ ] Configure Mattermost notifications
|
||
|
|
- [ ] Set appropriate retention periods
|
||
|
|
- [ ] Verify backup storage capacity
|
||
|
|
- [ ] Document restore procedures
|
||
|
|
- [ ] Schedule restore drills (quarterly)
|
||
|
|
- [ ] Monitor backup success rate
|
||
|
|
- [ ] Test offsite download/restore
|
||
|
|
|
||
|
|
## Backup Storage Structure
|
||
|
|
|
||
|
|
```
|
||
|
|
/opt/backups/
|
||
|
|
├── database/
|
||
|
|
│ ├── db_20251213_020000_daily.dump
|
||
|
|
│ ├── db_20251201_020000_monthly.sql
|
||
|
|
│ └── ...
|
||
|
|
└── files/
|
||
|
|
├── files_20251213_020000.tar.gz
|
||
|
|
└── ...
|
||
|
|
```
|
||
|
|
|
||
|
|
## Support
|
||
|
|
|
||
|
|
For issues or questions, check:
|
||
|
|
- Logs: `/logs/app.log`
|
||
|
|
- API Docs: `http://localhost:8000/api/docs`
|
||
|
|
- Dashboard: `http://localhost:8000/backups`
|