Jellyfin : Στήνουμε Selfhosted Media Streaming Σύστημα πολυμέσων μέσω Container


Το άρθρο αυτό αποτελεί μέρος της σειράς Raspberry Pi Server, υποστηριζόμενο από την επίσημη αντιπροσωπία του Raspberry Pi στην Ελλάδα, το nettop.gr το οποίο με προμήθευσε με το Raspberry Pi 5 ώστε να δημιουργήσω περισσότερο περιεχόμενο για τις δυνατότητες και τα Project που μπορούν να τρέξουν self-hosted πάνω στο Raspberry Pi στα Ελληνικά. Ευχαριστώ πάρα πολύ το nettop.gr για την υποστήριξη!!!


Jellyfin : Στήνουμε το δικό μας Selfhosted Media System για streaming βίντεο και φωτογραφιών μέσω Container

Disclaimer: Ο οδηγός αυτός αφοράει την ταξινόμηση και προσωπική χρήση οπτικοακουστικού υλικού που διαθέτουμε νόμιμα αγορασμένο. Δεν προτείνεται ούτε παροτρύνεται η χρήση του για παραβίαση πνευματικών δικαιωμάτων, κάτι που είναι παράνομο και κατακριτέο. Σεβόμαστε την εργασία των ανθρώπων που δούλεψαν σκληρά έτσι ώστε να απολαμβάνουμε το οπτικοακουστικό υλικό σε προσιτές τιμές, χωρίς να οδηγούμε ανθρώπους προς την αλλαγή καριέρας λόγω οικονομικών δυσκολιών.


Ο οδηγός αυτός λειτουργεί σε όλα τα συστήματα όπου υποστηρίζονται Containers, εκτός των Raspberry Pi;

Φυσικά, μιας και είναι σε μορφή Container, ο οδηγός αυτός μπορεί να εφαρμοστεί σε κάθε υπολογιστή οπού μπορεί να διαχειριστεί containers.


Σε ποια Container Engines ο οδηγός έχει δοκιμαστεί ως προς την συμβατότητά του;

Για όποιον θέλει να μάθει τι είναι το Docker, οπού αποτελεί την μεγάλη “ναυαρχίδα” των Containers, υπάρχει ήδη στο Linux-User.gr ένας πολύ αναλυτικός οδηγός: , οπού εμπεριέχει αναλυτικότερες πληροφορίες σχετικά με τις τεχνολογίες αυτές.

Επιπλέον, όποιος θέλει να μάθει περισσότερα για το Podman, ως έναν root-less διαχειριστή Container, μπορεί να κάνει κλικ εδώ:

Αφού σχολιάσαμε αυτά, πάμε πίσω στο Jellyfin:

Γιατί να selfhostάρουμε το Jellyfin;

  • Για να μπορούμε να streamάρουμε σε όλες τις συσκευές μας τις ταινίες, σειρές ή μουσική, βιβλία και βίντεο όπου έχουμε αγοράσει νόμιμα σε αναλογική μορφή (κασέτες, CDs, DVDs κλπ…) με στόχο να μπορούμε να τις απολαύσουμε από όποια συσκευή επιθυμούμε.
  • Για να μπορέσουμε να streamάρουμε προσωπικές μας φωτογραφίες και βίντεο σε όλες τις συσκευές του δικτύου,
  • Για να οργανώσουμε όμορφα σε ένα όμορφο περιβάλλον όλο το ψηφιακό μας υλικό,
  • Γιατί η Αυτονομία και η Αποκέντρωση είναι το μέλλον - κάτι που όπως έχετε καταλάβει μέσα από τις δράσεις μου τόσο στο Fediverse, όσο και Blockchain και Selfhosted Servers, το έχω θέσει ως φιλοσοφία ζωής.

Τι προτείνουμε;

  • Να προμηθευτείτε έναν σκληρό δίσκο (ακόμα και εξωτερικό) αρκετών Terabytes έτσι ώστε να έχετε μεγάλη άνεση να αποθηκεύετε ό,τι αρχεία θέλετε. Σε αυτό το σημείο βέβαια θα πρέπει να επισημανθεί πως λόγω της σχεδίασης των volumes σε containers, θα μπορείτε ανά πάσα στιγμή πάρα πολύ εύκολα να κάνετε μεταφορά σε έναν μεγαλύτερο δίσκο , απλά μεταφέροντας το volume που θα δούμε παρακάτω στο compose, με rsync σε άλλο φάκελο/δίσκο και απλά αλλάζοντας στο compose την θέση του volume αυτού. Και έτσι εύκολα και απλά, προσθέτουμε περισσότερο χώρο στο Jellyfin για περισσότερα πολυμέσα.

Ας ξεκινήσουμε:

Η διαδικασία είναι εξαιρετικά πολύ απλή μιας και έχω ετοιμάσει docker-compose.yml αρχείο, όπως είχαμε δει και στο Access Point Docker Container.

Απλά δημιουργούμε έναν φάκελο, όπου μέσα σε αυτόν δημιουργούμε ένα αρχείο με όνομα docker-compose.yml:

nano docker-compose.yml

Και κάνουμε copy-paste το παρακάτω:

version: '3.8'  

services:
  jellyfin:
    image: jellyfin/jellyfin:latest  #Χρησιμοποιούμε την τελευταία έκδοση του jellyfin
    container_name: jellyfin  #Ονομάζουμε το όνομα του container ως jellyfin
    networks:  #Προαιρετικό από εδώ και κάτω, μέχρι τον ορισμό της στατικής IP: Ορίζουμε το υποδίκτυο όπου θα τρέχει το jellyfin, χρήσιμο αν το έχουμε μαζί με reverse proxy.
     caddy_tuxapps:
      ipv4_address: 172.20.0.4
    ports:
      - "8096:8096"  # H HTTP πόρτα όπου θα τρέχει το jellyfin
      - "8920:8920"  # H HTTPS πόρτα όπου θα τρέχει το jellyfin
    volumes:
        #Εδώ ορίζουμε τα volumes όπου θα βρίσκονται τα χρήσιμα αρχεία ρυθμίσεων του jellyfin καθώς και ο χώρος όπου είναι αποθηκευμένα τα αρχεία όπου θέλουμε να βλέπουμε από το Jellyfin
      - "/media/test/services/vflix/config:/config"  # Οι ρυθμίσεις του Jellyfin
      - "/media/test/services/vflix/cache:/cache"  # Η cache του Jellyfin
      - "/media/test/services/vflix/media:/media"  # Ο φάκελος όπου θα αποθηκεύονται τα πολυμέσα όπου θα θέλουμε να βλέπουμε στο jellyfin. Ίσως να χρειαζόμαστε εξωτερικό δίσκο εδώ. Σε περίπτωση migration σε μεγαλύτερο δίσκο, αλλάζουμε τον προορισμό των παραπάνω φακέλων και κάνουμε ξανά deploy το container.
    restart: unless-stopped  
#Προαιρετικό όπως και το πάνω
networks:
  caddy_tuxapps:
    external: true

Kαι δημιουργούμε το container δίνοντας από τερματικό: (ενώ βρισκόμαστε στον φάκελο όπου βρίσκεται το docker-compose.yml):

docker-compose up -d

Αντίστοιχα, για Podman δίνουμε:

podman-compose up -d

Πρώτη Εκτέλεση του Jellyfin

Την πρώτη φορά που θα επισκεπτούμε το Jellyfin από την πόρτα 8096 (για http) ή 8920 (για https) θα τρέξει αυτόματα ο οδηγός εγκατάστασης.

Επιλέγουμε γλώσσα εγκατάστασης:

Έπειτα δημιουργούμε λογαριασμό διαχειριστή:

Έπειτα δημιουργούμε τις βιβλιοθήκες, με ταξινομημένο το υλικό όπου θέλουμε:

Ένας ιδανικός τρόπος είναι να έχουμε κατηγοριοποιήσει από πριν τα αρχεία μας σε υποφακέλους όπως:

  • Ταινίες,
  • Σειρές ,
  • Φωτογραφίες,
  • Βιβλία,
  • Audiobooks,
  • Virtual Reality/3D Περιεχόμενο,
  • Ο,τι άλλο επιθυμούμε.

Αξίζει να επισημανθεί ότι το Jellyfin τροφοδοτείται από μεταδομένα όπως τίτλους, περιγραφές, κριτικές, εξώφυλλα κλπ. απευθείας από διάσημες βάσεις δεδομένων όπως το TheMovieDb. Όταν δημιουργείται μία νέα βιβλιοθήκη, το Jellyfin θα μας ρωτήσει αυτόματα από πιες από αυτές τις βάσεις δεδομένων θέλουμε να τροφοδοτεί δεδομένα (αν θέλουμε):

