Portfolio
My Blog
Scroll down to discover
Search
Categories

Jellyfin, install and configure this media server on Ubuntu

July 29, 2023Category : IT & Network

Install Jellyfin on Ubuntu

Jellyfin is compatible with GNU / Linux, Mac OS and Windows. For this example we are going to install it on an Ubuntu 18.04 LTS distribution.

To begin we are going to open a terminal (Ctrl + Alt + T) and install HTTPS transport for APT, if it is not already installed on your computer:

sudo apt install curl gnupg software-properties-common -y
sudo add-apt-repository universe -y
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/jellyfin.gpg
export VERSION_OS="$( awk -F'=' '/^ID=/{ print $NF }' /etc/os-release )"
export VERSION_CODENAME="$( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release )"
export DPKG_ARCHITECTURE="$( dpkg --print-architecture )"
cat <<EOF | sudo tee /etc/apt/sources.list.d/jellyfin.sources
Types: deb
URIs: https://repo.jellyfin.org/${VERSION_OS}
Suites: ${VERSION_CODENAME}
Components: main
Architectures: ${DPKG_ARCHITECTURE}
Signed-By: /etc/apt/keyrings/jellyfin.gpg
EOF
sudo apt update && sudo apt upgrade

sudo apt install jellyfin -y

Start the Jellyfin service

To withdraw from your enable and start the service after each restart we will execute the following commands:

starting the media server

sudo systemctl enable jellyfin
sudo systemctl start jellyfin

We can check if the service has been started correctly or not by running the command:

media server status

sudo systemctl status jellyfin

If you see an output like the one in the previous screenshot, Jellyfin will have started the service correctly. At this point, we can move on to the initial setup.

 

upgrade jellyfin

sudo apt update -y
sudo apt --only-upgrade install jellyfin

edit jellyfin

1/ chaneg logo in login session-login-index-html.xxxxxxxxxx.chunk.js

find <div class=”padded-left padded-right padded-bottom-page margin-auto-y”>

add after <img src=”/web/assets/img/banner-light.png” width=188px style=”padding: 0px;display:block; margin-left: auto; margin-right: auto;”>

2/

Initial setup

We will be able to access Jellyfin from any system on the network. It will not be necessary to install any extra applications. All you need is a web browser modern. To begin, we are going to make the configuration, start by accessing the URL in the browser http://nombredominio:8096 o http://dirección-IP:8096.

 

Install rclone mount disk media form onedrive

curl https://rclone.org/install.sh | sudo bash

rclone config

Step by step

n > Microsoft onedrive > blank > blank > microsoft cloud global > n > n

authen with vps no gui, download rclone.exe and run

> rclone authorize “onedrive” > copy and paste token

> Onedrive personal or business > one drive business > blank > y > q

/etc/jellyfin/
/usr/share/jellyfin/
create folder follow /mnt/rclone/

 

mount cloud
rclone –vfs-cache-mode writes mount “OneDrive”: /mnt/rclone/

 

rclon config
tạo file trong /etc/systemd/system/rclone.service
hoặc /lib/systemd/system/ (với ubuntu 22.04)
[Unit] Description=Onedrive (rclone)
AssertPathIsDirectory=/mnt/rclone/Onedrive
Wants=network-online.target
After=network-online.target [Service] Type=simple
ExecStart=/usr/bin/rclone mount \
–allow-other \
–cache-dir=/tmp/rclone/vfs \
–no-modtime \
–stats=0 \
–bwlimit=30M \
–dir-cache-time=5m \
–vfs-cache-mode full \
–vfs-cache-max-size 1G \
–buffer-size 0 \
–user-agent “ISV|rclone.org|rclone/v1.62.2” \
–tpslimit 2 \
–cache-info-age=15m Onedrive:/ /mnt/rclone/Onedrive
ExecStop=/bin/fusermount -u /mnt/rclone/Onedrive
Restart=always
RestartSec=10 [Install] WantedBy=multi-user.target
install fuse3 iff err fuse

