Ευρετήριο ημερολογίουDockup / σημείωση πεδίου
Note / self-host-freshrss

Πώς να κάνετε self-host το FreshRSS το 2026: Ανανέωση feeds, Mobile API και αντίγραφα ασφαλείας

Ένας πρακτικός οδηγός για self-hosting του FreshRSS, με Docker, ports, persistent data, TLS, ασφάλεια, αντίγραφα ασφαλείας και τα προβλήματα που εμποδίζουν τη χρήση σε production. Με ελέγχους.

Ένα αποτυχημένο deployment του FreshRSS δεν καταρρέει πάντα. Μπορεί να εμφανίζει σελίδα σύνδεσης, ενώ τα feeds δεν ανανεώνονται ποτέ επειδή το cron είναι απενεργοποιημένο ή το outbound DNS αποτυγχάνει. Ξεκινήστε αντί γι’ αυτό με έναν end-to-end έλεγχο: προσθέστε feeds, εκτελέστε μια προγραμματισμένη ανανέωση, σημειώστε ένα item ως αναγνωσμένο και συγχρονίστε αυτή την κατάσταση μέσω του mobile API.

Ο έλεγχος αυτός αντανακλά τον καταγεγραμμένο σκοπό του FreshRSS: self-hosted RSS reader με συμβατό mobile API. Παράλληλα, αποκαλύπτει νωρίτερα ελλιπείς dependencies, λανθασμένες παραδοχές για τον proxy και ephemeral data απ’ ό,τι ένα uptime probe.

Χαρτογραφήστε το FreshRSS πριν αγγίξετε το Docker

Διαχωρίστε τέσσερις περιοχές ευθύνης για το FreshRSS: ingress, τον listener στο 80, το durable state και τις supporting services ή την τοπική χωρητικότητα. Η εξωτερική απαίτηση του FreshRSS είναι η προγραμματισμένη ανανέωση των feeds και η outbound πρόσβαση στους feed hosts. Ελέγξτε το outbound DNS, το TLS και τη συμπεριφορά του provider χωρίς να δημοσιεύσετε άλλη inbound service.

Εκτελέστε τη γνωστή, επιτυχημένη συναλλαγή — προσθέστε feeds, εκτελέστε μια προγραμματισμένη ανανέωση, σημειώστε ένα item ως αναγνωσμένο και συγχρονίστε αυτή την κατάσταση μέσω του mobile API — πριν θεωρήσετε ολοκληρωμένο αυτόν τον διαχωρισμό. Μετρήστε το πλήθος των feeds, το διάστημα ανανέωσης, τους αργούς publishers, τα database writes και τους ταυτόχρονους API clients και αποθηκεύστε το αποτέλεσμα μαζί με το deployment record. Παρέχει τόσο ένα acceptance criterion όσο και το πρώτο capacity baseline.

Δημιουργήστε αντίγραφα ασφαλείας για το state που δεν μπορεί να αναδημιουργήσει το FreshRSS

Δημιουργήστε ένα recovery manifest για το FreshRSS: data, extensions και την επιλεγμένη database. Κάντε mount το /var/www/FreshRSS/data πριν από το bootstrap, γράψτε harmless sample data και αντικαταστήστε το container, ώστε να αποδείξετε ότι το συγκεκριμένο path είναι πράγματι persistent. Ελέγξτε τώρα τα permissions και τον διαθέσιμο χώρο, επειδή ένα mounted path χωρίς δικαιώματα εγγραφής συμπεριφέρεται σαν να μην υπάρχει καθόλου persistence.

Αποθηκεύστε τα backups σε failure domain ξεχωριστό από τον server που εκτελείται. Αναδημιουργήστε το FreshRSS από το pinned image και επαληθεύστε ότι επιστρέφουν τα subscriptions, οι κατηγορίες, το read state, τα φίλτρα και τα extensions και ότι η προγραμματισμένη ανανέωση ανακτά ένα νέο item. Ο οδηγός persistent volumes βοηθά να μετατρέψετε αυτή την άσκηση σε πολιτική για snapshots και retention.

Επιλέξτε το trust boundary του FreshRSS

Κάντε threat modeling για την ενέργεια που εκτελεί το FreshRSS και όχι μόνο για τη φόρμα σύνδεσης. Εδώ, το πιο επικίνδυνο λάθος είναι να παραμείνει προσβάσιμο το αρχικό setup ή ο default user σε public host. Υλοποιήστε αυτό το boundary: ολοκληρώστε το setup ιδιωτικά, προστατέψτε τα API passwords και ρυθμίστε τους trusted proxies πριν ενεργοποιήσετε το mobile synchronization.

