aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--debian/changelog.j25
-rw-r--r--debian/compat1
-rw-r--r--debian/conf/jellyfin53
-rw-r--r--debian/conf/jellyfin.service.conf55
-rw-r--r--debian/conf/logging.json30
-rw-r--r--debian/conffiles.jellyfin-server0
-rw-r--r--debian/conffiles.jellyfin-web1
-rw-r--r--debian/control28
-rw-r--r--debian/copyright49
-rw-r--r--debian/gbp.conf6
-rw-r--r--debian/install.jellyfin-server4
-rw-r--r--debian/install.jellyfin-web1
-rw-r--r--debian/jellyfin.init62
-rw-r--r--debian/jellyfin.service17
-rw-r--r--debian/jellyfin.upstart20
-rw-r--r--debian/po/POTFILES.in1
-rw-r--r--debian/po/templates.pot57
-rw-r--r--debian/postinst.jellyfin-server102
-rw-r--r--debian/postrm.jellyfin-server81
-rw-r--r--debian/preinst.jellyfin-server78
-rw-r--r--debian/prerm.jellyfin-server61
-rwxr-xr-xdebian/rules57
-rw-r--r--debian/source/format1
-rw-r--r--debian/source/options7
25 files changed, 779 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5eb1c75
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+build/
+debian/changelog
diff --git a/debian/changelog.j2 b/debian/changelog.j2
new file mode 100644
index 0000000..5cf4c80
--- /dev/null
+++ b/debian/changelog.j2
@@ -0,0 +1,5 @@
+jellyfin ({package_version}-{package_build}) unstable; urgency=medium
+
+ * {release_comment}
+
+ -- Jellyfin Packaging Team <packaging@jellyfin.org> {release_date}
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..f599e28
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+10
diff --git a/debian/conf/jellyfin b/debian/conf/jellyfin
new file mode 100644
index 0000000..af460fe
--- /dev/null
+++ b/debian/conf/jellyfin
@@ -0,0 +1,53 @@
+# Jellyfin default configuration options
+# This is a POSIX shell fragment
+
+# Use this file to override the default configurations; add additional
+# options with JELLYFIN_ADD_OPTS.
+
+# Under systemd, use
+# /etc/systemd/system/jellyfin.service.d/jellyfin.service.conf
+# to override the user or this config file's location.
+
+#
+# General options
+#
+
+# Program directories
+JELLYFIN_DATA_DIR="/var/lib/jellyfin"
+JELLYFIN_CONFIG_DIR="/etc/jellyfin"
+JELLYFIN_LOG_DIR="/var/log/jellyfin"
+JELLYFIN_CACHE_DIR="/var/cache/jellyfin"
+
+# web client path, installed by the jellyfin-web package
+JELLYFIN_WEB_OPT="--webdir=/usr/share/jellyfin/web"
+
+# ffmpeg binary paths, overriding the system values
+JELLYFIN_FFMPEG_OPT="--ffmpeg=/usr/lib/jellyfin-ffmpeg/ffmpeg"
+
+# Disable glibc dynamic heap adjustment
+MALLOC_TRIM_THRESHOLD_=131072
+
+# [OPTIONAL] run Jellyfin as a headless service
+#JELLYFIN_SERVICE_OPT="--service"
+
+# [OPTIONAL] run Jellyfin without the web app
+#JELLYFIN_NOWEBAPP_OPT="--nowebclient"
+
+# Space to add additional command line options to jellyfin (for help see ~$ jellyfin --help)
+JELLYFIN_ADDITIONAL_OPTS=""
+
+# [OPTIONAL] run Jellyfin with ASP.NET Server Garbage Collection (uses more RAM and less CPU than Workstation GC)
+# 0 = Workstation
+# 1 = Server
+#COMPlus_gcServer=1
+
+#
+# SysV init/Upstart options
+#
+# Note: These options are ignored by systemd; use /etc/systemd/system/jellyfin.d overrides instead.
+#
+
+# Application username
+JELLYFIN_USER="jellyfin"
+# Full application command
+JELLYFIN_ARGS="$JELLYFIN_WEB_OPT $JELLYFIN_FFMPEG_OPT $JELLYFIN_SERVICE_OPT $JELLYFIN_NOWEBAPP_OPT $JELLFIN_ADDITIONAL_OPTS --datadir $JELLYFIN_DATA_DIR --configdir $JELLYFIN_CONFIG_DIR --logdir $JELLYFIN_LOG_DIR --cachedir $JELLYFIN_CACHE_DIR"
diff --git a/debian/conf/jellyfin.service.conf b/debian/conf/jellyfin.service.conf
new file mode 100644
index 0000000..1f92d7d
--- /dev/null
+++ b/debian/conf/jellyfin.service.conf
@@ -0,0 +1,55 @@
+# Jellyfin systemd configuration options
+
+# Use this file to override the user or environment file location.
+
+[Service]
+# Alter the user that Jellyfin runs as
+#User = jellyfin
+
+# Alter where environment variables are sourced from
+#EnvironmentFile = /etc/default/jellyfin
+
+# Service hardening options
+# These were added in PR #6953 to solve issue #6952, but some combination of
+# them causes "restart.sh" functionality to break with the following error:
+# sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the
+# 'nosuid' option set or an NFS file system without root privileges?
+# See issue #7503 for details on the troubleshooting that went into this.
+# Since these were added for NixOS specifically and are above and beyond
+# what 99% of systemd units do, they have been moved here as optional
+# additional flags to set for maximum system security and can be enabled at
+# the administrator's or package maintainer's discretion.
+# Uncomment these only if you know what you're doing, and doing so may cause
+# bugs with in-server Restart and potentially other functionality as well.
+#NoNewPrivileges=true
+#SystemCallArchitectures=native
+#RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK
+#RestrictNamespaces=false
+#RestrictRealtime=true
+#RestrictSUIDSGID=true
+#ProtectControlGroups=false
+#ProtectHostname=true
+#ProtectKernelLogs=false
+#ProtectKernelModules=false
+#ProtectKernelTunables=false
+#LockPersonality=true
+#PrivateTmp=false
+#PrivateDevices=false
+#PrivateUsers=true
+#RemoveIPC=true
+#SystemCallFilter=~@clock
+#SystemCallFilter=~@aio
+#SystemCallFilter=~@chown
+#SystemCallFilter=~@cpu-emulation
+#SystemCallFilter=~@debug
+#SystemCallFilter=~@keyring
+#SystemCallFilter=~@memlock
+#SystemCallFilter=~@module
+#SystemCallFilter=~@mount
+#SystemCallFilter=~@obsolete
+#SystemCallFilter=~@privileged
+#SystemCallFilter=~@raw-io
+#SystemCallFilter=~@reboot
+#SystemCallFilter=~@setuid
+#SystemCallFilter=~@swap
+#SystemCallErrorNumber=EPERM
diff --git a/debian/conf/logging.json b/debian/conf/logging.json
new file mode 100644
index 0000000..f32b208
--- /dev/null
+++ b/debian/conf/logging.json
@@ -0,0 +1,30 @@
+{
+ "Serilog": {
+ "MinimumLevel": "Information",
+ "WriteTo": [
+ {
+ "Name": "Console",
+ "Args": {
+ "outputTemplate": "[{Timestamp:HH:mm:ss}] [{Level:u3}] {Message:lj}{NewLine}{Exception}"
+ }
+ },
+ {
+ "Name": "Async",
+ "Args": {
+ "configure": [
+ {
+ "Name": "File",
+ "Args": {
+ "path": "%JELLYFIN_LOG_DIR%//jellyfin.log",
+ "fileSizeLimitBytes": 10485700,
+ "rollOnFileSizeLimit": true,
+ "retainedFileCountLimit": 10,
+ "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level:u3}] {Message}{NewLine}{Exception}"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+}
diff --git a/debian/conffiles.jellyfin-server b/debian/conffiles.jellyfin-server
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/debian/conffiles.jellyfin-server
diff --git a/debian/conffiles.jellyfin-web b/debian/conffiles.jellyfin-web
new file mode 100644
index 0000000..a4b2c55
--- /dev/null
+++ b/debian/conffiles.jellyfin-web
@@ -0,0 +1 @@
+/usr/share/jellyfin/web/config.json
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..4a05c27
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,28 @@
+Source: jellyfin
+Section: misc
+Priority: optional
+Maintainer: Jellyfin Packaging Team <packaging@jellyfin.org>
+Build-Depends: debhelper (>= 10),
+ dotnet-sdk-8.0,
+ npm | nodejs
+Standards-Version: 3.9.4
+Homepage: https://jellyfin.org
+Vcs-Browser: https://github.com/jellyfin
+
+Package: jellyfin
+Architecture: all
+Depends: jellyfin-server, jellyfin-web, jellyfin-ffmpeg6
+Description: Jellyfin is the Free Software Media System.
+ This metapackage provides the core Jellyfin components from one name.
+
+Package: jellyfin-server
+Architecture: any
+Recommends: jellyfin-web, sudo
+Description: Jellyfin is the Free Software Media System.
+ This package provides the Jellyfin server backend and API.
+
+Package: jellyfin-web
+Architecture: any
+Recommends: jellyfin-server
+Description: Jellyfin is the Free Software Media System.
+ This package provides the Jellyfin web client.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..2c2811d
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,49 @@
+Format: http://dep.debian.net/deps/dep5
+Upstream-Name: jellyfin
+Source: https://github.com/jellyfin
+
+Files: *
+Copyright: 2018-2024 Jellyfin Contributors
+License: GPL-U
+
+Files: debian/*
+Copyright: 2020-2024 Joshua M. Boniface <joshua@boniface.me>
+License: GPL-3.0
+
+License: GPL-U
+ NOTICE: The licensing situation of Jellyfin is complex. This code
+ is considered "GPL unversioned" and resulting binaries are treated
+ as GPL version 3 only for license compatibility reasons.
+ .
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 3 of the License.
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
+
+License: GPL-3.0
+
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
diff --git a/debian/gbp.conf b/debian/gbp.conf
new file mode 100644
index 0000000..60b3d28
--- /dev/null
+++ b/debian/gbp.conf
@@ -0,0 +1,6 @@
+[DEFAULT]
+pristine-tar = False
+cleaner = fakeroot debian/rules clean
+
+[import-orig]
+filter = [ ".git*", ".hg*", ".vs*", ".vscode*" ]
diff --git a/debian/install.jellyfin-server b/debian/install.jellyfin-server
new file mode 100644
index 0000000..05a7852
--- /dev/null
+++ b/debian/install.jellyfin-server
@@ -0,0 +1,4 @@
+build/usr/lib/jellyfin usr/lib/
+debian/conf/jellyfin etc/default/
+debian/conf/logging.json etc/jellyfin/
+debian/conf/jellyfin.service.conf etc/systemd/system/jellyfin.service.d/
diff --git a/debian/install.jellyfin-web b/debian/install.jellyfin-web
new file mode 100644
index 0000000..b393bf3
--- /dev/null
+++ b/debian/install.jellyfin-web
@@ -0,0 +1 @@
+build/web usr/share/jellyfin/
diff --git a/debian/jellyfin.init b/debian/jellyfin.init
new file mode 100644
index 0000000..784536d
--- /dev/null
+++ b/debian/jellyfin.init
@@ -0,0 +1,62 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: Jellyfin Media Server
+# Required-Start: $local_fs $network
+# Required-Stop: $local_fs
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Jellyfin Media Server
+# Description: Runs Jellyfin Server
+### END INIT INFO
+
+set -e
+
+# Carry out specific functions when asked to by the system
+
+if test -f /etc/default/jellyfin; then
+ . /etc/default/jellyfin
+fi
+
+. /lib/lsb/init-functions
+
+PIDFILE="/run/jellyfin.pid"
+
+case "$1" in
+ start)
+ log_daemon_msg "Starting Jellyfin Media Server" "jellyfin" || true
+
+ if start-stop-daemon --start --quiet --oknodo --background --pidfile $PIDFILE --make-pidfile --user $JELLYFIN_USER --chuid $JELLYFIN_USER --exec /usr/bin/jellyfin -- $JELLYFIN_ARGS; then
+ log_end_msg 0 || true
+ else
+ log_end_msg 1 || true
+ fi
+ ;;
+
+ stop)
+ log_daemon_msg "Stopping Jellyfin Media Server" "jellyfin" || true
+ if start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE --remove-pidfile; then
+ log_end_msg 0 || true
+ else
+ log_end_msg 1 || true
+ fi
+ ;;
+
+ restart)
+ log_daemon_msg "Restarting Jellyfin Media Server" "jellyfin" || true
+ start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE --remove-pidfile
+ if start-stop-daemon --start --quiet --oknodo --background --pidfile $PIDFILE --make-pidfile --user $JELLYFIN_USER --chuid $JELLYFIN_USER --exec /usr/bin/jellyfin -- $JELLYFIN_ARGS; then
+ log_end_msg 0 || true
+ else
+ log_end_msg 1 || true
+ fi
+ ;;
+
+ status)
+ status_of_proc -p $PIDFILE /usr/bin/jellyfin jellyfin && exit 0 || exit $?
+ ;;
+
+ *)
+ echo "Usage: $0 {start|stop|restart|status}"
+ exit 1
+ ;;
+esac
diff --git a/debian/jellyfin.service b/debian/jellyfin.service
new file mode 100644
index 0000000..2cc49f7
--- /dev/null
+++ b/debian/jellyfin.service
@@ -0,0 +1,17 @@
+[Unit]
+Description = Jellyfin Media Server
+After = network-online.target
+
+[Service]
+Type = simple
+EnvironmentFile = /etc/default/jellyfin
+User = jellyfin
+Group = jellyfin
+WorkingDirectory = /var/lib/jellyfin
+ExecStart = /usr/bin/jellyfin $JELLYFIN_WEB_OPT $JELLYFIN_FFMPEG_OPT $JELLYFIN_SERVICE_OPT $JELLYFIN_NOWEBAPP_OPT $JELLYFIN_ADDITIONAL_OPTS
+Restart = on-failure
+TimeoutSec = 15
+SuccessExitStatus=0 143
+
+[Install]
+WantedBy = multi-user.target
diff --git a/debian/jellyfin.upstart b/debian/jellyfin.upstart
new file mode 100644
index 0000000..ef5bc9b
--- /dev/null
+++ b/debian/jellyfin.upstart
@@ -0,0 +1,20 @@
+description "jellyfin daemon"
+
+start on (local-filesystems and net-device-up IFACE!=lo)
+stop on runlevel [!2345]
+
+console log
+respawn
+respawn limit 10 5
+
+kill timeout 20
+
+script
+ set -x
+ echo "Starting $UPSTART_JOB"
+
+ # Log file
+ logger -t "$0" "DEBUG: `set`"
+ . /etc/default/jellyfin
+ exec su -u $JELLYFIN_USER -c /usr/bin/jellyfin $JELLYFIN_ARGS
+end script
diff --git a/debian/po/POTFILES.in b/debian/po/POTFILES.in
new file mode 100644
index 0000000..cef83a3
--- /dev/null
+++ b/debian/po/POTFILES.in
@@ -0,0 +1 @@
+[type: gettext/rfc822deb] templates
diff --git a/debian/po/templates.pot b/debian/po/templates.pot
new file mode 100644
index 0000000..2cdcae4
--- /dev/null
+++ b/debian/po/templates.pot
@@ -0,0 +1,57 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: jellyfin-server\n"
+"Report-Msgid-Bugs-To: jellyfin-server@packages.debian.org\n"
+"POT-Creation-Date: 2015-06-12 20:51-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: note
+#. Description
+#: ../templates:1001
+msgid "Jellyfin permission info:"
+msgstr ""
+
+#. Type: note
+#. Description
+#: ../templates:1001
+msgid ""
+"Jellyfin by default runs under a user named \"jellyfin\". Please ensure that the "
+"user jellyfin has read and write access to any folders you wish to add to your "
+"library. Otherwise please run jellyfin under a different user."
+msgstr ""
+
+#. Type: string
+#. Description
+#: ../templates:2001
+msgid "Username to run Jellyfin as:"
+msgstr ""
+
+#. Type: string
+#. Description
+#: ../templates:2001
+msgid "The user that jellyfin will run as."
+msgstr ""
+
+#. Type: note
+#. Description
+#: ../templates:3001
+msgid "Jellyfin still running"
+msgstr ""
+
+#. Type: note
+#. Description
+#: ../templates:3001
+msgid "Jellyfin is currently running. Please close it and try again."
+msgstr ""
diff --git a/debian/postinst.jellyfin-server b/debian/postinst.jellyfin-server
new file mode 100644
index 0000000..947959a
--- /dev/null
+++ b/debian/postinst.jellyfin-server
@@ -0,0 +1,102 @@
+#!/bin/bash
+set -e
+
+NAME=jellyfin
+DEFAULT_FILE=/etc/default/${NAME}
+
+# Source Jellyfin default configuration
+if [[ -f $DEFAULT_FILE ]]; then
+ . $DEFAULT_FILE
+fi
+
+JELLYFIN_USER=${JELLYFIN_USER:-jellyfin}
+RENDER_GROUP=${RENDER_GROUP:-render}
+VIDEO_GROUP=${VIDEO_GROUP:-video}
+
+# Data directories for program data (cache, db), configs, and logs
+PROGRAMDATA=${JELLYFIN_DATA_DIRECTORY-/var/lib/$NAME}
+CONFIGDATA=${JELLYFIN_CONFIG_DIRECTORY-/etc/$NAME}
+LOGDATA=${JELLYFIN_LOG_DIRECTORY-/var/log/$NAME}
+CACHEDATA=${JELLYFIN_CACHE_DIRECTORY-/var/cache/$NAME}
+
+case "$1" in
+ configure)
+ # create jellyfin group if it does not exist
+ if [[ -z "$(getent group ${JELLYFIN_USER})" ]]; then
+ addgroup --quiet --system ${JELLYFIN_USER} > /dev/null 2>&1
+ fi
+ # create jellyfin user if it does not exist
+ if [[ -z "$(getent passwd ${JELLYFIN_USER})" ]]; then
+ adduser --system --ingroup ${JELLYFIN_USER} --shell /bin/false ${JELLYFIN_USER} --no-create-home --home ${PROGRAMDATA} \
+ --gecos "Jellyfin default user" > /dev/null 2>&1
+ fi
+ # add jellyfin to the render group for hwa
+ if [[ ! -z "$(getent group ${RENDER_GROUP})" ]]; then
+ usermod -aG ${RENDER_GROUP} ${JELLYFIN_USER} > /dev/null 2>&1
+ fi
+ # add jellyfin to the video group for hwa
+ if [[ ! -z "$(getent group ${VIDEO_GROUP})" ]]; then
+ usermod -aG ${VIDEO_GROUP} ${JELLYFIN_USER} > /dev/null 2>&1
+ fi
+ # ensure $PROGRAMDATA exists
+ if [[ ! -d $PROGRAMDATA ]]; then
+ mkdir $PROGRAMDATA
+ fi
+ # ensure $CONFIGDATA exists
+ if [[ ! -d $CONFIGDATA ]]; then
+ mkdir $CONFIGDATA
+ fi
+ # ensure $LOGDATA exists
+ if [[ ! -d $LOGDATA ]]; then
+ mkdir $LOGDATA
+ fi
+ # ensure $CACHEDATA exists
+ if [[ ! -d $CACHEDATA ]]; then
+ mkdir $CACHEDATA
+ fi
+ # Ensure permissions are correct on all config directories
+ chown -R ${JELLYFIN_USER} $PROGRAMDATA $CONFIGDATA $LOGDATA $CACHEDATA
+ chgrp adm $PROGRAMDATA $CONFIGDATA $LOGDATA $CACHEDATA
+ chmod 0750 $PROGRAMDATA $CONFIGDATA $LOGDATA $CACHEDATA
+
+ # Install jellyfin symlink into /usr/bin
+ ln -sf /usr/lib/jellyfin/bin/jellyfin /usr/bin/jellyfin
+
+ ;;
+ abort-upgrade|abort-remove|abort-deconfigure)
+ ;;
+ *)
+ echo "postinst called with unknown argument \`$1'" >&2
+ exit 1
+ ;;
+esac
+
+#DEBHELPER
+
+if [[ -x "/usr/bin/deb-systemd-helper" ]]; then
+ # Manual init script handling
+ deb-systemd-helper unmask jellyfin.service >/dev/null || true
+ # was-enabled defaults to true, so new installations run enable.
+ if deb-systemd-helper --quiet was-enabled jellyfin.service; then
+ # Enables the unit on first installation, creates new
+ # symlinks on upgrades if the unit file has changed.
+ deb-systemd-helper enable jellyfin.service >/dev/null || true
+ else
+ # Update the statefile to add new symlinks (if any), which need to be
+ # cleaned up on purge. Also remove old symlinks.
+ deb-systemd-helper update-state jellyfin.service >/dev/null || true
+ fi
+fi
+
+# End automatically added section
+# Automatically added by dh_installinit
+if [[ "$1" == "configure" ]] || [[ "$1" == "abort-upgrade" ]]; then
+ if [[ -d "/run/systemd/system" ]]; then
+ systemctl --system daemon-reload >/dev/null || true
+ deb-systemd-invoke start jellyfin >/dev/null || true
+ elif [[ -x "/etc/init.d/jellyfin" ]] || [[ -e "/etc/init/jellyfin.conf" ]]; then
+ update-rc.d jellyfin defaults >/dev/null
+ invoke-rc.d jellyfin start || exit $?
+ fi
+fi
+exit 0
diff --git a/debian/postrm.jellyfin-server b/debian/postrm.jellyfin-server
new file mode 100644
index 0000000..3d56a5f
--- /dev/null
+++ b/debian/postrm.jellyfin-server
@@ -0,0 +1,81 @@
+#!/bin/bash
+set -e
+
+NAME=jellyfin
+DEFAULT_FILE=/etc/default/${NAME}
+
+# Source Jellyfin default configuration
+if [[ -f $DEFAULT_FILE ]]; then
+ . $DEFAULT_FILE
+fi
+
+# Data directories for program data (cache, db), configs, and logs
+PROGRAMDATA=${JELLYFIN_DATA_DIRECTORY-/var/lib/$NAME}
+CONFIGDATA=${JELLYFIN_CONFIG_DIRECTORY-/etc/$NAME}
+LOGDATA=${JELLYFIN_LOG_DIRECTORY-/var/log/$NAME}
+CACHEDATA=${JELLYFIN_CACHE_DIRECTORY-/var/cache/$NAME}
+
+# In case this system is running systemd, we make systemd reload the unit files
+# to pick up changes.
+if [[ -d /run/systemd/system ]] ; then
+ systemctl --system daemon-reload >/dev/null || true
+fi
+
+case "$1" in
+ purge)
+ echo PURGE | debconf-communicate $NAME > /dev/null 2>&1 || true
+
+ if [[ -x "/etc/init.d/jellyfin" ]] || [[ -e "/etc/init/jellyfin.conf" ]]; then
+ update-rc.d jellyfin remove >/dev/null 2>&1 || true
+ fi
+
+ if [[ -x "/usr/bin/deb-systemd-helper" ]]; then
+ deb-systemd-helper purge jellyfin.service >/dev/null
+ deb-systemd-helper unmask jellyfin.service >/dev/null
+ fi
+
+ # Remove user and group
+ userdel jellyfin > /dev/null 2>&1 || true
+ delgroup --quiet jellyfin > /dev/null 2>&1 || true
+ # Remove config dir
+ if [[ -d $CONFIGDATA ]]; then
+ rm -rf $CONFIGDATA
+ fi
+ # Remove log dir
+ if [[ -d $LOGDATA ]]; then
+ rm -rf $LOGDATA
+ fi
+ # Remove cache dir
+ if [[ -d $CACHEDATA ]]; then
+ rm -rf $CACHEDATA
+ fi
+ # Remove program data dir
+ if [[ -d $PROGRAMDATA ]]; then
+ rm -rf $PROGRAMDATA
+ fi
+ # Remove binary symlink
+ rm -f /usr/bin/jellyfin
+ # Remove sudoers config
+ [[ -f /etc/sudoers.d/jellyfin-sudoers ]] && rm /etc/sudoers.d/jellyfin-sudoers
+ # Remove anything at the default locations; catches situations where the user moved the defaults
+ [[ -e /etc/jellyfin ]] && rm -rf /etc/jellyfin
+ [[ -e /var/log/jellyfin ]] && rm -rf /var/log/jellyfin
+ [[ -e /var/cache/jellyfin ]] && rm -rf /var/cache/jellyfin
+ [[ -e /var/lib/jellyfin ]] && rm -rf /var/lib/jellyfin
+ ;;
+ remove)
+ if [[ -x "/usr/bin/deb-systemd-helper" ]]; then
+ deb-systemd-helper mask jellyfin.service >/dev/null
+ fi
+ ;;
+ upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
+ ;;
+ *)
+ echo "postrm called with unknown argument \`$1'" >&2
+ exit 1
+ ;;
+esac
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/preinst.jellyfin-server b/debian/preinst.jellyfin-server
new file mode 100644
index 0000000..2713fb9
--- /dev/null
+++ b/debian/preinst.jellyfin-server
@@ -0,0 +1,78 @@
+#!/bin/bash
+set -e
+
+NAME=jellyfin
+DEFAULT_FILE=/etc/default/${NAME}
+
+# Source Jellyfin default configuration
+if [[ -f $DEFAULT_FILE ]]; then
+ . $DEFAULT_FILE
+fi
+
+# Data directories for program data (cache, db), configs, and logs
+PROGRAMDATA=${JELLYFIN_DATA_DIRECTORY-/var/lib/$NAME}
+CONFIGDATA=${JELLYFIN_CONFIG_DIRECTORY-/etc/$NAME}
+LOGDATA=${JELLYFIN_LOG_DIRECTORY-/var/log/$NAME}
+CACHEDATA=${JELLYFIN_CACHE_DIRECTORY-/var/cache/$NAME}
+
+# In case this system is running systemd, we make systemd reload the unit files
+# to pick up changes.
+if [[ -d /run/systemd/system ]] ; then
+ systemctl --system daemon-reload >/dev/null || true
+fi
+
+case "$1" in
+ install|upgrade)
+ # try graceful termination;
+ if [[ -d /run/systemd/system ]]; then
+ deb-systemd-invoke stop ${NAME}.service > /dev/null 2>&1 || true
+ elif [ -x "/etc/init.d/${NAME}" ] || [ -e "/etc/init/${NAME}.conf" ]; then
+ invoke-rc.d ${NAME} stop > /dev/null 2>&1 || true
+ fi
+ # try and figure out if jellyfin is running
+ PIDFILE=$(find /var/run/ -maxdepth 1 -mindepth 1 -name "jellyfin*.pid" -print -quit)
+ [[ -n "$PIDFILE" ]] && [[ -s "$PIDFILE" ]] && JELLYFIN_PID=$(cat ${PIDFILE})
+ # if its running, let's stop it
+ if [[ -n "$JELLYFIN_PID" ]]; then
+ echo "Stopping Jellyfin!"
+ # if jellyfin is still running, kill it
+ if [[ -n "$(ps -p $JELLYFIN_PID -o pid=)" ]]; then
+ CPIDS=$(pgrep -P $JELLYFIN_PID)
+ sleep 2 && kill -KILL $CPIDS
+ kill -TERM $CPIDS > /dev/null 2>&1
+ fi
+ sleep 1
+ # if it's still running, show error
+ if [[ -n "$(ps -p $JELLYFIN_PID -o pid=)" ]]; then
+ echo "Could not successfully stop JellyfinServer, please do so before uninstalling."
+ exit 1
+ else
+ [[ -f $PIDFILE ]] && rm $PIDFILE
+ fi
+ fi
+
+ # Clean up old Emby cruft that can break the user's system
+ [[ -f /etc/sudoers.d/emby ]] && rm -f /etc/sudoers.d/emby
+
+ # If we have existing config, log, or cache dirs in /var/lib/jellyfin, move them into the right place
+ if [[ -d $PROGRAMDATA/config ]]; then
+ mv $PROGRAMDATA/config $CONFIGDATA
+ fi
+ if [[ -d $PROGRAMDATA/logs ]]; then
+ mv $PROGRAMDATA/logs $LOGDATA
+ fi
+ if [[ -d $PROGRAMDATA/logs ]]; then
+ mv $PROGRAMDATA/cache $CACHEDATA
+ fi
+
+ ;;
+ abort-upgrade)
+ ;;
+ *)
+ echo "preinst called with unknown argument \`$1'" >&2
+ exit 1
+ ;;
+esac
+#DEBHELPER#
+
+exit 0
diff --git a/debian/prerm.jellyfin-server b/debian/prerm.jellyfin-server
new file mode 100644
index 0000000..e965cb7
--- /dev/null
+++ b/debian/prerm.jellyfin-server
@@ -0,0 +1,61 @@
+#!/bin/bash
+set -e
+
+NAME=jellyfin
+DEFAULT_FILE=/etc/default/${NAME}
+
+# Source Jellyfin default configuration
+if [[ -f $DEFAULT_FILE ]]; then
+ . $DEFAULT_FILE
+fi
+
+# Data directories for program data (cache, db), configs, and logs
+PROGRAMDATA=${JELLYFIN_DATA_DIRECTORY-/var/lib/$NAME}
+CONFIGDATA=${JELLYFIN_CONFIG_DIRECTORY-/etc/$NAME}
+LOGDATA=${JELLYFIN_LOG_DIRECTORY-/var/log/$NAME}
+CACHEDATA=${JELLYFIN_CACHE_DIRECTORY-/var/cache/$NAME}
+
+case "$1" in
+ remove|upgrade|deconfigure)
+ echo "Stopping Jellyfin!"
+ # try graceful termination;
+ if [[ -d /run/systemd/system ]]; then
+ deb-systemd-invoke stop ${NAME}.service > /dev/null 2>&1 || true
+ elif [ -x "/etc/init.d/${NAME}" ] || [ -e "/etc/init/${NAME}.conf" ]; then
+ invoke-rc.d ${NAME} stop > /dev/null 2>&1 || true
+ fi
+ # Ensure that it is shutdown
+ PIDFILE=$(find /var/run/ -maxdepth 1 -mindepth 1 -name "jellyfin*.pid" -print -quit)
+ [[ -n "$PIDFILE" ]] && [[ -s "$PIDFILE" ]] && JELLYFIN_PID=$(cat ${PIDFILE})
+ # if its running, let's stop it
+ if [[ -n "$JELLYFIN_PID" ]]; then
+ # if jellyfin is still running, kill it
+ if [[ -n "$(ps -p $JELLYFIN_PID -o pid=)" ]]; then
+ CPIDS=$(pgrep -P $JELLYFIN_PID)
+ sleep 2 && kill -KILL $CPIDS
+ kill -TERM $CPIDS > /dev/null 2>&1
+ fi
+ sleep 1
+ # if it's still running, show error
+ if [[ -n "$(ps -p $JELLYFIN_PID -o pid=)" ]]; then
+ echo "Could not successfully stop Jellyfin, please do so before uninstalling."
+ exit 1
+ else
+ [[ -f $PIDFILE ]] && rm $PIDFILE
+ fi
+ fi
+ if [[ -f /usr/lib/jellyfin/bin/MediaBrowser.Server.Mono.exe.so ]]; then
+ rm /usr/lib/jellyfin/bin/MediaBrowser.Server.Mono.exe.so
+ fi
+ ;;
+ failed-upgrade)
+ ;;
+ *)
+ echo "prerm called with unknown argument \`$1'" >&2
+ exit 1
+ ;;
+esac
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..8c52b29
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,57 @@
+#! /usr/bin/make -f
+CONFIG := Release
+TERM := xterm
+SHELL := /bin/bash
+
+HOST_ARCH := $(shell arch)
+BUILD_ARCH := ${DEB_HOST_MULTIARCH}
+ifeq ($(HOST_ARCH),x86_64)
+ # Building AMD64
+ DOTNETRUNTIME := linux-x64
+ ifeq ($(BUILD_ARCH),arm-linux-gnueabihf)
+ # Cross-building ARM on AMD64
+ DOTNETRUNTIME := linux-arm
+ endif
+ ifeq ($(BUILD_ARCH),aarch64-linux-gnu)
+ # Cross-building ARM on AMD64
+ DOTNETRUNTIME := linux-arm64
+ endif
+endif
+ifeq ($(HOST_ARCH),armv7l)
+ # Building ARM
+ DOTNETRUNTIME := linux-arm
+endif
+ifeq ($(HOST_ARCH),arm64)
+ # Building ARM
+ DOTNETRUNTIME := linux-arm64
+endif
+
+export DH_VERBOSE=1
+export DOTNET_CLI_TELEMETRY_OPTOUT=1
+
+%:
+ dh $@
+
+override_dh_auto_test:
+
+override_dh_clistrip:
+
+override_dh_auto_build:
+ cd jellyfin-server && dotnet publish -maxcpucount:1 --configuration $(CONFIG) \
+ --output='$(CURDIR)/build/usr/lib/jellyfin/bin' --self-contained --runtime $(DOTNETRUNTIME) \
+ -p:DebugSymbols=false -p:DebugType=none Jellyfin.Server
+ cd jellyfin-web && npm ci --no-audit --unsafe-perm && \
+ npm run build:production && mv $(CURDIR)/jellyfin-web/dist $(CURDIR)/build/web
+
+override_dh_auto_clean:
+ cd jellyfin-server && dotnet clean -maxcpucount:1 --configuration $(CONFIG) Jellyfin.Server || true
+ test -d $(CURDIR)/jellyfin-web/dist && \
+ rm -rf '$(CURDIR)/jellyfin-web/dist' || true
+ test -d $(CURDIR)/jellyfin-web/web && \
+ rm -rf '$(CURDIR)/jellyfin-web/web' || true
+ test -d $(CURDIR)/jellyfin-web/node_modules && \
+ rm -rf '$(CURDIR)/jellyfin-web/node_modules' || true
+ rm -rf '$(CURDIR)/build'
+
+override_dh_installinit:
+ dh_installinit --name=jellyfin
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..d3827e7
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+1.0
diff --git a/debian/source/options b/debian/source/options
new file mode 100644
index 0000000..b7adf56
--- /dev/null
+++ b/debian/source/options
@@ -0,0 +1,7 @@
+tar-ignore='.git*'
+tar-ignore='**/.git'
+tar-ignore='**/.hg'
+tar-ignore='**/.vs'
+tar-ignore='**/.vscode'
+tar-ignore='deployment'
+tar-ignore='*.deb'
bgstack15