#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' echo "============================================================" echo "[INFO] Installing Jellyfin on Arch Linux (native, no Docker)" echo "============================================================" # Require root or sudo if [[ "${EUID}" -ne 0 ]]; then SUDO="sudo" else SUDO="" fi echo "============================================================" echo "[INFO] Updating package database and system" echo "============================================================" $SUDO pacman -Syu --noconfirm echo "============================================================" echo "[INFO] Installing Jellyfin packages" echo "============================================================" $SUDO pacman -S --noconfirm jellyfin-server jellyfin-web jellyfin-ffmpeg echo "============================================================" echo "[INFO] Creating media directories" echo "============================================================" $SUDO mkdir -p /srv/media/movies $SUDO mkdir -p /srv/media/tv $SUDO mkdir -p /srv/media/music $SUDO mkdir -p /srv/jellyfin/cache $SUDO mkdir -p /srv/jellyfin/config echo "============================================================" echo "[INFO] Setting ownership" echo "============================================================" $SUDO chown -R jellyfin:jellyfin /srv/media $SUDO chown -R jellyfin:jellyfin /srv/jellyfin echo "============================================================" echo "[INFO] Creating systemd override for Jellyfin paths" echo "============================================================" $SUDO mkdir -p /etc/systemd/system/jellyfin.service.d $SUDO tee /etc/systemd/system/jellyfin.service.d/override.conf > /dev/null <<'EOF' [Service] Environment="JELLYFIN_DATA_DIR=/srv/jellyfin/config" Environment="JELLYFIN_CACHE_DIR=/srv/jellyfin/cache" EOF echo "============================================================" echo "[INFO] Reloading systemd and enabling Jellyfin" echo "============================================================" $SUDO systemctl daemon-reload $SUDO systemctl enable --now jellyfin echo "============================================================" echo "[INFO] Opening firewall ports if UFW is installed" echo "============================================================" if command -v ufw >/dev/null 2>&1; then $SUDO ufw allow 8096/tcp $SUDO ufw allow 8920/tcp $SUDO ufw reload fi echo "============================================================" echo "[INFO] Checking Jellyfin service status" echo "============================================================" $SUDO systemctl --no-pager --full status jellyfin || true IP="$(hostname -I 2>/dev/null | awk '{print $1}')" echo "============================================================" echo "[SUCCESS] Jellyfin installation complete" echo "============================================================" if [[ -n "${IP:-}" ]]; then echo "Open Jellyfin at:" echo " http://${IP}:8096" else echo "Open Jellyfin at:" echo " http://YOUR_SERVER_IP:8096" fi echo echo "Media directories:" echo " /srv/media/movies" echo " /srv/media/tv" echo " /srv/media/music" echo echo "Jellyfin config/cache:" echo " /srv/jellyfin/config" echo " /srv/jellyfin/cache" echo echo "Useful commands:" echo " systemctl status jellyfin" echo " journalctl -u jellyfin -e --no-pager"