- Created `TV_SHOWS_SQL_QUERY_PATTERNS.md` to document SQL query patterns for TV shows, including performance issues and missing indexes. - Added `README.md` for Linux package building, detailing steps for creating Debian and Red Hat packages. - Implemented build scripts for Debian and Red Hat, including service files and post-installation hooks. - Added necessary scripts for managing Jellyfin service lifecycle on both Debian and Red Hat systems. - Included package specifications and installation instructions for both distributions.
Linux Package Building
This directory contains scripts and templates for building Jellyfin Linux packages for both Debian and Red Hat-based distributions.
Quick Start
Build Both Packages
cd /home/wjones/projects/pgsql-jellyfin
chmod +x build-linux-packages.sh
./build-linux-packages.sh
Packages will be created in build/packages/.
Build Specific Distribution
# Debian only
./build-linux-packages.sh --deb-only
# Red Hat only
./build-linux-packages.sh --rpm-only
# Specific version
./build-linux-packages.sh --version 11.0.0
Directory Structure
scripts/
├── build-linux-packages.sh # Main automated build script
├── jellyfin.spec # Red Hat SPEC file template
├── debian/
│ ├── postinst.sh # Post-install hook (Debian)
│ ├── prerm.sh # Pre-remove hook (Debian)
│ ├── postrm.sh # Post-remove hook (Debian)
│ └── jellyfin.service # Systemd service file (Debian)
└── redhat/
├── post.sh # Post-install hook (Red Hat)
├── preun.sh # Pre-uninstall hook (Red Hat)
├── postun.sh # Post-uninstall hook (Red Hat)
└── jellyfin.service # Systemd service file (Red Hat)
Prerequisites
All Systems
- .NET SDK (for publishing the application)
fpm(Effing Package Manager) for cross-distribution building
Install FPM
Debian/Ubuntu:
sudo apt-get install ruby-dev
sudo gem install fpm
Red Hat/CentOS/Fedora:
sudo dnf install ruby-devel
sudo gem install fpm
Package Specifications
Publishing Parameters
Both distributions use identical .NET publishing parameters:
- Runtime:
linux-x64(64-bit Linux) - Configuration:
Release(optimized build) - Self-contained:
true(includes .NET runtime) - Output location:
/opt/jellyfin(standard FHS compliant)
Package Details
| Component | Debian | Red Hat |
|---|---|---|
| Extension | .deb |
.rpm |
| Install command | dpkg -i / apt install |
dnf install |
| Application dir | /opt/jellyfin |
/opt/jellyfin |
| Config dir | /etc/jellyfin |
/etc/jellyfin |
| Data dir | /var/lib/jellyfin |
/var/lib/jellyfin |
| Log dir | /var/log/jellyfin |
/var/log/jellyfin |
| Service file | /etc/systemd/system/ |
/etc/systemd/system/ |
| User | jellyfin (system user) |
jellyfin (system user) |
Installation
Debian
# Install package
sudo dpkg -i jellyfin-11.0.0-amd64.deb
sudo apt-get install -f # Fix dependencies if needed
# Start service
sudo systemctl start jellyfin
sudo systemctl status jellyfin
# View logs
sudo journalctl -u jellyfin -f
Red Hat
# Install package
sudo dnf install jellyfin-11.0.0-1.x86_64.rpm
# Start service
sudo systemctl start jellyfin
sudo systemctl status jellyfin
# View logs
sudo journalctl -u jellyfin -f
Verification
Inspect Package Contents
Debian:
dpkg -c jellyfin-11.0.0-amd64.deb
Red Hat:
rpm -qpl jellyfin-11.0.0-1.x86_64.rpm
Test Install/Remove Cycle
# Install
sudo dpkg -i jellyfin-11.0.0-amd64.deb # or dnf install for Red Hat
# Verify
sudo systemctl status jellyfin
# Remove
sudo dpkg -r jellyfin # or dnf remove for Red Hat
Build Details
What the Build Script Does
- Checks prerequisites - Ensures .NET SDK and fpm are available
- Restores dependencies -
dotnet restore Jellyfin.sln -r linux-x64 - Builds solution -
dotnet build Jellyfin.sln --configuration Release - Publishes application - Creates self-contained linux-x64 binary
- Generates Debian package - Creates
.debwith hooks and metadata - Generates Red Hat package - Creates
.rpmwith hooks and metadata - Reports completion - Displays package paths and sizes
Build Artifacts
Output location: <project-root>/build/packages/
jellyfin-11.0.0-amd64.deb- Debian packagejellyfin-11.0.0-1.x86_64.rpm- Red Hat package
Hooks and Lifecycle
Both packages include installation and removal hooks:
Installation
- Creates
jellyfinsystem user if not exists - Creates required directories (lib, log, cache)
- Sets proper ownership and permissions
- Enables and optionally starts systemd service
Removal
- Stops systemd service
- Disables service from auto-start
- Removes
jellyfinuser and group
Service Configuration
The included jellyfin.service file provides:
- Auto-restart on failure (5s delay)
- Resource limits (4GB max memory, 65k file descriptors)
- Proper logging (journald integration)
- Directory configuration:
--datadir=/var/lib/jellyfin(configuration and metadata)--logdir=/var/log/jellyfin(application logs)--cachedir=/var/cache/jellyfin(temporary cache)
Customization
Change Version
Edit SharedVersion.cs or use build script flag:
./build-linux-packages.sh --version 12.0.0
Modify Dependencies
Edit install scripts or update FPM dependencies in build-linux-packages.sh:
--depends "libssl3" \
--depends "libicu72" \
Add Custom Hooks
Edit the respective hook scripts in debian/ or redhat/ directories.
Documentation
For detailed information about the build process, see:
- LINUX_PACKAGE_BUILD_GUIDE.md - Complete guide with examples
Troubleshooting
FPM not found
# Debian/Ubuntu
sudo apt-get install ruby-dev && sudo gem install fpm
# Red Hat/CentOS
sudo dnf install ruby-devel && sudo gem install fpm
Missing dependencies during install
For Debian, run:
sudo apt-get install -f
For Red Hat, the package manager will automatically resolve.
Permission denied when running script
chmod +x build-linux-packages.sh
Check build details
Edit build-linux-packages.sh and remove > /dev/null 2>&1 to see verbose output.
Related Files
- Build Script:
build-linux-packages.sh - SPEC Template:
scripts/jellyfin.spec - Debian Hooks:
scripts/debian/{postinst,prerm,postrm}.sh - Red Hat Hooks:
scripts/redhat/{post,preun,postun}.sh - Service Files: Both distributions in
scripts/{debian,redhat}/jellyfin.service - Complete Guide:
docs/LINUX_PACKAGE_BUILD_GUIDE.md