SSD Nodes Learn 8GB RAM — $66/साल
गाइड Matt Connorलेखक: Matt Connor · अपडेट किया गया: 2026-08-01

Ubuntu VPS पर FreshRSS कैसे इंस्टॉल करें

Ubuntu 24.04 VPS पर Apache, PHP और MariaDB के साथ FreshRSS सेटअप करें। इस गाइड में release tarball, virtual host कॉन्फ़िगरेशन, cron job और मोबाइल API की समस्याओं का समाधान शामिल है।

आप क्या बना रहे हैं

सेल्फ-होस्टेड RSS रीडर एक ऐसा फीड रीडर है जो आपके अपने सर्वर पर चलता है, इसलिए कोई भी इसे बंद नहीं कर सकता और न ही यह बदल सकता है कि यह आपको क्या दिखाता है। यह गाइड Ubuntu 24.04 VPS पर FreshRSS को स्थापित करती है: सामने Apache, पीछे PHP, स्टोरेज के लिए MariaDB, और एक cron job जो नए लेखों को फेच करती है। RSS (Really Simple Syndication) वह फ़ाइल प्रारूप है जिसे कोई साइट प्रकाशित करती है ताकि सॉफ़्टवेयर उसके लेखों को पढ़ सके। FreshRSS वह PHP एप्लिकेशन है जो उन फ़ाइलों को एकत्र करता है, लेखों को सुरक्षित रखता है, और आपको एक वेब इंटरफ़ेस के साथ-साथ एक API (Application Programming Interface) प्रदान करता है जिसका उपयोग फ़ोन ऐप्स करते हैं।

इंस्टॉलेशन छोटा है: एक release को अनपैक करें, एक डेटाबेस बनाएं, एक virtual host लिखें, और एक कमांड लाइन इंस्टॉलर चलाएं। नीचे दिया गया अधिकांश कार्य वह हिस्सा है जिसे लोग बाद में गलत करते हैं, जो कि रिफ्रेश जॉब, मोबाइल API के लिए एन्कोडेड slashes, और फ़ाइल ओनरशिप है।

जुलाई 2026 तक FreshRSS 1.29.1 वर्तमान release है, और इसे PHP 8.1 या उससे नए संस्करण की आवश्यकता है। Ubuntu 24.04 में PHP 8.3 शामिल है, इसलिए डिस्ट्रीब्यूशन पैकेज पर्याप्त हैं और आपको किसी थर्ड-पार्टी PHP रिपॉजिटरी की आवश्यकता नहीं है।

LAMP स्टैक से शुरुआत करें

FreshRSS एक सामान्य PHP एप्लिकेशन है, इसलिए इसे किसी अन्य एप्लिकेशन की तरह ही आधार की आवश्यकता होती है। यदि आपने अभी तक वह आधार तैयार नहीं किया है, तो पहले Ubuntu 24.04 के लिए LAMP स्टैक सेटअप का पालन करें और फिर यहाँ वापस आएं। संक्षिप्त संस्करण:

sudo apt update
sudo apt install -y apache2 mariadb-server php libapache2-mod-php
sudo systemctl enable --now apache2 mariadb

systemctl status apache2 को active (running) रिपोर्ट करना चाहिए। यदि Apache शुरू नहीं होता है, तो इसका सामान्य कारण यह है कि कोई अन्य प्रक्रिया पहले से ही port 80 का उपयोग कर रही है, और sudo ss -ltnp | grep :80 उसका नाम बता देगा।

FreshRSS के लिए आवश्यक PHP एक्सटेंशन

FreshRSS के लिए libxml, cURL, JSON, PDO_MySQL, PCRE और ctype अनिवार्य हैं। इसके अलावा, इसे mbstring, iconv, Zlib और ZipArchive की भी आवश्यकता होती है, और 32-bit सिस्टम पर GMP की आवश्यकता होती है। Ubuntu पर ये डिस्ट्रीब्यूशन पैकेज के रूप में उपलब्ध होते हैं:

sudo apt install -y php-curl php-mbstring php-xml php-zip php-mysql php-intl php-gmp
sudo systemctl restart apache2

