SSD Nodes Learn Hosting plans →
מדריכים Matt Connorמאת Matt Connor

מדריך התקנת FreshRSS על שרת Ubuntu VPS

למדו כיצד להתקין FreshRSS על שרת Ubuntu 24.04 עם Apache, PHP ו-MariaDB. המדריך כולל הגדרת virtual host, הרשאות קבצים, משימות cron לרענון עדכונים וחיבור ה-API לנייד.

מה אתם בונים

קורא RSS בניהול עצמי הוא קורא הזנות המופעל על שרת שבבעלותכם, כך שאף גורם לא יכול להשבית אותו או לשנות את התוכן המוצג לכם. מדריך זה מתקין את FreshRSS על גבי VPS עם Ubuntu 24.04: שרת Apache בחזית, PHP מאחוריו, MariaDB לאחסון, ומשימת cron אחת שמושכת מאמרים חדשים. RSS (ראשי תיבות של Really Simple Syndication) הוא פורמט קבצים שאתרים מפרסמים כדי שתוכנות יוכלו לקרוא את המאמרים שלהם. FreshRSS הוא יישום PHP שאוסף את הקבצים הללו, שומר את המאמרים ומספק לכם ממשק אינטרנטי לצד API (ממשק תכנות יישומים) שיישומי טלפון יודעים לתקשר איתו.

ההתקנה עצמה מצומצמת: פריסת release, יצירת מסד נתונים, כתיבת virtual host אחד, הרצת מתקין שורת הפקודה, ולאחר מכן יצירת החשבון באמצעות cli/create-user.php. רוב העבודה להלן מתמקדת בחלק שאנשים נוטים לטעות בו לאחר מכן, והוא משימת הרענון, לוכסנים מקודדים עבור ה-API לנייד, והרשאות קבצים.

FreshRSS 1.30.4, שפורסם ב-21 באוקטובר 2026, הוא ה-release העדכני נכון ל-29 באוקטובר 2026, והוא דורש PHP 8.1 ומעלה. Ubuntu 24.04 מספקת את PHP 8.3, לכן חבילות ההפצה מספיקות ואין צורך במאגר PHP של צד שלישי.

התחילו מ־LAMP stack תקין

FreshRSS הוא יישום PHP רגיל, ולכן הוא זקוק לאותה תשתית בסיסית כמו כל יישום אחר. אם עדיין לא בניתם את התשתית הזאת, פעלו תחילה לפי מדריך הגדרת LAMP stack עבור Ubuntu 24.04 וחזרו לכאן. בקצרה:

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 אינו עולה, הסיבה הנפוצה היא תהליך אחר שכבר מחזיק בפורט 80, ו־sudo ss -ltnp | grep :80 מציג את שמו.

הרחבות PHP ש־FreshRSS זקוקה להן

FreshRSS מתייחסת ל־libxml, ‏cURL, ‏JSON, ‏PDO_MySQL, ‏PCRE ו־ctype כהרחבות חובה. היא זקוקה גם ל־mbstring, ‏iconv, ‏Zlib ו־ZipArchive, וכן ל־GMP במערכת 32 סיביות. ב־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. לכן שרת האינטרנט אינו מזהה הרחבה שהותקנה זה עתה עד להפעלה מחדש.

הורדת ה-release

התקינו את FreshRSS מחוץ ל-web root המוגדר כברירת מחדל, והפנו את Apache אליו. הפרדת ספריית היישום מ-document root מבטיחה שרק התיקייה הציבורית תהיה נגישה דרך HTTP.

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

כעת הגדירו את ההרשאות, שכן התיעוד של FreshRSS מקפיד עליהן מאוד: המשתמש של שרת ה-web הוא הבעלים של העץ, הקבוצה יכולה לקרוא כל קובץ, והקבוצה יכולה לכתוב ל-./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 דורש את התוסף php-sqlite3 אך אינו מחייב הגדרה של שרת מסד נתונים, והוא שומר את הנתונים של כל משתמש בקובץ data/users/_user_/db.sqlite נפרד. הוספת משתמשים אינה מאחדת את הכתיבה שלהם לקובץ SQLite משותף; מדריך זה משתמש ב-MariaDB כחלק מחבילת LAMP.

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. עדכוני RSS מכילים אימוג'י ותווים שאינם לטיניים, וקידוד ה-utf8 הישן בעל שלושת הבתים אינו מסוגל לאחסן תווים של ארבעה בתים. תווים שאינם נתמכים יגרמו לשגיאה תחת מצב ה-strict mode המוגדר כברירת מחדל ב-MariaDB; קיטום (truncation) של נתונים תלוי ב-SQL mode ובאפשרויות הצהרה כגון IGNORE.

