Cara Pasang FreshRSS pada VPS Ubuntu 24.04
Pasang FreshRSS 1.29.1 pada VPS Ubuntu 24.04 dengan Apache, PHP 8.3 dan MariaDB, termasuk cron penyegaran serta API aplikasi mudah alih.
Perkara yang anda bina
Pembaca RSS yang dihoskan sendiri ialah pembaca suapan yang berjalan pada pelayan milik anda, jadi tiada pihak lain boleh menutupnya atau mengubah perkara yang dipaparkan kepada anda. Panduan ini memasang FreshRSS pada VPS Ubuntu 24.04: Apache di hadapan, PHP di belakangnya, MariaDB untuk penyimpanan, dan satu tugas cron yang mengambil artikel baharu. RSS (really simple syndication) ialah format fail yang diterbitkan oleh sesuatu tapak supaya perisian boleh membaca artikelnya. FreshRSS ialah aplikasi PHP yang mengumpulkan fail tersebut, menyimpan artikel, dan menyediakan antara muka web serta API (application programming interface) yang digunakan oleh aplikasi telefon.
Pemasangan itu sendiri ringkas: nyahpek keluaran, cipta pangkalan data, tulis satu virtual host, dan jalankan satu pemasang baris perintah. Kebanyakan kerja di bawah melibatkan perkara yang sering tersilap selepas itu, iaitu tugas penyegaran, slash berkod untuk API mudah alih, dan pemilikan fail.
FreshRSS 1.29.1 ialah keluaran semasa pada Julai 2026, dan memerlukan PHP 8.1 atau lebih baharu. Ubuntu 24.04 disertakan dengan PHP 8.3, jadi pakej pengedaran sudah mencukupi dan anda tidak memerlukan repositori PHP pihak ketiga.
Mulakan dengan tindanan LAMP yang berfungsi
FreshRSS ialah aplikasi PHP biasa, jadi aplikasi ini memerlukan asas yang sama seperti aplikasi lain. Jika anda belum menyediakan asas tersebut, ikuti persediaan tindanan LAMP untuk Ubuntu 24.04 terlebih dahulu, kemudian kembali ke sini. Ringkasnya:
sudo apt update
sudo apt install -y apache2 mariadb-server php libapache2-mod-php
sudo systemctl enable --now apache2 mariadbsystemctl status apache2 sepatutnya melaporkan active (running). Jika Apache tidak dapat dimulakan, punca yang lazim ialah proses lain sedang menggunakan port 80, dan sudo ss -ltnp | grep :80 mengenal pastinya.
Sambungan PHP yang diperlukan oleh FreshRSS
FreshRSS menganggap libxml, cURL, JSON, PDO_MySQL, PCRE dan ctype sebagai wajib. FreshRSS juga memerlukan mbstring, iconv, Zlib dan ZipArchive, serta GMP pada sistem 32 bit. Di Ubuntu, sambungan ini tersedia sebagai pakej pengedaran:
sudo apt install -y php-curl php-mbstring php-xml php-zip php-mysql php-intl php-gmp
sudo systemctl restart apache2Semak sambungan yang benar-benar dimuatkan oleh PHP menggunakan php -m. Sambungan yang tiada tidak menghalang pemasang daripada bermula. Sebaliknya, pemasang akan berhenti pada skrin keperluan dan memaparkan baris merah yang menamakan sambungan tersebut. Menemui masalah pada peringkat itu boleh mengelirukan, jadi sahkan sekarang. Memulakan semula Apache penting kerana libapache2-mod-php menjalankan PHP dalam proses Apache. Oleh itu, pelayan web tidak akan melihat sambungan yang baru dipasang sehingga Apache dimulakan semula.
Muat turun keluaran
Pasang FreshRSS di luar root web lalai, kemudian arahkan Apache kepadanya. Dengan mengasingkan direktori aplikasi daripada root dokumen, hanya folder awam boleh dicapai 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/freshrssSeterusnya, tetapkan keizinan yang diwajibkan dengan ketat oleh dokumentasi FreshRSS: pengguna pelayan web memiliki pepohon direktori tersebut, kumpulan boleh membaca setiap fail, dan kumpulan boleh 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 dilangkau, pemasang gagal semasa menulis konfigurasinya kerana PHP berjalan sebagai www-data, dan www-data tidak boleh menulis ke dalam direktori yang dimiliki oleh root.
Cipta pangkalan data
FreshRSS menyokong SQLite, MariaDB, MySQL dan PostgreSQL. SQLite tidak memerlukan persediaan dan sesuai untuk seorang pengguna dengan beberapa ratus suapan. MariaDB ialah pilihan yang lebih baik apabila beberapa orang berkongsi tika, kerana penulisan serentak daripada tugas penyegaran dan antara muka web tidak lagi bersaing untuk mendapatkan kunci fail 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. Suapan mengandungi emoji dan skrip bukan Latin, manakala pengekodan utf8 tiga bait yang lama akan memotong tajuk artikel pada aksara empat bait pertama.
Hos maya Apache
Direktori awam ialah p/, bukan bahagian teratas pepohon direktori. Semua yang lain, termasuk fail konfigurasi yang menyimpan kata laluan pangkalan data anda, berada di atas akar dokumen dan tidak akan disampaikan oleh 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>Simpan konfigurasi itu sebagai /etc/apache2/sites-available/freshrss.conf dan dayakannya:
sudo a2enmod rewrite
sudo a2ensite freshrss
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2configtest sepatutnya memaparkan Syntax OK. AllowEncodedSlashes On kelihatan seperti pilihan dan sebenarnya tidak: Google Reader API menghantar pengecam suapan yang mengandungi %2F, dan tanpa arahan ini Apache menolaknya. Akibatnya, aplikasi mudah alih gagal menyegerak walaupun antara muka web berfungsi dengan sempurna.
Tambah HTTPS sebelum anda log masuk
Anda akan memasukkan kata laluan ke dalam tapak ini, jadi dapatkan sijil terlebih dahulu. Halakan rekod A ke pelayan, kemudian ikuti persediaan Certbot untuk Apache pada Ubuntu dan jalankan sudo certbot --apache -d rss.example.com. Certbot menulis semula hos maya untuk port 443 dan menambah pengalihan. Sahkan dengan curl -I https://rss.example.com/, yang sepatutnya mengembalikan 200 atau mengalihkan ke halaman log masuk.
Jalankan pemasang daripada baris perintah
FreshRSS mempunyai pemasang melalui pelayar, tetapi versi baris perintah boleh diulang dan merekodkan dengan tepat pilihan anda.
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 kedua-duanya sebagai www-data. Menjalankannya sebagai root akan mencipta fail konfigurasi yang dimiliki oleh root, dan antara muka web kemudiannya gagal menyimpan sebarang tetapan. --environment production juga penting kerana tetapan pembangunan mencetak notis PHP pada halaman.
Muatkan https://rss.example.com/ dan log masuk sebagai admin.
Mengapa suapan tidak disegarkan sendiri
Tiada proses mengambil suapan sehingga anda mengarahkannya. FreshRSS disegarkan apabila pelayar dibuka pada halaman tersebut. Ini bermakna tika yang anda lawati dua kali sehari memaparkan artikel yang sudah lapuk selama dua belas jam. Penyelesaiannya ialah skrip yang dikeluarkan oleh projek untuk tujuan ini, app/actualize_script.php, dan jalankannya melalui cron.
sudo crontab -u www-data -eTambahkan satu baris:
*/20 * * * * php /srv/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1Dua puluh minit ialah selang minimum yang munasabah. Skrip ini tidak akan menyegarkan mana-mana suapan lebih kerap daripada sekali setiap dua puluh minit. Jadual yang lebih singkat hanya membazirkan CPU. Jalankan skrip ini secara manual sekali dahulu:
sudo -u www-data php /srv/freshrss/app/actualize_script.phpOutput yang sihat menyenaraikan setiap suapan yang diambil dan berakhir tanpa ralat PHP. Jika tiada output langsung, pengguna cron adalah salah. Ralat keizinan pada data/ bermakna langkah chmod -R g+w telah dilangkau.
Tambah suapan pertama anda
Gunakan butang tambah di bahagian atas kiri antara muka, tampal alamat tapak, dan FreshRSS akan menemukan pautan suapan untuk anda. Kebanyakan tapak masih menerbitkan suapan walaupun tidak mengiklankannya, biasanya di /feed, /rss atau /atom.xml. Kategori ialah folder, dan anda boleh memindahkan suapan antara kategori dengan menyeretnya.
Jika anda datang daripada pembaca lain, eksport fail OPML di situ dan import fail tersebut pada halaman pengurusan langganan. OPML (outline processor markup language) ialah format senarai suapan standard, dan setiap pembaca yang wajar digunakan menyokongnya. Import yang besar akan menjadi perlahan semasa penyegaran pertama kerana setiap suapan diambil sekali. Oleh itu, berikan masa kepada pelaksanaan cron pertama sebelum menilai kelajuannya.
Baca pada telefon anda
FreshRSS menyokong Google Reader API, yang disokong oleh hampir semua aplikasi RSS. Dua perkara mesti dipenuhi. Dalam tetapan pengesahan, "Allow API access" mesti dihidupkan. Bendera --api-enabled di atas telah menetapkannya. Dalam profil anda, medan kata laluan API mesti mengandungi nilai. Kata laluan ini sengaja diasingkan daripada kata laluan log masuk kerana telefon lebih mudah hilang.
Lawati https://rss.example.com/api/ dan pilih "Check full server configuration". Konfigurasi yang berfungsi memulangkan PASS. Kegagalan di sini hampir selalu disebabkan baris AllowEncodedSlashes On yang tiada. Dalam aplikasi, masukkan alamat pelayan sebagai https://rss.example.com/api/greader.php, nama pengguna sebagai pengguna FreshRSS anda, dan kata laluan API sebagai kata laluan.
Alternatif Docker
Jika anda tidak mahu menyelenggara PHP dan Apache secara manual, projek ini menerbitkan imej freshrss/freshrss rasmi. Satu fail compose menyediakan aplikasi dan pangkalan datanya bersama-sama. Pertukarannya adalah seperti biasa: lebih sedikit komponen untuk diurus pada hos, satu lagi lapisan untuk dinyahpepijat apabila berlaku masalah, dan proksi terbalik masih diperlukan untuk TLS (keselamatan lapisan pengangkutan). Jika pilihan ini lebih sesuai untuk anda, asas Docker Compose untuk VPS menerangkan format fail tersebut, dan baris cron menjadi docker exec --user www-data freshrss php ./app/actualize_script.php.
Sandaran dan naik taraf
Dua perkara menyimpan keadaan anda: pangkalan data dan /srv/freshrss/data/. Buat dump yang pertama dengan sudo mysqldump freshrss > freshrss.sql, salin yang kedua, dan simpan kedua-duanya di lokasi selain pelayan ini. Senarai langganan anda juga wajar dieksport sebagai OPML sekali-sekala kerana fail itu boleh membina semula persediaan bacaan anda pada mana-mana perisian RSS.
Naik taraf dilakukan dengan mengekstrak keluaran yang lebih baharu ke direktori yang sama, kemudian menjalankan semula arahan pemilikan. FreshRSS menggunakan migrasi pangkalan datanya sendiri apabila halaman dimuatkan seterusnya. Buat sandaran terlebih dahulu kerana migrasi yang gagal pada pangkalan data yang tidak dapat dipulihkan akan menyebabkan keadaan yang tidak boleh dipulihkan. Pembaca RSS ialah perkhidmatan berisiko rendah untuk dijalankan dan calon yang baik untuk dimulakan jika anda sedang menyemak senarai perkara yang wajar dihoskan sendiri.
FAQ
Mengapakah suapan saya hanya dikemas kini apabila saya membuka FreshRSS?
Ini berlaku kerana tiada penjadual sehingga anda menciptanya. FreshRSS menyegarkan suapan semasa sesi pelayar dibuka dan tidak melakukan apa-apa apabila tab ditutup. Tambahkan baris cron yang memanggil app/actualize_script.php sebagai pengguna www-data, kemudian jalankan skrip itu secara manual sekali dan baca outputnya. Output yang tiada biasanya bermaksud cron menjalankannya sebagai pengguna yang salah, lalu PHP tidak dapat menulis ke data/.
Aplikasi mudah alih saya tidak dapat bersambung, tetapi laman web berfungsi. Mengapa?
Google Reader API meletakkan slash berkod (%2F) dalam laluan permintaan, dan Apache menolak slash tersebut secara lalai. Tambahkan AllowEncodedSlashes On dalam hos maya, kemudian muat semula Apache. Sahkan pembaikan dengan membuka https://rss.example.com/api/ dan menjalankan "Check full server configuration", yang sepatutnya melaporkan PASS. Pastikan juga kata laluan API ditetapkan dalam profil anda kerana kata laluan itu berasingan daripada kata laluan log masuk anda.
Patutkah saya menggunakan SQLite atau MariaDB?
Gunakan SQLite untuk seorang pengguna kerana tiada apa-apa yang perlu dipasang dan tiada kata laluan yang perlu diurus. Gunakan MariaDB apabila lebih daripada seorang membaca pada tika itu, atau apabila jumlah suapan melebihi beberapa ratus, kerana tugas penyegaran dan antara muka web menulis pada masa yang sama dan satu kunci fail menjadi hadnya. Anda masih boleh berpindah antara kedua-duanya kemudian melalui perintah eksport dan import. Oleh itu, ini bukan keputusan kekal.
Pemasang gagal apabila menulis konfigurasinya. Apakah masalahnya?
PHP berjalan sebagai www-data di bawah Apache, dan pengguna itu tidak dapat menulis ke dalam direktori yang dimiliki oleh root. Jalankan semula sudo chown -R www-data:www-data /srv/freshrss dan sudo chmod -R g+w /srv/freshrss/data, kemudian mulakan pemasang sekali lagi. Jika anda telah menjalankan pemasang baris perintah sebagai root, padamkan fail yang diciptanya di bawah data/ sebelum mencuba lagi kerana pemilikan fail tersebut ialah masalah sebenar.
Berapakah sumber pelayan yang diperlukan oleh pembaca RSS yang dihoskan sendiri?
Sangat sedikit. Beberapa ratus suapan pada pelan kecil sudah memadai kerana beban berlaku dalam lonjakan singkat semasa HTTP diambil setiap dua puluh minit, manakala pangkalan data kekal kecil selepas artikel lama dipadamkan. Penggunaan cakera meningkat mengikut tempoh penyimpanan. Oleh itu, tetapkan dasar pemadaman artikel dalam tetapan pengarkiban dan jangan simpan semua artikel selama-lamanya.