Paano mag-install ng FreshRSS sa Ubuntu VPS
I-install ang FreshRSS 1.29.1 sa Ubuntu 24.04 VPS gamit ang Apache, PHP 8.3 at MariaDB, kasama ang cron refresh at mobile app API setup.
Mga binubuo mo
Ang self-hosted RSS reader ay isang feed reader na tumatakbo sa server na pagmamay-ari mo, kaya walang ibang makakapag-shut down dito o makakapagbago sa ipinapakita nito sa iyo. Ilalagay ng gabay na ito ang FreshRSS sa isang Ubuntu 24.04 VPS: Apache sa harap, PHP sa likod nito, MariaDB para sa storage, at isang cron job na kumukuha ng mga bagong article. Ang RSS (really simple syndication) ay file format na inilalathala ng isang site upang mabasa ng software ang mga article nito. Ang FreshRSS ang PHP application na kumokolekta sa mga file na iyon, nag-iingat ng mga article, at nagbibigay sa iyo ng web interface at API (application programming interface) na ginagamit ng mga mobile app.
Maliit lang ang mismong installation: i-unpack ang release, gumawa ng database, magsulat ng isang virtual host, at magpatakbo ng isang command line installer. Karamihan sa mga problemang nararanasan pagkatapos nito ay nasa mga hakbang na madalas nagkakamali ang mga tao: ang refresh job, ang encoded slashes para sa mobile API, at ang file ownership.
Ang FreshRSS 1.29.1 ang kasalukuyang release noong July 2026, at nangangailangan ito ng PHP 8.1 o mas bago. May PHP 8.3 ang Ubuntu 24.04, kaya sapat na ang mga package ng distribution at hindi mo kailangan ng third-party PHP repository.
Magsimula sa gumaganang LAMP stack
Ordinaryong PHP application ang FreshRSS, kaya kailangan nito ang parehong base tulad ng iba pang PHP application. Kung hindi mo pa naihahanda ang base na iyon, sundin muna ang setup ng LAMP stack para sa Ubuntu 24.04 bago bumalik dito. Ang pinaikling bersyon:
sudo apt update
sudo apt install -y apache2 mariadb-server php libapache2-mod-php
sudo systemctl enable --now apache2 mariadbDapat mag-ulat ang systemctl status apache2 ng active (running). Kung hindi magsimula ang Apache, karaniwang sanhi nito ang ibang process na gumagamit na ng port 80, at tinutukoy ito ng sudo ss -ltnp | grep :80.
Mga PHP extension na kailangan ng FreshRSS
Itinuturing ng FreshRSS na mandatory ang libxml, cURL, JSON, PDO_MySQL, PCRE at ctype. Kailangan din nito ang mbstring, iconv, Zlib at ZipArchive, at ang GMP sa 32 bit na system. Sa Ubuntu, ini-install ang mga ito bilang distribution package:
sudo apt install -y php-curl php-mbstring php-xml php-zip php-mysql php-intl php-gmp
sudo systemctl restart apache2Suriin kung ano talaga ang na-load ng PHP gamit ang php -m. Hindi pumipigil sa pag-start ng installer ang nawawalang extension. Sa halip, hihinto ito sa requirements screen at magpapakita ng pulang linya na naglalagay sa pangalan ng extension. Nakalilito itong lugar para pa lamang matuklasan ang problema, kaya kumpirmahin ito ngayon. Mahalaga ang pag-restart ng Apache dahil pinananatili ng libapache2-mod-php ang PHP sa loob ng Apache process. Dahil dito, hindi makikita ng web server ang bagong-install na extension hangga't hindi ito nagre-restart.
I-download ang release
I-install ang FreshRSS sa labas ng default web root, at ituro rito ang Apache. Kapag hiwalay ang application directory sa document root, ang public folder lamang ang maaabot sa pamamagitan ng 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/freshrssNgayon, itakda ang permissions na mahigpit na hinihingi ng FreshRSS documentation: ang web server user ang dapat may-ari ng tree, maaaring magbasa ang group ng bawat file, at maaaring magsulat ang group sa ./data/.
sudo chown -R www-data:www-data /srv/freshrss
sudo chmod -R g+r /srv/freshrss
sudo chmod -R g+w /srv/freshrss/dataKapag nilaktawan ito, mabibigo ang installer habang isinusulat ang configuration nito, dahil tumatakbo ang PHP bilang www-data at hindi makapagsusulat ang www-data sa directory na pagmamay-ari ng root.
Lumikha ng database
Sinusuportahan ng FreshRSS ang SQLite, MariaDB, MySQL, at PostgreSQL. Walang setup na kailangan para sa SQLite, at sapat ito para sa isang tao na may ilang daang feed. Mas mainam ang MariaDB kapag maraming tao ang gumagamit ng instance, dahil hindi na nag-aagawan sa iisang file lock ang sabay na writes mula sa refresh job at web interface.
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;"Gamitin ang utf8mb4, hindi ang utf8. May emoji at non-Latin script ang mga feed, at pinuputol ng lumang three-byte utf8 encoding ang pamagat ng article sa unang four-byte character.
Ang Apache virtual host
Ang public directory ay p/, hindi ang pinakataas ng tree. Ang lahat ng iba pa, kabilang ang configuration file na naglalaman ng password ng database, ay nasa itaas ng document root kung saan hindi ito kailanman ise-serve ng 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>I-save ito bilang /etc/apache2/sites-available/freshrss.conf at i-enable ito:
sudo a2enmod rewrite
sudo a2ensite freshrss
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2Dapat mag-print ang configtest ng Syntax OK. Mukhang optional ang AllowEncodedSlashes On, pero hindi ito ganoon: nagpapadala ang Google Reader API ng mga feed identifier na naglalaman ng %2F, at kung wala ang directive na ito, nire-reject ng Apache ang mga ito. Dahil dito, hindi makapag-sync ang mga mobile app kahit gumagana nang maayos ang web interface.
Magdagdag ng HTTPS bago mag-log in
Magta-type ka ng password sa site na ito, kaya kumuha muna ng certificate. Ituro ang isang A record sa server, pagkatapos ay sundin ang setup ng Certbot para sa Apache sa Ubuntu at patakbuhin ang sudo certbot --apache -d rss.example.com. Binabago ng Certbot ang virtual host para sa port 443 at idinadagdag ang redirect. Kumpirmahin gamit ang curl -I https://rss.example.com/, na dapat magbalik ng 200 o mag-redirect sa login page.
Patakbuhin ang installer mula sa command line
May browser installer ang FreshRSS, pero repeatable ang command-line version at nag-iiwan ito ng record ng eksaktong mga pinili mo.
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'Patakbuhin ang dalawa bilang www-data. Kapag root ang gumamit sa mga ito, magkakaroon ng mga configuration file na pagmamay-ari ng root, kaya hindi na makakapag-save ng setting ang web interface sa susunod. Mahalaga rin ang --environment production dahil ipinapakita ng development setting ang mga PHP notice sa page.
I-load ang https://rss.example.com/ at mag-log in bilang admin.
Bakit hindi kusang nagre-refresh ang mga feed
Walang magpo-poll sa mga feed mo hangga't hindi mo ito sinasabihan. Nagre-refresh ang FreshRSS habang may browser na nakabukas dito. Ibig sabihin, kung dalawang beses mo lang bisitahin sa isang araw ang isang instance, labindalawang oras nang luma ang mga artikulong ipapakita nito. Ang solusyon ay ang script na inilabas ng project para rito, app/actualize_script.php, na patakbuhin mula sa cron.
sudo crontab -u www-data -eMagdagdag ng isang linya:
*/20 * * * * php /srv/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1Ang 20 minuto ang praktikal na minimum. Tumanggi ang script na mag-refresh ng isang feed nang higit sa isang beses kada 20 minuto. Kaya ang mas maikling schedule ay mag-aaksaya lamang ng CPU. Patakbuhin muna ito nang mano-mano:
sudo -u www-data php /srv/freshrss/app/actualize_script.phpSa maayos na output, nakalista ang bawat feed na na-fetch nito at nagtatapos ito nang walang PHP error. Kung wala itong i-print, mali ang cron user. Ang permission error sa data/ ay nangangahulugang nalaktawan ang hakbang na chmod -R g+w.
Idagdag ang iyong unang feeds
Gamitin ang plus button sa kaliwang itaas ng interface, i-paste ang site address, at awtomatikong hahanapin ng FreshRSS ang feed link para sa iyo. Karamihan sa mga site ay naglalabas pa rin ng feed kahit hindi nila ito direktang ipinapakita, karaniwan sa /feed, /rss o /atom.xml. Ang mga category ay mga folder, at drag lang ang kailangan para ilipat ang isang feed sa pagitan ng mga ito.
Kung galing ka sa ibang reader, mag-export muna roon ng OPML file at i-import ito sa subscription management page. Ang OPML (outline processor markup language) ang standard na format para sa listahan ng feed, at sinusuportahan ito ng lahat ng reader na karaniwang ginagamit. Mabagal ang unang refresh kapag malaki ang import dahil isang beses munang kinukuha ang bawat feed, kaya hintayin munang matapos ang unang cron run bago suriin ang bilis.
Basahin ito sa iyong phone
Sinusuportahan ng FreshRSS ang Google Reader API, na sinusuportahan ng halos lahat ng RSS app. May dalawang kundisyong dapat matupad. Sa authentication settings, dapat naka-on ang “Allow API access”; itinakda na ito ng --api-enabled flag sa itaas. Sa iyong profile, dapat may value ang API password field. Sadyang hiwalay ito sa iyong login password dahil mas madaling mawala ang phone.
Bisitahin ang https://rss.example.com/api/ at piliin ang “Check full server configuration”. Kapag maayos ang setup, magbabalik ito ng PASS. Halos palaging nawawalang AllowEncodedSlashes On line ang sanhi ng failure dito. Sa app, ilagay ang server address bilang https://rss.example.com/api/greader.php, ang username bilang iyong FreshRSS user, at ang API password bilang password.
Ang alternatibong Docker
Kung mas gusto mong hindi manu-manong mag-maintain ng PHP at Apache, naglalabas ang project ng opisyal na freshrss/freshrss image. Sa pamamagitan ng isang compose file, magkasama mong makukuha ang application at database nito. Karaniwan ang kapalit nito: mas kaunti ang kailangang i-manage sa host, pero may isa pang layer na kailangang i-debug kapag may nasira. Kailangan pa rin ng reverse proxy para sa TLS (transport layer security). Kung mas angkop ito sa iyo, saklaw ng mga pangunahing kaalaman sa Docker Compose para sa VPS ang file format, at magiging docker exec --user www-data freshrss php ./app/actualize_script.php ang cron line.
Mga backup at upgrade
Dalawang bagay ang naglalaman ng state ng system: ang database at ang /srv/freshrss/data/. I-dump ang una gamit ang sudo mysqldump freshrss > freshrss.sql, kopyahin ang ikalawa, at itago ang dalawang ito sa ibang lokasyon bukod sa server na ito. Mainam ding paminsan-minsan mag-export ng iyong subscription list sa OPML, dahil magagamit ang file na iyon upang buuin muli ang reading setup mo sa anumang RSS software.
Ang pag-upgrade ay nangangahulugang i-unpack ang mas bagong release sa parehong directory at muling patakbuhin ang mga ownership command. Awtomatikong inilalapat ng FreshRSS ang sarili nitong database migration sa susunod na page load. Mag-backup muna, dahil kung mabigo ang migration sa isang database na hindi mo ma-restore, hindi na ito mare-recover. Mababa ang panganib sa pagpapatakbo ng reader service, kaya magandang unang kandidato ito kung gumagawa ka ng listahan ng mga serbisyong sulit i-self-host.
FAQ
Bakit nag-a-update lang ang feeds ko kapag binubuksan ko ang FreshRSS?
Dahil walang scheduler hanggang sa gumawa ka nito. Nire-refresh ng FreshRSS ang feeds habang may bukas na browser session, at walang ginagawa kapag nakasara ang tab. Idagdag ang cron line na tumatawag sa app/actualize_script.php bilang user na www-data, pagkatapos ay manu-manong patakbuhin ang script nang isang beses at basahin ang output nito. Karaniwang nangangahulugan ang walang output na pinapatakbo ito ng cron bilang maling user, kaya hindi makapagsulat ang PHP sa data/.
Hindi makakonekta ang mobile app ko, pero gumagana ang website. Bakit?
Naglalagay ang Google Reader API ng encoded slashes (%2F) sa loob ng request paths, at awtomatikong nire-reject ng Apache ang mga ito. Idagdag ang AllowEncodedSlashes On sa loob ng virtual host at i-reload ang Apache. Kumpirmahin ang ayos sa pamamagitan ng pagbubukas sa https://rss.example.com/api/ at pagpapatakbo ng "Check full server configuration", na dapat mag-ulat ng PASS. Tiyakin ding nakatakda ang API password sa iyong profile, dahil hiwalay ito sa password para sa iyong login.
Dapat ba akong gumamit ng SQLite o MariaDB?
SQLite para sa isang user, dahil walang kailangang i-install at walang password na kailangang i-manage. Gamitin ang MariaDB kapag higit sa isang tao ang nagbabasa sa instance, o kapag lumampas ka sa ilang daang feed, dahil sabay na nagsusulat ang refresh job at web interface at nagiging limitasyon ang iisang file lock. Posibleng lumipat sa pagitan ng mga ito sa ibang pagkakataon gamit ang export at import commands, kaya hindi ito permanenteng desisyon.
Nabibigo ang installer kapag isinusulat nito ang configuration nito. Ano ang problema?
Tumatakbo ang PHP bilang www-data sa ilalim ng Apache, at hindi makapagsulat ang user na iyon sa directory na pagmamay-ari ng root. Patakbuhin muli ang sudo chown -R www-data:www-data /srv/freshrss at sudo chmod -R g+w /srv/freshrss/data, pagkatapos ay simulan ulit ang installer. Kung pinatakbo mo na bilang root ang command line installer, tanggalin ang mga file na ginawa nito sa ilalim ng data/ bago muling subukan, dahil ang ownership ng mga file ang aktuwal na problema.
Gaano karaming server resources ang kailangan ng self-hosted RSS reader?
Kaunti lamang. Komportable ang ilang daang feed sa maliit na plan, dahil panandaliang burst lang ng HTTP fetching ang load kada dalawampung minuto at nananatiling maliit ang database kapag na-purge na ang mga lumang article. Lumalaki ang disk usage ayon sa retention, kaya magtakda ng article purge policy sa archiving settings sa halip na panatilihin ang lahat magpakailanman.