PHP ने वास्तव में क्या लोड किया है, यह जांचने के लिए php -m का उपयोग करें। कोई एक्सटेंशन गायब होने पर इंस्टॉलर शुरू होने से नहीं रुकता है। यह आवश्यकताओं वाली स्क्रीन पर एक लाल रेखा के साथ रुक जाता है जिसमें उस एक्सटेंशन का नाम होता है, जो समस्या का पता लगाने के लिए एक भ्रमित करने वाली जगह है, इसलिए अभी पुष्टि कर लें। Apache को रीस्टार्ट करना महत्वपूर्ण है क्योंकि libapache2-mod-php PHP को Apache प्रक्रिया के भीतर रखता है, इसलिए नया इंस्टॉल किया गया एक्सटेंशन तब तक वेब सर्वर को दिखाई नहीं देता जब तक कि वह रीस्टार्ट न हो जाए।

रिलीज डाउनलोड करें

FreshRSS को डिफ़ॉल्ट वेब रूट के बाहर इंस्टॉल करें और Apache को इसकी ओर निर्देशित करें। एप्लिकेशन डायरेक्टरी को डॉक्यूमेंट रूट से अलग रखने का अर्थ है कि केवल public फ़ोल्डर ही HTTP के माध्यम से एक्सेस किया जा सकता है।

cd /tmp
curl -fsSLO https://github.com/FreshRSS/FreshRSS/archive/refs/tags/1.29.1.tar.gz
tar xzf 1.29.1.tar.gz
sudo mv FreshRSS-1.29.1 /srv/freshrss

अब अनुमतियों (permissions) की बात करते हैं, जिन्हें लेकर FreshRSS का डॉक्यूमेंटेशन बहुत सख्त है: वेब सर्वर उपयोगकर्ता के पास पूरी ट्री का स्वामित्व होना चाहिए, समूह (group) प्रत्येक फ़ाइल को पढ़ सकता है, और समूह ./data/ में लिख सकता है।

sudo chown -R www-data:www-data /srv/freshrss
sudo chmod -R g+r /srv/freshrss
sudo chmod -R g+w /srv/freshrss/data

यदि आप इसे छोड़ देते हैं, तो इंस्टॉलर अपना कॉन्फ़िगरेशन लिखते समय विफल हो जाएगा, क्योंकि PHP www-data के रूप में चलता है और www-data रूट (root) के स्वामित्व वाली डायरेक्टरी में नहीं लिख सकता है।

डेटाबेस बनाना

FreshRSS, SQLite, MariaDB, MySQL और PostgreSQL का समर्थन करता है। SQLite के लिए किसी सेटअप की आवश्यकता नहीं है और यह एक व्यक्ति के लिए कुछ सौ फ़ीड्स के साथ ठीक काम करता है। जब कई लोग एक ही इंस्टेंस का उपयोग करते हैं, तो MariaDB एक बेहतर विकल्प है, क्योंकि रिफ्रेश जॉब और वेब इंटरफ़ेस से होने वाले समवर्ती (concurrent) राइट्स अब एक ही फ़ाइल लॉक के लिए संघर्ष नहीं करते हैं।

sudo mariadb -e "CREATE DATABASE freshrss CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mariadb -e "CREATE USER 'freshrss'@'localhost' IDENTIFIED BY 'ReplaceThisPassword';"
sudo mariadb -e "GRANT ALL PRIVILEGES ON freshrss.* TO 'freshrss'@'localhost';"
sudo mariadb -e "FLUSH PRIVILEGES;"

utf8mb4 का उपयोग करें, न कि utf8 का। फ़ीड्स में इमोजी और गैर-लैटिन लिपियाँ होती हैं, और पुराना तीन-बाइट वाला utf8 एन्कोडिंग पहले चार-बाइट वाले कैरेक्टर पर ही लेख के शीर्षक को काट देता है।

Apache वर्चुअल होस्ट

पब्लिक डायरेक्टरी p/ है, न कि ट्री का शीर्ष। बाकी सब कुछ, जिसमें आपके डेटाबेस पासवर्ड वाली कॉन्फ़िगरेशन फ़ाइल भी शामिल है, डॉक्यूमेंट रूट के ऊपर स्थित है जहाँ से Apache इसे कभी भी सर्व नहीं करेगा।

<VirtualHost *:80>
	ServerName rss.example.com
	DocumentRoot /srv/freshrss/p/

	<Directory /srv/freshrss/p>
		AllowOverride AuthConfig FileInfo Indexes Limit
		Require all granted
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/freshrss_error.log
	CustomLog ${APACHE_LOG_DIR}/freshrss_access.log combined

	AllowEncodedSlashes On
</VirtualHost>

इसे /etc/apache2/sites-available/freshrss.conf के रूप में सेव करें और इसे इनेबल करें:

sudo a2enmod rewrite
sudo a2ensite freshrss
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2

configtest को Syntax OK प्रिंट करना चाहिए। AllowEncodedSlashes On वैकल्पिक लग सकता है लेकिन यह नहीं है: Google Reader API ऐसे फ़ीड आइडेंटिफ़ायर भेजता है जिनमें %2F होता है, और इस डायरेक्टिव के बिना Apache उन्हें रिजेक्ट कर देता है, जिससे मोबाइल ऐप्स सिंक होने में विफल हो जाते हैं जबकि वेब इंटरफ़ेस पूरी तरह से काम करता है।

लॉग इन करने से पहले HTTPS जोड़ें

आप इस साइट पर पासवर्ड टाइप करने वाले हैं, इसलिए पहले एक सर्टिफिकेट प्राप्त करें। सर्वर पर एक A रिकॉर्ड पॉइंट करें, फिर Ubuntu पर Apache के लिए Certbot सेटअप का पालन करें और sudo certbot --apache -d rss.example.com रन करें। Certbot पोर्ट 443 के लिए वर्चुअल होस्ट को रीराइट करता है और रीडायरेक्ट जोड़ता है। curl -I https://rss.example.com/ के साथ पुष्टि करें, जिसे 200 या लॉग इन पेज पर रीडायरेक्ट वापस करना चाहिए।

कमांड लाइन से इंस्टॉलर चलाएं

FreshRSS में एक ब्राउज़र इंस्टॉलर उपलब्ध है, लेकिन कमांड लाइन संस्करण को दोहराया जा सकता है और यह आपके द्वारा चुने गए विकल्पों का सटीक रिकॉर्ड रखता है।

sudo -u www-data php /srv/freshrss/cli/do-install.php \
  --default-user admin --auth-type form --environment production \
  --base-url https://rss.example.com --language en --api-enabled \
  --db-type mysql --db-host localhost --db-user freshrss \
  --db-password 'ReplaceThisPassword' --db-base freshrss
sudo -u www-data php /srv/freshrss/cli/create-user.php \
  --user admin --password 'a-long-passphrase' --api-password 'a-different-passphrase'

दोनों कमांड को www-data के रूप में चलाएं। इन्हें root के रूप में चलाने से ऐसी कॉन्फ़िगरेशन फ़ाइलें बनती हैं जिनका स्वामी root होता है, और बाद में वेब इंटरफ़ेस कोई भी सेटिंग सहेजने में विफल हो जाता है। --environment production भी महत्वपूर्ण है, क्योंकि डेवलपमेंट सेटिंग पेज पर PHP नोटिस प्रिंट करती है।

https://rss.example.com/ लोड करें और admin के रूप में लॉग इन करें।

फीड अपने आप रिफ्रेश क्यों नहीं होती हैं

जब तक आप निर्देश नहीं देते, तब तक कोई भी आपकी फीड को पोल (poll) नहीं करता है। FreshRSS तब रिफ्रेश होता है जब ब्राउज़र उस पर खुला हो, जिसका अर्थ है कि जिस इंस्टेंस (instance) को आप दिन में दो बार देखते हैं, वह आपको बारह घंटे पुराने लेख दिखाता है। इसका समाधान वह स्क्रिप्ट है जिसे प्रोजेक्ट इसके लिए प्रदान करता है, app/actualize_script.php, जिसे cron से चलाया जाता है।

sudo crontab -u www-data -e

एक लाइन जोड़ें:

*/20 * * * * php /srv/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1

बीस मिनट का समय एक उचित न्यूनतम सीमा है, क्योंकि स्क्रिप्ट किसी भी फीड को हर बीस मिनट में एक बार से अधिक रिफ्रेश करने से मना कर देती है, इसलिए इससे कम समय का शेड्यूल केवल CPU का उपयोग बढ़ाएगा। पहले इसे एक बार मैन्युअल रूप से चलाएं:

sudo -u www-data php /srv/freshrss/app/actualize_script.php

सफल आउटपुट में प्रत्येक फेच की गई फीड का नाम होता है और यह बिना किसी PHP त्रुटि के समाप्त होता है। यदि यह कुछ भी प्रिंट नहीं करता है, तो cron उपयोगकर्ता गलत है, और data/ पर अनुमति त्रुटि (permission error) का अर्थ है कि chmod -R g+w चरण को छोड़ दिया गया था।

अपने पहले फ़ीड जोड़ें

