MAATRIX / Блог / Как установить и настроить FreshRSS на VPS

Как установить и настроить FreshRSS на VPS

MAATRIX

Google Reader закрыли в 2013-м, но привычка читать десятки сайтов и блогов из одной ленты никуда не делась — просто теперь эта лента живёт в чужом сервисе с рекламой, трекерами и риском, что завтра его тоже закроют. FreshRSS решает эту задачу иначе: лёгкий PHP-агрегатор, который вы ставите на свой VPS за 15–20 минут, подключаете к нему любой мобильный клиент через Fever или Google Reader API и читаете новости так же удобно, как в 2012-м — только данные ваши. Ниже — установка с нуля на Ubuntu 24.04: PHP, веб-сервер, база данных, SSL и настройка под ежедневное использование.

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

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

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

Что такое FreshRSS и почему он подходит для self-hosted чтения

FreshRSS — открытый (AGPL) RSS/Atom-агрегатор на PHP, который существует с 2013 года и сейчас, пожалуй, самый живой проект в этой нише: активная разработка, PWA-интерфейс, который ставится на телефон как приложение, встроенные правила фильтрации по ключевым словам и полноценное API, совместимое с Fever и Google Reader — это значит, что почти любой мобильный RSS-клиент на iOS и Android (Reeder, NetNewsWire, Fluent Reader, ReadYou и десятки других) подключается к нему без танцев с бубном.

По требованиям к ресурсам FreshRSS не сравним с Nextcloud News или Tiny Tiny RSS в тяжёлой конфигурации — на VPS с 1 vCPU и 1 ГБ памяти он работает комфортно даже при паре сотен подписок, потому что делает одну вещь: скачивает ленты по расписанию, хранит статьи и отдаёт их через веб-интерфейс и API. Тяжёлой обработки медиа, полнотекстового поиска по вложениям или совместной работы здесь нет — и не нужно, если задача именно читать ленты.

ИнструментКогда выбрать
FreshRSSЛичное чтение лент, минимум ресурсов, нужен мобильный клиент через API
Tiny Tiny RSSНужны плагины сообщества и более гибкая фильтрация, готовы тратить больше ресурсов на JS-фронтенд
MinifluxМаксимально простой Go-бинарник без зависимостей, но интерфейс аскетичнее
Nextcloud NewsУже есть Nextcloud и не хочется отдельного сервиса ради RSS

Если Nextcloud у вас уже развёрнут для файлов и календаря, взгляните на разбор установки Nextcloud на Ubuntu 24.04 — модуль News туда ставится одной кнопкой из App Store. Но если нужен именно отдельный, лёгкий и быстрый ридер — берите FreshRSS.

Подготовка сервера

Понадобится VPS с Ubuntu 24.04, минимум 1 vCPU / 1 ГБ RAM (с запасом — 2 ГБ, если планируете держать сотни лент и не экономить на дисковом кеше), публичный IP и домен или поддомен, указывающий на этот IP. HTTPS не строго обязателен для работы веб-интерфейса, но мобильные клиенты по API часто требуют валидный сертификат, так что домен закладывайте сразу.

Обновите систему и поставьте базовые утилиты:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl unzip git ca-certificates

Заведите отдельного системного пользователя без прав на вход, от имени которого будет работать веб-сервер — это ограничивает ущерб, если в PHP-коде найдут уязвимость:

sudo adduser --system --group --home /var/www/freshrss --no-create-home freshrss
sudo mkdir -p /var/www/freshrss
sudo chown freshrss:freshrss /var/www/freshrss

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

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

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

Установка PHP и веб-сервера

FreshRSS написан на PHP и официально поддерживает версии от 8.1. На Ubuntu 24.04 в репозиториях идёт PHP 8.3 — этого достаточно, ставить сторонние PPA не нужно:

sudo apt install -y nginx php-fpm php-sqlite3 php-mysql php-curl \
  php-gd php-intl php-mbstring php-xml php-zip php-gmp

Пакет php-sqlite3 нужен, если планируете хранить базу в SQLite (рекомендуемый вариант для одного-двух пользователей — никакой отдельной СУБД, файл на диске, простое резервное копирование). Если ожидаете десятки аккаунтов или хотите единый сервер БД для нескольких приложений, поставьте вместо этого MariaDB — установка описана в отдельной статье про MariaDB на Ubuntu 24.04, пакет php-mysql уже включён в список выше.

Проверьте версию PHP и убедитесь, что php-fpm запущен:

php -v
sudo systemctl status php8.3-fpm --no-pager

Загрузка и размещение FreshRSS

Скачайте актуальный релиз с GitHub (не клонируйте master — берите тег релиза, там прошли тесты):

cd /tmp
curl -L -o freshrss.tar.gz \
  "https://github.com/FreshRSS/FreshRSS/releases/latest/download/FreshRSS.tar.gz"
sudo tar -xzf freshrss.tar.gz -C /var/www/freshrss --strip-components=1
sudo chown -R freshrss:www-data /var/www/freshrss
sudo find /var/www/freshrss -type d -exec chmod 750 {} \;
sudo find /var/www/freshrss -type f -exec chmod 640 {} \;

Каталогам ./data и ./users понадобится право записи от веб-сервера — установщик создаёт их при первом запуске, но полезно проверить владельца после установки:

sudo chown -R www-data:www-data /var/www/freshrss/data /var/www/freshrss/users 2>/dev/null

Настройка Nginx и SSL

