SSD Nodes Learn 8GB RAM — $66/taon
Mga Gabay Matt ConnorNi Matt Connor · Na-update 2026-08-02

Paano mag-install ng FreshRSS sa Ubuntu VPS

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

Ano ang bina-build mo

Ang self-hosted RSS reader ay isang feed reader na tumatakbo sa server na pagmamay-ari mo, kaya walang makakapag-shut down nito o makakapagbago sa ipinapakita nito sa iyo. Sa gabay na ito, ilalagay ang FreshRSS sa isang Ubuntu 24.04 VPS: Apache ang nasa harap, PHP ang nasa likod nito, MariaDB ang gagamitin para sa storage, at isang cron job ang kukuha ng mga bagong article. Ang RSS (really simple syndication) ay file format na pino-publish ng isang site para mabasa ng software ang mga article nito. Ang FreshRSS ang PHP application na kumokolekta ng mga file na ito, nag-iingat ng mga article, at nagbibigay sa iyo ng web interface at API (application programming interface) na ginagamit ng mga phone app.

Maliit lang ang mismong installation: i-unpack ang release, gumawa ng database, magsulat ng isang virtual host, at patakbuhin ang isang command line installer. Karamihan sa mga problemang nararanasan pagkatapos nito ay nagmumula sa mga bahaging 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 kailangan nito 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

Ang FreshRSS ay isang karaniwang PHP application, kaya kailangan nito ang parehong base gaya 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 at bumalik dito. Ang maikling bersyon:

sudo apt update
sudo apt install -y apache2 mariadb-server php libapache2-mod-php
sudo systemctl enable --now apache2 mariadb

Dapat iulat ng systemctl status apache2 ang active (running). Kung hindi mag-start ang Apache, ang karaniwang sanhi ay may 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, pati GMP sa 32-bit na system. Sa Ubuntu, available ang mga ito bilang mga package ng distribution:

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 pinipigilan ng nawawalang extension na magsimula ang installer. Sa halip, hihinto ito sa requirements screen at magpapakita ng pulang linya na tumutukoy sa extension. Nakalilito itong lugar para pa lang matuklasan ang problema, kaya kumpirmahin ito ngayon. Mahalaga ang pag-restart ng Apache dahil pinapanatili 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 directory ng application sa document root, ang public folder lamang ang maaabot sa 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

Itakda ngayon ang permissions, na mahigpit na hinihingi ng dokumentasyon ng FreshRSS: pagmamay-ari ng web server user ang buong tree, maaaring magbasa ang group sa 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/data

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

Gumawa ng database

Sinusuportahan ng FreshRSS ang SQLite, MariaDB, MySQL at PostgreSQL. Walang kailangang setup ang SQLite at sapat ito para sa isang tao na may ilang daang feed. Mas mainam ang MariaDB kapag maraming tao na ang gumagamit ng instance, dahil hindi na nagkakaroon ng contention sa iisang file lock ang sabay na pagsusulat 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 at hindi ang utf8. May emoji at mga script na hindi Latin ang mga feed, at pinuputol ng lumang three-byte utf8 encoding ang pamagat ng article sa unang four-byte character.

Apache virtual host

Ang public directory ay p/, hindi ang pinakatuktok ng tree. Ang lahat ng iba pa, kabilang ang configuration file na naglalaman ng iyong database password, 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 iyon 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 i-print ng configtest ang Syntax OK. Mukhang optional ang AllowEncodedSlashes On, pero hindi ito optional: nagpapadala ang Google Reader API ng mga feed identifier na naglalaman ng %2F, at kapag wala ang directive na ito, nire-reject ng Apache ang mga ito. Dahil dito, hindi makapag-sync ang mga mobile app kahit ganap na gumagana ang web interface.

Magdagdag ng HTTPS bago ka 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/; dapat itong magbalik ng 200 o mag-redirect sa login page.

Patakbuhin ang installer mula sa command line

May browser installer ang FreshRSS, pero nauulit ang command line version at nag-iiwan ito ng tala 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 dalawang command bilang www-data. Kapag root ang gumamit nito, gagawa ito ng mga configuration file na pagmamay-ari ng root. Dahil dito, hindi na makakapag-save ng setting ang web interface. 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 awtomatikong nagre-refresh ang mga feed

Walang nagpa-poll sa mga feed mo hangga't hindi mo ito kino-configure. Nagre-refresh ang FreshRSS habang may browser na nakabukas dito. Ibig sabihin, kung dalawang beses ka lang bumibisita sa isang araw, mga labindalawang oras nang luma ang mga artikulong ipinapakita 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 -e

Magdagdag ng isang linya:

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

Ang dalawampung minuto ang praktikal na minimum. Tumanggi ang script na mag-refresh ng kahit isang feed nang mas madalas kaysa isang beses kada dalawampung minuto. Kaya ang mas maikling pagitan ay mag-aaksaya lamang ng CPU. Patakbuhin muna ito nang mano-mano:

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

Sa normal na output, nakalista ang bawat feed na na-fetch nito at nagtatapos ito nang walang PHP error. Kung wala itong inilabas na kahit ano, mali ang cron user. Kung may permission error sa data/, hindi naisagawa ang hakbang na chmod -R g+w.

Idagdag ang iyong mga unang feed

Gamitin ang plus button sa kaliwang itaas ng interface, i-paste ang address ng site, at awtomatikong hahanapin ng FreshRSS ang link ng feed. Karamihan sa mga site ay naglalabas pa rin ng feed kahit hindi nila ito ipinapaalam, karaniwan sa /feed, /rss o /atom.xml. Ang mga category ay mga folder, at inililipat ang feed sa pagitan ng mga ito sa pamamagitan ng pag-drag.

Kung galing ka sa ibang reader, mag-export ng OPML file doon at i-import ito sa subscription management page. Ang OPML (outline processor markup language) ang standard na format ng listahan ng mga feed, at sinusuportahan ito ng bawat maaasahang reader na maaari mong lipatan. Mabagal ang unang refresh pagkatapos ng malaking import dahil isang beses munang kinukuha ang bawat feed, kaya hintayin munang matapos ang unang cron run bago suriin ang bilis.

Basahin sa iyong phone

Sinusuportahan ng FreshRSS ang Google Reader API, na sinusuportahan ng halos lahat ng RSS app. Dapat matupad ang dalawang kondisyon. Sa mga setting ng authentication, 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.

Puntahan ang https://rss.example.com/api/ at piliin ang "Check full server configuration". Kapag gumagana ang setup, ibabalik nito ang PASS. Halos palaging nawawala ang AllowEncodedSlashes On line kapag nagkaroon 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 alternatibo sa Docker

Kung mas gusto mong hindi manu-manong mag-maintain ng PHP at Apache, naglalabas ang project ng opisyal na freshrss/freshrss image, at isang compose file ang nagbibigay sa iyo ng application at database nito. Karaniwang kapalit nito: mas kaunting component sa host, isang karagdagang layer na kailangang i-debug kapag may nasira, at 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 format ng file, 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 iyong state: ang database at /srv/freshrss/data/. I-dump ang una gamit ang sudo mysqldump freshrss > freshrss.sql, kopyahin ang ikalawa, at itago ang pareho sa ibang lugar bukod sa server na ito. Mainam ding paminsan-minsang mag-export ng iyong subscription list bilang OPML, dahil magagamit ng file na iyon para buuing muli ang iyong reading setup sa anumang RSS software.

Ang pag-upgrade ay ang pag-unpack ng mas bagong release sa parehong directory at muling pagpapatakbo ng mga ownership command. Awtomatikong inilalapat ng FreshRSS ang sarili nitong database migrations sa susunod na pag-load ng page. Mag-backup muna, dahil hindi na mababawi ang sitwasyon kapag nabigo ang migration sa database na hindi mo maibabalik. Mababa ang panganib sa 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 aking feeds kapag binubuksan ko ang FreshRSS?

Walang scheduler hangga't hindi ka gumagawa nito. Nire-refresh ng FreshRSS ang feeds habang bukas ang browser session at wala itong ginagawa kapag nakasara ang tab. Idagdag ang cron line na tumatawag sa app/actualize_script.php bilang user na www-data, pagkatapos ay patakbuhin nang mano-mano 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 makasulat ang PHP sa data/.

Hindi makakonekta ang aking mobile app, pero gumagana ang website. Bakit?

Naglalagay ang Google Reader API ng mga naka-encode na slash (%2F) sa mga request path, at awtomatikong tinatanggihan ito ng Apache. Idagdag ang AllowEncodedSlashes On sa loob ng virtual host at i-reload ang Apache. Kumpirmahin ang pag-aayos sa pamamagitan ng pagbukas sa https://rss.example.com/api/ at pagpapatakbo ng "Check full server configuration", na dapat mag-ulat ng PASS. Tiyakin din na nakatakda ang API password sa iyong profile, dahil hiwalay ito sa password sa pag-login.

Dapat ko bang gamitin ang SQLite o MariaDB?

SQLite para sa iisang user, dahil walang kailangang i-install at walang password na kailangang pamahalaan. Gamitin ang MariaDB kapag higit sa isang tao ang nagbabasa sa instance, o kapag lumampas ka sa ilang daang feeds, dahil sabay na sumusulat ang refresh job at web interface at nagiging limitasyon ang isang file lock. Posibleng lumipat sa pagitan ng mga ito sa ibang pagkakataon sa pamamagitan ng export at import commands, kaya hindi ito permanenteng desisyon.

Nabibigo ang installer kapag isinusulat nito ang configuration nito. 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, tanggalin ang mga file na ginawa nito sa ilalim ng data/ bago muling subukan, dahil ang ownership ng mga ito ang aktuwal na problema.

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

Napakakaunti. Komportable ang ilang daang feeds sa isang maliit na plan, dahil maikli lamang ang mga burst ng HTTP fetching bawat dalawampung minuto at nananatiling maliit ang database kapag na-purge ang mga lumang article. Lumalaki ang disk usage batay sa retention, kaya magtakda ng article purge policy sa archiving settings sa halip na panatilihin ang lahat magpakailanman.

#freshrss#rss#self-hosting#php#apache