SSD Nodes Learn Hosting plans →
Mga Gabay Matt ConnorNi Matt Connor

Paano Mag-install ng FreshRSS sa Ubuntu VPS

I-install ang FreshRSS 1.30.1 sa Ubuntu 24.04 VPS gamit ang Apache, PHP at MariaDB, kasama ang virtual host, cron refresh, at mobile app API.

Mga binubuo mo

Ang self-hosted RSS reader ay isang feed reader na tumatakbo sa server na pagmamay-ari mo, kaya walang makapagpapasara nito o makapagbabago sa ipinapakita nito sa iyo. Inilalagay ng gabay na ito ang FreshRSS sa isang Ubuntu 24.04 VPS: Apache sa harapan, PHP sa likod nito, MariaDB para sa storage, at isang cron job na kumukuha ng mga bagong article. Ang RSS (really simple syndication) ay format ng file na inilalathala ng isang site upang mabasa ng software ang mga article nito. Ang FreshRSS ang PHP application na kumokolekta ng 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 phone app.

Maliit ang mismong installation: i-unpack ang isang release, gumawa ng database, magsulat ng isang virtual host, patakbuhin ang command line installer, at gumawa ng account gamit ang cli/create-user.php. Karamihan ng kailangang gawin sa ibaba ay ang mga bahaging madalas nagkakamali ang mga tao pagkatapos nito: ang refresh job, ang encoded slashes para sa mobile API, at ang file ownership.

Ang FreshRSS 1.30.4, na inilabas noong October 21, 2026, ang kasalukuyang release noong October 29, 2026, at kailangan nito ng PHP 8.1 o mas bago. May PHP 8.3 ang Ubuntu 24.04, kaya sapat na ang distribution packages 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 mariadb

Dapat 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 apache2

Suriin 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 maaaring ma-access gamit ang 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

Ngayon, ayusin ang permissions. Mahigpit ang FreshRSS documentation sa mga ito: pagmamay-ari ng web server user ang buong tree, maaaring basahin ng group ang bawat file, at maaaring sumulat 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/data

Kapag nilaktawan ito, mabibigo ang installer habang sinusulat nito ang configuration. Tumatakbo ang PHP bilang www-data, at hindi makapagsusulat ang www-data sa directory na pagmamay-ari ng root.

Gumawa ng database

Sinusuportahan ng FreshRSS ang SQLite, MariaDB, MySQL, at PostgreSQL. Kailangan ng SQLite ang php-sqlite3 extension, pero hindi nito kailangan ng pag-set up ng database server. Iniimbak nito ang data ng bawat user sa hiwalay na data/users/_user_/db.sqlite file. Kapag nagdagdag ng mga user, hindi inilalagay ang kanilang mga write sa iisang shared SQLite file. Sa gabay na ito, MariaDB ang ginagamit bilang bahagi ng LAMP stack.

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 at hindi ang utf8. Naglalaman ang mga feed ng emoji at mga script na hindi Latin. Hindi kayang mag-imbak ng four-byte character ang lumang three-byte utf8 encoding. Nagdudulot ng error ang mga hindi sinusuportahang character kapag default strict mode ng MariaDB ang ginagamit. Nakadepende ang truncation sa SQL mode at sa mga option ng statement gaya ng IGNORE.

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 apache2

Dapat 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 nagpo-poll sa mga feed mo hangga't hindi mo ito kino-configure. Hindi nagse-schedule ng feed fetching ang pagbukas ng FreshRSS; kung walang scheduler, gamitin ang update link sa navigation menu upang manu-manong i-fetch ang mga article. Ang solusyon ay ang script na inilalabas ng proyekto para rito, app/actualize_script.php, na patakbuhin mula sa cron.

sudo crontab -u www-data -e

Magdagdag ng isang linya:

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

Makatuwirang schedule ang dalawampung minuto, ngunit nalalapat pa rin ang refresh interval ng bawat feed: isang oras ang default, at sinusuportahan ng mga indibidwal na feed ang mga interval na hanggang labinlimang minuto. Patakbuhin muna ito nang mano-mano:

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

Ipinapakita ng normal na output ang refresh run at nagtatapos ito nang walang PHP error; lumalabas ang mga pangalan ng feed kapag may idinagdag o na-update na mga article. Kung wala itong i-print, suriin ang error output ng PHP at ang FreshRSS logs; hindi sapat ang kawalan ng output upang matukoy na cron user ang sanhi. Kung may permission error sa data/, suriin ang ownership at write permissions.

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 ginagamit ng maraming RSS app. Dalawang bagay ang 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. Hiwalay ito sa iyong login password dahil mas madaling mawala ang phone.

