Matrix homeserver

Εδώ και μία εβδομάδα έχω στήσει στο Raspberry Pi4 ένα matrix server στο σπίτι. Πάνω του έχω βάλει τα εξής bridges που παίζουν όλα μια χαρά:

  • Facebook Messenger
  • Telegram
  • WhatsApp
  • Skype
  • Discord - περίπλοκο, καθώς θέλει κ αυτό να σηκώσετε κάποιο app.
  • IRC
  • Slack – αρκετά περίπλοκο, πρέπει να είστε admin στο slack channel που θέλετε να κάνετε bridge ή να σας επιτρέψουν να σηκώσετε ένα app με συγκεκριμένα permissions.

Μου πήρε περίπου 2 εβδομάδες διαβάσματος και πειραματισμού, και νομίζω τελικά βρήκα τον πιο απλό τρόπο, ο οποίος είναι plug-n-play χρησιμοποιώντας ένα ansible playbook που έχει γράψει ένας developer: https://github.com/spantaleev/matrix-docker-ansible-deploy

Το καλύτερο είναι να το στήσετε πάνω σε κάποιο cloud VPS, έτσι θα έχετε αρκετά μεγάλο internet bandwidth και δεν θα εξαρτάστε από την ταχύτητα της DSL του σπιτιού σας, καθώς επίσης δεν θα σας απασχολεί το θέμα ρύθμισης του NAT στο router και όλες οι ρυθμίσεις για να βλέπει το domain την dynamic IP σας, γίνονται αρκετά απλούστερες. Στην περίπτωση που το στήσετε με αυτό τον τρόπο, επιλέξετε έναν server που βρίσκεται στην ίδια γεωγραφική θέση με εσάς, διότι μερικά messenger apps (πχ το Facebook Messenger) θα γκρινιάζει ότι κάποιος από περιέργη τοποθεσία θέλει να συνδεθεί στον λογαριασμό σας.

Αν πάλι θέλετε να το στήσετε στο σπίτι, τότε να έχετε υπόψην σαν ότι επειδή αλλάζει η IP διεύθυνση που έχετε, θα πρέπει να στήσετε κάποιο DynDNS service. Αυτό μπορεί να γίνει απευθείας στο router σας (αν διαθέτει τέτοια δυνατότητα) – όμως θα είστε περιορισμένοι στα συγκεκριμένα DynDNS services που υποστηρίζει το router σας. Εγώ θα σας πρότεινα να κάνετε το εξής:

  • Αγοράστε ένα domain
  • Κάνε έναν δωρεάν λογαριασμό στην CloudFlare
  • Τρέξτε κάπου στο σπίτι σας το https://hub.docker.com/r/oznu/cloudflare-ddns/ το οποίο θα συχρονίζει το A Record του domain σας να βλέπει πάντα την IP σας στο σπίτι.

Το πλεονάκτημα στήνοντας το σπίτι σας είναι σίγουρο ότι έχετε τα δεδομένα σας στο σπίτι σας ;)

Να σημειώσω εδώ ότι το free cloudflare προσφέρει και proxy dns, το οποίο είναι πολύ καλό για δύο λόγους:

  1. Κρύβει την IP του σπιτιού σας (δηλαδή αν κάποιος κάνει nslookup domain.com τότε δεν θα δείξει την IP του σπιτιού σας, αλλά μία obfuscated IP του cloudflare.
  2. Παίρνετε τζάμπα DDoS protection και άλλα καλά.

Βέβαια η διαδικασία σεταρίσματος του ansible playbook θα σας δυσκολέψει λίγο, γιατί επειδή το playbook τα κάνει όλα αυτόματα για εσάς, δεν γνωρίζει ότι εσείς χρησιμοποιείτε το cloudflare. Το πρόβλημα είναι μόνο στην περίπτωση όπου θέλετε να χρησιμοποιήσετε το proxy feature του clouflare, καθώς για αυτή τη περίπτωση θα χρειαστείτε τα δικά του SSL certificates, οπότε σε αυτή τη περίπτωση θα πρέπει να τακτοποιήσετε μόνοι σας – όχι ότι είναι κάτι δύσκολο. Διαφορετικά, μπορείτε να χρησιμοποιήσετε το cloudflare σε απλό DNS mode, και όχι proxy – σε αυτή τη περίπτωση δε χρειάζεται να αλλάξετε τίποτα στο playbook.

Στην περίπτωση που ο ISP σας μπλοκάρει public IP και πόρτες, τότε μπορείτε να κάνετε το εξής: να σηκώσετε το πιο φθηνό VPS/droplet σε κάποιο cloud και εκεί να σετάρετε ένα VPN server (είτε openVPN είτε wireguard). Το πρώτο έχει μεγάλη compatibility και το δεύτερο είναι αρκετά πιο γρήγορο – οπότε δείτε τι σας βολεύει και προτιμήστε. Με αυτή τη λύση, μπορείτε να κάνετε συνδέσετε το μηχάνημα στο σπίτι σας (αυτό που τρέχει το matrix) στον VPN server σας, όπου εκεί θα μπορείτε να κάνετε portforward ότι θέλετε, και δεν θα έχει ιδέα o ISP σας.

Σε κάθε περίπτωση καλό θα είναι να κάνετε κάποιες βασικές ρυθμήσεις ασφαλείας στον server που θα τρέχει το matrix, όπως ssh σε άλλη πόρτα (σε αυτή τη περίπτωση θα πρέπει να ρυθμίσετε το ansible να συνδέεται σε αυτήν), όχι root, login μόνο σε συγκεκριμένο χρήστη, disable τα password authentication και enable μόνο τα key-based, firewall ports, αυτόματα updates, κλπ. Μην είστε όμως υπερβολικοί, πχ σε κάποια φάση είχα ενεργοποιήσει μόνο TLS 1.3 με αποτέλεσμα να μην μπορεί να συνδεθεί κανένας σε μένα, καθώς είναι αρκετά καινούριο και δεν το χρησιμοποιούν πολλοί. Οπότε έβαλα σαν minimum TLS 1.2 – διαφορετικά δεν δούλευε το federation :P

Το ansible playbook σας ρυθμίζει τα πάντα, το federation καθώς επίσης και τα bridges. Οπότε εκμεταλλευτείτε το και μην το κάνετε manually. Επίσης λαμβάνει υπόψην του την μελλοντική αναβάθμιση αυτών. Επίσης επειδή τρέχουν όλα σε docker, είναι εύκολο να τα αφαιρέσετε χωρίς να “μολύνει” το σύστημά σας ή να το αφήσει σε “περίεργο” state. Βάζει τα πάντα στο /matrix directory.

Αν το κάνετε σε Raspberry να ξέρετε ότι τα περισσότερα images του playbook παίζουν σε AMD64 αρχιτεκτονική. Για τα υπόλοιπα κατεβάζει το git repo και κάνει build. Αυτό δεν είναι ενερογποιημένο σε όλα τα bridges, αλλά στέλνω PRs για να το φτιάξω να παίζουν όλα.

Η εμπειρία μου δουλεύει άψογα. Με όλα αυτά τα bridges θέλει περίπου 1.5GB RAM. πχ ένα VPS από την Hetzner με 2 CPU και 4GB RAM είναι μια χαρά.

Σε κάθε περίπτωση ΜΗΝ τρέξετε τον δικό σας Jitsi Server καθώς θέλετε πολύ δυνατό PC.

ΥΣ: Αν θέλετε αναλυτικές οδηγίες, θα προσπαθήσω να βρω χρόνο να το κάνω.

8 Likes

μπορεί εγώ να έχω πολλές άγνωστες λέξεις αλλά ευχαριστώ για την ιδέα. όμως γιατί να θέλω μία τέτοια αυτονόμηση, ποια τα οφέλη? (δεν γνωρίζω) :)

Πρόχειρα, κάποιες σκέψεις που μου έρχονται στο μυαλό:

Το πρώτο είναι από άποψη ιδιωτικότητας των δεδομένων σου. Ο server τρέχει σπίτι σου και το όλο δίκτυο χρησιμοποιεί κρυπτογράφηση (E2E). Βέβαια θα μπορούσες να χρησιμοποιήσεις μία οποιαδήποτε άλλη instance αντί να φτιάξεις την δική σου στο σπίτι (πχ @matrix.org – η συγκεκριμένη θα σταματήσει να δέχεται registrations γιατί γέμισε), αλλά εξακολουθούν να βλέπουν την IP σου, το email σου, σε ποια chatrooms μιλάς, πόση ώρα μιλάς κλπ (σε καμιά περίπτωση δεν βλέπουν όμως τις συνομιλίες).

Το δεύτερο είναι για να τρέχεις όλα τα chat σου στην ίδια εφαρμογή (ένα κοινό μέρος) και να μην έχεις 5-6 διαφορετικά applications. πχ ανοίγω το element στο κινητό και μέσα σε αυτό παίρνω μυνήματα από το facebook, το telegram, whatsapp και άλλα, χωρίς να έχω τις επημέρους αυτές εφαρμογές εγκατεστημένες στο κινητό μου.

Το τρίτο είναι για να βοηθήσεις το δίκτυο του matrix.org. Οι περισσότεροι κάνουν register στο matrix.org server το οποίο έχει γονατίσει και θα σταματήσουν να δέχονται registrations φέτος το 2021 κάποια στιγμή. Οπότε το να έχεις ο καθένας δικό του server είναι σηματικό για αυτούς. Επειδή είναι όμως τεχνικά δύσκολο για τον μέσο χρήστη, προσπαθούν να βρουν μία λύση peer-to-peer όπου θα τρέχει ο server στον browser. Για την ώρα όμως δεν είναι “σταθερή” μία τέτοια υλοποίηση. Ωστόσο με το ansible playbook και ένα VPS η όλη διαδικασία είναι περίπου 5 clicks γι αυτό και την προτείνω.

Το τέταρτο είναι για καθαρά για τις γνώσεις που θα πάρεις κάνοντας ένα στήνοντας ένα τέτοιο πράγμα.

ΥΣ: Οπου χρησιμοποιήσα το ρήμα “μιλάς” εννούσα “γράφεις”/πληκτρολογείς. Οχι audio δηλαδή.

