MAATRIX / Блог / FreshRSS на Ubuntu 24.04: пошаговая установка

FreshRSS на Ubuntu 24.04: пошаговая установка

MAATRIX

Google Reader закрыли ещё в 2013-м, а его наследники вроде Feedly или Inoreader рано или поздно упираются в лимит бесплатных подписок или начинают собирать ваши данные о том, что вы читаете. FreshRSS — лёгкий self-hosted агрегатор на PHP: минимум ресурсов, честный полнотекстовый поиск, API-совместимость с Google Reader (значит, работает с мобильными клиентами вроде Fluent Reader, Reeder, FeedMe), и никто кроме вас не видит список ваших подписок. Ниже — установка с нуля на Ubuntu 24.04: nginx, PHP 8.3, MariaDB, cron для автообновления лент и HTTPS.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что понадобится и почему выбран этот стек

FreshRSS — обычное PHP-приложение, Docker для него избыточен, если сервер выделен под один-два сервиса. Официально поддерживаются PHP 8.1+ и любая из MySQL/MariaDB/PostgreSQL/SQLite. Для этой установки:

КомпонентРольПочему
nginxвеб-сервер, приём HTTPSлёгкий, штатно кэширует статику
PHP 8.3-fpmвыполнение приложениявходит в стандартные репозитории Ubuntu 24.04
MariaDBхранение записей и подписокбыстрее SQLite на большом числе лент, проще бэкапить, чем PostgreSQL для одного пользователя
cronавтообновление лентFreshRSS сам не опрашивает источники — это делает демон или cron-задача

Минимально хватает 1 vCPU / 1 GB RAM даже на 200+ активных лент — PHP-скрипт лёгкий, нагрузку даёт в основном парсинг XML при обновлении. Если у вас уже есть VPS под другие задачи, FreshRSS спокойно уживётся рядом с nginx как reverse proxy для нескольких сайтов на одном сервере.

Перед началом обновите систему и поставьте базовые пакеты:

apt update && apt upgrade -y
apt install -y curl git unzip software-properties-common

Установка PHP 8.3 и нужных расширений

Ubuntu 24.04 несёт PHP 8.3 в штатных репозиториях — отдельный PPA не требуется:

apt install -y php8.3-fpm php8.3-cli php8.3-mysql php8.3-curl \
  php8.3-gd php8.3-intl php8.3-mbstring php8.3-xml php8.3-zip php8.3-sqlite3

Расширение gd нужно для генерации favicon-иконок лент, intl — для корректной сортировки заголовков на разных языках, curl — собственно для получения RSS/Atom. Проверьте, что php-fpm запустился:

systemctl status php8.3-fpm

Если сервис не поднялся — почти всегда причина в синтаксической опечатке в /etc/php/8.3/fpm/pool.d/www.conf, туда лезть на этом этапе не нужно, дефолтный конфиг рабочий.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

MariaDB: база и пользователь под FreshRSS

apt install -y mariadb-server
mysql_secure_installation

На вопросы mysql_secure_installation отвечайте: удалить анонимных пользователей — да, запретить root-вход удалённо — да, удалить тестовую БД — да. Дальше создаём отдельную базу и пользователя, не используйте root-доступ в самом приложении:

mysql -u root -p
CREATE DATABASE freshrss CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'freshrss'@'localhost' IDENTIFIED BY 'замените-на-длинный-пароль';
GRANT ALL PRIVILEGES ON freshrss.* TO 'freshrss'@'localhost';
FLUSH PRIVILEGES;
EXIT;

utf8mb4 обязателен — без него заголовки статей с эмодзи или иероглифами будут превращаться в кракозябры или обрезаться. Если разворачиваете MariaDB впервые на сервере, базовые шаги те же, что описаны в отдельном гайде по MariaDB на Ubuntu 24.04.

Загрузка FreshRSS и настройка прав

Ставим в /var/www/freshrss, файлы приложения должны принадлежать пользователю, от которого работает php-fpm (по умолчанию www-data):

git clone https://github.com/FreshRSS/FreshRSS.git /var/www/freshrss
cd /var/www/freshrss
chown -R www-data:www-data /var/www/freshrss
chmod -R 755 /var/www/freshrss

Клонирование через git, а не архив релиза, даёт удобство: обновление версии позже сводится к git pull внутри тега стабильного релиза. Зафиксируйте текущую стабильную ветку:

git checkout $(git describe --tags $(git rev-list --tags --max-count=1))

Это подставит последний стабильный тег вместо HEAD ветки edge, где иногда бывают недоделанные коммиты.

nginx: виртуальный хост и PHP-FPM

