# PostgreSQL Database Provider - Migration Guide ## Overview The `Jellyfin.Database.Providers.Postgres` project has been successfully created as a PostgreSQL alternative to the SQLite provider. This document outlines the key changes and migration path. ## Project Structure ``` src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/ ├── Jellyfin.Database.Providers.Postgres.csproj ├── PostgresDatabaseProvider.cs ├── ModelBuilderExtensions.cs ├── GlobalSuppressions.cs ├── Properties/ │ └── AssemblyInfo.cs ├── ValueConverters/ │ └── DateTimeKindValueConverter.cs ├── Migrations/ │ └── PostgresDesignTimeJellyfinDbFactory.cs └── README.md ``` ## Key Differences from SQLite Provider ### 1. Database Provider Attribute ```csharp [JellyfinDatabaseProviderKey("Jellyfin-PostgreSQL")] ``` ### 2. Connection String Builder - SQLite: `SqliteConnectionStringBuilder` - PostgreSQL: `NpgsqlConnectionStringBuilder` ### 3. Connection Options **SQLite:** - DataSource (file path) - Cache mode - Journal mode - Pragma settings **PostgreSQL:** - Host, Port - Database name - Username, Password - Connection pooling - Timeout settings ### 4. Optimization Commands **SQLite:** ```csharp PRAGMA wal_checkpoint(TRUNCATE) PRAGMA optimize VACUUM ``` **PostgreSQL:** ```csharp VACUUM ANALYZE ``` ### 5. Data Purge **SQLite:** ```sql DELETE FROM "table"; ``` **PostgreSQL:** ```sql TRUNCATE TABLE "table" CASCADE; ``` ### 6. Backup/Restore - **SQLite**: File-based backup (Copy jellyfin.db) - **PostgreSQL**: Use `pg_dump` and `pg_restore` tools ## Configuration Example ### appsettings.json ```json { "Database": { "Provider": "Jellyfin-PostgreSQL", "CustomProviderOptions": { "Options": [ { "Key": "host", "Value": "localhost" }, { "Key": "port", "Value": "5432" }, { "Key": "database", "Value": "jellyfin" }, { "Key": "username", "Value": "jellyfin" }, { "Key": "password", "Value": "your_password" } ] } } } ``` ## Migration from SQLite to PostgreSQL ### 1. Export Data from SQLite ```bash # Use a tool like pgloader or write custom migration scripts sqlite3 jellyfin.db .dump > jellyfin_dump.sql ``` ### 2. Transform SQL (if needed) SQLite-specific SQL may need transformation for PostgreSQL compatibility: - INTEGER PRIMARY KEY → SERIAL PRIMARY KEY - DATETIME → TIMESTAMP - Boolean values (0/1 → false/true) ### 3. Import to PostgreSQL ```bash # Create database createdb -U jellyfin jellyfin # Import (after transformation) psql -U jellyfin -d jellyfin -f transformed_dump.sql ``` ### 4. Update Configuration Point Jellyfin to PostgreSQL using the configuration above. ## Creating Migrations ```bash cd src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres # Add migration dotnet ef migrations add MigrationName --context JellyfinDbContext # Apply migrations dotnet ef database update --context JellyfinDbContext ``` ## Package Dependencies - `Npgsql.EntityFrameworkCore.PostgreSQL` 9.0.2 (with EF Core 10 override) - `Microsoft.EntityFrameworkCore` 10.0.3 - `Microsoft.EntityFrameworkCore.Relational` 10.0.3 - `Microsoft.EntityFrameworkCore.Design` 10.0.3 - `Microsoft.EntityFrameworkCore.Tools` 10.0.3 **Note**: When Npgsql 10.x is released, update `Directory.Packages.props`. ## Testing ### Unit Tests Tests should be added to verify: 1. Connection string building 2. Migration application 3. CRUD operations 4. Transaction handling ### Integration Tests 1. Test against real PostgreSQL instance 2. Verify data type mappings 3. Test concurrent access 4. Performance benchmarks ## Known Limitations 1. **Version Compatibility**: Using Npgsql 9.x with EF Core 10.x (temporary) 2. **Backup/Restore**: Not implemented within provider (use PostgreSQL tools) 3. **Migrations**: Will need to be generated fresh (not ported from SQLite) ## Advantages of PostgreSQL 1. **Multi-user Support**: Better concurrent access handling 2. **ACID Compliance**: Full transaction support 3. **Scalability**: Better performance with large datasets 4. **JSON Support**: Native JSONB type for complex data 5. **Replication**: Built-in master-slave replication 6. **Extensions**: PostGIS, full-text search, etc. ## Next Steps 1. **Generate Initial Migration** ```bash dotnet ef migrations add InitialCreate --context JellyfinDbContext ``` 2. **Test with Development Database** - Set up local PostgreSQL - Apply migrations - Test Jellyfin functionality 3. **Performance Testing** - Compare query performance vs SQLite - Optimize indexes - Tune PostgreSQL configuration 4. **Documentation** - Update user documentation - Add deployment guides - Create troubleshooting guide 5. **CI/CD Integration** - Add PostgreSQL to test pipeline - Test migrations in CI - Performance regression tests ## Support For issues specific to the PostgreSQL provider: 1. Check PostgreSQL logs: `/var/log/postgresql/` 2. Enable EF Core logging in Jellyfin 3. Verify PostgreSQL version compatibility (12+) 4. Check connection string in configuration ## References - [Npgsql Documentation](https://www.npgsql.org/efcore/) - [PostgreSQL Documentation](https://www.postgresql.org/docs/) - [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/) - [Jellyfin Database Architecture](https://jellyfin.org/docs/)