Files

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!


For Fresh Database - Zero Configuration!

  1. Create an empty PostgreSQL database:

    psql -U postgres -c "CREATE DATABASE jellyfin OWNER jellyfin;"
    
  2. Just start Jellyfin:

    dotnet run --project Jellyfin.Server
    

That's it! Jellyfin will:

  • Detect the database is empty (no library schema)
  • 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:

  1. Connects to PostgreSQL database
  2. Checks if library schema exists
  3. If empty: Automatically runs sql/schema_init/create_database_schema.sql
  4. If not empty: Skips initialization and proceeds normally
  5. ⚠️ Logs warning about any pending migrations (doesn't apply them)
  6. 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 library schema)
  • 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:

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):

  1. Uncomment the migration code in PostgresDatabaseProvider.cs
  2. Remove the warning log statements
  3. EF Core migrations will work automatically again

📞 Need Help?

If you encounter issues:

  1. Check logs: Look for database connection errors
  2. Verify credentials: Ensure PostgreSQL user has proper permissions
  3. Check schema: Run verification queries above
  4. 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