Files
XC_VM/docs/en/administration/backup-strategy.md
T

223 lines
5.7 KiB
Markdown

# Backup Strategy
XC_VM supports automated and manual database backups with local storage and optional Dropbox upload.
Backups are managed through the admin panel, CLI commands, and a cron job.
---
## What Gets Backed Up
Backups contain the complete database structure and data, **except** the following tables:
```text
detect_restream_logs, epg_data, lines_activity, lines_live,
lines_logs, login_logs, mag_claims, mag_logs, mysql_syslog,
panel_logs, panel_stats, servers_stats, signals,
streams_errors, streams_logs, streams_stats, syskill_log,
users_credits_logs, users_logs, watch_logs
```
> **Note:** Restoring a backup clears all log data. These tables are excluded to keep backup sizes manageable.
Backups do **not** include:
- File system data (recordings, VOD files, EPG XML)
- Configuration files (`config/`)
- Binary dependencies (`bin/`)
- Temporary files (`tmp/`)
---
## Configuration
Settings are in the admin panel under **Backups**:
| Setting | Default | Description |
| --- | --- | --- |
| `automatic_backups` | `off` | frequency: `off`, `hourly`, `daily`, `weekly`, `monthly` |
| `backups_to_keep` | `0` | local retention count (0 = unlimited) |
| `dropbox_remote` | `0` | enable Dropbox upload |
| `dropbox_keep` | `0` | remote retention count (0 = unlimited) |
| `dropbox_token` | `''` | Dropbox API token |
---
## Creating Backups
### Manual (admin panel)
Click **Create Backup Now** in the backups page. This runs the cron job in force mode:
```bash
/home/xc_vm/console.php cron:backups 1
```
### Automatic (cron)
The `cron:backups` job checks the schedule on each run:
| Schedule | Interval |
| --- | --- |
| `hourly` | 3600s |
| `daily` | 86400s |
| `weekly` | 604800s |
| `monthly` | 2419200s |
Only runs on the main server (`is_main=1`). Uses PID-based locking to prevent overlapping runs.
### Backup process
1. Close MySQL connection before dump.
2. Run `mysqldump --no-data` (structure) + `mysqldump --ignore-table` (data, excluding log tables).
3. Validate file size (empty files are deleted).
4. If Dropbox enabled: upload with status tracking.
5. Apply retention policy (delete oldest files exceeding limit).
### File location
```text
/home/xc_vm/backups/backup_YYYY-MM-DD_HH:MM:SS.sql
```
---
## Restoring Backups
### From admin panel
Click **Restore** on any backup entry. Requires confirmation.
Process:
1. If local file exists, use it. Otherwise download from Dropbox to `/home/xc_vm/tmp/restore.sql`.
2. Drop and recreate the database.
3. Import the SQL file.
4. Re-dump structure after import.
```php
BackupService::restore($filename, $config)
```
> **Important:** Restore drops the entire database and recreates it. All data not in the backup will be lost.
### From CLI
For migration scenarios with selective table import:
```bash
sudo /home/xc_vm/console.php tools migration /path/to/backup.sql
```
This restores to a `xc_vm_migrate` database for selective data migration, rather than overwriting the live database.
---
## Retention
### Local retention
- If `backups_to_keep > 0`: keeps only the N most recent files. Oldest deleted first.
- If `backups_to_keep = 0`: keeps all files (unlimited).
### Remote retention
- If `dropbox_keep > 0`: keeps only the N most recent files on Dropbox. Oldest deleted first.
- If `dropbox_keep = 0`: keeps all remote files (unlimited).
Cleanup runs automatically after each backup via `BackupsCronJob`.
---
## Dropbox Integration
File: `src/Core/Storage/DropboxClient.php`
When `dropbox_remote` is enabled:
1. After local backup creation, upload to Dropbox.
2. A `.uploading` marker file is created during upload.
3. On success: `.uploading` is deleted.
4. On failure: `.error` file is created with the error message.
Admin panel status indicators:
| Indicator | Meaning |
| --- | --- |
| Green | successfully uploaded |
| Yellow | currently uploading (< 10 minutes old) |
| Red | upload failed (hover for error message) |
| Gray | not uploaded |
Methods:
```php
BackupService::checkRemoteConnection() // validate Dropbox token
BackupService::uploadRemote($path, $filename, $overwrite = true) // upload backup
BackupService::downloadRemote($path, $filename) // download backup
BackupService::deleteRemote($path) // delete remote backup
BackupService::getRemote() // list remote backups
```
---
## CLI Commands
### cron:backups
Automated backup cron job. Can be forced with argument `1`:
```bash
sudo -u xc_vm /home/xc_vm/console.php cron:backups
sudo -u xc_vm /home/xc_vm/console.php cron:backups 1 # force
```
### tools migration
Restore a backup to a migration database for selective import:
```bash
sudo /home/xc_vm/console.php tools migration /path/to/backup.sql
```
### tools database --confirm
Reset to a blank database (destroys all data):
```bash
sudo /home/xc_vm/console.php tools database --confirm
```
### tools mysql
Re-authorize load balancers on MySQL:
```bash
sudo /home/xc_vm/console.php tools mysql
```
---
## API Endpoint
Action: `backup` (requires `adv:database` permission)
| Sub-action | Description |
| --- | --- |
| `backup` | trigger immediate backup (background) |
| `delete` | delete local backup + Dropbox copy |
| `restore` | restore database from backup |
---
## Related files
| File | Purpose |
| --- | --- |
| `src/Core/Backup/BackupService.php` | backup/restore logic |
| `src/Core/Storage/DropboxClient.php` | Dropbox API client |
| `src/Cli/CronJobs/BackupsCronJob.php` | automated backup cron |
| `src/Cli/Commands/ToolsCommand.php` | CLI migration and database tools |
| `src/Public/Views/admin/backups.php` | admin panel UI |
| `src/Public/Views/admin/api.php` | API endpoint handler |
| `src/Public/Controllers/Admin/BackupsController.php` | admin controller |