# 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!

1. **Create an empty PostgreSQL database**:
   ```sh
   psql -U postgres -c "CREATE DATABASE jellyfin OWNER jellyfin;"
   ```

2. **Just start Jellyfin**:
   ```sh
   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:

```sh
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:

```sh
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:

```sh
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:

### Option 1: Apply Only Missing Indexes (Recommended)

If your database structure is already correct, just add the performance indexes:

```sh
# 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:

```sh
# 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:

```sql
-- 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