Pumunta sa https://rss.example.com/api/ upang awtomatikong patakbuhin ang mga server configuration check. Ang gumaganang setup ay magbabalik ng PASS. Kung mabigo ang check, suriin ang AllowEncodedSlashes On setting ng virtual host at ang naiulat na error. 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 iyong system: ang database at /srv/freshrss/data/. I-dump ang una gamit ang sudo mysqldump freshrss > freshrss.sql, kopyahin ang ikalawa, at itago ang dalawa sa ibang lokasyon na hindi ang server na ito. Mainam ding paminsan-minsan mag-export ng subscription list bilang OPML, dahil inililipat ng file na iyon ang feed list mo sa ibang reader na sumusuporta sa OPML. Hindi nito napapanatili ang mga setting na partikular sa FreshRSS, gaya ng refresh frequency, credentials, user agent, o XPath web scraping rules. Gumamit din ng SQLite export upang mapanatili ang mga iyon.

Ang pag-upgrade ay nangangahulugang i-unpack ang mas bagong release sa parehong directory at muling patakbuhin ang mga ownership command. Sundin ang version-by-version upgrade path ng proyekto at i-verify ang FreshRSS pagkatapos ng bawat hakbang. Awtomatikong inilalapat ng FreshRSS ang sarili nitong database migrations sa susunod na page load. Mag-back up muna, dahil kapag nabigo ang migration sa database na hindi mo maibalik, hindi na ito mare-recover. Kung nag-install ka mula sa mas lumang tarball gaya ng 1.29.1, mag-upgrade sa 1.30.4: kasama sa 1.30.x security releases ang session ID rotation kapag may authentication changes at mga limitasyon sa ZIP imports. Ina-update din ng 1.30.4 ang alternative Alpine Docker images upang matugunan ang mga malulubhang PHP vulnerabilities. Mababa ang risk ng pagpapatakbo ng reader service, kaya magandang unang kandidato ito kung sinusuri mo ang listahan ng mga serbisyong sulit i-self-host.

FAQ

Bakit nag-a-update lang ang mga feed ko kapag binubuksan ko ang FreshRSS?

Hindi nagse-schedule ng feed fetching ang pagbubukas ng page. Kung walang scheduler, gamitin ang update link para manu-manong mag-refresh. Idagdag ang cron line na tumatawag sa app/actualize_script.php bilang user na www-data, pagkatapos ay patakbuhin nang isang beses ang script nang mano-mano at basahin ang output nito. Kung walang output, tingnan ang error output ng PHP at ang FreshRSS logs, pagkatapos ay tiyaking may write access ang cron user 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 pag-aayos sa pagbukas ng https://rss.example.com/api/, kung saan dapat i-report ng automatic configuration check ang PASS. Tiyakin ding nakatakda ang API password sa iyong profile, dahil hiwalay ito sa login password mo.

Dapat ko bang gamitin ang SQLite o MariaDB?

Kailangan ng SQLite ang php-sqlite3 extension, pero hindi nito kailangan ng database server o database password na imam manage. May hiwalay na SQLite database file ang bawat user, kaya ang pagdaragdag ng second user ay hindi nagdudulot ng contention sa iisang shared file at hindi nangangailangan ng MariaDB. Gamitin ang MariaDB kung gusto mong gamitin ang database server sa iyong LAMP stack. Posibleng lumipat sa pagitan ng mga ito sa ibang pagkakataon gamit ang export at import commands, kaya hindi ito permanenteng desisyon.

Nagfa-fail ang installer kapag sinusulat nito ang configuration. Ano ang mali?

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 muli ang installer. Kung pinatakbo mo na bilang root ang command line installer, ayusin ang ownership ng mga file na ginawa nito sa ilalim ng data/ bago muling subukan.

Gaano karaming server resources ang kailangan ng self-hosted RSS reader?

Napakakaunti. Idinisenyo ang FreshRSS na tumakbo sa modest hardware, pero nakadepende ang resource use sa iyong mga feed, laki ng mga article, at retention settings. Lumalaki ang disk usage kasabay ng retention, kaya magtakda ng article purge policy sa archiving settings sa halip na panatilihin ang lahat magpakailanman.

Nakatulong ba ang artikulong ito?