c38adfc0f7
Added support for configuring all major Jellyfin paths (data, config, cache, log, temp, web) via a `startup.json` file, with priority after CLI and environment variables. Introduced a new `TempDir` option, configurable through CLI, env var, or config file, with backward-compatible defaults. Refactored path resolution logic to integrate file-based config and ensure directory creation. Updated constructors and CLI options to support temp directory. Improved EF Core migration error handling and logging. Added comprehensive documentation and example config files. All changes are backward compatible.
305 lines
7.9 KiB
Markdown
305 lines
7.9 KiB
Markdown
# Troubleshooting: EF Core Pending Model Changes Warning
|
|
|
|
## Issue Description
|
|
|
|
When deploying Jellyfin to a test/production environment, you may encounter this error:
|
|
|
|
```
|
|
System.InvalidOperationException: The model for context 'JellyfinDbContext' has pending changes.
|
|
Add a new migration before updating the database.
|
|
```
|
|
|
|
This error occurs when Entity Framework Core detects that the database model has changed but there isn't a corresponding migration file.
|
|
|
|
## Root Causes
|
|
|
|
### 1. Missing Migration Files (Most Common)
|
|
The development machine has all the migration files, but they weren't deployed to the test/production machine.
|
|
|
|
**Solution**: Ensure all migration files are deployed with your application.
|
|
|
|
#### Check for Migration Files
|
|
|
|
**Location:** `src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/`
|
|
|
|
Files should include:
|
|
- `*.cs` - Migration classes
|
|
- `*.Designer.cs` - Migration metadata
|
|
- `JellyfinDbContextModelSnapshot.cs` - Current model snapshot
|
|
|
|
**Verify on test machine:**
|
|
```bash
|
|
# Check if migration files exist
|
|
ls /opt/pgsql-jellyfin/src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/
|
|
|
|
# Count migration files
|
|
find /opt/pgsql-jellyfin -name "*Migration*.cs" | wc -l
|
|
```
|
|
|
|
### 2. Build Configuration Mismatch
|
|
Migration files might be excluded from the build output.
|
|
|
|
**Solution:** Check your `.csproj` file:
|
|
|
|
```xml
|
|
<ItemGroup>
|
|
<!-- Ensure migrations are included -->
|
|
<Compile Include="Migrations\*.cs" />
|
|
</ItemGroup>
|
|
```
|
|
|
|
### 3. Model Changed Without Migration
|
|
The code has model changes that haven't been captured in a migration.
|
|
|
|
**Solution:** Generate a new migration on your development machine:
|
|
|
|
```bash
|
|
# Navigate to the project directory
|
|
cd src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/
|
|
|
|
# Create a new migration
|
|
dotnet ef migrations add YourMigrationName --context JellyfinDbContext
|
|
|
|
# Rebuild and redeploy
|
|
dotnet build
|
|
```
|
|
|
|
### 4. Different .NET SDK Versions
|
|
Different SDK versions might have different EF Core behaviors.
|
|
|
|
**Solution:** Ensure both machines use the same .NET SDK version:
|
|
|
|
```bash
|
|
# Check version
|
|
dotnet --version
|
|
|
|
# Should be .NET 11 or later
|
|
```
|
|
|
|
## Fix Applied in Code
|
|
|
|
We've suppressed the `PendingModelChangesWarning` in the database provider configuration since we explicitly handle migrations in our startup code:
|
|
|
|
### PostgreSQL Provider
|
|
```csharp
|
|
options
|
|
.UseNpgsql(connectionString, options => /* ... */)
|
|
.ConfigureWarnings(warnings =>
|
|
warnings.Ignore(RelationalEventId.PendingModelChangesWarning));
|
|
```
|
|
|
|
### SQLite Provider
|
|
```csharp
|
|
options
|
|
.UseSqlite(connectionString, options => /* ... */)
|
|
.ConfigureWarnings(warnings =>
|
|
{
|
|
warnings.Ignore(RelationalEventId.NonTransactionalMigrationOperationWarning);
|
|
warnings.Ignore(RelationalEventId.PendingModelChangesWarning);
|
|
});
|
|
```
|
|
|
|
## Verification Steps
|
|
|
|
### 1. Check Logs on Test Machine
|
|
|
|
Look for these log messages:
|
|
|
|
```
|
|
[INF] Checking PostgreSQL database for missing tables...
|
|
[INF] Found X pending migrations: Migration1, Migration2, ...
|
|
[INF] Applying migrations...
|
|
[INF] Successfully applied X migrations
|
|
```
|
|
|
|
If you see warnings:
|
|
```
|
|
[WRN] Model has pending changes. This may indicate missing migration files.
|
|
[WRN] If you're seeing this on a test/production system, ensure all migration files are deployed.
|
|
```
|
|
|
|
### 2. Compare Migration Files
|
|
|
|
**On development machine:**
|
|
```powershell
|
|
# PowerShell
|
|
Get-ChildItem -Path "src\Jellyfin.Database\Jellyfin.Database.Providers.Postgres\Migrations" -Recurse | Select-Object Name
|
|
```
|
|
|
|
**On test machine:**
|
|
```bash
|
|
# Linux
|
|
find /opt/pgsql-jellyfin/src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations -type f
|
|
```
|
|
|
|
The file lists should match!
|
|
|
|
### 3. Verify Deployment
|
|
|
|
Ensure your deployment process includes:
|
|
|
|
1. **All .cs files** in Migrations folder
|
|
2. **All .Designer.cs files** in Migrations folder
|
|
3. **JellyfinDbContextModelSnapshot.cs**
|
|
|
|
## Deployment Checklist
|
|
|
|
### For Manual Deployment
|
|
|
|
- [ ] Build the solution in Release mode
|
|
- [ ] Copy all migration files from dev to test machine
|
|
- [ ] Verify file permissions (migrations must be readable)
|
|
- [ ] Check that the migration assembly is correct
|
|
- [ ] Restart Jellyfin after deploying new files
|
|
|
|
### For Docker/Container Deployment
|
|
|
|
Ensure your `Dockerfile` includes:
|
|
|
|
```dockerfile
|
|
# Copy migration files
|
|
COPY src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/ \
|
|
/app/src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/
|
|
```
|
|
|
|
### For CI/CD Deployment
|
|
|
|
```yaml
|
|
# Example GitHub Actions / GitLab CI
|
|
- name: Build
|
|
run: dotnet build --configuration Release
|
|
|
|
- name: Publish
|
|
run: dotnet publish --configuration Release --no-build
|
|
|
|
# Verify migrations are included
|
|
- name: Verify Migrations
|
|
run: |
|
|
if [ ! -d "publish/Migrations" ]; then
|
|
echo "ERROR: Migration files not found in publish output!"
|
|
exit 1
|
|
fi
|
|
```
|
|
|
|
## Alternative: Database-First Approach (Not Recommended)
|
|
|
|
If you absolutely cannot deploy migration files, you could manually create the database schema, but this is **not recommended** as it bypasses EF Core's migration tracking.
|
|
|
|
## Quick Fix for Immediate Issue
|
|
|
|
If you need an immediate fix on the test machine:
|
|
|
|
### Option 1: Deploy Missing Files (Recommended)
|
|
|
|
1. Copy migration files from development machine to test machine
|
|
2. Restart Jellyfin
|
|
3. Verify migrations are applied
|
|
|
|
### Option 2: Temporarily Skip Migration Check (Not Recommended)
|
|
|
|
You could modify the code to skip the check, but this could lead to database inconsistencies:
|
|
|
|
```csharp
|
|
// In EnsureTablesExistAsync - NOT RECOMMENDED
|
|
if (pendingMigrationsList.Count > 0)
|
|
{
|
|
logger.LogWarning("Skipping {Count} pending migrations", pendingMigrationsList.Count);
|
|
// Don't call MigrateAsync
|
|
}
|
|
```
|
|
|
|
## Prevention
|
|
|
|
### 1. Automated Deployment
|
|
|
|
Use a deployment script that ensures all files are copied:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# deploy.sh
|
|
|
|
SOURCE_DIR="/path/to/dev"
|
|
DEST_DIR="/opt/pgsql-jellyfin"
|
|
|
|
# Stop Jellyfin
|
|
systemctl stop jellyfin
|
|
|
|
# Copy binaries and migrations
|
|
rsync -av --include='*.dll' --include='*.cs' --include='*.Designer.cs' \
|
|
"${SOURCE_DIR}/" "${DEST_DIR}/"
|
|
|
|
# Verify migrations
|
|
if [ ! -f "${DEST_DIR}/src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/JellyfinDbContextModelSnapshot.cs" ]; then
|
|
echo "ERROR: Migration files not found!"
|
|
exit 1
|
|
fi
|
|
|
|
# Start Jellyfin
|
|
systemctl start jellyfin
|
|
```
|
|
|
|
### 2. Continuous Integration
|
|
|
|
Add migration verification to your build pipeline:
|
|
|
|
```yaml
|
|
test:
|
|
script:
|
|
- dotnet build
|
|
- dotnet test
|
|
# Verify migrations compile
|
|
- dotnet ef migrations list --project src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/
|
|
```
|
|
|
|
### 3. Version Control
|
|
|
|
Always commit migration files:
|
|
|
|
```bash
|
|
git add src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/
|
|
git commit -m "Add database migration"
|
|
git push
|
|
```
|
|
|
|
## Related Files Modified
|
|
|
|
To fix this issue, we modified:
|
|
|
|
1. **PostgresDatabaseProvider.cs** - Added warning suppression
|
|
2. **SqliteDatabaseProvider.cs** - Added warning suppression
|
|
3. **Both providers** - Improved error logging and diagnostics
|
|
|
|
## Testing the Fix
|
|
|
|
After applying the code changes:
|
|
|
|
1. **Build the solution:**
|
|
```bash
|
|
dotnet build
|
|
```
|
|
|
|
2. **Deploy to test machine**
|
|
|
|
3. **Check logs:**
|
|
```bash
|
|
journalctl -u jellyfin -f
|
|
# or
|
|
tail -f /var/log/jellyfin/log_*.txt
|
|
```
|
|
|
|
4. **Verify startup:**
|
|
- Should see "Checking PostgreSQL database for missing tables..."
|
|
- Should NOT see "pending changes" error
|
|
- Should see "Successfully applied X migrations" or "No migrations needed"
|
|
|
|
## Summary
|
|
|
|
The error was caused by EF Core's strict validation of model changes. We've:
|
|
|
|
✅ **Suppressed the warning** since we explicitly handle migrations
|
|
✅ **Added better logging** to diagnose issues
|
|
✅ **Improved error messages** to help identify root causes
|
|
✅ **Maintained backward compatibility**
|
|
|
|
The fix ensures that the automatic migration system works correctly without false positives from EF Core's model validation.
|