6.3 KiB
Jellyfin PostgreSQL Database Setup (.NET 11 Preview)
Overview
Due to .NET 11 being a preview release, EF Core migrations cannot run automatically at startup. Database schema is created using SQL scripts.
✨ NEW: Automatic Schema Initialization
If the database is empty (no library schema found), Jellyfin will automatically execute sql/schema_init/create_database_schema.sql at startup!
🚀 Automatic Setup (Recommended)
For Fresh Database - Zero Configuration!
-
Create an empty PostgreSQL database:
psql -U postgres -c "CREATE DATABASE jellyfin OWNER jellyfin;" -
Just start Jellyfin:
dotnet run --project Jellyfin.Server
That's it! Jellyfin will:
- ✅ Detect the database is empty (no
libraryschema) - ✅ Automatically load
sql/schema_init/create_database_schema.sql - ✅ Execute the full schema creation script
- ✅ Initialize all tables, schemas, and base indexes
- ✅ Continue with normal startup
What you'll see in logs:
[INF] Database is empty (library schema not found). Attempting to initialize from SQL script...
[INF] Found schema script at: D:\Jellyfin\sql\schema_init\create_database_schema.sql
[INF] Executing create_database_schema.sql to initialize database...
[INF] Successfully initialized database from SQL script
[INF] Database schema verification complete.
🔧 Manual Setup (Alternative)
If you prefer manual control or the automatic setup fails:
🔧 Manual Setup (Alternative)
If you prefer manual control or the automatic setup fails:
Step 1: Create Database and Schema
Run the main schema creation script:
psql -U jellyfin -d postgres -f sql/schema_init/create_database_schema.sql
This creates:
- All database schemas (library, activitylog, authentication, etc.)
- All tables with proper columns and data types
- Primary keys and foreign keys
- Base indexes
Step 2: Apply Supplementary Performance Indexes
After the main schema is created, apply the performance indexes:
psql -U jellyfin -d jellyfin -f sql/indexes/apply-supplementary-indexes-migration.sql
This creates 5 additional performance indexes for:
- Library browsing
- Folder hierarchy
- Recently added content
- Genre/tag filtering
- Episode deduplication
Step 3: Apply ActivityLog Index Fix
If the ActivityLogs table exists, apply the final index:
psql -U jellyfin -d jellyfin -f sql/fix-activitylog-index.sql
This creates the 6th performance index for user activity queries.
📋 What Changed for .NET 11 Preview
Automatic SQL Script Execution ✨
New Feature: Empty database auto-initialization!
When Jellyfin starts:
- ✅ Connects to PostgreSQL database
- ✅ Checks if
libraryschema exists - ✅ If empty: Automatically runs
sql/schema_init/create_database_schema.sql - ✅ If not empty: Skips initialization and proceeds normally
- ⚠️ Logs warning about any pending migrations (doesn't apply them)
- ✅ Continues with normal startup
In Code (PostgresDatabaseProvider.cs)
Disabled:
- ❌
context.Database.EnsureCreatedAsync()- Bypasses migration tracking - ❌
context.Database.MigrateAsync()- Not compatible with .NET 11 preview
Added:
- ✅ Empty database detection (checks for
libraryschema) - ✅ Automatic SQL script execution from
sql/schema_init/create_database_schema.sql - ✅ Proper error handling and logging
- ✅ 10-minute timeout for large schema creation
🔄 Upgrading Existing Database
If you already have a Jellyfin database and are upgrading:
Option 1: Apply Only Missing Indexes (Recommended)
If your database structure is already correct, just add the performance indexes:
# Apply supplementary indexes
psql -U jellyfin -d jellyfin -f sql/indexes/apply-supplementary-indexes-migration.sql
# Apply ActivityLog index fix
psql -U jellyfin -d jellyfin -f sql/fix-activitylog-index.sql
Option 2: Full Schema Recreation (Data Loss!)
⚠️ WARNING: This will delete all data!
Only do this for a fresh start:
# Drop existing database
psql -U jellyfin -d postgres -c "DROP DATABASE IF EXISTS jellyfin;"
# Recreate from schema
psql -U jellyfin -d postgres -f sql/schema_init/create_database_schema.sql
psql -U jellyfin -d jellyfin -f sql/indexes/apply-supplementary-indexes-migration.sql
psql -U jellyfin -d jellyfin -f sql/fix-activitylog-index.sql
📁 SQL Script Locations
D:\Projects\pgsql-jellyfin\
├── sql/
│ ├── schema_init/
│ │ ├── create_database_schema.sql ← Main database schema
│ │ └── 10_create_supplementary_indexes.sql ← (EF migration file)
│ ├── indexes/
│ │ └── apply-supplementary-indexes-migration.sql ← Performance indexes
│ ├── diagnostics/
│ │ ├── diagnostics.sql
│ │ ├── monitor-query-performance.sql
│ │ └── query-analysis.sql
│ ├── fix-activitylog-index.sql ← ActivityLog index fix
│ └── README-DATABASE-SETUP.md ← This file
✅ Verification
After running the scripts, verify everything is set up correctly:
-- Check schemas exist
SELECT schema_name FROM information_schema.schemata
WHERE schema_name IN ('library', 'activitylog', 'authentication', 'displaypreferences');
-- Check migration history
SELECT * FROM library."__EFMigrationsHistory" ORDER BY "MigrationId";
-- Check indexes
SELECT schemaname, tablename, indexname
FROM pg_indexes
WHERE indexname LIKE 'idx_%'
ORDER BY tablename, indexname;
Expected:
- ✅ 4+ schemas
- ✅ 3+ migrations in history
- ✅ 6+ custom performance indexes
🎯 When .NET 11 Goes GA
When .NET 11 is officially released (no longer preview):
- Uncomment the migration code in
PostgresDatabaseProvider.cs - Remove the warning log statements
- EF Core migrations will work automatically again
📞 Need Help?
If you encounter issues:
- Check logs: Look for database connection errors
- Verify credentials: Ensure PostgreSQL user has proper permissions
- Check schema: Run verification queries above
- Manual fixes: All scripts use
IF NOT EXISTS- safe to re-run
Created: 2026-03-07
Commit: 0911146 - EF migrations disabled for .NET 11 preview