SSD Nodes Learn 8GB RAM — $66/سال
تعلیمی Matt Connorتحریر: Matt Connor · اپ ڈیٹ شدہ 2026-08-01

Ubuntu VPS پر FreshRSS کیسے انسٹال کریں

Ubuntu 24.04 پر FreshRSS انسٹال کرنے کا مکمل طریقہ۔ Apache، PHP اور MariaDB کے ساتھ ڈیٹا بیس سیٹ اپ، cron job کنفیگریشن اور موبائل API کے لیے ضروری مراحل یہاں موجود ہیں۔

آپ کیا بنا رہے ہیں

خود سے میزبانی کردہ (self-hosted) RSS ریڈر ایک ایسا فیڈ ریڈر ہے جو آپ کے اپنے سرور پر چلتا ہے، لہذا کوئی بھی اسے بند نہیں کر سکتا اور نہ ہی یہ تبدیل کر سکتا ہے کہ یہ آپ کو کیا دکھاتا ہے۔ یہ گائیڈ Ubuntu 24.04 VPS پر FreshRSS کو انسٹال کرتی ہے: سامنے Apache، اس کے پیچھے PHP، اسٹوریج کے لیے MariaDB، اور ایک cron job جو نئے مضامین حاصل کرتی ہے۔ RSS (Really Simple Syndication) وہ فائل فارمیٹ ہے جسے ایک سائٹ شائع کرتی ہے تاکہ سافٹ ویئر اس کے مضامین پڑھ سکے۔ FreshRSS وہ PHP ایپلیکیشن ہے جو ان فائلوں کو اکٹھا کرتی ہے، مضامین کو محفوظ رکھتی ہے، اور آپ کو ایک ویب انٹرفیس کے ساتھ ساتھ ایک API (Application Programming Interface) فراہم کرتی ہے جس سے فون ایپس بات کرتی ہیں۔

انسٹالیشن خود مختصر ہے: ایک ریلیز کو ان پیک کریں، ایک ڈیٹا بیس بنائیں، ایک ورچوئل ہوسٹ لکھیں، اور ایک کمانڈ لائن انسٹالر چلائیں۔ نیچے دیا گیا زیادہ تر کام وہ حصہ ہے جسے لوگ بعد میں غلط کرتے ہیں، یعنی ریفریش جاب، موبائل API کے لیے انکوڈ شدہ سلیشز، اور فائل کی ملکیت۔

FreshRSS 1.29.1 جولائی 2026 تک موجودہ ریلیز ہے، اور اسے 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 بٹ سسٹم پر 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 کی دستاویزات سخت ہیں: ویب سرور صارف پوری ٹری کا مالک ہو، گروپ ہر فائل کو پڑھ سکے، اور گروپ ./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 کو کسی سیٹ اپ کی ضرورت نہیں ہوتی اور یہ ایک فرد کے لیے چند سو فیڈز کے ساتھ استعمال کرنے کے لیے موزوں ہے۔ جب ایک سے زیادہ افراد ایک ہی انسٹینس (instance) استعمال کر رہے ہوں تو MariaDB بہتر انتخاب ہے، کیونکہ اس صورت میں ریفریش جاب اور ویب انٹرفیس سے بیک وقت ہونے والی رائٹس (writes) ایک ہی فائل لاک کے لیے تنازعہ پیدا نہیں کرتیں۔

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 اسے کبھی بھی سرو (serve) نہیں کرے گا۔

<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 انہیں مسترد کر دیتا ہے، جس کی وجہ سے موبائل ایپس سنک (sync) ہونے میں ناکام ہو جاتی ہیں جبکہ ویب انٹرفیس بالکل درست کام کرتا ہے۔

لاگ ان کرنے سے پہلے HTTPS شامل کریں

