Ubuntu VPS uzerine FreshRSS kurulumu rehberi
Ubuntu 24.04 sunucunuzda Apache, PHP 8.3 ve MariaDB kullanarak FreshRSS kurulumunu adim adim ogrenin. Cron yenileme ayarlari ve mobil API erisimi gibi kritik detaylari inceleyin.
Ne inşa ediyorsunuz
Kendi sunucunuzda barındırdığınız (self-hosted) bir RSS okuyucu, kimsenin kapatamayacağı veya içeriğini değiştiremeyeceği, tamamen size ait bir besleme okuyucusudur. Bu kılavuz, FreshRSS uygulamasını bir Ubuntu 24.04 VPS üzerinde kurmanızı sağlar: Önde Apache, arkada PHP, depolama için MariaDB ve yeni makaleleri çeken bir adet cron işi. RSS (really simple syndication), bir sitenin makalelerinin yazılım tarafından okunabilmesi için yayınladığı dosya formatıdır. FreshRSS, bu dosyaları toplayan, makaleleri saklayan ve size bir web arayüzü ile telefon uygulamalarının haberleştiği bir API (uygulama programlama arayüzü) sunan PHP tabanlı bir uygulamadır.
Kurulumun kendisi oldukça küçüktür: bir sürümü (release) açın, bir veritabanı oluşturun, bir sanal ana makine (virtual host) dosyası yazın ve bir komut satırı yükleyicisini çalıştırın. Aşağıdaki işlemlerin büyük bir kısmı, insanların kurulum sonrasında hata yaptığı kısımlardır; bunlar yenileme işi, mobil API için kodlanmış eğik çizgiler (slashes) ve dosya sahipliği ayarlarıdır.
Temmuz 2026 itibarıyla güncel sürüm FreshRSS 1.29.1'dir ve PHP 8.1 veya daha yeni bir sürüm gerektirir. Ubuntu 24.04, PHP 8.3 ile geldiğinden dağıtım paketleri yeterlidir; üçüncü taraf bir PHP deposuna ihtiyaç duymazsınız.
Çalışan bir LAMP yığını ile başlayın
FreshRSS standart bir PHP uygulamasıdır, bu nedenle diğer tüm uygulamalarla aynı temel gereksinimlere sahiptir. Eğer bu temeli henüz oluşturmadıysanız, önce Ubuntu 24.04 üzerinde LAMP yığını kurulumu rehberini takip edin ve ardından buraya dönün. Kısa özet:
sudo apt update
sudo apt install -y apache2 mariadb-server php libapache2-mod-php
sudo systemctl enable --now apache2 mariadbsystemctl status apache2 komutu active (running) çıktısını vermelidir. Apache başlamıyorsa, bunun yaygın nedeni başka bir sürecin 80 numaralı portu kullanıyor olmasıdır; sudo ss -ltnp | grep :80 komutu bu süreci tanımlayacaktır.
FreshRSS için gerekli PHP eklentileri
FreshRSS; libxml, cURL, JSON, PDO_MySQL, PCRE ve ctype kütüphanelerini zorunlu tutar. Ayrıca mbstring, iconv, Zlib, ZipArchive ve 32 bit sistemlerde GMP eklentilerini de gerektirir. Ubuntu üzerinde bu paketler dağıtım paketleri olarak şu şekilde kurulur:
sudo apt install -y php-curl php-mbstring php-xml php-zip php-mysql php-intl php-gmp
sudo systemctl restart apache2PHP'nin halihazırda neleri yüklediğini php -m ile kontrol edin. Eksik bir eklenti, yükleyicinin başlamasını engellemez. Yükleyiciyi, eksik eklentiyi belirten kırmızı bir satırla gereksinimler ekranında durdurur; bu, sorunu keşfetmek için kafa karıştırıcı bir noktadır, bu yüzden şimdi doğrulayın. Apache'yi yeniden başlatmak önemlidir çünkü libapache2-mod-php, PHP'yi Apache süreci içinde tutar; bu nedenle yeni yüklenen bir eklenti, sunucu yeniden başlatılana kadar web sunucusu tarafından görülmez.
Sürümü indirin
FreshRSS'i varsayılan web kök dizininin dışına kurun ve Apache'yi bu dizine yönlendirin. Uygulama dizinini belge kök dizininden ayrı tutmak, HTTP üzerinden yalnızca public klasörünün erişilebilir olmasını 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 dokümantasyonunun kesin kurallar koyduğu izinleri ayarlayın: web sunucusu kullanıcısı dizin ağacının sahibi olmalı, grup her dosyayı okuyabilmeli ve grup ./data/ dizinine 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ı atlarsanız, PHP www-data kullanıcısı olarak çalıştığı ve www-data dizini root tarafından sahiplenildiği için yükleyici yapılandırma dosyasını yazamaz ve başarısız olur.
Veritabanını oluşturma
FreshRSS; SQLite, MariaDB, MySQL ve PostgreSQL destekler. SQLite herhangi bir kurulum gerektirmez ve birkaç yüz beslemeye sahip tek bir kullanıcı için yeterlidir. Birden fazla kişi aynı örneği kullanıyorsa MariaDB daha iyi bir tercihtir; çünkü yenileme işi ile web arayüzünden gelen eşzamanlı yazma işlemleri artık tek bir dosya kilidi için çakışmaz.
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ın. Beslemeler emoji ve Latin alfabesi dışı karakterler içerir; eski üç baytlık utf8 kodlaması, makale başlığını dört baytlık ilk karakterde keser.
Apache sanal ana bilgisayarı (virtual host)
Genel dizin p/ yolundadır, ağaç yapısının en üstünde değildir. Veritabanı parolanızı içeren yapılandırma dosyası dahil olmak üzere diğer her şey, Apache'nin asla sunmayacağı belge kök dizininin üzerinde yer alır.
<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 komutu Syntax OK çıktısını vermelidir. AllowEncodedSlashes On isteğe bağlı görünebilir ancak değildir: Google Reader API, %2F karakterlerini içeren besleme tanımlayıcıları gönderir ve bu yönerge olmadan Apache bunları reddeder; bu durumda web arayüzü sorunsuz çalışırken mobil uygulamalar eşitleme yapamaz.
Oturum açmadan önce HTTPS ekleyin
Bu siteye bir parola girmek üzeresiniz, bu nedenle öncelikle bir sertifika edinin. Bir A kaydını sunucuya yönlendirin, ardından Ubuntu üzerinde Apache için Certbot kurulumu adımlarını izleyin ve sudo certbot --apache -d rss.example.com komutunu çalıştırın. Certbot, 443 numaralı port için sanal ana bilgisayar (virtual host) yapılandırmasını yeniden yazar ve yönlendirmeyi ekler. curl -I https://rss.example.com/ komutu ile doğrulamayı yapın; bu komut bir 200 yanıtı veya oturum açma sayfasına bir yönlendirme döndürmelidir.
Yükleyiciyi komut satırından çalıştırma
FreshRSS bir tarayıcı tabanlı yükleyiciye sahiptir, ancak komut satırı sürümü tekrarlanabilir bir yapıdadır ve seçilen ayarların tam bir kaydını tutar.
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 komutu da www-data olarak çalıştırın. Komutların root olarak çalıştırılması, yapılandırma dosyalarının root sahipliğinde oluşturulmasına neden olur; bu durum, web arayüzünün daha sonra herhangi bir ayarı kaydetmesini engeller. --environment production ayarı da önemlidir, çünkü geliştirme modu etkinleştirildiğinde PHP uyarıları sayfa içeriğine yazdırılır.
https://rss.example.com/ dosyasını yükleyin ve admin olarak giriş yapın.
Akışlar neden otomatik olarak yenilenmiyor
Siz komut vermediğiniz sürece akışlarınız için herhangi bir sorgulama yapılmaz. FreshRSS, yalnızca üzerinde bir tarayıcı açıkken yenileme yapar; bu da günde iki kez ziyaret ettiğiniz bir örneğin size on iki saatlik eski makaleleri göstereceği anlamına gelir. Bunun çözümü, projenin bu iş için sunduğu app/actualize_script.php betiğinin cron üzerinden çalıştırılmasıdır.
sudo crontab -u www-data -eŞu satırı ekleyin:
*/20 * * * * php /srv/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1Yirmi dakika makul bir alt sınırdır; çünkü betik, herhangi bir akışı yirmi dakikadan daha sık yenilemeyi reddeder. Bu yüzden daha sık bir zamanlama yalnızca CPU tüketir. Önce manuel olarak bir kez çalıştırın:
sudo -u www-data php /srv/freshrss/app/actualize_script.phpSorunsuz bir çıktı, getirilen her akışı isimlendirir ve bir PHP hatası olmadan sona erer. Eğer hiçbir şey yazdırılmazsa, cron kullanıcısı hatalıdır; data/ üzerindeki bir izin hatası ise chmod -R g+w adımının atlandığı anlamına gelir.
İlk beslemelerinizi ekleyin
Arayüzün sol üst köşesindeki artı düğmesini kullanın, bir site adresi yapıştırın; FreshRSS besleme bağlantısını sizin için otomatik olarak bulacaktır. Çoğu site, reklamını yapmasa bile genellikle /feed, /rss veya /atom.xml adreslerinde bir besleme yayınlar. Kategoriler klasör görevi görür ve bir beslemeyi bu klasörler arasında taşımak sürükle-bırak yöntemiyle yapılır.
Başka bir okuyucudan geçiş yapıyorsanız, oradan bir OPML dosyası dışa aktarın ve abonelik yönetimi sayfası altından içe aktarın. OPML (outline processor markup language), standart besleme listesi formatıdır ve terk etmeye değer her okuyucu bunu destekler. Büyük boyutlu bir içe aktarma işleminde, her besleme ilk kez getirileceği için ilk yenileme yavaş olacaktır; bu nedenle hız konusunda karar vermeden önce ilk cron çalışmasına zaman tanıyın.
Telefonunuzdan okuyun
FreshRSS, neredeyse tüm RSS uygulamalarının desteklediği Google Reader API ile uyumludur. İki koşulun sağlanması gerekir. Kimlik doğrulama ayarları altında "Allow API access" seçeneği açık olmalıdır; yukarıdaki --api-enabled bayrağı bunu zaten ayarlamıştır. Profilinizde, API parolası alanının bir değer içermesi gerekir. Bu parola, telefonun kaybolma riskine karşı giriş parolanızdan kasıtlı olarak ayrı tutulmuştur.
https://rss.example.com/api/ adresini ziyaret edin ve "Check full server configuration" seçeneğini belirleyin. Çalışan bir yapılandırma PASS sonucunu döndürür. Buradaki bir hata, neredeyse her zaman eksik olan AllowEncodedSlashes On satırından kaynaklanır. Uygulama içerisinde sunucu adresi olarak https://rss.example.com/api/greader.php, kullanıcı adı olarak FreshRSS kullanıcınızı ve parola olarak API parolanızı girin.
Docker alternatifi
PHP ve Apache servislerini manuel olarak yönetmek istemiyorsanız, proje resmi bir freshrss/freshrss imajı yayınlamaktadır ve tek bir compose dosyası ile uygulama ve veritabanı birlikte kurulabilir. Bu durumun getirdiği takas standarttır: ana makinede daha az hareketli parça bulunur, ancak bir sorun çıktığında hata ayıklanacak bir katman daha eklenmiş olur ve TLS (transport layer security) için yine de bir reverse proxy gereklidir. Eğer bu yöntem size daha uygunsa, VPS üzerinde Docker Compose temelleri dokümanı dosya formatını açıklar ve cron satırı docker exec --user www-data freshrss php ./app/actualize_script.php haline gelir.
Yedekleme ve yükseltme
Sunucu durumunuzu iki bileşen 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ı yapmak faydalıdır; bu dosya, herhangi bir RSS yazılımında okuma düzeninizi yeniden oluşturmanızı sağlar.
Yükseltme işlemi, daha yeni bir sürümü mevcut dizinin üzerine açmak ve sahiplik komutlarını yeniden çalıştırmaktan ibarettir. FreshRSS, sayfa bir sonraki kez yüklendiğinde kendi veritabanı geçişlerini uygular. İşleme başlamadan önce mutlaka yedek alın; çünkü geri yükleyemeyeceğiniz bir veritabanında başarısız olan bir geçiş, kurtarılamaz bir duruma yol açar. Bir okuyucu servisi çalıştırmak düşük riskli bir işlemdir ve self-host etmeye değer uygulamalar listesi üzerinde çalışıyorsanız, başlangıç için iyi bir adaydır.
FAQ
Beslemelerim neden yalnızca FreshRSS'i açtığımda güncelleniyor?
Çünkü siz bir zamanlayıcı oluşturana kadar sistemde herhangi bir zamanlayıcı bulunmaz. FreshRSS, beslemeleri tarayıcı oturumu açıkken yeniler; sekme kapalıyken hiçbir işlem yapmaz. app/actualize_script.php komutunu çağıran cron satırını www-data kullanıcısı olarak ekleyin, ardından betiği bir kez manuel olarak çalıştırıp çıktısını inceleyin. Sessizlik genellikle cron'un betiği yanlış kullanıcıyla çalıştırdığına, dolayısıyla PHP'nin data/ dizinine yazamadığına işaret eder.
Mobil uygulamam bağlanamıyor ancak web sitesi çalışıyor. Neden?
Google Reader API, istek yollarının içine kodlanmış eğik çizgiler (%2F) yerleştirir ve Apache bunları varsayılan olarak reddeder. Sanal ana bilgisayar (virtual host) içine AllowEncodedSlashes On ekleyin ve Apache'yi yeniden yükleyin. https://rss.example.com/api/ adresini açıp "Check full server configuration" komutunu çalıştırarak düzeltmeyi doğrulayın; bu işlem PASS sonucunu döndürmelidir. Ayrıca API parolasının profilinizde ayarlı olduğundan emin olun, çünkü bu parola giriş parolanızdan farklıdır.
SQLite mı yoksa MariaDB mi kullanmalıyım?
Tek kullanıcı için SQLite kullanın; çünkü kurulacak bir şey yoktur ve yönetilecek bir parola gerektirmez. Birden fazla kişi örneği kullanıyorsa veya birkaç yüz beslemeyi geçtiyseniz MariaDB tercih edin; çünkü yenileme işi ve web arayüzü aynı anda yazma işlemi yapar ve tek bir dosya kilidi darboğaz oluşturur. Daha sonra dışa ve içe aktarma komutları ile ikisi arasında geçiş yapmak mümkün olduğundan, bu 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 ve bu kullanıcı root sahipliğindeki bir dizine yazamaz. sudo chown -R www-data:www-data /srv/freshrss ve sudo chmod -R g+w /srv/freshrss/data komutlarını tekrar çalıştırın, ardından yükleyiciyi yeniden başlatın. Komut satırı yükleyicisini zaten root olarak çalıştırdıysanız, data/ altında oluşturduğu dosyaları silin; çünkü asıl sorun bu dosyaların sahiplik bilgisidir.
Kendi barındırdığım bir RSS okuyucu için ne kadar sunucu kaynağı gerekir?
Çok az. Küçük bir plan üzerinde birkaç yüz besleme rahatlıkla çalışır; çünkü yük, yirmi dakikada bir gerçekleşen kısa süreli HTTP getirme işlemlerinden ibarettir ve eski makaleler temizlendiğinde veritabanı boyutu küçük kalır. Disk kullanımı saklama süresine bağlı olarak artar, bu nedenle her şeyi sonsuza kadar tutmak yerine arşivleme ayarlarından bir makale temizleme politikası belirleyin.