Centralize build output and generate OS-specific startup.json
- 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
This commit is contained in:
@@ -0,0 +1,356 @@
|
||||
# Jellyfin Path Configuration Guide
|
||||
|
||||
## Overview
|
||||
All major paths in Jellyfin are now fully configurable through **three methods**: configuration file, command-line options, or environment variables. This allows you to customize where Jellyfin stores its data, logs, cache, configuration, and temporary files.
|
||||
|
||||
## Configuration Methods
|
||||
|
||||
Jellyfin supports three ways to configure paths (in priority order):
|
||||
|
||||
### 1. Configuration File (NEW!)
|
||||
Create a `startup.json` file with your path configurations. See [FILE_BASED_STARTUP_CONFIG.md](FILE_BASED_STARTUP_CONFIG.md) for details.
|
||||
|
||||
**Example:**
|
||||
```json
|
||||
{
|
||||
"Paths": {
|
||||
"DataDir": "/var/lib/jellyfin",
|
||||
"ConfigDir": "/etc/jellyfin",
|
||||
"CacheDir": "/var/cache/jellyfin",
|
||||
"LogDir": "/var/log/jellyfin",
|
||||
"TempDir": "/var/tmp/jellyfin"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Command-Line Options
|
||||
Pass options when starting Jellyfin.
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
jellyfin --datadir /var/lib/jellyfin --logdir /var/log/jellyfin
|
||||
```
|
||||
|
||||
### 3. Environment Variables
|
||||
Set environment variables in your shell or systemd service.
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
export JELLYFIN_DATA_DIR=/var/lib/jellyfin
|
||||
export JELLYFIN_LOG_DIR=/var/log/jellyfin
|
||||
```
|
||||
|
||||
## Priority Order
|
||||
|
||||
When a path is configured in multiple places, Jellyfin uses this priority (highest to lowest):
|
||||
|
||||
1. **Command-line options** (highest priority)
|
||||
2. **Environment variables**
|
||||
3. **Configuration file** (`startup.json`)
|
||||
4. **Default values** (lowest priority)
|
||||
|
||||
This allows you to:
|
||||
- Set defaults in a configuration file
|
||||
- Override system-wide with environment variables
|
||||
- Override temporarily with command-line options
|
||||
|
||||
## Available Path Configurations
|
||||
|
||||
### 1. Program Data Directory (Database Files)
|
||||
**Purpose**: Main directory for database files and application data
|
||||
|
||||
- **Configuration File**: `Paths:DataDir` in `startup.json`
|
||||
- **Command Line**: `-d, --datadir <path>`
|
||||
- **Environment Variable**: `JELLYFIN_DATA_DIR`
|
||||
- **Default**:
|
||||
- Windows: `%LocalAppData%\jellyfin`
|
||||
- Linux/Unix: `$XDG_DATA_HOME/jellyfin` or `~/.local/share/jellyfin`
|
||||
- macOS: `~/Library/Application Support/jellyfin`
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Configuration file (startup.json)
|
||||
{
|
||||
"Paths": {
|
||||
"DataDir": "/var/lib/jellyfin"
|
||||
}
|
||||
}
|
||||
|
||||
# Command line
|
||||
jellyfin --datadir /var/lib/jellyfin
|
||||
|
||||
# Environment variable
|
||||
export JELLYFIN_DATA_DIR=/var/lib/jellyfin
|
||||
```
|
||||
|
||||
### 2. Configuration Directory
|
||||
**Purpose**: User settings, pictures, and configuration files
|
||||
|
||||
- **Configuration File**: `Paths:ConfigDir` in `startup.json`
|
||||
- **Command Line**: `-c, --configdir <path>`
|
||||
- **Environment Variable**: `JELLYFIN_CONFIG_DIR`
|
||||
- **Default**:
|
||||
- Windows/macOS: `{datadir}/config`
|
||||
- Linux/Unix: `$XDG_CONFIG_HOME/jellyfin` or `~/.config/jellyfin`
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Configuration file
|
||||
{
|
||||
"Paths": {
|
||||
"ConfigDir": "/etc/jellyfin"
|
||||
}
|
||||
}
|
||||
|
||||
# Command line
|
||||
jellyfin --configdir /etc/jellyfin
|
||||
|
||||
# Environment variable
|
||||
export JELLYFIN_CONFIG_DIR=/etc/jellyfin
|
||||
```
|
||||
|
||||
### 3. Cache Directory
|
||||
**Purpose**: Image cache, metadata cache, and other temporary cached data
|
||||
|
||||
- **Configuration File**: `Paths:CacheDir` in `startup.json`
|
||||
- **Command Line**: `-C, --cachedir <path>`
|
||||
- **Environment Variable**: `JELLYFIN_CACHE_DIR`
|
||||
- **Default**:
|
||||
- Windows/macOS: `{datadir}/cache`
|
||||
- Linux/Unix: `$XDG_CACHE_HOME/jellyfin` or `~/.cache/jellyfin`
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Configuration file
|
||||
{
|
||||
"Paths": {
|
||||
"CacheDir": "/var/cache/jellyfin"
|
||||
}
|
||||
}
|
||||
|
||||
# Command line
|
||||
jellyfin --cachedir /var/cache/jellyfin
|
||||
|
||||
# Environment variable
|
||||
export JELLYFIN_CACHE_DIR=/var/cache/jellyfin
|
||||
```
|
||||
|
||||
### 4. Log Directory
|
||||
**Purpose**: Application log files
|
||||
|
||||
- **Configuration File**: `Paths:LogDir` in `startup.json`
|
||||
- **Command Line**: `-l, --logdir <path>`
|
||||
- **Environment Variable**: `JELLYFIN_LOG_DIR`
|
||||
- **Default**: `{datadir}/log`
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Configuration file
|
||||
{
|
||||
"Paths": {
|
||||
"LogDir": "/var/log/jellyfin"
|
||||
}
|
||||
}
|
||||
|
||||
# Command line
|
||||
jellyfin --logdir /var/log/jellyfin
|
||||
|
||||
# Environment variable
|
||||
export JELLYFIN_LOG_DIR=/var/log/jellyfin
|
||||
```
|
||||
|
||||
### 5. Temp Directory ⭐ NEW
|
||||
**Purpose**: Temporary files created during transcoding and other operations
|
||||
|
||||
- **Configuration File**: `Paths:TempDir` in `startup.json`
|
||||
- **Command Line**: `-t, --tempdir <path>`
|
||||
- **Environment Variable**: `JELLYFIN_TEMP_DIR`
|
||||
- **Default**: `{system_temp}/jellyfin` (e.g., `/tmp/jellyfin` on Linux)
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Configuration file
|
||||
{
|
||||
"Paths": {
|
||||
"TempDir": "/var/tmp/jellyfin"
|
||||
}
|
||||
}
|
||||
|
||||
# Command line
|
||||
jellyfin --tempdir /var/tmp/jellyfin
|
||||
|
||||
# Environment variable
|
||||
export JELLYFIN_TEMP_DIR=/var/tmp/jellyfin
|
||||
```
|
||||
|
||||
### 6. Web Client Directory
|
||||
**Purpose**: Location of the Jellyfin web client files
|
||||
|
||||
- **Configuration File**: `Paths:WebDir` in `startup.json`
|
||||
- **Command Line**: `-w, --webdir <path>`
|
||||
- **Environment Variable**: `JELLYFIN_WEB_DIR`
|
||||
- **Default**:
|
||||
1. Searches for `wwwroot` folder in solution root (development)
|
||||
2. Falls back to `{appdir}/jellyfin-web`
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Configuration file
|
||||
{
|
||||
"Paths": {
|
||||
"WebDir": "/usr/share/jellyfin/web"
|
||||
}
|
||||
}
|
||||
|
||||
# Command line
|
||||
jellyfin --webdir /usr/share/jellyfin/web
|
||||
|
||||
# Environment variable
|
||||
export JELLYFIN_WEB_DIR=/usr/share/jellyfin/web
|
||||
```
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Using Command Line Options
|
||||
```bash
|
||||
# Windows
|
||||
jellyfin.exe --datadir "C:\ProgramData\Jellyfin" --logdir "C:\Logs\Jellyfin" --tempdir "D:\Temp\Jellyfin"
|
||||
|
||||
# Linux
|
||||
jellyfin --datadir /var/lib/jellyfin --logdir /var/log/jellyfin --tempdir /var/tmp/jellyfin --cachedir /var/cache/jellyfin
|
||||
```
|
||||
|
||||
### Using Environment Variables
|
||||
```bash
|
||||
# Linux/macOS - Add to ~/.bashrc or /etc/environment
|
||||
export JELLYFIN_DATA_DIR=/var/lib/jellyfin
|
||||
export JELLYFIN_CONFIG_DIR=/etc/jellyfin
|
||||
export JELLYFIN_CACHE_DIR=/var/cache/jellyfin
|
||||
export JELLYFIN_LOG_DIR=/var/log/jellyfin
|
||||
export JELLYFIN_TEMP_DIR=/var/tmp/jellyfin
|
||||
export JELLYFIN_WEB_DIR=/usr/share/jellyfin/web
|
||||
|
||||
# Windows - Set in PowerShell or System Properties
|
||||
$env:JELLYFIN_DATA_DIR="C:\ProgramData\Jellyfin"
|
||||
$env:JELLYFIN_LOG_DIR="C:\Logs\Jellyfin"
|
||||
$env:JELLYFIN_TEMP_DIR="D:\Temp\Jellyfin"
|
||||
```
|
||||
|
||||
### Systemd Service (Linux)
|
||||
Create or edit `/etc/systemd/system/jellyfin.service`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Jellyfin Media Server
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=jellyfin
|
||||
Group=jellyfin
|
||||
Environment="JELLYFIN_DATA_DIR=/var/lib/jellyfin"
|
||||
Environment="JELLYFIN_CONFIG_DIR=/etc/jellyfin"
|
||||
Environment="JELLYFIN_CACHE_DIR=/var/cache/jellyfin"
|
||||
Environment="JELLYFIN_LOG_DIR=/var/log/jellyfin"
|
||||
Environment="JELLYFIN_TEMP_DIR=/var/tmp/jellyfin"
|
||||
Environment="JELLYFIN_WEB_DIR=/usr/share/jellyfin/web"
|
||||
ExecStart=/usr/bin/jellyfin
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
## Priority Order
|
||||
|
||||
When determining which path to use, Jellyfin follows this priority:
|
||||
|
||||
1. **Command-line option** (highest priority)
|
||||
2. **Environment variable**
|
||||
3. **Default value** (lowest priority)
|
||||
|
||||
This allows you to:
|
||||
- Set system-wide defaults via environment variables
|
||||
- Override on a per-run basis with command-line options
|
||||
- Fall back to sensible defaults if nothing is specified
|
||||
|
||||
## Directory Permissions
|
||||
|
||||
Ensure the user running Jellyfin has appropriate permissions:
|
||||
|
||||
```bash
|
||||
# Linux example - create directories and set permissions
|
||||
sudo mkdir -p /var/lib/jellyfin /etc/jellyfin /var/cache/jellyfin /var/log/jellyfin /var/tmp/jellyfin
|
||||
sudo chown -R jellyfin:jellyfin /var/lib/jellyfin /etc/jellyfin /var/cache/jellyfin /var/log/jellyfin /var/tmp/jellyfin
|
||||
sudo chmod 755 /var/lib/jellyfin /etc/jellyfin /var/cache/jellyfin /var/log/jellyfin /var/tmp/jellyfin
|
||||
```
|
||||
|
||||
## Benefits
|
||||
|
||||
### Performance
|
||||
- Place temp directory on fast storage (SSD/NVMe) for transcoding performance
|
||||
- Put cache on separate disk to reduce I/O contention
|
||||
- Use different mount points for logs vs data
|
||||
|
||||
### Storage Management
|
||||
- Separate data across different partitions/disks
|
||||
- Use network storage for backups while keeping temp on local fast storage
|
||||
- Easier to manage disk space quotas
|
||||
|
||||
### Security
|
||||
- Follow OS security best practices (e.g., `/var` hierarchy on Linux)
|
||||
- Set appropriate permissions per directory type
|
||||
- Separate user data from system configuration
|
||||
|
||||
### Containerization
|
||||
- Map volumes to specific paths
|
||||
- Follow container best practices (ephemeral temp, persistent data)
|
||||
- Easier Docker/Podman volume mounting
|
||||
|
||||
### Backup & Maintenance
|
||||
- Backup only important directories (data, config) and skip cache/temp
|
||||
- Easier to exclude temporary files from backups
|
||||
- Simplified cleanup of cache and temp directories
|
||||
|
||||
## Docker Example
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
jellyfin:
|
||||
image: jellyfin/jellyfin:latest
|
||||
environment:
|
||||
- JELLYFIN_DATA_DIR=/data
|
||||
- JELLYFIN_CONFIG_DIR=/config
|
||||
- JELLYFIN_CACHE_DIR=/cache
|
||||
- JELLYFIN_LOG_DIR=/log
|
||||
- JELLYFIN_TEMP_DIR=/temp
|
||||
volumes:
|
||||
- /host/jellyfin/data:/data
|
||||
- /host/jellyfin/config:/config
|
||||
- /host/jellyfin/cache:/cache
|
||||
- /host/jellyfin/log:/log
|
||||
- /fast-storage/jellyfin/temp:/temp
|
||||
ports:
|
||||
- "8096:8096"
|
||||
```
|
||||
|
||||
## Verification
|
||||
|
||||
After starting Jellyfin, check the logs to verify paths are set correctly:
|
||||
|
||||
```
|
||||
[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
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- All paths are created automatically if they don't exist (permissions allowing)
|
||||
- Paths are normalized to absolute paths internally
|
||||
- Relative paths are resolved from the current working directory
|
||||
- Changes require a restart to take effect
|
||||
- Command-line help: `jellyfin --help`
|
||||
Reference in New Issue
Block a user