Το CRON_MIN ελέγχει τη συμπεριφορά και όχι την εμπιστευτικότητα· επικυρώστε τον τύπο και την τιμή του και αποθηκεύστε τα πραγματικά FreshRSS credentials ξεχωριστά. Μην επιλύετε ένα permission error εκτελώντας το container ως root ή κάνοντας ευρύ mount του host. Τα resource limits ανήκουν επίσης στον σχεδιασμό ασφαλείας, όταν οι χρήστες μπορούν να επηρεάσουν το πλήθος των feeds, το διάστημα ανανέωσης, τους αργούς publishers, τα database writes και τους ταυτόχρονους API clients.

Τι πρέπει να περάσει πριν φτάσουν πραγματικά δεδομένα στο FreshRSS

Μετατρέψτε το smoke test του FreshRSS σε repeatable release command ή σε ένα σύντομο runbook. Το output του πρέπει να αποδεικνύει το εξής αποτέλεσμα: προσθήκη feeds, εκτέλεση προγραμματισμένης ανανέωσης, σημείωση ενός item ως αναγνωσμένου και συγχρονισμός αυτής της κατάστασης μέσω του mobile API. Καταγράψτε μαζί με το αποτέλεσμα την έκδοση της εφαρμογής, το container digest, το route hostname και το test-data identifier.

Εκτελέστε τον ίδιο έλεγχο μετά από μια routine αντικατάσταση container και μετά την επαναφορά των data, extensions και της επιλεγμένης database σε άλλο περιβάλλον. Το restore έχει πετύχει όταν επιστρέφουν τα subscriptions, οι κατηγορίες, το read state, τα φίλτρα και τα extensions και η προγραμματισμένη ανανέωση ανακτά ένα νέο item. Συγκρίνετε τον χρόνο και την κατανάλωση που σχετίζονται με το πλήθος των feeds, το διάστημα ανανέωσης, τους αργούς publishers, τα database writes και τους ταυτόχρονους API clients· μια μεγάλη αλλαγή αξίζει διερεύνηση ακόμη κι όταν η τελική ενέργεια εξακολουθεί να περνά.

Στη συνέχεια, δοκιμάστε ένα ασφαλές failure: αρνηθείτε προσωρινά την πρόσβαση στο test path που χρησιμοποιείται για την προγραμματισμένη ανανέωση των feeds και για την outbound πρόσβαση στους feed hosts. Επιβεβαιώστε ότι το FreshRSS εμφανίζει το σφάλμα και επιστρέφει κανονικά χωρίς καταστροφικές manual αλλαγές. Διατηρήστε μόνο το απαραίτητο, redacted απόσπασμα του log. Αυτό το τετραμερές gate καλύπτει το startup, το persistence, το recovery και το failure handling.

Ένα Docker baseline για το FreshRSS

Ένα launch προσαρμοσμένο σε production είναι σκόπιμα απλό: named state, explicit port και κανένα secret μέσα στο image.

docker run -d \
  --name freshrss \
  --restart unless-stopped \
  -p 127.0.0.1:80:80 \
  -v freshrss-data:/var/www/FreshRSS/data \
  -e CRON_MIN=15 \
  freshrss/freshrss:latest

Το παράδειγμα αποτελεί baseline και όχι ολοκληρωμένο supporting stack. Επιτρέψτε και επαληθεύστε το outbound ή client-side path που απαιτείται για την προγραμματισμένη ανανέωση των feeds και την outbound πρόσβαση στους feed hosts. Ελέγξτε τα effective mounts και τον listener και, στη συνέχεια, δοκιμάστε να προσθέσετε feeds, να εκτελέσετε μια προγραμματισμένη ανανέωση, να σημειώσετε ένα item ως αναγνωσμένο και να συγχρονίσετε αυτή την κατάσταση μέσω του mobile API. Κάντε pin το working image πριν από την επόμενη επανεκκίνηση.

Μην αφήνετε την επιτυχία του proxy να κρύβει την αποτυχία της εφαρμογής

Ο browser, ο API client και το FreshRSS πρέπει να συμφωνούν σε ένα origin. Για να το πετύχετε, δηλώστε τους trusted proxies και το canonical HTTPS base. Διατηρήστε το αρχικό host και protocol, κρατώντας παράλληλα το port 80 μη διαθέσιμο ως ανταγωνιστική public address.

Ο οδηγός αντιμετώπισης προβλημάτων για site που δεν είναι διαθέσιμο βοηθά να ξεχωρίσετε ένα unreachable route από μια εφαρμογή που αποκρίνεται. Η διάκριση αυτή έχει σημασία εδώ: τα feeds δεν ανανεώνονται ποτέ επειδή το cron είναι απενεργοποιημένο ή το outbound DNS αποτυγχάνει. Μόνο το πρώτο διορθώνεται με αλλαγές στο ingress· το δεύτερο απαιτεί έλεγχο των FreshRSS logs, του state ή του workload.

Παρακολουθείτε το workload και όχι μόνο το container