Создайте конфиг /etc/nginx/sites-available/freshrss.conf:

server {
    listen 80;
    server_name freshrss.example.com;
    root /var/www/freshrss/p;
    index index.php;

    client_max_body_size 16M;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\. {
        deny all;
    }

    location ~ ^/(\.git|\.env|cli|data|extensions/.*/config) {
        deny all;
    }
}

Корень сайта — именно подпапка p внутри репозитория, это точка входа веб-интерфейса FreshRSS, а не корень репозитория. Последний блок location закрывает доступ к служебным директориям, где хранятся конфиги и данные — без этого их теоретически можно скачать напрямую по URL.

Активируйте сайт и проверьте синтаксис:

ln -s /etc/nginx/sites-available/freshrss.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

HTTPS через Let's Encrypt

RSS-агрегатор хранит логин и пароль в форме входа при каждом заходе, поэтому HTTPS не опция, а обязательное условие — особенно если вы читаете ленты с телефона через открытый Wi-Fi:

apt install -y certbot python3-certbot-nginx
certbot --nginx -d freshrss.example.com

Certbot сам допишет блок listen 443 ssl и настроит редирект с 80-го порта. Сертификат обновляется автоматически через systemd-таймер, который ставится вместе с пакетом — проверить его можно командой systemctl list-timers | grep certbot. Если на этом шаге получаете ошибку валидации домена, разберитесь в частых причинах, почему Let's Encrypt не проходит валидацию — обычно дело в DNS-записи, которая ещё не разрешилась, или в firewall, блокирующем 80-й порт снаружи.

Веб-установщик и подключение первых лент

Откройте https://freshrss.example.com/ — мастер установки запросит:

  • язык интерфейса;
  • параметры подключения к БД: тип MySQL, хост localhost, имя базы freshrss, пользователь и пароль, созданные выше;
  • логин и пароль администратора FreshRSS (это отдельная учётка, не связана с MariaDB).

После завершения мастера заходите в интерфейс и добавляете первую ленту через «Управление подписками → Добавить фид», указав URL сайта или прямую ссылку на RSS/Atom. FreshRSS умеет искать фид автоматически по адресу главной страницы сайта — можно не выискивать точный /feed/ вручную.

Для быстрого массового переноса подписок из другого сервиса используется OPML: экспортируйте файл из Feedly/Inoreader/старого Google Reader-архива и загрузите его через «Импорт/экспорт → Импортировать OPML-файл» — все папки категорий и подписки перенесутся разом.

Автообновление лент по cron

Сам по себе FreshRSS ленты не опрашивает — это должен делать внешний планировщик. Добавьте задачу в crontab пользователя www-data:

crontab -u www-data -e

И впишите строку (обновление каждые 15 минут):

*/15 * * * * /usr/bin/php /var/www/freshrss/app/actualize_script.php > /dev/null 2>&1

Если у вас несколько пользователей FreshRSS на одном инстансе и нужно обновлять их порознь, actualize_script.php принимает параметр --user=имя. Проверить, что cron реально отрабатывает, можно вручную запустив ту же команду из-под www-data:

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

Если команда отваливается с ошибкой доступа к БД — почти всегда забыт chown на директорию data/ после git pull при обновлении версии.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Обязательна ли MariaDB, или хватит SQLite?

Для одного-двух пользователей и до пары сотен лент SQLite работает нормально и вообще не требует отдельной СУБД. MariaDB имеет смысл, если лент много, читаете с нескольких устройств одновременно, или планируете несколько независимых пользователей на одном инстансе.

Работает ли FreshRSS с мобильными приложениями?

Да, в настройках профиля есть «Доступ через API» с включением Fever API и Google Reader API — после включения подключаются сторонние клиенты вроде Reeder, FeedMe, Fluent Reader, NetNewsWire.

Как перенести FreshRSS на другой сервер?

Бэкап сводится к дампу базы (mysqldump freshrss > backup.sql) и копированию директории data/ с пользовательскими настройками и кэшем иконок. На новом сервере — восстановить дамп и распаковать data/ поверх свежего клона репозитория.

Почему не обновляются некоторые ленты?

Часто источник отдаёт неполный или невалидный XML, или требует User-Agent браузера. В логах FreshRSS (раздел «Управление подписками», иконка проблемной ленты) обычно видна конкретная причина — HTTP-код ответа или ошибка парсинга.

Нужен ли отдельный SSL-сертификат, если FreshRSS уже за общим reverse proxy?

Нет, если у вас на сервере уже стоит reverse proxy с сертификатом на весь домен — достаточно добавить блок location для FreshRSS в существующий конфиг, отдельный certbot --nginx -d не нужен.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →