FreshRSS на Ubuntu 24.04: пошаговая установка
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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →