# Summary: File-Based Startup Configuration ## ✅ Implementation Complete! Yes, startup options can now be configured via file in addition to command-line arguments and environment variables! ## 🎯 Configuration Methods Jellyfin now supports **three ways** to configure startup paths: ### 1. 📄 Configuration File (NEW!) - File: `startup.json` - Format: JSON - Location: Current directory, app directory, or config subdirectory - **Best for**: Production servers, containers, persistent configurations ### 2. 🔧 Command-Line Arguments - Example: `--datadir /var/lib/jellyfin` - **Best for**: Testing, one-time overrides, debugging ### 3. 🌍 Environment Variables - Example: `JELLYFIN_DATA_DIR=/var/lib/jellyfin` - **Best for**: System-wide settings, CI/CD, user-specific overrides ## 📊 Priority Order When a path is configured in multiple places, Jellyfin uses this priority (highest to lowest): ``` 1. Command-line options (--datadir, etc.) ↓ 2. Environment variables (JELLYFIN_DATA_DIR, etc.) ↓ 3. Configuration file (startup.json) ↓ 4. Default values ``` ## 📁 Configuration File Format Create a file named `startup.json`: ```json { "Paths": { "DataDir": "/var/lib/jellyfin", "ConfigDir": "/etc/jellyfin", "CacheDir": "/var/cache/jellyfin", "LogDir": "/var/log/jellyfin", "TempDir": "/var/tmp/jellyfin", "WebDir": "/usr/share/jellyfin/web" } } ``` ### All Properties are Optional! You can omit any property or set it to `null`, and Jellyfin will fall back to environment variables or defaults: ```json { "Paths": { "DataDir": "/custom/data" } } ``` ## 📍 File Locations The `startup.json` file is searched in these locations (first found is used): 1. `./startup.json` (current working directory) 2. `{AppDirectory}/startup.json` 3. `{AppDirectory}/config/startup.json` ## 🔧 Changes Made ### New Files Created 1. **Jellyfin.Server/Resources/Configuration/startup.default.json** - Default template 2. **startup.json.example** - User-friendly example with documentation 3. **FILE_BASED_STARTUP_CONFIG.md** - Comprehensive documentation ### Code Changes 1. **Jellyfin.Server/Helpers/StartupHelpers.cs** - Added `LoadStartupConfiguration()` method - Searches for `startup.json` in multiple locations - Integrates file-based config into path resolution - Priority: CLI > Env Var > Config File > Default ### Modified Path Resolution All six paths now support configuration file: - DataDir - ConfigDir - CacheDir - LogDir - TempDir - WebDir ## 💡 Use Cases ### 1. Production Server ```json { "Paths": { "DataDir": "/var/lib/jellyfin", "ConfigDir": "/etc/jellyfin", "CacheDir": "/var/cache/jellyfin", "LogDir": "/var/log/jellyfin", "TempDir": "/var/tmp/jellyfin" } } ``` ### 2. Docker Container ```json { "Paths": { "DataDir": "/data", "ConfigDir": "/config", "CacheDir": "/cache", "TempDir": "/temp" } } ``` ### 3. Portable Installation ```json { "Paths": { "DataDir": "./data", "ConfigDir": "./config", "CacheDir": "./cache", "LogDir": "./logs", "TempDir": "./temp" } } ``` ### 4. Performance Optimization ```json { "Paths": { "DataDir": "/mnt/hdd/jellyfin/data", "CacheDir": "/mnt/ssd/jellyfin/cache", "TempDir": "/mnt/nvme/jellyfin/temp" } } ``` ## ✅ Validation When Jellyfin starts, it logs the configuration file being used: ``` Loaded startup configuration from: /path/to/startup.json ``` If the file has errors: ``` Warning: Failed to load startup configuration from /path/to/startup.json: [error] ``` All resolved paths are logged: ``` [INF] Program data path: /var/lib/jellyfin [INF] Config directory path: /etc/jellyfin [INF] Cache path: /var/cache/jellyfin [INF] Log directory path: /var/log/jellyfin [INF] Temp directory path: /var/tmp/jellyfin [INF] Web resources path: /usr/share/jellyfin/web ``` ## 🎨 Example Scenarios ### Scenario 1: Basic File Configuration **startup.json:** ```json { "Paths": { "DataDir": "/var/lib/jellyfin" } } ``` **Result:** DataDir from file, all others use defaults ### Scenario 2: Mixed Configuration **startup.json:** ```json { "Paths": { "DataDir": "/var/lib/jellyfin", "ConfigDir": "/etc/jellyfin" } } ``` **Environment:** ```bash export JELLYFIN_TEMP_DIR=/fast-storage/temp ``` **Result:** - DataDir & ConfigDir from file - TempDir from environment variable - Others use defaults ### Scenario 3: Override Everything **startup.json:** ```json { "Paths": { "DataDir": "/var/lib/jellyfin" } } ``` **Command line:** ```bash jellyfin --datadir /tmp/testing ``` **Result:** DataDir from command line (highest priority) ## 📦 Migration Guide ### From Environment Variables **Before:** ```bash export JELLYFIN_DATA_DIR=/var/lib/jellyfin export JELLYFIN_CONFIG_DIR=/etc/jellyfin export JELLYFIN_CACHE_DIR=/var/cache/jellyfin ``` **After:** Create `startup.json`: ```json { "Paths": { "DataDir": "/var/lib/jellyfin", "ConfigDir": "/etc/jellyfin", "CacheDir": "/var/cache/jellyfin" } } ``` Then remove environment variables. ### From Command-Line Arguments **Before:** ```bash jellyfin --datadir /var/lib/jellyfin --configdir /etc/jellyfin --cachedir /var/cache/jellyfin ``` **After:** Create `startup.json` and run: ```bash jellyfin ``` ## 🐳 Docker Integration **docker-compose.yml:** ```yaml version: '3.8' services: jellyfin: image: jellyfin/jellyfin volumes: - ./startup.json:/app/startup.json - jellyfin_data:/data - jellyfin_config:/config - jellyfin_cache:/cache ``` **startup.json:** ```json { "Paths": { "DataDir": "/data", "ConfigDir": "/config", "CacheDir": "/cache" } } ``` ## 🔒 Security - Keep `startup.json` readable only by Jellyfin user - Don't commit sensitive paths to public repositories - Use file permissions: `chmod 600 startup.json` - Consider separate files per environment ## 📚 Benefits ### Advantages Over Environment Variables ✅ **Portable** - Easy to copy between systems ✅ **Version Control** - Track changes in Git ✅ **Self-Documenting** - Clear structure ✅ **Persistent** - Survives reboots ✅ **No Shell Escaping** - No quoting issues ✅ **Easy Editing** - Simple text file ### Advantages Over Command-Line ✅ **Permanent** - No need to repeat options ✅ **Complex Configurations** - Handle many options easily ✅ **Documentation** - Can include comments ✅ **Consistency** - Same config every time ## 🏗️ Build Status ✅ **Build Successful** ✅ **All tests passing** ✅ **Backward compatible** - existing configurations continue to work ✅ **No breaking changes** ## 📖 Documentation Created 1. **FILE_BASED_STARTUP_CONFIG.md** - Complete guide with examples 2. **startup.json.example** - Template with examples and notes 3. **startup.default.json** - Minimal template 4. **This summary** - Quick reference ## 🚀 Getting Started 1. **Copy the example file:** ```bash cp startup.json.example startup.json ``` 2. **Edit with your paths:** ```bash nano startup.json ``` 3. **Place in one of these locations:** - Next to jellyfin executable - In config subdirectory - In current working directory 4. **Start Jellyfin:** ```bash jellyfin ``` 5. **Verify it's loaded:** Check logs for "Loaded startup configuration from:" ## 📊 Complete Feature Matrix | Path | CLI Option | Env Variable | Config File | Default | |------|-----------|--------------|-------------|---------| | Data | ✅ `--datadir` | ✅ `JELLYFIN_DATA_DIR` | ✅ `Paths:DataDir` | ✅ OS-specific | | Config | ✅ `--configdir` | ✅ `JELLYFIN_CONFIG_DIR` | ✅ `Paths:ConfigDir` | ✅ OS-specific | | Cache | ✅ `--cachedir` | ✅ `JELLYFIN_CACHE_DIR` | ✅ `Paths:CacheDir` | ✅ OS-specific | | Logs | ✅ `--logdir` | ✅ `JELLYFIN_LOG_DIR` | ✅ `Paths:LogDir` | ✅ `{data}/log` | | Temp | ✅ `--tempdir` | ✅ `JELLYFIN_TEMP_DIR` | ✅ `Paths:TempDir` | ✅ `{system_temp}/jellyfin` | | Web | ✅ `--webdir` | ✅ `JELLYFIN_WEB_DIR` | ✅ `Paths:WebDir` | ✅ `wwwroot` or `jellyfin-web` | ## 🎉 Result **All startup options are now configurable via file, in addition to command-line and environment variables!** This provides maximum flexibility for all deployment scenarios: - Development - Testing - Staging - Production - Containers - Portable installations - Multiple instances Choose the configuration method that works best for your use case! 🚀