آپ اس سائٹ پر پاس ورڈ درج کرنے والے ہیں، لہذا پہلے ایک سرٹیفکیٹ حاصل کریں۔ سرور پر ایک A record پوائنٹ کریں، پھر 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) کو دیکھتے ہیں تو آپ کو 12 گھنٹے پرانے مضامین نظر آئیں گے۔ اس کا حل وہ اسکرپٹ ہے جو پروجیکٹ اس مقصد کے لیے فراہم کرتا ہے، یعنی app/actualize_script.php، جسے cron سے چلایا جاتا ہے۔

sudo crontab -u www-data -e

ایک لائن شامل کریں:

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

20 منٹ کا وقفہ ایک مناسب حد ہے، کیونکہ یہ اسکرپٹ کسی بھی فیڈ کو ہر 20 منٹ میں ایک بار سے زیادہ ریفریش کرنے سے انکار کر دیتا ہے، لہذا اس سے زیادہ تیز شیڈول صرف CPU کا ضیاع ہے۔ پہلے اسے ایک بار دستی طور پر چلائیں:

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

صحت مند آؤٹ پٹ میں ہر اس فیڈ کا نام ہوتا ہے جسے فیچ کیا گیا ہو اور یہ کسی PHP ایرر کے بغیر ختم ہوتا ہے۔ اگر یہ کچھ بھی پرنٹ نہیں کرتا، تو cron صارف غلط ہے، اور data/ پر اجازت (permission) کا ایرر ظاہر کرتا ہے کہ 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 فیلڈ میں ایک ویلیو ہونی چاہیے، اور یہ جان بوجھ کر آپ کے لاگ ان پاس ورڈ سے الگ رکھی گئی ہے کیونکہ فون ایک ایسی ڈیوائس ہے جس کے گم ہونے کا امکان زیادہ ہوتا ہے۔

https://rss.example.com/api/ پر جائیں اور "Check full server configuration" کا انتخاب کریں۔ ایک درست سیٹ اپ PASS واپس کرتا ہے۔ یہاں ناکامی کی وجہ تقریباً ہمیشہ AllowEncodedSlashes On لائن کا غائب ہونا ہوتی ہے۔ ایپ میں، سرور کا ایڈریس https://rss.example.com/api/greader.php کے طور پر دیں، صارف کا نام اپنا FreshRSS صارف نام رکھیں، اور API password کے خانے میں اپنا پاس ورڈ درج کریں۔

Docker کا متبادل

اگر آپ PHP اور Apache کو دستی طور پر برقرار نہیں رکھنا چاہتے، تو پروجیکٹ ایک باضابطہ freshrss/freshrss امیج شائع کرتا ہے، اور ایک compose فائل آپ کو ایپلیکیشن اور اس کا ڈیٹا بیس ایک ساتھ فراہم کرتی ہے۔ اس کا سودا معمول کے مطابق ہے: ہوسٹ پر کم متحرک پرزے، خرابی کی صورت میں ڈیبگ کرنے کے لیے ایک اضافی تہہ، اور TLS (transport layer security) کے لیے اب بھی ایک ریورس پراکسی کی ضرورت ہے۔ اگر یہ آپ کے لیے زیادہ موزوں ہے، تو 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 فیڈز کو تب ریفریش کرتا ہے جب براؤزر سیشن کھلا ہو، اور ٹیب بند ہونے پر یہ کچھ نہیں کرتا۔ app/actualize_script.php کو کال کرنے والی cron لائن کو www-data صارف کے طور پر شامل کریں، پھر اسکرپٹ کو ایک بار دستی طور پر چلائیں اور اس کا آؤٹ پٹ پڑھیں۔ خاموشی کا عام طور پر مطلب یہ ہوتا ہے کہ 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 فیچنگ کے مختصر برسٹس پر مشتمل ہوتا ہے اور پرانے مضامین کے حذف ہونے کے بعد ڈیٹا بیس چھوٹا رہتا ہے۔ ڈسک کا سائز ریٹینشن کے ساتھ بڑھتا ہے، لہذا سب کچھ ہمیشہ کے لیے رکھنے کے بجائے آرکائیونگ سیٹنگز میں مضمون کو حذف کرنے کی پالیسی سیٹ کریں۔

#freshrss#rss#self-hosting#php#apache