Το ποντίκι τελειώνει το ρύμι του, σηκώνει μαύρη σημαία στο κατάρτι του και σαλπάρει στην Καραϊβική, έχοντας φορτωμένους στο αμπάρι του όλους τους λόγους του κόσμου.

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

Το ποντίκι στο θέμα της πειρατείας συνεχίζει να είναι υπέρ, αλλά με προϋποθέσεις. Ενισχύει όποτε και όπου μπορεί τους εργάτες της τέχνης που εκτιμά.

Το παρόν ποστ μπαίνει σε τεχνικές λεπτομέρειες. Αν πιστεύετε πως δεν θα καταλάβετε για τι μιλάει ή φοβάστε το jargon, προσπεράστε το ελεύθερα. Από το επόμενο γυρνάμε στην κανονικότητα.


Την Δευτέρα που μας πέρασε, αγόρασα έναν εξωτερικό δίσκο (hdd) 2 terabyte για γύρω στα 100 ευρώ. Γενικότερα στη σημερινή κατάσταση, πιστεύω πως πρέπει να αγοράζουμε hardware με κάθε ευκαιρία, πριν φτάσουμε σε καταστάσεις Mad Max με μνήμες ram και gpu.

Τον δίσκο αυτόν τον έβαλα στο k16, το οποίο βάφτισα icarus γιατί είναι μαθηματικά βέβαιο πως κάποια στιγμή θα καεί απ’ τη χρήση. Του εγκατέστησα arch linux btw, και του έβαλα στατική ip στο Lan μου. Για να μην αναγκάζομαι να πληκτρολογώ κάθε φορά την ip του, έβαλα να τρέχει ένα avahi daemon, οπότε τοπικά είναι προσβάσιμο στο domain icarus.local. Το συνέδεσα με ethernet πάνω στο deco μου για να αξιοποιεί όλη την ταχύτητα του δικτύου και σήκωσα ssh server για να μπορώ να το χρησιμοποιώ χωρίς να είναι συνδεδεμένο σε κάποια οθόνη ή να έχει περιφερειακά.

Εγκατέστησα podman. Το προτίμησα σε σχέση με το docker γιατί δεν σήκωνε daemon και γιατί ήταν πιο εύκολο να το στήσω rootless. Αυτό είναι σημαντικό από άποψη ασφάλειας. Αν κάποιος χακάρει ένα rootful container και καταφέρει να κάνει escape το sandbox, οι συνέπειες για τον host είναι αρκετά πιο σοβαρές. Με rootless containers περιορίζουμε αρκετά αυτόν τον κίνδυνο.

Από εκεί και πέρα ξεκίνησα να βλέπω τι μπορώ να στήσω.

Jellyfin#

Ένα απ’ τα πιο “must” self hosted appliances που υπάρχουν αυτή τη στιγμή, είναι το jellyfin. Ουσιαστικά είναι μια λύση media center, με την οποία μπορούμε να μοιραζόμαστε τα αρχεία της βιβλιοθήκης μας στο δίκτυο. Αναλαμβάνει library discovery, σηκώνει web interface, έχει συμβατές εφαρμογές για android και iOS.

Με λίγα λόγια ήταν ένας βολικός τρόπος να βλέπω στο android tv box μου ο,τι είχα αποθηκευμένο στο icarus - ή τέλος πάντων στον εξωτερικό σκληρό του δίσκο. Πέρασα με rsync μερικά αρχεία βίντεο που είχα στο λάπτοπ μου, σαν ένα proof of concept κι έπαιξε κάτι παραπάνω από ικανοποιητικά. Το jellyfin έχει και δυνατότητες transcoding, όπου αυτό χρειάζεται και γι’ αυτό το λόγο του έδωσα δικαιώματα να βλέπει άμεσα και την iGPU του icarus ώστε να μην φορτώνει (αποκλειστικά) την CPU μου.

Για όσες/ους από σας ενδιαφέρεστε, παραθέτω από κάτω το compose.yml μου. Ναι, είναι τόσο απλό.

services:
  jellyfin:
    image: docker.io/jellyfin/jellyfin:12
    container_name: jellyfin

    ports:
      - "8096:8096"

    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128

    environment:
      - TZ=Europe/Athens
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /mnt/wd/media:/media:ro

    restart: unless-stopped

Eξίσου απλό ήταν και το στήσιμο των υπόλοιπων services που περιγράφω στην πορεία. Χρειάστηκε βέβαια αρκετό troubleshooting, κυρίως όσον αφορά σε permissions στους φακέλους και τα UIDs των χρηστών των containers.

Για την ώρα το jellyfin σέρβιρε στην τηλεόρασή μου την μικρή συλλογή που του είχα δώσει, αλλά εξακολουθούσαν να υπάρχουν τα άλυτα ακόμα προβλήματα.

  • Πώς μεγαλώνω τη συλλογή μου;
  • Πώς θα βρίσκω εύκολα, συγχρονισμένους υπότιτλους;

Θα τα δούμε στη συνέχεια, προς το παρόν μια μικρή παρένθεση.

Γιατί podman;#

Σε γενικές γραμμές, το στήσιμο των services σε containers έχει πολλά πλεονεκτήματα, όπως πχ το sandboxing που ανέφερα νωρίτερα. Τα δύο κύρια όμως για μένα είναι τα εξής:

  1. Είναι reproducible, πολύ λίγα πράγματα είναι δεμένα με τον host - ένα τέτοιο παράδειγμα στο προηγούμενο yaml, είναι το expose της iGPU μου στο container. Συνεπώς με λίγο έως καθόλου edit, όλο το homelab μπορεί να μεταφερθεί σε άλλο υπολογιστή.
  2. Όλο το configuration μπορεί κάλλιστα να μπει σε version control system και να έχουμε όλα τα πλεονεκτήματα που φέρνει αυτό.

Πίσω στο θέμα μας.

qBit#

Το ζήτημα της επέκτασης της συλλογής, ανέλαβε ένα instance του qBittorrent. Δεν έψαξα ιδιαίτερα τις εναλλακτικές (transmission, κλπ) αν και έχω χρησιμοποιήσει εναλλακτικούς clients στο παρελθόν. Το σκεπτικό ήταν πως είναι ώριμο project και “it gets the job done”. Ρύθμισα τα volumes και έκανα ένα-δυο πειράματα, στα οποία έπρεπε να δημιουργώ hardlinks των κατεβασμένων αρχείων για να μπορεί να τα διαβάζει το jellyfin.

Κατέβασα android client στο κινητό μου κι έτσι μπορούσα πλέον να προσθέτω torrents από εκεί και να τα αφήνω να κατεβαίνουν.

Τα δύο ζητήματα που προέκυψαν εδώ ήταν:

  1. Πού πας ξεβράκωτος στα αγγούρια, κάνοντας torrenting με την πραγματική σου ip;
  2. Κάθε download θα χρειαζόταν manual hardlinking ή έστω ένα (κατά πάσα πιθανότητα ai generated και error prone) bash script που θα έκανε αυτή τη δουλειά όποτε θα κατέβαινε κάποιο αρχείο.

Το πρώτο το είχα λύσει ήδη, βάζοντας το qBittorrent σε ένα compose file σε ένα δίκτυο πίσω από gluetun. Το gluetun είναι υπεύθυνο να συνδέεται με το κατάλληλο configuration στην ivpn μου και συνεπώς όσα containers βγαίνουν από το δίκτυό του, βγαίνουν ταυτόχρονα και μέσω της ivpn.

Ένα test εδώ έδειξε πως όλα είχαν πάει όπως έπρεπε. :)

Για το δεύτερο ζήτημα, προτίμησα να μην πάω με κάτι τόσο custom και τσαπατσούλικο. Έριξα μια ματιά στο που έχει στραφεί η υπόλοιπη κοινότητα κι αποφάσισα να ακολουθήσω κι εγώ την πεπατημένη.

ARR!!! stack#

Το arr stack είναι μια συλλογή open source εργαλείων προορισμένα για self hosting, που αυτοματοποιούν σε αρκετά μεγάλο βαθμό τη διαχείριση συλλογών media. Λειτουργούν άψογα μεταξύ τους και δεν χρειάζεται να τα εγκαταστήσουμε όλα, παρά μόνον αυτά που καλύπτουν τις ανάγκες μας.

Ένα γρήγορο βίντεο παρουσίασης στο youtube θα τα καλύπτει αρκετά, πάμε όμως να δούμε τι έστησα εγώ και για ποιούς λόγους.

Prowlarr: για index managing. Του σέτταρα 2 torrent providers και το συνέδεσα με το Radarr και το Sonarr.

Έτσι, τα δύο τελευταία μπορούν να αναζητούν releases στους indexers μέσω του Prowlarr και όταν βρουν αυτό που θέλουν, να στέλνουν το download στον qBittorrent client.

Radarr: για ταινίες. Αυτό ανέλαβε το κατέβασμα των metadata της υπάρχουσας συλλογής ταινιών και την αναζήτηση νέων ταινιών μέσω του Prowlarr. Στις ρυθμίσεις του μπορούμε να σεττάρουμε επιθυμητή ποιότητα, να αναζητήσουμε υπάρχουσες ταινίες ή ακόμα και να σεττάρουμε “wanted” όπου θα αναζητεί αυτόματα ταινίες που δεν υπάρχουν στους trackers μας ή ακόμα και ταινίες που δεν έχουν κυκλοφορήσει ακόμα. Όταν αυτές βρεθούν, το Radarr θα αναλάβει να τις κατεβάσει αυτόματα.

