8f860a8ec3
- All DLLs now output to lib\[Configuration]\[TargetFramework]\ at repo root (see Directory.Build.props) - .gitignore updated to exclude /lib/ - On first run, startup.json is auto-generated with OS-appropriate default paths (Windows, Linux, macOS, or portable) - Removes null/example config; generated config is immediately usable and clearly documented - Extensive new documentation: build output, startup.json logic, visual guides, and code proofs - Publish profile now deletes existing files for clean deploys - No breaking changes: existing startup.json files are preserved - Improves first-run UX, deployment, and cross-platform consistency
4.0 KiB
4.0 KiB
Database Table Verification and Auto-Creation Feature
Overview
Added automatic database table verification and creation during Jellyfin startup. This ensures all required tables exist and automatically applies any pending Entity Framework Core migrations.
Changes Made
1. Interface Update
File: src/Jellyfin.Database/Jellyfin.Database.Implementations/IJellyfinDatabaseProvider.cs
- Added
EnsureTablesExistAsyncmethod to theIJellyfinDatabaseProviderinterface - This method is responsible for checking and creating missing database tables
2. PostgreSQL Provider Implementation
File: src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/PostgresDatabaseProvider.cs
- Implemented
EnsureTablesExistAsyncmethod - Checks for pending EF Core migrations
- Applies migrations if needed using
Database.MigrateAsync() - Verifies each schema (activitylog, authentication, displaypreferences, library, users) contains tables
- Logs warnings if schemas exist but contain no tables
- Provides detailed logging throughout the process
3. SQLite Provider Implementation
File: src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/SqliteDatabaseProvider.cs
- Implemented
EnsureTablesExistAsyncmethod for SQLite - Checks for pending migrations
- Applies migrations if needed
- Verifies database integrity
- Logs table count and completion status
4. Startup Integration
File: Jellyfin.Server/Program.cs
- Added call to
EnsureTablesExistAsyncin theStartServermethod - Executes after
PrepareDatabaseProviderbut before backup restoration - Runs early in the startup process to ensure database is ready
How It Works
- During Startup: After the database provider is prepared, the system calls
EnsureTablesExistAsync() - Migration Check: The method checks if there are any pending EF Core migrations
- Migration Application: If migrations are pending, they are automatically applied
- Table Verification: The method verifies that all expected schemas contain tables
- Logging: Detailed logs are provided for each step:
- Number of pending migrations found
- Migration application progress
- Schema verification results
- Warnings for empty schemas
Benefits
- Automatic Recovery: Automatically fixes missing tables by applying migrations
- Early Detection: Catches database schema issues during startup before they cause runtime errors
- Detailed Logging: Provides clear visibility into what's happening with the database
- Prevention: Prevents errors like "relation does not exist" by ensuring all tables are created
- Both Databases: Works for both PostgreSQL and SQLite providers
Example Logs
When the system starts and finds missing tables:
[INF] Checking PostgreSQL database for missing tables...
[INF] Found 3 pending migrations. Applying migrations...
[INF] Successfully applied 3 migrations
[DBG] Schema 'activitylog' contains 1 tables
[DBG] Schema 'authentication' contains 3 tables
[DBG] Schema 'displaypreferences' contains 4 tables
[DBG] Schema 'library' contains 15 tables
[DBG] Schema 'users' contains 4 tables
[INF] Database table verification complete
When everything is up to date:
[INF] Checking PostgreSQL database for missing tables...
[INF] All database tables are up to date. No migrations needed.
[INF] Database table verification complete
Testing Recommendations
- Fresh Database: Test with a completely new database to verify migrations are applied
- Partial Database: Test with a database missing some tables to ensure they're created
- Complete Database: Test with an up-to-date database to ensure it skips unnecessary work
- Schema Verification: Verify that the warning logs appear if schemas exist but are empty
Notes
- The method is called automatically during startup - no configuration needed
- Migrations are applied in the correct order as defined by EF Core
- The process will throw exceptions if migrations fail, preventing startup with a broken database
- Both PostgreSQL and SQLite providers are fully supported