# 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 ```bash 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 ```bash # 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:** ```bash sudo apt-get install ruby-dev sudo gem install fpm ``` **Red Hat/CentOS/Fedora:** ```bash 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 ```bash # 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 ```bash # 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:** ```bash dpkg -c jellyfin-11.0.0-amd64.deb ``` **Red Hat:** ```bash rpm -qpl jellyfin-11.0.0-1.x86_64.rpm ``` ### Test Install/Remove Cycle ```bash # 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 1. **Checks prerequisites** - Ensures .NET SDK and fpm are available 2. **Restores dependencies** - `dotnet restore Jellyfin.sln -r linux-x64` 3. **Builds solution** - `dotnet build Jellyfin.sln --configuration Release` 4. **Publishes application** - Creates self-contained linux-x64 binary 5. **Generates Debian package** - Creates `.deb` with hooks and metadata 6. **Generates Red Hat package** - Creates `.rpm` with hooks and metadata 7. **Reports completion** - Displays package paths and sizes ### Build Artifacts Output location: `/build/packages/` - `jellyfin-11.0.0-amd64.deb` - Debian package - `jellyfin-11.0.0-1.x86_64.rpm` - Red Hat package ## Hooks and Lifecycle Both packages include installation and removal hooks: ### Installation - Creates `jellyfin` system 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 `jellyfin` user 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: ```bash ./build-linux-packages.sh --version 12.0.0 ``` ### Modify Dependencies Edit install scripts or update FPM dependencies in `build-linux-packages.sh`: ```bash --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](../docs/LINUX_PACKAGE_BUILD_GUIDE.md) - Complete guide with examples ## Troubleshooting ### FPM not found ```bash # 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: ```bash sudo apt-get install -f ``` For Red Hat, the package manager will automatically resolve. ### Permission denied when running script ```bash 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`