Files
pgsql-jellyfin/DATABASE_PRESETS_FEATURE.md
T
wjones 69c213f13c Auto-generate startup.json and add database presets
Introduces automatic creation of a self-documenting startup.json file on first startup, with example path configurations for Linux, Windows, and portable setups. Adds preset database configurations to database.xml for easy switching between SQLite and PostgreSQL. Refactors database config classes for XML serialization compatibility and ensures database.xml is never empty. Comprehensive documentation and migration guides included.
2026-02-25 16:29:08 -05:00

6.9 KiB

Summary: Multi-Database Configuration with Presets

Feature Implemented!

Yes! The database.xml configuration file now includes preset configurations for both SQLite and PostgreSQL, making it easy to switch between database providers.

🎯 What Was Added

1. Preset Configurations in database.xml

The configuration file now includes a <PresetConfigurations> section with example configurations for:

  • SQLite (default) - Single-file database
  • PostgreSQL-Local - PostgreSQL on localhost

2. New Configuration Classes

PresetDatabaseConfiguration.cs - Stores template database configurations

public class PresetDatabaseConfiguration
{
    public string? DatabaseType { get; set; }
    public CustomDatabaseOptions? CustomProviderOptions { get; set; }
    public DatabaseLockingBehaviorTypes LockingBehavior { get; set; }
    public string? Description { get; set; }
}

Updated DatabaseConfigurationOptions.cs - Added PresetConfigurations property

public Dictionary<string, PresetDatabaseConfiguration>? PresetConfigurations { get; set; }

📄 Configuration File Structure

The database.xml file now looks like this:

<DatabaseConfigurationOptions>
  
  <!-- ACTIVE CONFIGURATION -->
  <DatabaseType>Jellyfin-SQLite</DatabaseType>
  <LockingBehavior>NoLock</LockingBehavior>
  
  <!-- POSTGRESQL OPTIONS (when needed) -->
  <CustomProviderOptions>
    <!-- PostgreSQL settings -->
  </CustomProviderOptions>
  
  <!-- PRESET CONFIGURATIONS (Templates) -->
  <PresetConfigurations>
    <PresetConfiguration>
      <key>SQLite</key>
      <value>
        <DatabaseType>Jellyfin-SQLite</DatabaseType>
        <Description>Default SQLite database</Description>
      </value>
    </PresetConfiguration>
    
    <PresetConfiguration>
      <key>PostgreSQL-Local</key>
      <value>
        <DatabaseType>Jellyfin-PostgreSQL</DatabaseType>
        <Description>PostgreSQL on localhost</Description>
      </value>
    </PresetConfiguration>
  </PresetConfigurations>
  
</DatabaseConfigurationOptions>

🔄 How to Switch Databases

Step 1: Stop Jellyfin

sudo systemctl stop jellyfin

Step 2: Edit database.xml

To use SQLite:

<DatabaseType>Jellyfin-SQLite</DatabaseType>
<!-- Remove or comment out CustomProviderOptions -->

To use PostgreSQL:

<DatabaseType>Jellyfin-PostgreSQL</DatabaseType>
<CustomProviderOptions>
  <PluginName>Jellyfin.Database.Providers.Postgres</PluginName>
  <PluginAssembly>Jellyfin.Database.Providers.Postgres.dll</PluginAssembly>
  <ConnectionString></ConnectionString>
  <Options>
    <CustomDatabaseOption>
      <Key>host</Key>
      <Value>localhost</Value>
    </CustomDatabaseOption>
    <CustomDatabaseOption>
      <Key>database</Key>
      <Value>jellyfin</Value>
    </CustomDatabaseOption>
    <CustomDatabaseOption>
      <Key>username</Key>
      <Value>jellyfin</Value>
    </CustomDatabaseOption>
    <CustomDatabaseOption>
      <Key>password</Key>
      <Value>your_password</Value>
    </CustomDatabaseOption>
  </Options>
</CustomProviderOptions>

Step 3: Start Jellyfin

sudo systemctl start jellyfin

📍 Configuration File Location

  • Linux: /etc/jellyfin/database.xml or ~/.config/jellyfin/database.xml
  • Windows: %ProgramData%\Jellyfin\config\database.xml
  • Docker: /config/database.xml (in your config volume)

💡 Key Benefits

  1. No need to remember syntax - Examples are right in the file
  2. Quick reference - See all available options at a glance
  3. Easy switching - Just change one line and add credentials
  4. Self-documenting - Descriptions explain what each preset does
  5. No separate documentation needed - Everything in one place

🗂️ Files Modified

Created:

  1. src/Jellyfin.Database/Jellyfin.Database.Implementations/DbConfiguration/PresetDatabaseConfiguration.cs

    • New class to store preset configurations
  2. database.xml.example

    • Complete example configuration file with comments
  3. DATABASE_CONFIGURATION_GUIDE.md

    • Comprehensive guide for database configuration

Modified:

  1. src/Jellyfin.Database/Jellyfin.Database.Implementations/DbConfiguration/DatabaseConfigurationOptions.cs

    • Added PresetConfigurations property
  2. Jellyfin.Server.Implementations/Extensions/ServiceCollectionExtensions.cs

    • Added default preset creation on first startup

📋 Example Presets Included

SQLite Preset

<PresetConfiguration>
  <key>SQLite</key>
  <value>
    <DatabaseType>Jellyfin-SQLite</DatabaseType>
    <LockingBehavior>NoLock</LockingBehavior>
    <Description>Default SQLite database configuration. Database stored in data directory.</Description>
  </value>
</PresetConfiguration>

PostgreSQL Preset

<PresetConfiguration>
  <key>PostgreSQL-Local</key>
  <value>
    <DatabaseType>Jellyfin-PostgreSQL</DatabaseType>
    <LockingBehavior>NoLock</LockingBehavior>
    <Description>PostgreSQL database on localhost. Update Options with your database credentials.</Description>
  </value>
</PresetConfiguration>

🚀 Usage Workflow

  1. First Startup: database.xml is created with SQLite active and presets included
  2. View Presets: Open database.xml to see available configurations
  3. Switch Database:
    • Change <DatabaseType> to desired provider
    • Add/update <CustomProviderOptions> if using PostgreSQL
    • Restart Jellyfin
  4. Done: Jellyfin now uses the new database

🎨 Advanced Customization

You can add your own presets to the configuration file:

<PresetConfiguration>
  <key>PostgreSQL-Production</key>
  <value>
    <DatabaseType>Jellyfin-PostgreSQL</DatabaseType>
    <LockingBehavior>Optimistic</LockingBehavior>
    <Description>PostgreSQL production server with optimistic locking</Description>
  </value>
</PresetConfiguration>

⚠️ Important Notes

  1. Presets are templates only - They don't activate automatically
  2. Copy settings to active configuration to use them
  3. Stop Jellyfin before editing database.xml
  4. Protect the file - It may contain passwords
  5. Backup before changing database types

🔒 Security

# Protect database.xml
chmod 600 /etc/jellyfin/database.xml
chown jellyfin:jellyfin /etc/jellyfin/database.xml

🏗️ Build Status

Build Successful
No Breaking Changes
Backward Compatible
Comprehensive Documentation

📚 Documentation

Created comprehensive guides:

  1. DATABASE_CONFIGURATION_GUIDE.md - Complete configuration reference
  2. database.xml.example - Annotated example file
  3. This summary - Quick reference

Your database.xml file now includes preset configurations for easy switching between SQLite and PostgreSQL! 🎉

Just edit one line (<DatabaseType>) and optionally add PostgreSQL credentials to switch databases. No need to remember complex configuration syntax - it's all right there in the file!