MAATRIX / Блог / FreshRSS на сервере: частые ошибки и решения

FreshRSS на сервере: частые ошибки и решения

MAATRIX

FreshRSS — один из немногих self-hosted сервисов, который реально работает «поставил и забыл»: лёгкий, без Node.js-зоопарка, разумная замена Google Reader. Но именно из-за этой простоты, когда что-то ломается, разбираться приходится с нуля — документация местами скупая, а ошибки в логах не всегда очевидны. Ниже — конкретные проблемы, с которыми сталкиваются на боевых VPS, и что с ними делать.

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

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

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

Белый экран или 500 ошибка после установки

Ставите FreshRSS, открываете /i/ для установки — и вместо мастера белая страница или голая «500 Internal Server Error» без деталей. Первым делом включите вывод ошибок PHP и посмотрите лог PHP-FPM:

tail -50 /var/log/php8.3-fpm.log
tail -50 /var/log/nginx/error.log

В девяти случаях из десяти причина — не хватает PHP-расширения. FreshRSS требует конкретный набор, и если ставили «минимальный» PHP, чего-то обязательно нет:

sudo apt install php8.3-curl php8.3-xml php8.3-intl php8.3-gd \
  php8.3-mbstring php8.3-sqlite3 php8.3-zip
sudo systemctl restart php8.3-fpm

Если планируете MySQL или PostgreSQL вместо SQLite — добавьте php8.3-mysql или php8.3-pgsql соответственно, иначе на шаге выбора СУБД мастер установки просто не покажет нужный вариант в списке.

Отдельная причина белого экрана — memory_limit в PHP выставлен слишком низко (64M на некоторых образах по умолчанию). FreshRSS при обновлении лент и импорте OPML легко упирается в этот лимит. Поднимите до 256M в /etc/php/8.3/fpm/php.ini и перезапустите php-fpm.

FreshRSS не обновляет ленты автоматически

Веб-интерфейс открывается, ленты добавляются, но новые статьи появляются только если зайти и нажать «Актуализировать» руками. Это значит, что фоновое обновление не настроено — FreshRSS сам по себе не «живёт» в фоне, ему нужен внешний планировщик.

Правильный способ — cron-задача от имени пользователя веб-сервера (обычно www-data), которая дёргает встроенный скрипт актуализации:

sudo crontab -u www-data -e

И добавить строку:

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

Частая ошибка — прописать команду в crontab обычного пользователя (root или своего), а не www-data: скрипт тогда либо падает по правам на каталог data/, либо создаёт файлы с неправильным владельцем, из-за чего веб-интерфейс потом не может их прочитать. Проверить, что задача реально выполняется, можно логом:

grep CRON /var/log/syslog | grep actualize

Если строк нет вообще — cron демон не видит задачу (опечатка в пути к PHP или неправильный синтаксис). Если строки есть, но ленты всё равно не обновляются, зайдите в админку FreshRSS: Настройки → Обновление ленты — там должен стоять режим «Через планировщик (cron)», а не «Ручной» или «При посещении сайта». Про сами cron-задачи на сервере — отдельный разбор в статье про частые ошибки cron, если проблема шире одного FreshRSS.

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

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

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

Impossible to connect при добавлении ленты

Пытаетесь добавить конкретный источник — FreshRSS пишет «Impossible to connect to feed (RSSFile HTTP...)» или похожую ошибку сети, хотя лента открывается в браузере без проблем. Причины делятся на три группы.

Первая — сервер не может достучаться до источника из-за исходящего файрвола или блокировки на уровне хостера. Проверьте вручную с сервера:

curl -I -v https://example.com/rss.xml

Вторая — источник отдаёт устаревший или самоподписанный TLS-сертификат, а curl на сервере строг к проверке цепочки. Временно (для диагностики, не для продакшена) можно проверить гипотезу флагом -k, но постоянным решением это быть не должно — если проблема в сертификате именно вашего сайта на другом домене, разберитесь с самим сертификатом, а не отключайте проверку.

Третья, самая частая на практике — источник блокирует запросы без нормального User-Agent или требует куки/JS-рендеринг (Cloudflare-защита, антибот). FreshRSS такие ленты не потянет в принципе — это ограничение самого источника, а не бага. Проверить, отдаёт ли сайт вообще валидный RSS без браузерных танцев: curl -A "Mozilla/5.0" https://example.com/feed.

Permission denied при записи в data или config

После установки или переноса на новый сервер FreshRSS ругается на невозможность записать в ./data/ или ./data/users/_/config.php. Классическая проблема прав после git clone или распаковки архива не от имени веб-сервера:

sudo chown -R www-data:www-data /var/www/FreshRSS/data
sudo find /var/www/FreshRSS/data -type d -exec chmod 755 {} \;
sudo find /var/www/FreshRSS/data -type f -exec chmod 644 {} \;

