- 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.
6.3 KiB
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