apt update && apt install fuse3 s3fs

hoặc

ln -s /bin/fusermount /bin/fusermount3

After terminating rclone, FUSE usually doesn’t dismount correctly. We’ll have to run fusermount -u <mountpoint> with my vps fusermount -u Onedrive to unmount it correctly. If it says its busy, force it by umount -l <mountpoint> and then using the fusermount command again.

Save it and execute it by running systemctl start rclonemount. You can view if it failed or not by running systemctl status rclonemount. To make it execute on next boot, execute systemctl enable rclonemount and it should run on the next reboot.

If you do any changes to rclonemount.service, make sure to execute systemctl daemon-reload to reload any changes you’re done.

 

Taking a Backup

  1. Stop the running Jellyfin server. This is extremely important, as otherwise the database will be locked and might not be recoverable when restoring. Note that this will interrupt any playback.
    • Any platform: Within the Jellyfin Dashboard, click “Shutdown”. This should cleanly stop the process on all platforms, but if not, try one of the following.
    • Docker: docker stop jellyfin
    • Debian/Ubuntu packages: sudo systemctl stop jellyfin or sudo service jellyfin stop
    • Windows Installer: Right-click the Tray app, and select “Quit”; or, in Process Manager, find the Jellyfin process and terminate it.
    • MacOS Installer (.dmg): In Activity Monitor, find the Jellyfin process and terminate it.
    • Portable Installs (regardless of platform): Stop the running jellyfin or jellyfin.exe program, however it was started.
  2. Copy your data and configuration directories to a destination of your choice. What you name the copies is up to you; personally, I like to use dated and versioned directory names e.g. jellyfin.2024-05-01_10.8.13. Where these files are also depends on the platform; generally these follow the XDG Directory Specification for platforms that support it. For more information see the configuration documentation.NOTE: These are default locations; if you’ve changed your data or config paths, use those instead.
    • Official Docker: Wherever your /data and /config volumes are sourced from; this is set in your docker-compose.yml or in your -v options to docker run.
    • LinuxServer.io Docker: Data and config are wherever your /config volume is sourced from; this is set in your docker-compose.yml or in your -v options to docker run.
    • Debian/Ubuntu packages: Data is in /var/lib/jellyfin and config is in /etc/jellyfin; these are defined in /etc/default/jellyfin.
    • RPMFusion Fedora/CentOS packages: Data is in /var/lib/jellyfin and config is in /etc/jellyfin; these are defined in /etc/sysconfig/jellyfin.
    • Windows Tray/Installer (.exe): Data and config is in %PROGRAMDATA%\Jellyfin\Server (C:\ProgramData\Jellyfin\Server) or %LOCALAPPDATA%\Jellyfin (C:\Users\<Username>\AppData\Local\Jellyfin).
    • MacOS Installer (.dmg): Data is stored in one of these paths; back up whichever one(s) exist: ~/.config/jellyfin/~/.local/share/jellyfin/~/Library/Application Support/Jellyfin/.
    • Portable Installs:
      • Linux: Data is stored in ~/.local/share/jellyfin and config in ~/.local/share/jellyfin.
      • Windows: Data and config is in C:\Users\<Username>\AppData\Local\Jellyfin, using %LOCALAPPDATA%.
      • MacOS: Data is stored in these paths; back up whichever one(s) exist: ~/.config/jellyfin/~/.local/share/jellyfin/~/Library/Application Support/Jellyfin/.

    As an example, on Debian, you can do this with these commands to make a copy of both directories into a single target directory:

TIMESTAMP=$(date +%Y%m%d%H%M%S)
VERSION=10.9.10
sudo mkdir -p /media/backups/jellyfin.${TIMESTAMP}_${VERSION} # Or change the path wherever in your system makes sense to you
sudo cp -a /var/lib/jellyfin /media/backups/jellyfin.${TIMESTAMP}_${VERSION}/data
sudo cp -a /etc/jellyfin /media/backups/jellyfin.${TIMESTAMP}_${VERSION}/config