Και έπειτα μπορούμε να πλοηγηθούμε έτσι ώστε να αντιστοιχήσουμε τον φάκελο που θέλουμε με την εκάστοτε βιβλιοθήκη.

Βλέπουμε ενδεικτικά την βιβλιοθήκη Movies όπου δημιούργησα:

Και έπειτα επιλέγουμε την γλώσσα των μεταδεδομένων που θέλουμε καθώς και την χώρα προέλευσης μας.

Τέλος, μπορούμε να ενεργοποιήσουμε το Remote Access έτσι ώστε να μπορούν να συνδεθούν στο Jellyfin μας άλλες συσκευές του δικτύου.

Αυτό ήταν!!!

Είμαστε έτοιμοι! Η εγκατάσταση του Jellyfin, ιδιαίτερα ως compose container, όπως είδαμε είναι εξαιρετικά απλή. Όλη η δουλειά έχει γίνει από πριν από εμάς για εσάς. :slight_smile:

Αξίζει να επισημανθεί πως σε αυτά τα screenshots, στήσαμε το Jellyfin μέσω Podman

Παραμετροποιώντας το Jellyfin

Επιλέγοντας το κουμπί με τις τρεις γραμμές, μας εμφανίζει μία κάθετη κορδέλα με πολλαπλές επιλογές. Επιλέγουμε Settings.

Και εδώ βρισκόμαστε στις ρυθμίσεις του Jellyfin.

Διαχείριση Χρηστών

Αρχικά, στην κατηγορία Users, μπορούμε να δημιουργήσουμε νέους χρήστες (π.χ. τα μέλη της οικογένειας μας όπου θα έχουν πρόσβαση στο Jellyfin).

Ορίζοντας reverse proxy

Στην κατηγορία networking, μπορούμε να ορίσουμε έναν reverse proxy (π.χ., όπως βλέπετε, έχω κάνει να λειτουργεί στο movies.v.flix - εσωτερικό dns domain) καθώς μπορούμε και να ενεργοποιήσουμε/απενεργοποιήσουμε το https.

Reverse Proxy με Caddy:

Αν έχουμε τρέξει το compose αρχείο, όπως αναγράφεται παραπάνω, μπορούμε πολύ εύκολα να στήσουμε έναν reverse proxy από Caddy δίνοντας:

movies.v.flix {
    tls internal
    reverse_proxy 172.20.0.4:8096
}

Plugins

Αξίζει επίσης να αναφερθεί ότι το Jellyfin υποστηρίζει διάφορα πρόσθετα, συμπεριλαμβανομένου του KODI αλλά και την αυτόματ λήψη και εισαγωγή υπότιτλων, όπως μπορούμε να δούμε στο screenshot αυτό:

Ας πλοηγηθούμε τώρα στο Jellyfin

Αφού εντάξουμε τις βιβλιοθήκες μας και κατέβουν τα διάφορα μεταδεδομένα, η αρχική μας οθόνη θα μοιάζει περίπου κάπως έτσι: (η φωτογραφία προέρχεται από το επίσημο site του jellyfin, δεν πρόκειται για δικιά μου).

Όταν επιλέγουμε κάποια ταινία/σειρά όπου έχουν κατέβει τα μεταδεδομένα, θα εμφανίζονται πληροφορίες όπως αυτές σε αυτό το screenshot: (με την γνωστή και αγαπημένη Ελληνική Σειρά).

Τέλος, άλλο ένα use case όπου μου έχει διευκολύνει την καθημερινότητα, είναι να χρησιμοποιώ το Jellyfin ως φωτογραφικό άλμπουμ για εμένα και τους παππούδες/γιαγιάδες.

Πιο συγκεκριμένα, έχω προσθέσει ταξινομημένα ανά χρονιά σε φακέλους της κάθε χρονιάς τις φωτογραφίες και αντίστοιχα τις κασέτες σε αντίστοιχη βιβλιοθήκη, και πάρα πολύ εύκολα οι παππούδες/γιαγιάδες μπορούν από το τηλεκοντρόλ τους μέσω Android TV, να πλοηγηθούν και να δουν φωτογραφίες από τα εγγόνια τους (π.χ. εγώ 2 χρόνια πριν ανακαλύψω τον κόσμο του GNU/Linux στο τότε περιοδικό Ελληνικό Linux Format με τον κύριο Τετραγωνοπαντελονή:).

