SSD Nodes Learn Hosting plans →
מדריכים Matt Connorמאת Matt Connor · עודכן 2026-08-03

התקנת FreshRSS על VPS עם Ubuntu 24.04

מדריך להתקנת FreshRSS 1.29.1 על VPS עם Ubuntu 24.04, Apache, PHP 8.3 ו-MariaDB, כולל release tarball, virtual host, רענון cron ו-API לאפליקציה.

מה אתם בונים

קורא RSS באירוח עצמי הוא קורא הזנות שפועל בשרת שבבעלותכם, כך שאיש אינו יכול להשבית אותו או לשנות את התוכן שהוא מציג לכם. במדריך הזה תתקינו את FreshRSS על VPS עם Ubuntu 24.04: ‏Apache לפניו, ‏PHP מאחוריו, ‏MariaDB לאחסון, ומשימת cron אחת שאוספת מאמרים חדשים. RSS ‏(really simple syndication) הוא פורמט קובץ שאתר מפרסם כדי שתוכנה תוכל לקרוא את המאמרים שלו. FreshRSS היא יישום PHP שאוסף את הקבצים האלה, שומר את המאמרים ומספק ממשק אינטרנט וכן API ‏(application programming interface) שאפליקציות בטלפון משתמשות בו.

ההתקנה עצמה קצרה: פריסת release, יצירת מסד נתונים, כתיבת virtual host אחד והפעלת מתקין אחד משורת הפקודה. רוב העבודה שבה טועים לאחר מכן קשורה למשימת הרענון, ל־encoded slashes עבור ה־API הנייד ולבעלות על הקבצים.

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

התחילו מ־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. לכן שרת האינטרנט אינו מזהה הרחבה שהותקנה זה עתה עד להפעלה מחדש.

הורדת הגרסה

התקינו את FreshRSS מחוץ ל־web root ברירת המחדל, והפנו אליו את Apache. הפרדת תיקיית היישום מ־document root מבטיחה שרק התיקייה הציבורית תהיה נגישה דרך 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

כעת הגדירו את ההרשאות, שעליהן תיעוד 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 אינו דורש הגדרה ומתאים למשתמש יחיד עם כמה מאות הזנות. MariaDB הוא הבחירה הטובה יותר כאשר כמה משתמשים חולקים את אותה התקנה, משום שכתיבות מקביליות של משימת הרענון ושל ממשק האינטרנט אינן מתחרות עוד על נעילת קובץ יחידה.

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. הזנות עשויות להכיל emoji וכתבים שאינם לטיניים, והקידוד הישן בעל שלושת הבתים, utf8, קוטע את כותרת המאמר בתו הראשון שאורכו ארבעה בתים.

ה־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.

מדוע ההזנות אינן מתרעננות מעצמן

שום תהליך אינו בודק את ההזנות עד שמגדירים זאת במפורש. 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

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

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

פלט תקין מציג את שמות ההזנות שהסקריפט הוריד ומסתיים ללא שגיאת PHP. אם לא מודפס דבר, משתמש cron שגוי מוגדר. שגיאת הרשאות ב־data/ פירושה שהשלב chmod -R g+w דולג.

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

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

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

קראו בטלפון

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

היכנסו אל https://rss.example.com/api/ ובחרו באפשרות "Check full server configuration". תצורה תקינה מחזירה את PASS. כשל בשלב זה נובע כמעט תמיד מהיעדר השורה AllowEncodedSlashes On. באפליקציה, הגדירו את כתובת השרת כ־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 מדי פעם, משום שהקובץ הזה מאפשר לבנות מחדש את סביבת הקריאה בכל תוכנת RSS.

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

FAQ

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

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

היישום הנייד שלי אינו יכול להתחבר, אבל האתר פועל. מדוע?

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

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

השתמשו ב־SQLite עבור משתמש יחיד, משום שאין צורך להתקין דבר ואין סיסמה לניהול. עברו ל־MariaDB כאשר יותר מאדם אחד קורא ב־instance, או כאשר אתם עוברים את רף של כמה מאות feeds, משום שמשימת הרענון וממשק האינטרנט כותבים בו־זמנית, ונעילה של קובץ יחיד הופכת למגבלה. בהמשך אפשר לעבור ביניהם באמצעות פקודות הייצוא והייבוא, ולכן זו אינה החלטה בלתי הפיכה.

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

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 באירוח עצמי?

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