3./Start up Jellyfin again, either after upgrading or on the current version. You now have a safe copy of your data in the path chosen in step 2.

Restoring a Backup

This process assumes you followed the steps above to take the backup.

  1. Stop the running Jellyfin server process.
  2. Move your current data and configuration directories out of the way (e.g. by appending .bak to them). For example, sudo mv /var/lib/jellyfin /var/lib/jellyfin.bak and sudo mv /etc/jellyfin /etc/jellyfin.bak.
  3. Copy – do not move or rename – your backup to the existing name. For example, sudo cp -a /media/backups/jellyfin.2024-10-27_10.9.11/data /var/lib/jellyfin and sudo cp -a /media/backups/jellyfin.2024-10-27_10.9.11/config /etc/jellyfin.
  4. If required, downgrade Jellyfin to the same version as your backup now.
  5. Start up Jellyfin again. It should start cleanly with the old data, assuming versions are correct. If you downgraded this may happen automatically.

 

 

Install Jellyfin on Docker UI

compose.yaml

services:
jellyfin_H4Mm:
image: jellyfin/jellyfin:${VERSION}
# container_name: ${CONTAINER_NAME}
deploy:
resources:
limits:
cpus: ${CPUS}
memory: ${MEMORY_LIMIT}
restart: always
ports:
– ${HOST_IP}:${WEB_HTTP_PORT}:8096
volumes:
– ${APP_PATH}/config:/config
– ${APP_PATH}/cache:/cache
– /mnt/rclone/Onedrive/LOSSLESS:/media/media
labels:
createdBy: “bt_apps”
networks:
– baota_net

networks:
baota_net:
external: true

.env

VERSION=latest
CONTAINER_NAME=CONTAINER_NAME
HOST_IP=0.0.0.0
WEB_HTTP_PORT=8096
CPUS=0
MEMORY_LIMIT=0MB
APP_PATH=/www/dk_project/dk_app/jellyfin/jellyfin_H4Mm

….

CSS config

https://github.com/BobHasNoSoul/jellyfin-mods

 

/*remove logo*/
.pageTitleWithLogo {
width: 0 !important;
}

/*color background*/
.backgroundContainer.withBackdrop,
.backdropContainer,
.backgroundContainer {
background: #000720cc;
}

/*remove favourite*/
.material-icons.favorite:before {
display: none !important;
}
.btnUserRating{display:none;} button[is=”emby-ratingbutton”]{display:none;} .noHomeButtonHeader button[data-index=”1″]{display:none;} button[data-index=”3″]{display:none;}

/*If the logo is present on the details page of an item, hide the items’ title*/
#itemDetailPage .itemName.infoText.parentNameLast > bdi:nth-child(1) {display: none;}
.hide+.detailPageWrapperContainer .itemName > bdi:nth-child(1) {display: block !important;}

/*Do the same for the single episodes link back title*/
#itemDetailPage .parentName > bdi:nth-child(1) {display: none;}
.hide+.parentName > bdi:nth-child(1) {display: block !important;}

/*Hide the top bar when the login page is visible*/
body:has(#loginPage:not(.hide)) .skinHeader {
display: none !important;
}

/*Show the top bar when the login page is hidden or absent*/
body:not(:has(#loginPage:not(.hide))) .skinHeader {
display: flex !important;
}

 

Plugin

https://raw.githubusercontent.com/bvolvy/CustomLogoPlugin/main/manifest.json

https://raw.githubusercontent.com/danieladov/JellyfinPluginManifest/master/manifest.json

https://raw.githubusercontent.com/n00bcodr/jellyfin-plugins/main/10.11/manifest.json

for movie

https://www.iamparadox.dev/jellyfin/plugins/manifest.json

https://github.com/MakD/zombie-release

 

 

01.
© Oliver / All rights reserved.
To top