ה־virtual host של 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 אל השרת, ולאחר מכן פעלו לפי מדריך ההגדרה של Certbot עבור Apache ב־Ubuntu והפעילו את sudo certbot --apache -d rss.example.com. Certbot משנה את תצורת ה־virtual host עבור פורט 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.

מדוע פידים אינם מתרעננים מעצמם

שום דבר לא מבצע פול (polling) לפידים שלכם עד שתגדירו זאת. פתיחת FreshRSS אינה מתזמנת משיכת פידים; ללא מתזמן, השתמשו בקישור העדכון בתפריט הניווט כדי למשוך מאמרים באופן ידני. הפתרון הוא הסקריפט שהפרויקט מספק לצורך זה, app/actualize_script.php, המופעל מתוך cron.

sudo crontab -u www-data -e

הוסיפו שורה אחת:

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

עשרים דקות הן תזמון סביר, אך מרווח הרענון של כל פיד עדיין תקף: ברירת המחדל היא שעה אחת, ופידים בודדים תומכים במרווחים של החל מחמש-עשרה דקות. הריצו זאת פעם אחת ידנית תחילה:

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

פלט תקין מדווח על הרצת הרענון ומסתיים ללא שגיאת PHP; שמות הפידים מופיעים כאשר מאמרים מתווספים או מתעדכנים. אם הפלט ריק לחלוטין, בדקו את פלט השגיאות של PHP ואת הלוגים של FreshRSS; שתיקה כשלעצמה אינה מעידה על כך שמשתמש ה-cron הוא הגורם לבעיה. שגיאת הרשאות ב-data/ מחייבת בדיקה של בעלות והרשאות כתיבה.

הוספת העדכונים הראשונים

השתמשו בכפתור הפלוס בפינה השמאלית העליונה של הממשק, הדביקו כתובת של אתר, ו־FreshRSS יאתר עבורכם את קישור העדכון. רוב האתרים עדיין מפרסמים עדכון כזה גם אם אינם מציגים אותו, בדרך כלל ב־/feed, ב־/rss או ב־/atom.xml. קטגוריות הן תיקיות, והעברת עדכון ביניהן מתבצעת בגרירה.

אם אתם עוברים מקורא אחר, ייצאו ממנו קובץ OPML וייבאו אותו בדף ניהול המינויים. OPML (שפת סימון למעבדי מבנה) הוא הפורמט הסטנדרטי לרשימת עדכונים, וכל קורא ראוי שממנו עוברים תומך בו. ייבוא גדול איטי ברענון הראשון, משום שכל עדכון נמשך פעם אחת. לכן המתינו להרצת ה־cron הראשונה לפני שתעריכו את המהירות.

קריאה בטלפון הנייד

FreshRSS תומך ב-API של Google Reader, שבו משתמשות אפליקציות RSS רבות. עליך לוודא שני תנאים. תחת הגדרות האימות, האפשרות "Allow API access" חייבת להיות מופעלת; דגל ה---api-enabled לעיל כבר ביצע זאת. תחת הפרופיל שלך, שדה ה-API password חייב להכיל ערך. סיסמה זו נפרדת במכוון מסיסמת ההתחברות הרגילה שלך, כיוון שקל יותר לאבד מכשיר טלפון.

בקר ב-https://rss.example.com/api/ כדי להריץ בדיקות תצורה אוטומטיות לשרת. הגדרה תקינה תחזיר PASS. אם הבדיקה נכשלת, בדוק את הגדרת ה-AllowEncodedSlashes On של ה-virtual host ואת השגיאה המדווחת. באפליקציה, הזן את כתובת השרת כ-https://rss.example.com/api/greader.php, את שם המשתמש כמשתמש ה-FreshRSS שלך, ואת סיסמת ה-API כסיסמה.

החלופה המבוססת על Docker

אם אתם מעדיפים שלא לתחזק את PHP ואת Apache באופן ידני, הפרויקט מפרסם image רשמי של freshrss/freshrss, וקובץ compose אחד מספק את היישום ואת מסד הנתונים שלו יחד. המחיר הוא הפשרה הרגילה: פחות רכיבים לתחזוקה ב־host, שכבה נוספת לאבחון כאשר משהו מתקלקל, ועדיין נדרש reverse proxy עבור TLS (אבטחת שכבת התעבורה). אם אפשרות זו מתאימה לכם יותר, המדריך הבסיסי ל־Docker Compose עבור VPS מסביר את מבנה הקובץ, ושורת ה־cron הופכת ל־docker exec --user www-data freshrss php ./app/actualize_script.php.

גיבויים ושדרוגים