Sonarr αντίστοιχα με το Radarr, το Sonarr ανέλαβε την ίδια δουλειά για τις σειρές. Εδώ μπορούμε να ρυθμίζουμε και τις σεζόν ή τα επεισόδια που θέλουμε να κατεβάσουμε, να βάλουμε στο queue σειρές που παρακολουθούμε, ώστε να αρχίσουν να κατεβαίνουν τα επεισόδια της νέας σεζόν κοκ.

Bazarr: Τέλος, το Bazarr ήρθε να λύσει το θέμα των υποτίτλων. Του ρύθμισα providers και τη διασύνδεση με τα υπόλοιπα services. Έτσι όταν κατεβαίνει κάποια ταινία ή επεισόδιο σειράς, το Bazarr ξεκινά αυτόματα να αναζητά υπότιτλους στα ελληνικά, τους βαθμολογεί με ένα score στο οποίο συνυπολογίζει τα tags του κάθε release, κατεβάζει τον καταλληλότερο κι αν κρίνει πως χρειάζεται, τον συγχρονίζει αυτόματα χρησιμοποιώντας το εργαλείο ffsubsync.

Όπως καταλαβαίνει όποιος έχει προσπαθήσει να κατεβάσει υπότιτλους έστω και μία φορά, αυτό είναι δύσκολο sport. Από την ως τώρα εμπειρία μου όμως, μπορώ να πω πως το Bazarr τα καταφέρνει άψογα, με ένα ποσοστό επιτυχίας γύρω στο 92%. Ακόμα και για εκεί όμως υπάρχουν λύσεις, που είναι πέρα από τη θεματική αυτού του ποστ.

Και όλα αυτά τα εκθέτεις στο internet ρε ποντίκι;#

Αποφάσισα να μην το κάνω αυτό. Τα περισσότερα από τα services που περιγράφονται εδώ θα χρησιμοποιούνται αποκλειστικά από εμένα, με μοναδική εξαίρεση για το jellyfin. Για να αποφύγω λοιπόν τα αδιάκριτα βλέματα (αν και όλα τα services είναι password protected) και το μεγάλωμα του attack surface στο δίκτυό μου, αποφάσισα να τα κρατήσω όλα τοπικά.

Για να μπορούμε όμως (εγώ κι όσοι χρειαστεί) να έχουμε πρόσβαση από άλλα δίκτυα, έστησα μια vpn με WireGuard.

Για τη χρήση του qBittorrent όπως είπα νωρίτερα, εγκατέστησα το qBitController στο κινητό μου, ενώ για τη διαχείριση του arr stack, εγκατέστησα το Atrium.

Έτσι, όταν συνδέομαι μέσω vpn, έχω πρόσβαση σε όλα τα διαχειριστικά services καθώς και στο ίδιο το jellyfin για απομακρυσμένη παρακολούθηση.

“Πρέπει να χεις πυρετό, δεν μας διαφήμισες καθόλου το ntfy σ’ αυτό το ποστ”

ΛΟΙΠΟΝ ΞΕΧΑΣΑ! Όλες οι εφαρμογές του arr stack για τις οποίες σας μίλησα, προσφέρουν out of the box διασύνδεση με το ntfy! Προσωπικά όμως δεν το έχω κάνει, γιατί το qBitController στέλνει επίσης notifications όταν κατεβαίνει κάτι κι αυτό αρκεί για το workflow μου. :)

Μερικές παραλείψεις#

Δύο πράγματα που δεν ανέφερα νωρίτερα. Το arr stack έχει κι άλλες εφαρμογές, μια εκ των οποίων είναι σύστημα για recommendations, με το προφανές όνομα Recomendarr. Φυσικά υπάρχουν κι άλλες εναλλακτικές και γι’ αυτό (όπως το πιο actively maintained Sugestarr) αλλά και για τα υπόλοιπα services που έχω στήσει.

Ένα honourable mention ακόμα στην πειρατική μου φαρέτρα είναι το slskd, ένας client για το soulseek το οποίο δεν γνώριζα μέχρι πρότινος γιατί ζούσα κάτω από μια πέτρα. Αυτό το container επίσης περνάει μέσα από το network του gluetun.

Το τέλος του ποστ#

Κάπως έτσι λοιπόν, θα μπορούσε να στήσει κάποιος ένα πειρατικό media center που λίγα πράγματα θα είχε να ζηλέψει από μια πλατφόρμα streaming. Οκ, ίσως όχι “λίγα”, αλλά με την παρούσα κατάσταση στον κατακερματισμό ταινιών και σειρών, η πλάστιγγα ίσως να άρχιζε να γέρνει αρκετά προς την self-hosted πλευρά.

Ο,τι κι αν κάνετε, να θυμάστε πως οι εργάτες της τέχνης δεν πληρώνονται με τα μπράβο. Μην είστε τζαναμπέτηδες.