# Database Management Guide This guide covers the comprehensive database management features available in the Seismo Fleet Manager, including manual snapshots, restoration, remote cloning, and automatic backups. ## Table of Contents 1. [Manual Database Snapshots](#manual-database-snapshots) 2. [Restore from Snapshot](#restore-from-snapshot) 3. [Download and Upload Snapshots](#download-and-upload-snapshots) 4. [Clone Database to Dev Server](#clone-database-to-dev-server) 5. [Automatic Backup Service](#automatic-backup-service) 6. [API Reference](#api-reference) --- ## Manual Database Snapshots ### Creating a Snapshot via UI 1. Navigate to **Settings** → **Danger Zone** tab 2. Scroll to the **Database Management** section 3. Click **"Create Snapshot"** 4. Optionally enter a description 5. The snapshot will be created and appear in the "Available Snapshots" list ### Creating a Snapshot via API ```bash curl -X POST http://localhost:8000/api/settings/database/snapshot \ -H "Content-Type: application/json" \ -d '{"description": "Pre-deployment backup"}' ``` ### What Happens - A full copy of the SQLite database is created using the SQLite backup API - The snapshot is stored in `./data/backups/` directory - A metadata JSON file is created alongside the snapshot - No downtime or interruption to the running application ### Snapshot Files Snapshots are stored as: - **Database file**: `snapshot_YYYYMMDD_HHMMSS.db` - **Metadata file**: `snapshot_YYYYMMDD_HHMMSS.db.meta.json` Example: ``` data/backups/ ├── snapshot_20250101_143022.db ├── snapshot_20250101_143022.db.meta.json ├── snapshot_20250102_080000.db └── snapshot_20250102_080000.db.meta.json ``` --- ## Restore from Snapshot ### Restoring via UI 1. Navigate to **Settings** → **Danger Zone** tab 2. In the **Available Snapshots** section, find the snapshot you want to restore 3. Click the **restore icon** (circular arrow) next to the snapshot 4. Confirm the restoration warning 5. A safety backup of the current database is automatically created 6. The database is replaced with the snapshot 7. The page reloads automatically ### Restoring via API ```bash curl -X POST http://localhost:8000/api/settings/database/restore \ -H "Content-Type: application/json" \ -d '{ "filename": "snapshot_20250101_143022.db", "create_backup": true }' ``` ### Important Notes - **Always creates a safety backup** before restoring (unless explicitly disabled) - **Application reload required** - Users should refresh their browsers - **Atomic operation** - The entire database is replaced at once - **Cannot be undone** - But you'll have the safety backup --- ## Download and Upload Snapshots ### Download a Snapshot **Via UI**: Click the download icon next to any snapshot in the list **Via Browser**: ``` http://localhost:8000/api/settings/database/snapshot/snapshot_20250101_143022.db ``` **Via Command Line**: ```bash curl -o backup.db http://localhost:8000/api/settings/database/snapshot/snapshot_20250101_143022.db ``` ### Upload a Snapshot **Via UI**: 1. Navigate to **Settings** → **Danger Zone** tab 2. Find the **Upload Snapshot** section 3. Click **"Choose File"** and select a `.db` file 4. Click **"Upload Snapshot"** **Via Command Line**: ```bash curl -X POST http://localhost:8000/api/settings/database/upload-snapshot \ -F "file=@/path/to/your/backup.db" ``` --- ## Clone Database to Dev Server The clone tool allows you to copy the production database to a remote development server over the network. ### Prerequisites - Remote dev server must have the same Seismo Fleet Manager installation - Network connectivity between production and dev servers - Python 3 and `requests` library installed ### Basic Usage ```bash # Clone current database to dev server python3 scripts/clone_db_to_dev.py --url https://dev.example.com # Clone using existing snapshot python3 scripts/clone_db_to_dev.py \ --url https://dev.example.com \ --snapshot snapshot_20250101_143022.db # Clone with authentication token python3 scripts/clone_db_to_dev.py \ --url https://dev.example.com \ --token YOUR_AUTH_TOKEN ``` ### What Happens 1. Creates a snapshot of the production database (or uses existing one) 2. Uploads the snapshot to the remote dev server 3. Automatically restores the snapshot on the dev server 4. Creates a safety backup on the dev server before restoring ### Remote Server Setup The remote dev server needs no special setup - it just needs to be running the same Seismo Fleet Manager application with the database management endpoints enabled. ### Use Cases - **Testing**: Test changes against production data in a dev environment - **Debugging**: Investigate production issues with real data safely - **Training**: Provide realistic data for user training - **Development**: Build new features with realistic data --- ## Automatic Backup Service The automatic backup service runs scheduled backups in the background and manages backup retention. ### Configuration The backup scheduler can be configured programmatically or via environment variables. **Programmatic Configuration**: ```python from backend.services.backup_scheduler import get_backup_scheduler scheduler = get_backup_scheduler() scheduler.configure( interval_hours=24, # Backup every 24 hours keep_count=10, # Keep last 10 backups enabled=True # Enable automatic backups ) scheduler.start() ``` **Environment Variables** (add to your `.env` or deployment config): ```bash AUTO_BACKUP_ENABLED=true AUTO_BACKUP_INTERVAL_HOURS=24 AUTO_BACKUP_KEEP_COUNT=10 ``` ### Integration with Application Startup Add to `backend/main.py`: ```python from backend.services.backup_scheduler import get_backup_scheduler @app.on_event("startup") async def startup_event(): # Start automatic backup scheduler scheduler = get_backup_scheduler() scheduler.configure( interval_hours=24, # Daily backups keep_count=10, # Keep 10 most recent enabled=True ) scheduler.start() @app.on_event("shutdown") async def shutdown_event(): # Stop backup scheduler gracefully scheduler = get_backup_scheduler() scheduler.stop() ``` ### Manual Control ```python from backend.services.backup_scheduler import get_backup_scheduler scheduler = get_backup_scheduler() # Get current status status = scheduler.get_status() print(status) # {'enabled': True, 'running': True, 'interval_hours': 24, 'keep_count': 10, 'next_run': '2025-01-02T14:00:00'} # Create backup immediately scheduler.create_automatic_backup() # Stop scheduler scheduler.stop() # Start scheduler scheduler.start() ``` ### Backup Retention The scheduler automatically deletes old backups based on the `keep_count` setting. For example, if `keep_count=10`, only the 10 most recent backups are kept, and older ones are automatically deleted. --- ## API Reference ### Database Statistics ```http GET /api/settings/database/stats ``` Returns database size, row counts, and last modified time. **Response**: ```json { "database_path": "./data/seismo_fleet.db", "size_bytes": 1048576, "size_mb": 1.0, "total_rows": 1250, "tables": { "roster": 450, "emitters": 600, "ignored_units": 50, "unit_history": 150 }, "last_modified": "2025-01-01T14:30:22" } ``` ### Create Snapshot ```http POST /api/settings/database/snapshot Content-Type: application/json { "description": "Optional description" } ``` **Response**: ```json { "message": "Snapshot created successfully", "snapshot": { "filename": "snapshot_20250101_143022.db", "created_at": "20250101_143022", "created_at_iso": "2025-01-01T14:30:22", "description": "Optional description", "size_bytes": 1048576, "size_mb": 1.0, "type": "manual" } } ``` ### List Snapshots ```http GET /api/settings/database/snapshots ``` **Response**: ```json { "snapshots": [ { "filename": "snapshot_20250101_143022.db", "created_at": "20250101_143022", "created_at_iso": "2025-01-01T14:30:22", "description": "Manual backup", "size_mb": 1.0, "type": "manual" } ], "count": 1 } ``` ### Download Snapshot ```http GET /api/settings/database/snapshot/{filename} ``` Returns the snapshot file as a download. ### Delete Snapshot ```http DELETE /api/settings/database/snapshot/{filename} ``` ### Restore Database ```http POST /api/settings/database/restore Content-Type: application/json { "filename": "snapshot_20250101_143022.db", "create_backup": true } ``` **Response**: ```json { "message": "Database restored successfully", "restored_from": "snapshot_20250101_143022.db", "restored_at": "2025-01-01T15:00:00", "backup_created": "snapshot_20250101_150000.db" } ``` ### Upload Snapshot ```http POST /api/settings/database/upload-snapshot Content-Type: multipart/form-data file: ``` --- ## Best Practices ### 1. Regular Backups - **Enable automatic backups** with a 24-hour interval - **Keep at least 7-10 backups** for historical coverage - **Create manual snapshots** before major changes ### 2. Before Major Operations Always create a snapshot before: - Software upgrades - Bulk data imports - Database schema changes - Testing destructive operations ### 3. Testing Restores Periodically test your restore process: 1. Download a snapshot 2. Test restoration on a dev environment 3. Verify data integrity ### 4. Off-Site Backups For production systems: - **Download snapshots** to external storage regularly - Use the clone tool to **sync to remote servers** - Store backups in **multiple geographic locations** ### 5. Snapshot Management - Delete old snapshots when no longer needed - Use descriptive names/descriptions for manual snapshots - Keep pre-deployment snapshots separate --- ## Troubleshooting ### Snapshot Creation Fails **Problem**: "Database is locked" error **Solution**: The database is being written to. Wait a moment and try again. The SQLite backup API handles most locking automatically. ### Restore Doesn't Complete **Problem**: Restore appears to hang **Solution**: - Check server logs for errors - Ensure sufficient disk space - Verify the snapshot file isn't corrupted ### Upload Fails on Dev Server **Problem**: "Permission denied" or "File too large" **Solutions**: - Check file upload size limits in your web server config (nginx/apache) - Verify write permissions on `./data/backups/` directory - Ensure sufficient disk space ### Automatic Backups Not Running **Problem**: No automatic backups being created **Solutions**: 1. Check if scheduler is enabled: `scheduler.get_status()` 2. Check application logs for scheduler errors 3. Ensure `schedule` library is installed: `pip install schedule` 4. Verify scheduler was started in application startup --- ## Security Considerations 1. **Access Control**: Restrict access to the Settings → Danger Zone to administrators only 2. **Backup Storage**: Store backups in a secure location with proper permissions 3. **Remote Cloning**: Use authentication tokens when cloning to remote servers 4. **Data Sensitivity**: Remember that snapshots contain all database data - treat them with the same security as the live database --- ## File Locations - **Database**: `./data/seismo_fleet.db` - **Backups Directory**: `./data/backups/` - **Clone Script**: `./scripts/clone_db_to_dev.py` - **Backup Service**: `./backend/services/database_backup.py` - **Scheduler Service**: `./backend/services/backup_scheduler.py` --- ## Support For issues or questions: 1. Check application logs in `./logs/` 2. Review this documentation 3. Test with a small database first 4. Contact your system administrator