Add PostgreSQL provider and EF Core 10 support

Introduce Jellyfin.Database.Providers.Postgres project, enabling PostgreSQL as a database backend using Entity Framework Core 10 and Npgsql. Add custom value converters and model builder extensions for PostgreSQL compatibility. Update solution-wide dependencies to Microsoft.EntityFrameworkCore 10.0.3 and Npgsql.EntityFrameworkCore.PostgreSQL 9.0.2 (as a temporary workaround until 10.x is released). Regenerate all relevant NuGet, build, and cache files. Add new and updated binaries, debug symbols, and XML documentation for affected projects. No application source code changes outside of the new provider and supporting infrastructure.
This commit is contained in:
2026-02-20 16:52:36 -05:00
parent ae274053a8
commit fd03e1f564
261 changed files with 1678 additions and 107 deletions
@@ -0,0 +1,103 @@
# Jellyfin.Database.Providers.Postgres
PostgreSQL database provider for Jellyfin.
## ⚠️ Important Note
This provider currently uses `Npgsql.EntityFrameworkCore.PostgreSQL 9.0.2` with EF Core 10.0.3, which requires overriding package version constraints. This is a temporary workaround until Npgsql releases a version compatible with EF Core 10.
**Compatibility Warning**: This may cause runtime issues. Monitor for:
- Npgsql.EntityFrameworkCore.PostgreSQL 10.x release
- Update `Directory.Packages.props` when available
## Configuration
To use PostgreSQL as the database backend, configure the following options in your Jellyfin configuration:
```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_secure_password" },
{ "Key": "pooling", "Value": "true" },
{ "Key": "command-timeout", "Value": "30" },
{ "Key": "connection-timeout", "Value": "15" }
]
}
}
}
```
## Database Setup
Before using this provider, ensure PostgreSQL is installed and create the database:
```sql
CREATE DATABASE jellyfin;
CREATE USER jellyfin WITH PASSWORD 'your_secure_password';
GRANT ALL PRIVILEGES ON DATABASE jellyfin TO jellyfin;
```
## Creating Migrations
To create a new migration:
```bash
cd src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres
dotnet ef migrations add YourMigrationName --context JellyfinDbContext
```
## Applying Migrations
Migrations will be applied automatically when Jellyfin starts. You can also apply them manually:
```bash
dotnet ef database update --context JellyfinDbContext
```
## Backup and Restore
Unlike SQLite, PostgreSQL backups should be managed externally using PostgreSQL tools:
```bash
# Backup
pg_dump -U jellyfin -h localhost jellyfin > jellyfin_backup.sql
# Restore
psql -U jellyfin -h localhost jellyfin < jellyfin_backup.sql
```
## Configuration Options
| Key | Default | Description |
|-----|---------|-------------|
| host | localhost | PostgreSQL server hostname |
| port | 5432 | PostgreSQL server port |
| database | jellyfin | Database name |
| username | jellyfin | Database username |
| password | (empty) | Database password |
| pooling | true | Enable connection pooling |
| command-timeout | 30 | Command timeout in seconds |
| connection-timeout | 15 | Connection timeout in seconds |
| EnableSensitiveDataLogging | false | Enable sensitive data logging (for debugging) |
## Performance Tuning
For better performance, consider:
1. **Indexes**: The provider will create necessary indexes through migrations
2. **Connection Pooling**: Enabled by default
3. **Vacuum**: Scheduled optimization runs `VACUUM ANALYZE` periodically
4. **PostgreSQL Configuration**: Adjust `shared_buffers`, `effective_cache_size`, etc. in postgresql.conf
## Notes
- Migrations from SQLite are not automatically handled. You'll need to export data from SQLite and import into PostgreSQL manually.
- The provider uses UTC timestamps throughout for consistency.
- Transaction isolation level and other PostgreSQL-specific features can be configured through Npgsql connection string parameters.