Pasang FreshRSS di VPS Ubuntu 24.04
Panduan memasang FreshRSS 1.29.1 di VPS Ubuntu 24.04 dengan Apache, PHP 8.3, MariaDB, virtual host, cron refresh, dan API aplikasi seluler.
Yang Anda bangun
Pembaca RSS yang di-host sendiri adalah pembaca feed yang berjalan di server milik Anda, sehingga tidak ada pihak yang dapat mematikannya atau mengubah konten yang ditampilkannya. Panduan ini memasang FreshRSS pada VPS Ubuntu 24.04: Apache sebagai server front-end, PHP sebagai lapisan aplikasi, MariaDB untuk penyimpanan, dan satu tugas cron untuk mengambil artikel baru. RSS (really simple syndication) adalah format file yang dipublikasikan situs agar perangkat lunak dapat membaca artikelnya. FreshRSS adalah aplikasi PHP yang mengumpulkan file tersebut, menyimpan artikel, serta menyediakan antarmuka web dan API (application programming interface) yang digunakan aplikasi ponsel.
Proses instalasinya sederhana: ekstrak release, buat database, tulis satu virtual host, lalu jalankan satu installer command line. Sebagian besar masalah biasanya terjadi setelahnya, yaitu pada tugas refresh, encoded slashes untuk API seluler, dan kepemilikan file.
FreshRSS 1.29.1 adalah release terbaru per Juli 2026, dan memerlukan PHP 8.1 atau yang lebih baru. Ubuntu 24.04 menyediakan PHP 8.3, sehingga paket distribusi sudah cukup dan Anda tidak memerlukan repositori PHP pihak ketiga.
Mulai dari stack LAMP yang berfungsi
FreshRSS adalah aplikasi PHP biasa, sehingga memerlukan basis yang sama seperti aplikasi lainnya. Jika Anda belum menyiapkan basis tersebut, ikuti penyiapan stack LAMP untuk Ubuntu 24.04 terlebih dahulu, lalu kembali ke sini. Versi singkatnya:
sudo apt update
sudo apt install -y apache2 mariadb-server php libapache2-mod-php
sudo systemctl enable --now apache2 mariadbsystemctl status apache2 harus melaporkan active (running). Jika Apache tidak dapat dimulai, penyebab yang umum adalah proses lain sudah menggunakan port 80, dan sudo ss -ltnp | grep :80 menampilkan nama proses tersebut.
Ekstensi PHP yang diperlukan FreshRSS
FreshRSS menganggap libxml, cURL, JSON, PDO_MySQL, PCRE, dan ctype sebagai ekstensi wajib. FreshRSS juga memerlukan mbstring, iconv, Zlib, dan ZipArchive, serta GMP pada sistem 32 bit. Di Ubuntu, ekstensi tersebut tersedia sebagai paket distribusi:
sudo apt install -y php-curl php-mbstring php-xml php-zip php-mysql php-intl php-gmp
sudo systemctl restart apache2Periksa ekstensi yang benar-benar dimuat PHP dengan php -m. Ekstensi yang tidak ada tidak mencegah penginstal dimulai. Namun, ekstensi tersebut akan menghentikan proses pada layar persyaratan dengan baris merah yang menyebutkan nama ekstensi. Menemukan masalah di tahap itu dapat membingungkan, jadi lakukan pemeriksaan sekarang. Memulai ulang Apache penting karena libapache2-mod-php menjalankan PHP di dalam proses Apache. Akibatnya, server web tidak dapat melihat ekstensi yang baru diinstal sampai Apache dimulai ulang.
Unduh rilis
Instal FreshRSS di luar root web default, lalu arahkan Apache ke sana. Memisahkan direktori aplikasi dari root dokumen memastikan hanya folder publik yang dapat diakses melalui 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/freshrssSekarang atur izinnya. Dokumentasi FreshRSS menetapkan aturan yang ketat: pengguna server web memiliki seluruh hierarki direktori, grup dapat membaca setiap file, dan grup dapat menulis ke ./data/.
sudo chown -R www-data:www-data /srv/freshrss
sudo chmod -R g+r /srv/freshrss
sudo chmod -R g+w /srv/freshrss/dataJika langkah ini dilewati, penginstal gagal saat menulis konfigurasinya karena PHP berjalan sebagai www-data, sedangkan www-data tidak dapat menulis ke direktori yang dimiliki root.
Buat database
FreshRSS mendukung SQLite, MariaDB, MySQL, dan PostgreSQL. SQLite tidak memerlukan penyiapan dan cukup untuk satu orang dengan beberapa ratus feed. MariaDB lebih sesuai jika beberapa orang menggunakan instance yang sama, karena penulisan serentak dari tugas refresh dan antarmuka web tidak lagi saling berebut kunci file tunggal.
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;"Gunakan utf8mb4, bukan utf8. Feed dapat berisi emoji dan skrip non-Latin, sedangkan pengodean utf8 lama yang menggunakan tiga byte akan memotong judul artikel pada karakter pertama yang menggunakan empat byte.
Virtual host Apache
Direktori publik adalah p/, bukan direktori teratas dalam hierarki. Semua yang lain, termasuk file konfigurasi yang menyimpan kata sandi database Anda, berada di atas document root sehingga Apache tidak akan menyajikannya.
<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>Simpan sebagai /etc/apache2/sites-available/freshrss.conf lalu aktifkan:
sudo a2enmod rewrite
sudo a2ensite freshrss
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2configtest seharusnya menampilkan Syntax OK. AllowEncodedSlashes On tampak opsional, tetapi sebenarnya wajib: Google Reader API mengirim pengenal feed yang berisi %2F. Tanpa direktif ini, Apache menolaknya sehingga aplikasi seluler gagal melakukan sinkronisasi, sementara antarmuka web berfungsi dengan baik.
Tambahkan HTTPS sebelum Anda masuk
Anda akan mengetikkan kata sandi ke situs ini, jadi dapatkan sertifikat terlebih dahulu. Arahkan A record ke server, lalu ikuti penyiapan Certbot untuk Apache di Ubuntu dan jalankan sudo certbot --apache -d rss.example.com. Certbot menulis ulang virtual host untuk port 443 dan menambahkan pengalihan. Konfirmasikan dengan curl -I https://rss.example.com/, yang seharusnya mengembalikan 200 atau mengarahkan ke halaman login.
Jalankan penginstal dari baris perintah
FreshRSS memiliki penginstal melalui browser, tetapi versi baris perintah dapat dijalankan berulang kali dan mencatat pilihan Anda secara persis.
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'Jalankan keduanya sebagai www-data. Menjalankannya sebagai root membuat file konfigurasi dimiliki oleh root, sehingga antarmuka web kemudian gagal menyimpan pengaturan apa pun. --environment production juga penting karena pengaturan pengembangan menampilkan notifikasi PHP pada halaman.
Muat https://rss.example.com/ dan masuk sebagai admin.
Mengapa feed tidak diperbarui sendiri
Tidak ada proses yang memeriksa feed sampai Anda mengaturnya. FreshRSS melakukan pembaruan saat browser terbuka pada halaman tersebut. Akibatnya, instance yang Anda kunjungi dua kali sehari menampilkan artikel yang sudah berusia dua belas jam. Solusinya adalah skrip yang disediakan proyek untuk keperluan ini, app/actualize_script.php, dan menjalankannya melalui cron.
sudo crontab -u www-data -eTambahkan satu baris:
*/20 * * * * php /srv/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1Dua puluh menit adalah batas minimum yang wajar. Skrip menolak memperbarui satu feed yang sama lebih sering daripada sekali setiap dua puluh menit. Jadwal yang lebih rapat hanya membebani CPU. Jalankan skrip sekali secara manual terlebih dahulu:
sudo -u www-data php /srv/freshrss/app/actualize_script.phpKeluaran yang normal mencantumkan setiap feed yang berhasil diambil dan berakhir tanpa kesalahan PHP. Jika tidak ada keluaran sama sekali, pengguna cron salah. Kesalahan izin pada data/ berarti langkah chmod -R g+w dilewati.
Tambahkan feed pertama Anda
Gunakan tombol plus di kiri atas antarmuka, tempelkan alamat situs, dan FreshRSS akan menemukan tautan feed untuk Anda. Sebagian besar situs masih menerbitkan feed meskipun tidak mencantumkannya, biasanya di /feed, /rss atau /atom.xml. Kategori berfungsi sebagai folder, dan Anda dapat memindahkan feed di antaranya dengan menyeretnya.
Jika Anda beralih dari pembaca lain, ekspor file OPML di sana dan impor file tersebut dari halaman pengelolaan langganan. OPML (outline processor markup language) adalah format standar untuk daftar feed, dan semua pembaca yang layak digunakan mendukungnya. Impor dalam jumlah besar akan berjalan lambat saat penyegaran pertama karena setiap feed diambil satu kali. Tunggu cron berjalan pertama kali sebelum menilai kecepatannya.
Baca di ponsel
FreshRSS mendukung Google Reader API, yang didukung oleh hampir semua aplikasi RSS. Dua hal harus terpenuhi. Pada pengaturan autentikasi, "Allow API access" harus diaktifkan. Flag --api-enabled di atas sudah mengaktifkannya. Pada profil Anda, kolom kata sandi API harus berisi nilai. Kata sandi ini sengaja dipisahkan dari kata sandi login karena ponsel lebih mudah hilang.
Buka https://rss.example.com/api/, lalu pilih "Check full server configuration". Konfigurasi yang berfungsi akan menampilkan PASS. Kegagalan pada tahap ini hampir selalu disebabkan oleh baris AllowEncodedSlashes On yang tidak ada. Di aplikasi, masukkan alamat server sebagai https://rss.example.com/api/greader.php, nama pengguna sebagai pengguna FreshRSS Anda, dan kata sandi API sebagai kata sandi.
Alternatif Docker
Jika Anda lebih memilih untuk tidak mengelola PHP dan Apache secara manual, proyek ini menyediakan image freshrss/freshrss resmi. Satu file compose menyediakan aplikasi dan databasenya sekaligus. Konsekuensinya seperti biasa: lebih sedikit komponen yang perlu dikelola di host, tetapi ada satu lapisan tambahan yang harus ditelusuri saat terjadi masalah. Anda tetap memerlukan reverse proxy untuk TLS (transport layer security). Jika pilihan ini lebih sesuai, dasar-dasar Docker Compose untuk VPS menjelaskan format file tersebut, dan baris cron menjadi docker exec --user www-data freshrss php ./app/actualize_script.php.
Pencadangan dan pemutakhiran
Dua hal menyimpan status Anda: database dan /srv/freshrss/data/. Ekspor yang pertama dengan sudo mysqldump freshrss > freshrss.sql, salin yang kedua, lalu simpan keduanya di lokasi selain server ini. Daftar langganan Anda juga sebaiknya sesekali diekspor dalam format OPML, karena file tersebut dapat membangun ulang pengaturan bacaan Anda pada perangkat lunak RSS apa pun.
Pemutakhiran dilakukan dengan mengekstrak rilis yang lebih baru ke direktori yang sama, lalu menjalankan kembali perintah kepemilikan. FreshRSS akan menerapkan migrasi databasenya sendiri saat halaman berikutnya dimuat. Lakukan pencadangan terlebih dahulu, karena migrasi yang gagal pada database yang tidak dapat dipulihkan akan menimbulkan kondisi yang tidak dapat diperbaiki. Reader adalah layanan berisiko rendah untuk dijalankan dan kandidat awal yang baik jika Anda sedang meninjau daftar hal yang layak di-host sendiri.
FAQ
Mengapa feed saya hanya diperbarui saat saya membuka FreshRSS?
Karena belum ada penjadwal sampai Anda membuatnya. FreshRSS menyegarkan feed saat sesi browser terbuka dan tidak melakukan apa pun saat tab ditutup. Tambahkan baris cron yang memanggil app/actualize_script.php sebagai pengguna www-data, lalu jalankan skrip secara manual sekali dan baca hasilnya. Tidak adanya keluaran biasanya berarti cron menjalankannya sebagai pengguna yang salah, sehingga PHP tidak dapat menulis ke data/.
Aplikasi seluler saya tidak dapat terhubung, tetapi situs web berfungsi. Mengapa?
Google Reader API menempatkan garis miring yang dikodekan (%2F) di dalam jalur permintaan, dan Apache menolaknya secara default. Tambahkan AllowEncodedSlashes On di dalam virtual host, lalu muat ulang Apache. Konfirmasikan perbaikannya dengan membuka https://rss.example.com/api/ dan menjalankan "Check full server configuration", yang seharusnya melaporkan PASS. Periksa juga apakah kata sandi API telah ditetapkan di profil Anda, karena kata sandi tersebut terpisah dari kata sandi login Anda.
Sebaiknya saya menggunakan SQLite atau MariaDB?
Gunakan SQLite untuk satu pengguna, karena tidak ada yang perlu diinstal dan tidak ada kata sandi yang perlu dikelola. Gunakan MariaDB jika lebih dari satu orang membaca pada instance tersebut, atau jika jumlah feed melebihi beberapa ratus, karena tugas penyegaran dan antarmuka web menulis pada saat yang sama dan satu penguncian file menjadi batasnya. Anda dapat berpindah di antara keduanya nanti melalui perintah ekspor dan impor, jadi ini bukan keputusan permanen.
Penginstal gagal saat menulis konfigurasinya. Apa masalahnya?
PHP berjalan sebagai www-data di bawah Apache, dan pengguna tersebut tidak dapat menulis ke direktori yang dimiliki root. Jalankan kembali sudo chown -R www-data:www-data /srv/freshrss dan sudo chmod -R g+w /srv/freshrss/data, lalu mulai penginstal lagi. Jika Anda sudah menjalankan penginstal baris perintah sebagai root, hapus file yang dibuatnya di bawah data/ sebelum mencoba lagi, karena kepemilikan file tersebut adalah masalah sebenarnya.
Berapa banyak sumber daya server yang diperlukan pembaca RSS yang di-host sendiri?
Sangat sedikit. Beberapa ratus feed pada paket kecil sudah memadai, karena beban muncul dalam lonjakan singkat pengambilan HTTP setiap dua puluh menit dan database tetap kecil setelah artikel lama dihapus. Penggunaan disk bertambah sesuai retensi, jadi tetapkan kebijakan penghapusan artikel di pengaturan pengarsipan, bukan menyimpan semuanya selamanya.