שני דברים מגדירים את המצב שלכם: מסד הנתונים, והתיקייה /srv/freshrss/data/. בצעו dump לראשון באמצעות sudo mysqldump freshrss > freshrss.sql, העתיקו את השני, ושמרו את שניהם במיקום חיצוני לשרת זה. כדאי גם לייצא מדי פעם את רשימת המנויים שלכם בפורמט OPML, שכן קובץ זה מאפשר להעביר את רשימת הערוצים שלכם לקוראים אחרים התומכים ב-OPML. פעולה זו אינה שומרת הגדרות ספציפיות ל-FreshRSS כגון תדירות רענון, פרטי הזדהות, user agent או חוקי XPath ל-web scraping; השתמשו בייצוא SQLite כדי לשמור גם אותם.

שדרוג מתבצע על ידי פריסת גרסה חדשה על גבי אותה תיקייה והרצה מחדש של פקודות הבעלות. עקבו אחר נתיב השדרוג גרסה-אחר-גרסה של הפרויקט ואמתו את תקינות FreshRSS לאחר כל שלב. FreshRSS מחילה את מיגרציות מסד הנתונים שלה בטעינת הדף הבאה. בצעו גיבוי תחילה, כיוון שמיגרציה שנכשלה במסד נתונים שאינכם יכולים לשחזר היא מצב בלתי הפיך. אם התקנתם מ-tarball ישן יותר כגון 1.29.1, עברו ל-1.30.4: מהדורות האבטחה 1.30.x כוללות סבב מזהי session בעת שינויי הזדהות ומגבלות על ייבוא ZIP, בעוד ש-1.30.4 מעדכנת גם את תמונות ה-Alpine Docker החלופיות עבור פגיעויות PHP חמורות. קורא RSS הוא שירות בעל סיכון נמוך להרצה ומועמד ראשון מצוין אם אתם עובדים לפי רשימה של שירותים שכדאי לארח באופן עצמי.

FAQ

מדוע העדכונים בפידים מתבצעים רק כשאני פותח את FreshRSS?

פתיחת הדף אינה מתזמנת את משיכת הפידים; ללא מתזמן, יש להשתמש בקישור העדכון כדי לרענן ידנית. הוסיפו את שורת ה-cron המפעילה את app/actualize_script.php כמשתמש www-data, לאחר מכן הריצו את הסקריפט ידנית פעם אחת ובדקו את הפלט שלו. אם אין פלט, בדקו את פלט השגיאות של PHP ואת הלוגים של FreshRSS, ולאחר מכן ודאו שלמשתמש ה-cron יש הרשאות כתיבה ל-data/.

האפליקציה לנייד לא מצליחה להתחבר, אבל האתר עובד. מדוע?

ממשק ה-Google Reader API מכניס לוכסנים מקודדים (%2F) בתוך נתיבי הבקשות, ו-Apache דוחה אותם כברירת מחדל. הוסיפו את AllowEncodedSlashes On בתוך ה-virtual host וטענו מחדש את Apache. אשרו את התיקון על ידי פתיחת https://rss.example.com/api/, שם בדיקת התצורה האוטומטית אמורה לדווח על PASS. כמו כן, ודאו שסיסמת ה-API מוגדרת בפרופיל שלכם, שכן היא נפרדת מסיסמת ההתחברות הרגילה.

האם כדאי להשתמש ב-SQLite או ב-MariaDB?

SQLite דורש את התוסף php-sqlite3, אך אינו דורש שרת מסד נתונים או ניהול סיסמאות למסד הנתונים. כל משתמש מקבל קובץ מסד נתונים נפרד ב-SQLite, כך שהוספת משתמש שני אינה יוצרת התנגשות על קובץ משותף ואינה מחייבת שימוש ב-MariaDB. השתמשו ב-MariaDB אם ברצונכם להשתמש בשרת מסד הנתונים הקיים ב-stack ה-LAMP שלכם. מעבר ביניהם בשלב מאוחר יותר אפשרי באמצעות פקודות ייצוא וייבוא, כך שזו אינה החלטה סופית.

תוכנית ההתקנה נכשלת בעת כתיבת התצורה. מה הבעיה?

PHP רץ כ-www-data תחת Apache, ומשתמש זה אינו יכול לכתוב לתיקייה שבבעלות root. הריצו שוב את sudo chown -R www-data:www-data /srv/freshrss ו-sudo chmod -R g+w /srv/freshrss/data, ולאחר מכן התחילו את ההתקנה מחדש. אם כבר הרצתם את מתקין שורת הפקודה כ-root, תקנו את הבעלות על הקבצים שנוצרו תחת data/ לפני שתנסו שוב.

אילו משאבי שרת נדרשים עבור קורא RSS בהתארחות עצמית?

מעט מאוד. FreshRSS תוכנן לרוץ על חומרה צנועה, אך צריכת המשאבים תלויה בפידים שלכם, בגודל המאמרים ובהגדרות השמירה. נפח הדיסק גדל ככל ששומרים יותר נתונים, לכן הגדירו מדיניות מחיקת מאמרים בהגדרות הארכיון במקום לשמור הכל לנצח.

האם המאמר הזה היה מועיל?