Επιπλέον, έχω ψηφιοποιήσει τις παλιές κασέτες και μέσω Jellyfin, μπορούν τόσο οι παππούδες όσο κι εμείς για λόγους αρχειοθέτησης, να έχουμε πρόσβαση όλοι και να streamάρουμε μέσω των Browser/Android/AndroidTV μας.

Τέλος, αξίζει να επισημανθεί πως το Jellyfin έχει δοκιμαστεί για να streamάρει VR/3D περιεχόμενο στο Oculus Quest 2 μου με απόλυτη επιτυχία, ακόμα και μέσω Raspberry Pi 4 χωρίς κανένα θέμα σε αναλύσεις 4Κ.

Jellyfin Clients για κινητά και τηλεοράσεις:

Πρόσβαση στο Jellyfin εκτός σπιτιού;

Παρόλο που θα μπορούσαμε πολύ εύκολα να το κάνουμε διαθέσιμο στον έξω κόσμο, απλά ενεργοποιώντας το Port Forward στον router μας και αγοράζοντας ένα domain, ενδεχομένως θα ήταν πιο εύκολο και secure απλά να δημιουργήσουμε ένα VPN με wireguard, και να συνδεθούμε απευθείας στο δίκτυο μας με ασφάλεια, χωρίς να είναι απευθείας εκτεθειμένο στο διαδίκτυο.

Στον επόμενο οδηγό της σειράς Raspberry Pi Server, θα δούμε πώς μπορούμε να δημιουργήσουμε ως docker-container το δικό μας wireguard. :slight_smile:

9 «Μου αρέσει»

Θα είναι σαν να έχουμε ένα δικό μας “netflix” αλλά με προσωπικές φωτογραφίες, βίντεο και άλλα πολυμέσα, για να μπορούν να streamάρουν απευθείας από τις τηλεοράσεις ακόμα και οι παππούδες/γιαγιάδες :slight_smile:
Εnjoy!

3 «Μου αρέσει»

Ευχαριστούμε πολύ @sv1sjp για τον πολύ αναλυτικό και απλό οδηγό.
Μερικές ερωτήσεις.
1.Η στατιστική ip που ορίζουμε είναι τυχαία ή είναι η ip του container.
2.Με ποια εντολή βλέπουμε την ip του docker ή του podman;
3.Επίσης τα volumes πρέπει να τα έχουμε δημιουργήσει προτού τρέξουμε το docker compose;
4.Αν θέλουμε να αλλάξουμε τον αριθμό μιας θύρας, ποιον αλλάζουμε αυτόν που είναι δεξιά ή αριστερά από την άνω-κάτω τελεία :
Ευχαριστούμε εκ των προτέρων.

1 «Μου αρέσει»
  1. Η στατιστική IP που ορίζεται μπορεί να είναι τυχαία ή συγκεκριμένη, ανάλογα με τον τρόπο διαμόρφωσης του δικτύου μας .
  2. Για να δούμε την IP του Docker, μπορούμε να χρησιμοποιήσουμε την εντολή:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name

Αντίστοιχα, για το Podman, χρησιμοποιούμε την εντολή:

podman inspect -f '{{.NetworkSettings.IPAddress}}' container_name
  1. Ναι, τα volumes πρέπει να έχουν δημιουργηθεί πριν από την εκτέλεση του Docker Compose, εκτός κι αν ορίζονται να δημιουργηθούν αυτόματα μέσω του αρχείου docker-compose.yml. Στην περίπτωση μας, μας ενδιαφέρει κυρίως να υπάρχει ο φάκελος για τα πολυμέσα. Oι φάκελοι ρυθμίσεων θα γίνουν generate αυτόματα όπου ορίσουμε εμείς!
  2. Για να αλλάξουμε τον αριθμό μιας πόρτας στο Docker Compose, αλλάζουμε τον αριθμό που είναι αριστερά από την άνω-κάτω τελεία, δηλαδή τον αριθμό της πόρτας του host συστήματος.

Αυτά συνοπτικά, για περισσότερες containerο-απορίες, καλύτερα να συζητηθούν στα αντίστοιχα άρθρα ως σχόλια στο Linux-User.gr :)_