इंटरफ़ेस के ऊपरी बाएँ कोने में स्थित प्लस बटन का उपयोग करें, किसी साइट का पता पेस्ट करें, और FreshRSS आपके लिए फ़ीड लिंक खोज लेगा। अधिकांश साइटें तब भी एक फ़ीड प्रकाशित करती हैं जब वे इसका विज्ञापन नहीं करती हैं, जो आमतौर पर /feed, /rss या /atom.xml पर उपलब्ध होता है। श्रेणियाँ फ़ोल्डर की तरह होती हैं, और उनके बीच किसी फ़ीड को ले जाना ड्रैग-एंड-ड्रॉप जितना आसान है।

यदि आप किसी अन्य रीडर का उपयोग कर रहे हैं, तो वहाँ से एक OPML फ़ाइल एक्सपोर्ट करें और उसे सब्सक्रिप्शन प्रबंधन पृष्ठ के अंतर्गत इम्पोर्ट करें। OPML (आउटलाइन प्रोसेसर मार्कअप लैंग्वेज) फ़ीड सूची का मानक प्रारूप है, और हर विश्वसनीय रीडर इसका समर्थन करता है। पहली बार रिफ्रेश करने पर एक बड़ा इम्पोर्ट धीमा हो सकता है क्योंकि हर फ़ीड को एक बार फ़ेच किया जाता है, इसलिए गति का आकलन करने से पहले पहले cron रन को पूरा होने का समय दें।

अपने फोन पर इसे पढ़ें

FreshRSS, Google Reader API का उपयोग करता है, जिसे लगभग सभी RSS ऐप्स सपोर्ट करते हैं। इसके लिए दो शर्तें पूरी होनी चाहिए। प्रमाणीकरण सेटिंग्स (authentication settings) के अंतर्गत, "Allow API access" विकल्प चालू होना चाहिए, जिसे ऊपर दिए गए --api-enabled फ्लैग द्वारा पहले ही सेट किया जा चुका है। आपकी प्रोफाइल के अंतर्गत, API password फ़ील्ड में एक मान (value) होना चाहिए। यह आपके लॉगिन पासवर्ड से जानबूझकर अलग रखा गया है क्योंकि फोन खोने की संभावना अधिक होती है।

https://rss.example.com/api/ पर जाएं और "Check full server configuration" चुनें। एक सही सेटअप PASS लौटाता है। यहाँ विफलता का कारण लगभग हमेशा AllowEncodedSlashes On लाइन का गायब होना होता है। ऐप में, सर्वर एड्रेस के रूप में https://rss.example.com/api/greader.php, यूजरनेम के रूप में अपना FreshRSS यूजर, और API पासवर्ड के रूप में अपना पासवर्ड दर्ज करें।

Docker का विकल्प

यदि आप PHP और Apache को मैन्युअल रूप से प्रबंधित नहीं करना चाहते हैं, तो प्रोजेक्ट एक आधिकारिक freshrss/freshrss इमेज प्रकाशित करता है। एक compose फ़ाइल आपको एप्लिकेशन और उसका डेटाबेस एक साथ प्रदान करती है। इसमें सामान्य समझौता यह है: होस्ट पर कम घटक होते हैं, लेकिन समस्या आने पर डीबग करने के लिए एक अतिरिक्त परत होती है, और TLS (transport layer security) के लिए अभी भी एक reverse proxy की आवश्यकता होती है। यदि यह आपके लिए बेहतर है, तो VPS के लिए Docker Compose की बुनियादी बातें फ़ाइल प्रारूप को कवर करती हैं, और cron लाइन docker exec --user www-data freshrss php ./app/actualize_script.php हो जाती है।

बैकअप और अपग्रेड

आपकी स्थिति दो चीजों पर निर्भर करती है: डेटाबेस और /srv/freshrss/data/। पहले वाले का डंप sudo mysqldump freshrss > freshrss.sql के साथ लें, दूसरे की प्रतिलिपि बनाएँ, और दोनों को इस सर्वर के अलावा कहीं और सुरक्षित रखें। आपकी सब्सक्रिप्शन सूची का समय-समय पर OPML एक्सपोर्ट लेना भी उपयोगी है, क्योंकि वह फ़ाइल किसी भी RSS सॉफ़्टवेयर पर आपके रीडिंग सेटअप को फिर से तैयार कर देती है।

