لماذا تستضيف FreshRSS ذاتيًا على خادم VPS
FreshRSS مجمِّع خلاصات RSS/Atom مكتوب بلغة PHP، مصمَّم ليكون خفيف الموارد مع إدارة آلاف المقالات. تحلّ الاستضافة الذاتية على خادم VPS ثلاث مشكلات لا تعالجها الخدمات المغلقة: الاستدامة (لا تختفي متابعتك بين ليلة وضحاها)، والخصوصية (لا أحد يحلّل اشتراكاتك)، والحداثة (تحدّد أنت وتيرة التحديث عبر cron، دون حصة مفروضة). خادم VPS، خلافًا للاستضافة المشتركة، يمنحك وصولاً كاملاً عبر SSH وحقّ تشغيل حاوية Docker وجدولة المهام — وهو بالضبط ما يحتاجه FreshRSS لتحديث الخلاصات في الخلفية.
فوائد ملموسة لـFreshRSS المُستضاف ذاتيًا
- واجهة برمجية أصلية متوافقة مع Fever وGoogle Reader: زامِن مع Reeder أو FeedMe أو Fluent Reader على الجوال.
- امتداد GReader / الكشط (scraping): استرجع المحتوى الكامل للمقالات المبتورة بفضل مرشّحات XPath.
- متعدد المستخدمين مع حصص لكل حساب: مثالي لمشاركة نسخة داخل وكالة.
- بصمة ذاكرة ضئيلة (200 إلى 300 ميغابايت): يعمل على أصغر خادم VPS دون تعثّر.
- تحديث مُدار بـcron: أنت تقرّر ما إذا كانت الخلاصات تُحدَّث كل 5 دقائق أو كل ساعة.
- نسخ احتياطي بسيط: قاعدة بيانات SQLite/MySQL ومجلد بيانات يكفيان لاستعادة كل شيء.
المتطلبات التقنية
FreshRSS من أكثر تطبيقات الاستضافة الذاتية اقتصادًا في الموارد. احسب 1 vCPU و1 غيغابايت من RAM لنسخة شخصية بعدد قليل من المستخدمين؛ ويكفي 10 غيغابايت من القرص بسعة كبيرة، إذ يشغل معظمه سجلّ المقالات. على الجانب البرمجي: Docker وإضافة Docker Compose مثبّتتان على الخادم VPS، واسم نطاق (أو نطاق فرعي من نوع rss.yourdomain.com) موجَّه بسجل A إلى عنوان IP الخادم، ومنفذ 80/443 مفتوح للوكيل العكسي. لا حاجة لتثبيت PHP على المضيف: تتضمّن الصورة الرسمية freshrss/freshrss كل شيء.
نشر FreshRSS خطوة بخطوة
تجهيز الخادم VPS وDocker
اتّصل عبر SSH، وحدّث النظام (
apt update && apt upgrade -y)، ثم ثبّت Docker:curl -fsSL https://get.docker.com | sh. أضف مستخدمك إلى مجموعة docker:usermod -aG docker $USER. تحقّق بـdocker compose version. أنشئ مجلد المشروع:mkdir -p /opt/freshrss && cd /opt/freshrss.كتابة ملف docker-compose.yml
أنشئ الملف
docker-compose.ymlبالمحتوى التالي:services: freshrss: image: freshrss/freshrss:latest container_name: freshrss restart: unless-stopped environment: CRON_MIN: "*/20" TZ: "Africa/Casablanca" volumes: - ./data:/var/www/FreshRSS/data - ./extensions:/var/www/FreshRSS/extensions ports: - "127.0.0.1:8080:80"المنفذ مرتبط بـ
127.0.0.1فقط: الوكيل العكسي المحلي وحده يمكنه الوصول إليه.تهيئة nginx كوكيل عكسي
ثبّت nginx:
apt install -y nginx. أنشئ الملف/etc/nginx/sites-available/freshrss:server { listen 80; server_name rss.yourdomain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }فعّل الـvhost:
ln -s /etc/nginx/sites-available/freshrss /etc/nginx/sites-enabled/ && nginx -t && systemctl reload nginx.الحصول على شهادة TLS عبر Certbot
ثبّت Certbot وإضافة nginx:
apt install -y certbot python3-certbot-nginx. أصدر الشهادة:certbot --nginx -d rss.yourdomain.com. يعدّل Certbot تلقائيًا وضع vhost الـnginx للاستماع على المنفذ 443 وإعادة توجيه HTTP إلى HTTPS. يُمكَّن التجديد التلقائي افتراضيًا عبر مؤقت systemd الخاص بـcertbot.تشغيل الحاوية
شغّل المكدّس من
/opt/freshrss:docker compose up -d. تابِع التهيئة:docker compose logs -f. تطبّق الحاوية عمليات الترحيل وتنشئ شجرة البيانات عند التشغيل الأول. تحقّق بعد ذلك من أن FreshRSS يستجيب:curl -I https://rss.yourdomain.com.إكمال التثبيت عبر الويب
افتح
https://rss.yourdomain.comفي متصفحك. يطلب منك المساعد اختيار خلفية قاعدة البيانات: حدّد SQLite للاستخدام الشخصي (ملف واحد، لا خدمة للإدارة)، أو MySQL إذا كان متوقعًا عشرات المستخدمين. أنشئ حساب المسؤول بكلمة مرور قوية.تفعيل الواجهة البرمجية (API)
انتقل إلى ملف التعريف ← إدارة API. اختر «تفعيل GReader/Fever API» وعيّن كلمة مرور API منفصلة عن كلمة مرورك الرئيسية. لاحظ عنوان URL الأساسي لـAPI:
https://rss.yourdomain.com/api/greader.php.استيراد ملف OPML
صدّر اشتراكاتك من قارئك القديم (Feedly، Inoreader…) بصيغة OPML. في FreshRSS، انتقل إلى اشتراكات ← استيراد/تصدير ← استيراد ملف OPML. تُعاد إنشاء فئاتك وخلاصاتك في ثوانٍ. تحقّق من أول تحديث يدوي:
docker compose exec freshrss php ./cli/actualize.php.التحقق من cron التلقائي
تُهيّئ المتغيّر
CRON_MIN=*/20الـcron الداخلي للحاوية لتحديث جميع الخلاصات كل 20 دقيقة. تأكد من تشغيله:docker compose exec freshrss crontab -l. إذا كانت النتيجة فارغة، أضفCRON_MIN: "*/20"تحتenvironment:وأعد إنشاء الحاوية.
بالنسبة للمواقع التي تنشر مقتطفًا فقط في خلاصتها، ثبّت الامتداد الرسمي «FreshRSS Content Selector»: اضبط محدِّد CSS (مثل article.post-content) لكل اشتراك، وسيجلب FreshRSS النص الكامل عند كل تحديث. ادمجه مع امتداد المرشّحات لإخفاء المقالات المموَّلة المكتشَفة بالكلمة المفتاحية تلقائيًا.
الإعداد المتقدم لـFreshRSS
بمجرد تشغيل النسخة الأساسية، تحوّل ثلاثة محاور تحسينية FreshRSS من قارئ بسيط إلى أداة مراقبة احترافية:
الامتدادات: RSS-Bridge وFullTextRss. انسخ الامتداد إلى /opt/freshrss/extensions/، ثم فعّله في قسم الامتدادات بالواجهة. يُولِّد RSS-Bridge خلاصة RSS للمواقع التي لا توفرها (Twitter/X العام، Instagram، LinkedIn). تُكمل FullTextRss المقالات المبتورة بواسطة قواعد مواقع محددة مسبقًا — أكثر من 2000 موقع مُهيَّأة بالفعل في قاعدة القواعد المجتمعية.
وتيرة التحديث. تناسب القيمة CRON_MIN=*/20 معظم احتياجات المراقبة. للمصادر الحرجة (تنبيهات الأمان، أسعار الأسهم)، انزل إلى */5. لتقليل الحمل على خادمك مع كثير من الاشتراكات غير النشطة، ارتفع إلى */60.
SQLite مقابل MySQL. يكفي SQLite لبضع مئات الآلاف من المقالات وعدد قليل من المستخدمين. عند تجاوز 5 مستخدمين متزامنين أو 500,000 مقال، يوفر MySQL أداءً أفضل. الترحيل من SQLite إلى MySQL ممكن عبر أداة CLI convert-db.php المضمّنة في الحاوية.
واجهة FreshRSS البرمجية لعملاء الذكاء الاصطناعي والأتمتة
FreshRSS من المجمِّعات النادرة التي تطبّق واجهتين برمجيتين قياسيتين: واجهة Google Reader (/api/greader.php) وواجهة Fever (/api/fever.php). هذه الواجهات الموثّقة علنيًا تُتيح التكامل السلس مع عشرات أدوات الأتمتة.
تكامل n8n. في سير عمل n8n، استخدم عقدة HTTP Request مع مصادقة Basic (بيانات اعتماد API الخاصة بـFreshRSS). استدعِ نقطة نهاية GReader لجلب المقالات غير المقروءة الجديدة، ثم سلسل مع عقدة OpenAI لتلخيص كل مقالة وإرسال الملخص إلى Slack أو بريد إلكتروني.
تكامل Make (سابقًا Integromat). يُتيح وحدة HTTP في Make نفس استدعاءات REST. سيناريو نموذجي: كل ساعة، جلب المقالات المميّزة بنجمة، إثراؤها بنموذج لغوي كبير عبر webhook، ودفعها إلى Notion أو Airtable لبناء قاعدة معرفة منظَّمة.
عملاء الذكاء الاصطناعي. يمكن لأطر العمل مثل LangChain أو LlamaIndex الاستعلام مباشرةً عن واجهة FreshRSS البرمجية لتغذية خط أنابيب RAG على مراقبتك الشخصية. تصبح نسختك مصدر بيانات خاصًا ومنظَّمًا وحديثًا، بعيدًا عن النماذج العامة.
FreshRSS مقابل Miniflux مقابل Tiny Tiny RSS
مرّر الجدول أفقيًا
| المعيار | FreshRSS | Miniflux | Tiny Tiny RSS |
|---|---|---|---|
| اللغة / المكدّس | PHP + SQLite/MySQL | Go (ثنائي واحد) | PHP + PostgreSQL |
| الذاكرة العشوائية الدنيا | ~50 ميغابايت (بدون Docker) | ~20 ميغابايت | ~100 ميغابايت |
| الواجهة البرمجية القياسية | Google Reader + Fever | Miniflux REST + Fever | Google Reader (إضافة) |
| الامتدادات / الإضافات | غنية (أكثر من 30 رسمية) | محدودة (مرشّحات أصلية) | إضافات طرف ثالث كثيرة |
| الرخصة | AGPL-3.0 | Apache-2.0 | GPL-3.0 |
النسخ الاحتياطي وترحيل FreshRSS
من مزايا الاستضافة الذاتية السيطرة الكاملة على بياناتك. مستويان من النسخ الاحتياطي يغطيان جميع السيناريوهات:
تصدير OPML (الاشتراكات). من اشتراكات ← استيراد/تصدير ← تصدير OPML، تُنشئ ملف XML يحمل جميع خلاصاتك وفئاتك. أتمتِ ذلك عبر crontab: 0 3 * * * docker exec freshrss php /var/www/FreshRSS/cli/export-opml-file.php > /opt/backups/freshrss-opml-$(date +%F).xml.
نسخ احتياطي كامل (قاعدة البيانات + البيانات). للاحتفاظ بسجل القراءة والنجوم، انسخ وحدة Docker بالكامل: rsync -a /opt/freshrss/data/ /opt/backups/freshrss-data-$(date +%F)/.
الترحيل بين خوادم VPS. العملية خطية: (1) أوقف الحاوية المصدر (docker compose stop)؛ (2) انسخ مجلد data/ إلى الخادم الجديد عبر rsync أو scp؛ (3) انشر نفس docker-compose.yml على الخادم الجديد وابدأ التشغيل؛ (4) حدّث سجل DNS A إلى عنوان IP الجديد. الوقت الإجمالي لنسخة شخصية: أقل من 10 دقائق، دون فقدان أي بيانات.
استكشاف الأخطاء: 4 أخطاء شائعة
1. Cron غير نشط — الخلاصات لا تتحدث. العَرَض: يبقى عمود «آخر تحديث» ثابتًا. تحقّق أولاً من تشغيل cron الداخلي: docker compose exec freshrss crontab -l. إذا كانت النتيجة فارغة، أضف CRON_MIN: "*/20" تحت environment: وأعد إنشاء الحاوية.
2. خلاصة لا تتحدث أبدًا رغم نشاط cron. السبب الأكثر شيوعًا: الخلاصة ترجع باستمرار خطأ HTTP 429 (تحديد المعدل) أو 403. تحقّق في اشتراكات ← إدارة ← آخر خطأ. لموقع يحجب الطلبات دون User-Agent، أضف User-Agent صريحًا في الإعدادات المتقدمة للخلاصة.
3. خطأ SSL «certificate verify failed». يحدث حين تحاول الحاوية الوصول إلى خلاصة HTTPS بشهادة موقَّعة ذاتيًا أو منتهية الصلاحية. الخيارات: تعطيل التحقق من SSL لهذه الخلاصة تحديدًا، أو تحديث قاعدة بيانات CA للحاوية (docker compose exec freshrss update-ca-certificates).
4. امتداد FullTextRss صامت — المحتوى لا يزال مبتورًا. تحقّق من تفعيل الامتداد في الامتدادات وصحّة عنوان URL لخدمة FullTextRss في إعداداته. إذا كنت تستخدم النسخة المستضافة ذاتيًا، اختبر الرابط مباشرةً في المتصفح. استجابة JSON فارغة تعني أن محدِّد الموقع غير موجود في قاعدة القواعد — أنشئ ملف قواعد مخصصة في site_patterns/ وأضِفه كحجم Docker.
حالة استخدام: خلاصة مراقبة تقنية للمطور
أضف خلاصات إصدار GitHub لكل تبعية في مشروعك (https://github.com/<owner>/<repo>/releases.atom)، وخلاصة Hacker News (https://news.ycombinator.com/rss)، ومدونات المشرفين الرئيسيين في منظومتك، وخلاصات CVE لبيئة التشغيل ونظام التشغيل.
يقدم FreshRSS الجدول الزمني الخام — بدون ترتيب خوارزمي ولا منشورات مروّجة. أنشئ قاعدة إضافة نجمة تلقائية: أي مقالة تحتوي 'تنبيه أمني' أو 'تغيير جذري' تحصل على نجمة وتُطلق إشعار ntfy على هاتفك. تحصل على الإشارة، دون ضجيج المنصات الاجتماعية.