Если используете Docker-образ FreshRSS, ситуация похожая, но лечится через volume: убедитесь, что примонтированный каталог на хосте принадлежит тому же UID, что и процесс внутри контейнера (по умолчанию часто 1000). Несовпадение UID хоста и контейнера — топ-причина «permission denied» именно в контейнерных установках, и права нужно поправить снаружи, а не пытаться chmod 777 изнутри контейнера как временный костыль, который потом забывают убрать.

Отдельно проверьте SELinux, если сервер на AlmaLinux или CentOS — там даже при правильном chown доступ может блокироваться политикой безопасности, и в логе PHP будет обычный «permission denied» без намёка на SELinux. Диагностика: sudo ausearch -m avc -ts recent, и если находки есть — sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/FreshRSS/data(/.*)?" с последующим restorecon -R.

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

На старте почти все ставят FreshRSS с базой SQLite — это правильный выбор для личного использования на 20-50 лент. Но когда лент становится несколько сотен, а обновление идёт параллельно с чтением через веб-интерфейс, начинают проскакивать ошибки database is locked.

SQLite не рассчитана на конкурентную запись — это не баг FreshRSS, а фундаментальное свойство файловой базы. Если ошибка появляется регулярно, а не разово при совпадении cron и активного чтения, пора переезжать на MySQL/MariaDB или PostgreSQL. Миграция делается встроенной CLI-командой:

cd /var/www/FreshRSS
php ./cli/create-user.php --no-config --help

Практичнее не мигрировать данные вручную, а сразу поставить второй профиль подключения к MySQL через мастер установки (/i/) и перенести подписки через экспорт/импорт OPML — это надёжнее, чем ковырять базу напрямую. Про сам MySQL на сервере, если после переезда начнутся отдельные проблемы с самой СУБД, — смотрите разбор частых ошибок MySQL.

СУБДКогда достаточноКогда переезжать
SQLite1 пользователь, до ~50-100 лентпоявляется database is locked
MySQL/MariaDBнесколько пользователей или много лентнужна общая база с бэкапами через стандартные тулы
PostgreSQLта же ситуация, если уже есть Postgres-инфраструктуранет особых причин выбирать вместо MySQL, кроме привычки

Мобильные приложения не подключаются через Google Reader API

FreshRSS умеет отдавать данные по протоколу Google Reader API — это то, что нужно, чтобы читать ленты из привычных мобильных клиентов (например, приложений, поддерживающих Fever/GReader API). В самом FreshRSS его нужно явно включить в профиле пользователя, и отдельно задать API-пароль (он не совпадает с паролем от веб-интерфейса) — это первая и самая частая причина, по которой клиент пишет «неверный логин или пароль», хотя в браузере вы заходите нормально.

Вторая частая причина — реверс-прокси перед FreshRSS обрезает или неправильно передаёт заголовки авторизации. Если FreshRSS стоит за nginx, в конфиге обязательно должны быть проброшены стандартные заголовки:

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Без X-Forwarded-Proto FreshRSS иногда генерирует ссылки на API с неправильной схемой (http вместо https), и клиент, ожидающий строго HTTPS, просто отваливается по TLS. Если конфиг реверс-прокси кажется подозрительным в целом, есть отдельный разбор типовых проблем — nginx как reverse proxy. Если вместо самодельного nginx вы используете обратный прокси с автоматическим SSL, полезно свериться со статьёй про ошибки Let's Encrypt на сервере — сертификат для домена FreshRSS ничем не отличается от любого другого.

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

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

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

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

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

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

Почему после установки FreshRSS показывает белую страницу?

Чаще всего не хватает PHP-расширения (curl, xml, intl, gd, mbstring) или занижен memory_limit. Смотрите лог PHP-FPM — там всегда видна конкретная причина.

Как проверить, что cron реально обновляет ленты, а не просто настроен?

Посмотрите grep CRON /var/log/syslog | grep actualize — если записей нет, задача не выполняется. И убедитесь, что в настройках FreshRSS выбран режим обновления «через планировщик», а не «вручную».

Стоит ли сразу ставить MySQL вместо SQLite?

Для одного пользователя и разумного числа лент SQLite достаточно и проще в обслуживании. Переезжайте на MySQL/MariaDB, только когда реально столкнулись с database is locked, а не заранее «на всякий случай».

Почему мобильное приложение не может подключиться по Google Reader API, хотя веб-версия работает?

Убедитесь, что API включён в профиле пользователя и задан отдельный API-пароль — он не тот же, что пароль от сайта. Если это не помогло, проверьте заголовки реверс-прокси перед FreshRSS.

Можно ли восстановить доступ, если забыт пароль администратора FreshRSS?

Да, через CLI на сервере: php ./cli/user-password-change.php --user ваш_логин --password новый_пароль, выполнять из каталога установки от имени пользователя веб-сервера.

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

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

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