अपग्रेड करने का अर्थ है उसी डायरेक्टरी के ऊपर एक नए रिलीज़ को अनपैक करना और ओनरशिप कमांड्स को फिर से चलाना। FreshRSS अगले पेज लोड पर अपने डेटाबेस माइग्रेशन को स्वयं लागू कर देता है। पहले बैकअप लें, क्योंकि जिस डेटाबेस को आप रिस्टोर नहीं कर सकते, उस पर विफल माइग्रेशन एक ऐसी स्थिति है जिसे सुधारा नहीं जा सकता। एक रीडर चलाना कम जोखिम वाली सेवा है और यदि आप सेल्फ-होस्टिंग के योग्य चीजों की सूची पर काम कर रहे हैं, तो यह एक अच्छा शुरुआती विकल्प है।

FAQ

मेरे फीड्स केवल तब अपडेट क्यों होते हैं जब मैं FreshRSS खोलता हूँ?

क्योंकि जब तक आप शेड्यूलर नहीं बनाते, तब तक कोई शेड्यूलर मौजूद नहीं होता। FreshRSS फीड्स को तब रिफ्रेश करता है जब ब्राउज़र सेशन खुला होता है और टैब बंद होने पर यह कुछ नहीं करता। www-data यूजर के रूप में app/actualize_script.php को कॉल करने वाली cron लाइन जोड़ें, फिर स्क्रिप्ट को एक बार मैन्युअल रूप से चलाएं और उसका आउटपुट पढ़ें। साइलेंस का आमतौर पर मतलब है कि cron इसे गलत यूजर के रूप में चला रहा है, इसलिए PHP data/ में लिख नहीं पा रहा है।

मेरा मोबाइल ऐप कनेक्ट नहीं हो पा रहा है, लेकिन वेबसाइट काम कर रही है। क्यों?

Google Reader API रिक्वेस्ट पाथ के अंदर एन्कोडेड स्लैश (%2F) डालता है, और Apache डिफ़ॉल्ट रूप से उन्हें अस्वीकार कर देता है। वर्चुअल होस्ट के अंदर AllowEncodedSlashes On जोड़ें और Apache को रिलोड करें। https://rss.example.com/api/ खोलकर और "Check full server configuration" चलाकर फिक्स की पुष्टि करें, जिसे PASS रिपोर्ट करना चाहिए। यह भी जांचें कि आपके प्रोफाइल में API पासवर्ड सेट है या नहीं, क्योंकि यह आपके लॉगिन पासवर्ड से अलग होता है।

क्या मुझे SQLite या MariaDB का उपयोग करना चाहिए?

एक यूजर के लिए SQLite का उपयोग करें, क्योंकि इसमें कुछ भी इंस्टॉल करने और कोई पासवर्ड मैनेज करने की आवश्यकता नहीं होती है। जब एक से अधिक व्यक्ति इंस्टेंस पर पढ़ते हैं, या जब आप कुछ सौ फीड्स से आगे निकल जाते हैं, तो MariaDB का उपयोग करें, क्योंकि रिफ्रेश जॉब और वेब इंटरफेस एक ही समय में लिखते हैं और एक सिंगल फाइल लॉक सीमा बन जाता है। बाद में इनके बीच स्विच करना एक्सपोर्ट और इम्पोर्ट कमांड के माध्यम से संभव है, इसलिए यह कोई स्थायी निर्णय नहीं है।

इंस्टॉलर अपना कॉन्फ़िगरेशन लिखते समय विफल क्यों हो जाता है?

PHP Apache के तहत www-data के रूप में चलता है, और वह यूजर root के स्वामित्व वाली डायरेक्टरी में नहीं लिख सकता है। sudo chown -R www-data:www-data /srv/freshrss और sudo chmod -R g+w /srv/freshrss/data को फिर से चलाएं, फिर इंस्टॉलर को दोबारा शुरू करें। यदि आपने पहले ही कमांड लाइन इंस्टॉलर को root के रूप में चलाया है, तो दोबारा प्रयास करने से पहले data/ के तहत बनाई गई फाइलों को हटा दें, क्योंकि उनका स्वामित्व ही वास्तविक समस्या है।

सेल्फ-होस्टेड RSS रीडर को कितने सर्वर की आवश्यकता होती है?

बहुत कम। एक छोटे प्लान पर कुछ सौ फीड्स आराम से चल जाते हैं, क्योंकि लोड हर बीस मिनट में HTTP फेचिंग के छोटे बर्स्ट होते हैं और पुराने लेखों को हटाने के बाद डेटाबेस छोटा रहता है। डिस्क रिटेंशन के साथ बढ़ती है, इसलिए सब कुछ हमेशा के लिए रखने के बजाय आर्काइविंग सेटिंग्स में लेख हटाने की नीति (purge policy) सेट करें।