Παρακολουθείτε την εργασία που εκτελεί το FreshRSS: το πλήθος των feeds, το διάστημα ανανέωσης, τους αργούς publishers, τα database writes και τους ταυτόχρονους API clients. Ορίστε limits με headroom για αυτή την εργασία και αποφύγετε ένα liveness probe που ανταγωνίζεται το workload. Ο operator check πρέπει και πάλι να επιχειρεί να προσθέσει feeds, να εκτελεί μια προγραμματισμένη ανανέωση, να σημειώνει ένα item ως αναγνωσμένο και να συγχρονίζει αυτή την κατάσταση μέσω του mobile API σε τακτά διαστήματα.

Για τα updates, θυμηθείτε ότι τα extensions, τα database migrations και οι αλλαγές στον feed parser μπορούν να επηρεάσουν τις ανανεώσεις, ακόμη κι όταν το login εξακολουθεί να λειτουργεί. Κάντε deploy το candidate απέναντι σε ένα recovered copy και επαναλάβετε το γνωστό test. Αν τα feeds δεν ανανεώνονται ποτέ επειδή το cron είναι απενεργοποιημένο ή το outbound DNS αποτυγχάνει, χρησιμοποιήστε τα runtime logs και το πραγματικό network request για να εντοπίσετε ποια παραδοχή άλλαξε.

Μεταφέρετε το repeatable infrastructure work στο Dockup

Το one-click deployment του FreshRSS από το Dockup πρέπει να κάνει την αντικατάσταση ασφαλή: το route εξακολουθεί να δείχνει στο 80, τα secrets δεν είναι baked μέσα στο image και τα persistent paths επιστρέφουν στο νέο container. Το ίδιο deployment μπορεί να εκτελείται σε Dockup compute ή σε attached machine.

Ολοκληρώστε τη δουλειά που αφορά ειδικά την εφαρμογή, επιτρέποντας και επαληθεύοντας την προγραμματισμένη ανανέωση των feeds και την outbound πρόσβαση στους feed hosts, εφαρμόζοντας την canonical public address και εκτελώντας αυτόν τον acceptance check: προσθέστε feeds, εκτελέστε μια προγραμματισμένη ανανέωση, σημειώστε ένα item ως αναγνωσμένο και συγχρονίστε αυτή την κατάσταση μέσω του mobile API. Προσθέστε το αποτέλεσμα του restore στο runbook πριν φτάσουν οι πραγματικοί χρήστες.

Συχνές ερωτήσεις

Τι χρειάζεται το FreshRSS για deployment σε production;

Δρομολογήστε το FreshRSS container στο port 80 μέσω ενός HTTPS origin. Η εξωτερική απαίτηση παράδοσης είναι η προγραμματισμένη ανανέωση των feeds και η outbound πρόσβαση στους feed hosts. Μην θεωρήσετε το FreshRSS έτοιμο μέχρι να μπορείτε να προσθέσετε feeds, να εκτελέσετε μια προγραμματισμένη ανανέωση, να σημειώσετε ένα item ως αναγνωσμένο και να συγχρονίσετε αυτή την κατάσταση μέσω του mobile API.

Ποια δεδομένα του FreshRSS πρέπει να περιλαμβάνονται σε backup;

Κάντε persist το /var/www/FreshRSS/data και συμπεριλάβετε τα data, τα extensions και την επιλεγμένη database στο ίδιο recovery manifest. Ένα καθαρό FreshRSS restore θεωρείται επιτυχημένο μόνο όταν επιστρέφουν τα subscriptions, οι κατηγορίες, το read state, τα φίλτρα και τα extensions και η προγραμματισμένη ανανέωση ανακτά ένα νέο item.

Απαιτεί το FreshRSS HTTPS πίσω από reverse proxy;

Χρησιμοποιήστε HTTPS για το public FreshRSS origin και διατηρήστε το port 80 στο internal route. Εφαρμόστε σωστά τη ρύθμιση του FreshRSS: δηλώστε τους trusted proxies και το canonical HTTPS base. Για το FreshRSS, το HTTPS προστατεύει τα credentials ή το περιεχόμενο των χρηστών κατά τη μεταφορά και διατηρεί συνεπή τη συμπεριφορά των clients που εξαρτάται από το origin.

Πώς πρέπει να δοκιμάζεται ένα upgrade του FreshRSS;

Κάντε restore το τρέχον FreshRSS state σε ένα isolated deployment, εφαρμόστε την candidate έκδοση και επαναλάβετε το acceptance transaction. Δώστε ιδιαίτερη προσοχή, επειδή τα extensions, τα database migrations και οι αλλαγές στον feed parser μπορούν να επηρεάσουν τις ανανεώσεις, ακόμη κι όταν το login εξακολουθεί να λειτουργεί. Διατηρήστε το προηγούμενο FreshRSS image μέχρι να κατανοήσετε το όριο των data migrations και του rollback.