# PostgreSQL Backup Configuration - Implementation Summary ## What Was Created This implementation adds configurable PostgreSQL backup options to Jellyfin that can be configured through the `database.xml` file. ### New Files Created: 1. **`DatabaseBackupOptions.cs`** - Location: `src/Jellyfin.Database/Jellyfin.Database.Implementations/DbConfiguration/` - Contains all configurable backup settings - Properties: PgDumpPath, PgRestorePath, BackupFormat, CompressionLevel, TimeoutSeconds, etc. 2. **`PostgresBackupService.cs`** - Location: `src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/` - Service class that performs backup and restore operations - Reads configuration from `database.xml` - Executes `pg_dump` and `pg_restore` with configured options 3. **`database.xml.example`** - Location: `src/Jellyfin.Database/Jellyfin.Database.Implementations/DbConfiguration/` - Example configuration file showing all available options - Can be copied to Jellyfin's config directory 4. **`BACKUP_CONFIGURATION.md`** - Location: `src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/` - Complete documentation for end users - Configuration reference and troubleshooting guide ### Modified Files: 1. **`DatabaseConfigurationOptions.cs`** - Added `BackupOptions` property to hold backup configuration ## How It Works ### Configuration Flow: ``` database.xml ↓ DatabaseConfigurationOptions.BackupOptions ↓ PostgresBackupService reads options via IConfigurationManager ↓ pg_dump/pg_restore executed with configured parameters ``` ### Example database.xml: ```xml Jellyfin-PostgreSQL Jellyfin-PostgreSQL Jellyfin.Database.Providers.Postgres Host=localhost;Database=jellyfin;Username=jellyfin;Password=pwd pg_dump custom 6 true 1800 true ``` ### Using the Service: ```csharp // In your DI setup (Startup.cs or similar) services.AddSingleton(); // In your code public class BackupManager { private readonly PostgresBackupService _backupService; public BackupManager(PostgresBackupService backupService) { _backupService = backupService; } public async Task PerformBackup() { // All settings are read from database.xml automatically var backupPath = await _backupService.CreateBackupAsync("/backup/directory"); Console.WriteLine($"Backup created: {backupPath}"); } public async Task RestoreFromBackup(string backupFile) { await _backupService.RestoreBackupAsync(backupFile); } } ``` ## Configuration Options All options are **optional** with sensible defaults: | Option | Type | Default | Description | |--------|------|---------|-------------| | `PgDumpPath` | string | Searches PATH | Path to pg_dump executable | | `PgRestorePath` | string | Searches PATH | Path to pg_restore executable | | `BackupFormat` | string | "custom" | Backup format: custom, plain, directory, tar | | `IncludeBlobs` | bool | true | Include large objects in backup | | `CompressionLevel` | int | 6 | Compression level (0-9) | | `TimeoutSeconds` | int | 1800 | Max backup/restore time (30 min) | | `VerboseOutput` | bool | true | Enable verbose logging | | `ParallelJobs` | int? | null | Number of parallel jobs (directory format) | | `AdditionalArguments` | string? | null | Extra pg_dump arguments | ## Benefits 1. **User-Configurable**: Users can customize backup behavior without code changes 2. **Flexible**: Supports all pg_dump formats and options 3. **Secure**: Uses environment variables for passwords 4. **Robust**: Includes timeout handling and error reporting 5. **Well-Documented**: Complete documentation for end users 6. **Backward Compatible**: All options have defaults, no configuration required for basic use ## Next Steps To integrate this into Jellyfin: 1. **Register the Service** in your DI container: ```csharp services.AddSingleton(); ``` 2. **Wire into existing backup system** (if Jellyfin has one): ```csharp // In your backup manager/controller if (dbType == "PostgreSQL") { var postgresBackup = serviceProvider.GetRequiredService(); await postgresBackup.CreateBackupAsync(backupDirectory); } ``` 3. **Add UI configuration** (optional): - Create admin UI to edit backup options - Save to database.xml through configuration manager 4. **Testing**: - Test with different backup formats - Test timeout handling - Test restore operations - Test path auto-detection on Windows/Linux ## Example Usage Scenarios ### Scenario 1: Basic Backup (default settings) ```xml pg_dump ``` ### Scenario 2: High Compression for Storage ```xml custom 9 3600 ``` ### Scenario 3: Fast Parallel Backup ```xml directory 4 3 ``` ### Scenario 4: Plain SQL Script ```xml plain --exclude-schema=test ``` ## Security Considerations 1. **File Permissions**: Ensure `database.xml` is readable only by the Jellyfin user 2. **Backup Storage**: Store backups in a secure location with appropriate permissions 3. **Password Handling**: Uses `PGPASSWORD` environment variable (more secure than CLI args) 4. **Audit Logging**: All operations are logged with timestamps ## Troubleshooting Common issues and solutions are documented in `BACKUP_CONFIGURATION.md`.