Создайте конфиг виртуального хоста. FreshRSS требует, чтобы document root указывал на подкаталог p/, а не на корень проекта:

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

    client_max_body_size 20M;

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

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\. {
        deny all;
    }
}

Активируйте сайт и перезапустите Nginx:

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

Если конфиг не подхватывается или nginx ругается на синтаксис — типовые причины разобраны в статье Nginx не видит изменения конфига. Выпустите сертификат Let's Encrypt (домен должен уже смотреть на IP сервера):

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d rss.example.com

Certbot сам допишет блок listen 443 ssl и настроит редирект с 80 порта. Про выбор между certbot и acme.sh для автопродления есть отдельное сравнение: certbot или acme.sh — что выбрать для сервера.

Не забудьте открыть порты в файрволе, если ufw активен:

sudo ufw allow 'Nginx Full'

Базовая настройка ufw на VPS описана в статье как установить и настроить файрвол UFW на VPS.

Установщик FreshRSS: первый запуск

Откройте https://rss.example.com/i/ — попадёте в веб-установщик. Он попросит:

  • язык интерфейса — доступен русский;
  • тип базы данных — SQLite для простоты или MySQL/PostgreSQL, если завели отдельную СУБД;
  • логин и пароль администратора — используйте длинный уникальный пароль, панель смотрит наружу;
  • часовой пояс — от него зависит расписание обновления лент и метки времени статей.

После завершения установщика зайдите под созданной учёткой и добавьте первую ленту через Подписки → Добавить фид — можно вставить прямую ссылку на RSS/Atom-файл или URL сайта, FreshRSS попробует найти фид автоматически по тегам <link rel="alternate"> на странице.

Для массового переноса подписок из другого агрегатора используйте импорт OPML: Управление подписками → Импорт/экспорт → Импортировать файл OPML. Экспорт из Google Reader-совместимых сервисов и большинства других ридеров даёт файл в этом формате без конвертации.

Автообновление лент, API и мобильные клиенты

По умолчанию FreshRSS обновляет ленты только когда кто-то открывает веб-интерфейс — для регулярного фонового обновления нужен cron. Проверьте путь к CLI-скрипту и добавьте задачу от имени пользователя www-data:

sudo crontab -u www-data -e

Добавьте строку (обновление раз в 20 минут):

*/20 * * * * /usr/bin/php /var/www/freshrss/app/actualize_script.php > /var/log/freshrss-cron.log 2>&1

Если крон-задача не срабатывает — типовые причины (неверный PATH, отсутствие прав, тихие ошибки PHP) разобраны в статье cron-задачи на сервере: частые ошибки и решения.

Для мобильных клиентов включите API: зайдите в Профиль → Доступ по API, задайте отдельный пароль API (может отличаться от пароля веб-интерфейса) и включите поддержку Fever или Google Reader API — что именно поддерживает ваш клиент, обычно указано в его документации. Большинство современных приложений (Reeder на iOS, Fluent Reader, ReadYou на Android) работают через Google Reader API endpoint вида https://rss.example.com/api/greader.php.

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

Резервное копирование и обслуживание

При SQLite бэкап сводится к копированию файла базы и каталога data/:

sudo tar -czf freshrss-backup-$(date +%F).tar.gz \
  /var/www/freshrss/data /var/www/freshrss/users

Добавьте эту команду в cron с ротацией старых архивов (find ... -mtime +N -delete) или вынесите в общий скрипт бэкапа сервера, если он у вас уже есть. Если используете MySQL/MariaDB как бэкенд — потребуется отдельный дамп через mysqldump, нюансы и типовые проблемы разобраны в статье бэкап MySQL на сервере: частые ошибки и решения.

Обновление самого FreshRSS до новой версии — это замена файлов новым релизом поверх старых (каталоги data/ и users/ не трогаются) с последующим запуском cli/update.php для миграции схемы базы, если она менялась. Перед обновлением обязательно сделайте бэкап — миграции редко ломаются, но откатить проще, имея копию.

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

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

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

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

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

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

Можно ли обойтись без домена, работать по IP?

Технически да — веб-интерфейс откроется по http://IP/i/. Но без валидного сертификата многие мобильные клиенты откажутся подключаться по API, а трафик, включая пароль, пойдёт в открытом виде. Для реального использования домен и SSL нужны.

SQLite не станет узким местом при большом числе лент?

Для личного использования (до пары сотен подписок, один-два аккаунта) — нет, SQLite справляется свободно. Если планируете десятки пользователей с активным чтением одновременно, миграция на MySQL/MariaDB снизит блокировки при параллельной записи.

FreshRSS умеет читать полный текст статьи, если в RSS только заголовок?

Да, есть расширение полного текста через встроенные правила для популярных сайтов и общий парсер по алгоритму извлечения контента — включается в настройках конкретной подписки, но не гарантирует идеальный результат на всех сайтах с нестандартной вёрсткой.

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

Скопировать каталоги data/ и users/ (там база SQLite или дамп MySQL, если используете его, плюс пользовательские настройки), развернуть тот же релиз на новом сервере и указать те же пути в конфиге — миграция сводится к переносу этих двух каталогов.

Нужен ли отдельный vCPU под FreshRSS, если сервер уже занят другими сайтами?

Нет, приложение лёгкое и почти всё время простаивает между запусками cron — спокойно уживается на одном VPS с другими сайтами и сервисами, если общего запаса памяти хватает на PHP-FPM пул и веб-сервер.

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

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

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