Ubuntu VPS'ye FreshRSS Kurulumu: Apache ve MariaDB
Ubuntu 24.04 VPS'ye FreshRSS 1.29.1 kurun: Apache, PHP 8.3, MariaDB, virtual host, cron yenilemesi ve mobil uygulama API ayarlarını öğrenin.
Yapılanlar
Kendi sunucunuzda barındırılan RSS okuyucu, sahip olduğunuz bir sunucuda çalışan bir feed okuyucudur. Bu nedenle hiç kimse onu kapatamaz veya size gösterdiği içerikleri değiştiremez. Bu kılavuzda FreshRSS, Ubuntu 24.04 VPS üzerine kurulur: önde Apache, arka planda PHP, depolama için MariaDB ve yeni makaleleri alan tek bir cron işi kullanılır. RSS (really simple syndication), bir web sitesinin yazılımların makalelerini okuyabilmesi için yayımladığı dosya biçimidir. FreshRSS, bu dosyaları toplayan, makaleleri saklayan ve web arayüzü ile telefon uygulamalarının kullandığı API (application programming interface) sağlayan PHP uygulamasıdır.
Kurulumun kendisi küçüktür: bir release paketi açılır, bir veritabanı oluşturulur, bir virtual host yazılır ve bir komut satırı yükleyicisi çalıştırılır. Aşağıdaki işlemlerin çoğu, sonrasında sık yapılan hataları önlemeye yöneliktir. Bunlar yenileme işi, mobil API için kodlanmış eğik çizgiler ve dosya sahipliğidir.
FreshRSS 2026 Temmuz itibarıyla güncel release olan 1.29.1 sürümüdür ve PHP 8.1 veya daha yeni bir sürüm gerektirir. Ubuntu 24.04, PHP 8.3 ile birlikte gelir. Bu nedenle dağıtım paketleri yeterlidir ve üçüncü taraf bir PHP deposuna ihtiyaç yoktur.
Çalışan bir LAMP yığınıyla başlayın
FreshRSS, sıradan bir PHP uygulamasıdır. Bu nedenle diğer PHP uygulamalarıyla aynı temel bileşenlere ihtiyaç duyar. Bu temeli henüz oluşturmadıysanız önce Ubuntu 24.04 için LAMP yığını kurulumunu uygulayın, ardından buraya dönün. Kısa sürüm:
sudo apt update
sudo apt install -y apache2 mariadb-server php libapache2-mod-php
sudo systemctl enable --now apache2 mariadbsystemctl status apache2 çıktısında active (running) bildirilmelidir. Apache başlamıyorsa bunun yaygın nedeni, başka bir işlemin 80 numaralı bağlantı noktasını zaten kullanıyor olmasıdır. sudo ss -ltnp | grep :80 bu işlemin adını gösterir.
FreshRSS'in ihtiyaç duyduğu PHP uzantıları
FreshRSS, libxml, cURL, JSON, PDO_MySQL, PCRE ve ctype uzantılarını zorunlu tutar. Ayrıca mbstring, iconv, Zlib ve ZipArchive uzantılarını da ister. 32 bit sistemlerde GMP de gerekir. Ubuntu'da bunlar dağıtım paketleri olarak sunulur:
sudo apt install -y php-curl php-mbstring php-xml php-zip php-mysql php-intl php-gmp
sudo systemctl restart apache2PHP'nin gerçekte yüklediği uzantıları php -m ile denetleyin. Eksik bir uzantı yükleyicinin başlatılmasını engellemez. Yükleyici, gereksinimler ekranında uzantının adını içeren kırmızı bir satır göstererek durur. Sorunu bu aşamada fark etmek kafa karıştırıcı olabilir; bu nedenle şimdi doğrulama yapılmalıdır. Apache'nin yeniden başlatılması önemlidir; çünkü libapache2-mod-php PHP'yi Apache işlemi içinde çalıştırır. Bu nedenle yeni yüklenen bir uzantı, Apache yeniden başlatılana kadar web sunucusu tarafından kullanılamaz.
Sürümü indirme
FreshRSS'yi varsayılan web kök dizininin dışında kurun ve Apache'yi bu dizine yönlendirin. Uygulama dizininin belge kök dizininden ayrı tutulması, HTTP üzerinden yalnızca genel klasöre erişilebilmesini sağlar.
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Şimdi FreshRSS belgelerinde kesin olarak belirtilen izinleri ayarlayın: ağaç yapısının sahibi web sunucusu kullanıcısı olmalıdır, grup her dosyayı okuyabilmelidir ve grup ./data/ konumuna yazabilmelidir.
sudo chown -R www-data:www-data /srv/freshrss
sudo chmod -R g+r /srv/freshrss
sudo chmod -R g+w /srv/freshrss/dataBu adım atlanırsa yükleyici yapılandırmasını yazarken başarısız olur. Bunun nedeni PHP'nin www-data olarak çalışması ve www-data konumunun root'a ait bir dizine yazamamasıdır.
Veritabanını oluşturma
FreshRSS; SQLite, MariaDB, MySQL ve PostgreSQL'i destekler. SQLite için kurulum gerekmez ve birkaç yüz akışın bulunduğu tek kullanıcılı kurulumlar için uygundur. Birden fazla kişi aynı örneği kullandığında MariaDB tercih edilmelidir. Bunun nedeni, yenileme işi ile web arayüzünün eşzamanlı yazma işlemlerinin artık tek bir dosya kilidi için çakışmamasıdır.
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;"utf8 yerine utf8mb4 kullanılmalıdır. Akışlarda emoji ve Latin dışı betikler bulunabilir. Eski üç baytlık utf8 kodlaması, dört baytlık ilk karakterde makale başlığını keser.
Apache sanal ana bilgisayarı
Genel dizin p/ konumudur; ağaç yapısının üst düzeyi değildir. Veritabanı parolanızı içeren yapılandırma dosyası da dahil olmak üzere diğer her şey, Apache'nin hiçbir zaman sunmayacağı belge kökünün üzerinde bulunur.
<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>Bunu /etc/apache2/sites-available/freshrss.conf olarak kaydedin ve etkinleştirin:
sudo a2enmod rewrite
sudo a2ensite freshrss
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2configtest çıktısında Syntax OK yazmalıdır. AllowEncodedSlashes On isteğe bağlı gibi görünür, ancak değildir: Google Reader API, %2F içeren akış tanımlayıcıları gönderir. Bu yönerge olmadan Apache bunları reddeder. Bu nedenle mobil uygulamalar eşzamanlamayı başaramaz, web arayüzü ise sorunsuz çalışır.
Giriş yapmadan önce HTTPS ekleyin
Bu siteye bir parola girmek üzeresiniz; bu nedenle önce bir sertifika edinin. Bir A kaydını sunucuya yönlendirin, ardından Ubuntu üzerinde Apache için Certbot kurulumunu izleyin ve sudo certbot --apache -d rss.example.com komutunu çalıştırın. Certbot, 443 numaralı bağlantı noktası için sanal ana makine yapılandırmasını yeniden yazar ve yönlendirmeyi ekler. curl -I https://rss.example.com/ ile doğrulama yapın. Bu komut 200 döndürmeli veya giriş sayfasına yönlendirmelidir.
Yükleyiciyi komut satırından çalıştırma
FreshRSS için bir tarayıcı yükleyicisi bulunur, ancak komut satırı sürümü tekrarlanabilir niteliktedir ve seçilen seçeneklerin tam kaydını bırakır.
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'Her iki komut da www-data olarak çalıştırılmalıdır. Bunların root olarak çalıştırılması, sahipliği root olan yapılandırma dosyaları oluşturur. Bu durumda web arayüzü daha sonra ayarları kaydedemez. --environment production de önemlidir, çünkü geliştirme ayarı PHP bildirimlerini sayfaya yazdırır.
https://rss.example.com/ dosyasını yükleyin ve admin olarak oturum açın.
Akışlar neden kendiliğinden yenilenmez
Siz belirtmedikçe akışları yoklayan hiçbir işlem çalışmaz. FreshRSS, tarayıcı açıkken yenileme yapar. Bu nedenle günde iki kez ziyaret edilen bir örnek, on iki saat eski makaleleri gösterir. Çözüm, projenin bu amaçla yayımladığı app/actualize_script.php betiğini cron üzerinden çalıştırmaktır.
sudo crontab -u www-data -eBir satır ekleyin:
*/20 * * * * php /srv/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1Yirmi dakika uygun en kısa aralıktır. Betik, herhangi bir akışı yirmi dakikada birden daha sık yenilemeyi reddeder. Daha kısa bir zamanlama yalnızca CPU tüketir. Önce betiği elle bir kez çalıştırın:
sudo -u www-data php /srv/freshrss/app/actualize_script.phpSorunsuz çıktıda getirilen her akışın adı yer alır ve işlem PHP hatası olmadan sona erer. Hiç çıktı alınmıyorsa cron kullanıcısı yanlıştır. data/ üzerinde bir izin hatası görülmesi, chmod -R g+w adımının atlandığı anlamına gelir.
İlk yayın akışlarınızı ekleyin
Arayüzün sol üstündeki artı düğmesini kullanın, site adresini yapıştırın; FreshRSS yayın akışı bağlantısını otomatik olarak bulur. Çoğu site, yayın akışını duyurmasa bile hâlâ yayımlar. Bu akış genellikle /feed, /rss veya /atom.xml adreslerinde bulunur. Kategoriler klasör görevi görür. Bir yayın akışını kategoriler arasında taşımak için sürükleyin.
Başka bir okuyucudan geçiyorsanız, yayın listesi olarak bir OPML dosyasını dışa aktarın ve abonelik yönetimi sayfasından içe aktarın. OPML (outline processor markup language), standart yayın akışı listesi biçimidir. Kullanılabilir durumdaki her okuyucu bu biçimi destekler. Büyük bir içe aktarma işleminde ilk yenileme yavaş olur. Bunun nedeni her yayın akışının bir kez alınmasıdır. Hızı değerlendirmeden önce ilk cron çalışmasının tamamlanması için zaman tanıyın.
Telefonunuzda okuyun
FreshRSS, neredeyse tüm RSS uygulamalarının desteklediği Google Reader API ile çalışır. İki koşulun sağlanması gerekir. Kimlik doğrulama ayarlarında "Allow API access" etkin olmalıdır; yukarıdaki --api-enabled flag'i bunu zaten etkinleştirmiştir. Profilinizdeki API password alanında bir değer bulunmalıdır. Bu parola, telefonun kaybedilmesi daha kolay bir cihaz olması nedeniyle oturum açma parolanızdan bilerek ayrı tutulur.
https://rss.example.com/api/ adresini ziyaret edin ve "Check full server configuration" seçeneğini belirleyin. Çalışan bir kurulum PASS döndürür. Buradaki hata neredeyse her zaman eksik AllowEncodedSlashes On satırından kaynaklanır. Uygulamada sunucu adresi olarak https://rss.example.com/api/greader.php değerini, kullanıcı adı olarak FreshRSS kullanıcı adınızı ve parola olarak API parolanızı girin.
Docker alternatifi
PHP ve Apache'yi elle yönetmek tercih edilmiyorsa proje, resmi bir freshrss/freshrss imajı yayımlar. Tek bir compose dosyası uygulamayı ve veritabanını birlikte sağlar. Bunun karşılığında bilinen ödünler geçerlidir: ana bilgisayarda daha az bileşen bulunur, ancak bir şey bozulduğunda hata ayıklanacak bir katman daha eklenir. TLS (transport layer security) için yine de bir reverse proxy gerekir. Bu yaklaşım daha uygunsa VPS için Docker Compose temelleri dosya biçimini açıklar. Cron satırı da docker exec --user www-data freshrss php ./app/actualize_script.php olur.
Yedekler ve yükseltmeler
Durumunuzu iki unsur belirler: veritabanı ve /srv/freshrss/data/. İlkini sudo mysqldump freshrss > freshrss.sql ile dışa aktarın, ikincisini kopyalayın ve her ikisini de bu sunucunun dışında bir yerde saklayın. Abonelik listeniz için de zaman zaman OPML dışa aktarımı alın. Bu dosya, herhangi bir RSS yazılımında okuma düzeninizi yeniden oluşturur.
Yükseltme, daha yeni bir sürümü aynı dizine açmayı ve sahiplik komutlarını yeniden çalıştırmayı gerektirir. FreshRSS, sonraki sayfa yüklemesinde kendi veritabanı geçişlerini uygular. Önce yedek alın. Geri yükleyemediğiniz bir veritabanındaki başarısız geçiş kurtarılamaz bir duruma yol açar. Bir okuyucu, çalıştırılması düşük riskli bir hizmettir. Kendi sunucunuzda barındırmaya değer unsurların listesini inceliyorsanız iyi bir ilk adaydır.
FAQ
Akışlarım neden yalnızca FreshRSS'yi açtığımda güncelleniyor?
Bir zamanlayıcı oluşturulana kadar herhangi bir zamanlayıcı bulunmaz. FreshRSS, tarayıcı oturumu açıkken akışları yeniler; sekme kapatıldığında hiçbir işlem yapmaz. app/actualize_script.php çağrısını www-data kullanıcısı olarak yapan cron satırını ekleyin. Ardından betiği bir kez elle çalıştırın ve çıktısını okuyun. Genellikle sessizlik, cron'un betiği yanlış kullanıcıyla çalıştırdığı anlamına gelir. Bu durumda PHP, data/ konumuna yazamaz.
Mobil uygulamam bağlanamıyor, ancak web sitesi çalışıyor. Neden?
Google Reader API, istek yollarında kodlanmış eğik çizgiler (%2F) kullanır. Apache bunları varsayılan olarak reddeder. Sanal ana makine yapılandırmasına AllowEncodedSlashes On ekleyin ve Apache'yi yeniden yükleyin. Düzeltmeyi doğrulamak için https://rss.example.com/api/ adresini açın ve "Check full server configuration" seçeneğini çalıştırın. Sonuçta PASS bildirilmelidir. Ayrıca API parolasının profilinizde ayarlandığını kontrol edin. Bu parola, oturum açma parolanızdan ayrıdır.
SQLite mı, MariaDB mi kullanılmalı?
Tek bir kullanıcı için SQLite kullanılmalıdır. Kurulacak başka bir bileşen ve yönetilecek bir parola yoktur. Örneğin üzerinde birden fazla kişi okuma yapmaya başladığında veya birkaç yüz akışı aştığınızda MariaDB kullanılmalıdır. Yenileme işi ve web arayüzü aynı anda yazma işlemi gerçekleştirir. Bu durumda tek dosya kilidi sınırlayıcı olur. Daha sonra dışa aktarma ve içe aktarma komutlarıyla ikisi arasında geçiş yapılabilir. Bu nedenle kalıcı bir karar değildir.
Yükleyici yapılandırmasını yazarken başarısız oluyor. Sorun nedir?
PHP, Apache altında www-data olarak çalışır. Bu kullanıcı, root tarafından sahip olunan bir dizine yazamaz. sudo chown -R www-data:www-data /srv/freshrss ve sudo chmod -R g+w /srv/freshrss/data komutlarını yeniden çalıştırın. Ardından yükleyiciyi tekrar başlatın. Komut satırı yükleyicisini root olarak zaten çalıştırdıysanız yeniden denemeden önce data/ altında oluşturduğu dosyaları silin. Sorunun asıl nedeni dosya sahipliğidir.
Kendi barındırdığım RSS okuyucusu için ne kadar sunucu kaynağı gerekir?
Çok az kaynak gerekir. Küçük bir planda birkaç yüz akış rahatça çalışır. Yük, yirmi dakikada bir gerçekleşen kısa HTTP alma işlemleri şeklindedir. Eski makaleler silindiğinde veritabanı da küçük kalır. Disk kullanımı saklama süresine göre artar. Bu nedenle her şeyi süresiz saklamak yerine arşivleme ayarlarında makale silme politikasını belirleyin.