5 Likes

Καταρχήν ευχαριστούμε πολύ για την …περιήγηση!
Είναι κάτι που από καιρό σκέφτομαι να κάνω, αλλά με σταματάει ένα μόνο πράμα: το viber… Πρέπει να μαστε από τις λίγες χώρες στον κόσμο που σε τόσο μεγάλο ποσοστό χρησιμοποιεί viber…

2 Likes

Όποτε βρεις τον χρόνο εννοείται μας ενδιαφέρει το όλο στήσιμο και είναι και πολύ επίκαιρο.

Αρκετές κινηματικές ομάδες θα ήθελαν να στήσουν το δικό τους και να κάνουν federation με τις υπόλοιπες και όλο αυτό να λειτουργεί ανεξάρτητα.

1 Like

Ο εύκολος τρόπος για κάποιον τελείως άσχετο με το αντικείμενο που θέλει να το στησει εύκολα αλλά και να μην ασχοληθεί στην πορεία (να γίνεται update μόνο του) τότε η καλύτερη λύση είναι το cloudron. Για την ώρα δουλεύει μόνο σε 64-bit αρχιτεκτονική, οπότε δεν μπορείς να το στήσεις σε κάποιο Raspberry Pi.

  1. Αγόρασε ένα domain
  2. Φτιάξε ένα account στο Clouflare (δωρεάν)

Διάλεξε αν θες να στήσεις τον server στο σπίτι σου ή σε κάποιο VPS (πχ Hetzner ή DigitalOcean ή AWS ή ό,τι άλλο θες, το κόστος είναι περίπου 6 ευρώ το μήνα για 2 cores, 4GB ram).

Αν το στήσεις στο σπίτι σου, θα πρέπει να φροντίσεις να ενημερώνεις το CloudFlare καθε φορά που αλλάζει η IP διεύθυνση στο σπίτι σου. Αυτό το κάνει αυτόματα το cloudron. Απλά θα πρέπει να έχεις κατά νου οτι αν είναι αργό το ιντερνετ σου ή αν πέφτει συχνά, τότε θα έχεις πρόβλημα.

  1. Στήσε το cloudron στον server σου. 1-2 εντολές είναι όλο και όλο. Μετά θα σου δώσει ένα user interface να εγκαταστήσεις εφαρμογές, όπως το Matrix Cloudron - Install Matrix Synapse - Secure & decentralized communication – αλλά μην το κάνεις ακόμα.

  2. Πανε στα settings του domain και και πρόσθεσε τα nameservers του Cloudflare, έτσι ώστε το cloudflare να ελέγχει τα DNS, subdomains, κλπ. (πχ για να σου φτιάξει αυτόματα το matrix.yourdomain.com)

  3. Κάνε κλικ να εγκαταστασήσεις το matrix. Αυτό ήταν. Σου ρυθμίζει αυτόματα το federation. Τώρα παίζει, και θα γίνεται αυτόματα update.

ΥΣ: Το cloudron υποστηρίζει δωρεάν μέχρι 2 apps. Οπότε δεν χρειάζεται να πληρώσεις κάτι. Ασε δε που μπορείς να βάλεις και το Cloudron - Install Element - Liberate your communication για να μπαίνεις και από τον browser αν θες να κάνεις chat.

Η όλη διαδικασία παίρνει περίπου μισή μέρα αν είσαι τελείως άσχετος. Διαφορετικά είναι γύρω στη μία ώρα.

Τώρα, αν είσαι σχετικός και θες να πειράξεις αρκετά τον matrix σερβερ σου ώστε να μπορεί να μιλάει με facebook, whatsup, telegram, και άλλα διάφορα, τότε το cloudron δεν σε καλύπτει. Θέλει να το στήσεις μόνος σου. Αλλά υπάρχει ένα υπερ-τρέλειο ansible playbook που το στήνει αυτόματα για σένα. Το έχω δοκιμάσει και παίζει μια χαρά. Μάλιστα έχω κάνει port και διαφορα plugins να παίζουν σε raspberry pi – τα τέσταρα και έγραψα και τον κώδικα για αυτά. Εκεί πέρα πας στο github. Ξεκινάς από εδώ: matrix-docker-ansible-deploy/prerequisites.md at master · spantaleev/matrix-docker-ansible-deploy · GitHub

ΥΣ: Προσωπικά επέλεξα να τον cloudron τρόπο γιατί δεν θέλω να ασχολούμαι όλη την ώρα το maintainance του server. Πραγματικά δεν βλέπω τον λόγο να μην το κάνουν ΟΛΟΙ αυτό. Κάθε άνθρωπος μπορεί να έχει δωρεάν (μόνο για το domain θα πληρώσει, πχ 2 ευρώ το χρόνο είναι το πιο φθηνό που νπορείς να βρεις) τον δικό του federated matrix server.

Εγω έφτιαξα μερικά δωμάτια στον server και κάλεσα φίλους και συγγενείς.

2 Likes

Mια ευκολη λυση πρεπει να ειναι και το freedombox αλλά δεν το εχω δοκιμασει ο ιδιος…

1 Like