Проверен полностью15 892

RSS и новости

FreshRSS

FreshRSS собирает RSS и Atom-ленты, фильтрует статьи, хранит историю чтения и предоставляет API для сторонних мобильных и desktop-клиентов. Рецепт включает PostgreSQL 18, автоматическое обновление лент, детерминированный первый запуск и безопасную привязку web-порта к localhost.

Обзор

FreshRSS — лёгкий агрегатор RSS и Atom для личной ленты или небольшой доверенной группы. Он группирует источники, фильтрует и помечает статьи, поддерживает поиск, OPML и WebSub, а Google Reader/Fever API позволяет читать ленты в сторонних Android, iOS и desktop-клиентах.

Рецепт запускает закреплённый FreshRSS 1.29.1 с PostgreSQL 18. Первый запуск детерминирован: создаётся отдельный администратор с form auth, включается API с другим паролем, выбираются английский интерфейс, production environment и cron дважды в час. Data, extensions и PostgreSQL сохраняются в отдельных volumes.

Безопасность и границы рецепта

Полный HTTP smoke-тест прошёл на amd64, arm64 и armv7; backup и restore практически не проверялись. Получение feed URL выполняется сервером и может достигать внутренних адресов, поэтому рецепт предназначен только для доверенных пользователей. В FreshRSS 1.29.1 нет параметра INTERNAL_HOST_ALLOWLIST; рецепт не задаёт его и тем более не разрешает *. Для недоверенных пользователей нужна отдельная сетевая политика исходящего трафика. Web привязан к localhost, PostgreSQL наружу не опубликован, а доверие proxy-заголовкам по умолчанию выключено.

Отслеживание обновлений

Это сохранённые результаты отдельных проверок, а не данные в реальном времени. Неизвестный статус означает, что проверка ещё не выполнялась.

Новые релизы

Сравнение версии рецепта с последним известным релизом upstream. Это номер версии, а не разбор изменений.

Актуальная версия 1.29.11 сент. 2026 г., 00:22 UTC

Критические уязвимости

Результат отдельного сканирования Docker-образов, а не проверки Compose.

Не провереноПроверка не выполнялась

Несовместимые обновления

Новый major находится сравнением номеров версий. Вердикт о совместимости заносится вручную после чтения release notes и порядка миграции.

Не провереноПроверка не выполнялась

compose.yaml

Изменения upstream Compose относительно проверенного рецепта.

Upstream Compose не отслеживаетсяПроверка не выполнялась

Устаревшие Docker-образы

Проверка закреплённых тегов образов на наличие новых версий.

Не провереноПроверка не выполнялась

От наблюдения к действию

План обновления

Рецепт уже закрепляет последний известный релиз. Ниже показаны сохранённые основания для этой версии.

1.29.11.29.1
  1. Открыть основания релиза

    Открыть релиз на GitHub ↗ Ссылка нужна для ревизии и сама по себе не доказывает совместимость.

  2. Проверить границу версий

    Номера версий не пересекают major-границу совместимости. Вердикт о совместимости не записан.

  3. Подготовить смену тегов образов

    Смена тегов образов сейчас не планируется.

  4. Следовать документированной схеме миграции

    Ручные шаги после обновления. Шаги конкретного релиза всё равно берутся из release notes и инструкции по установке.

  5. Защитить точку отката

    Смена версии сейчас не планируется. Рецепт содержит процедуру backup. Restore не проверен.

  6. Проверить обновлённый рецепт

    Точная проверка уровня «Проверен полностью» для этой версии записана 2026-09-03.

Прочитать порядок обновления в инструкции по установке ↓

Характеристики

Безопасность и публикация

Уровни установки

Статус показывает, насколько опубликованный рецепт покрывает требования каждого уровня.

Частично

Для дома

Минимальная конфигурация для локальной сети или доступа через VPN.

  • Один сервер
  • Локальный доступ
  • Минимум компонентов

Нужно добавить вручную: один сервер, локальный доступ, минимум компонентов.

Частично

Для VPS

Публичная установка с защищённым доступом и резервными копиями.

  • Домен
  • HTTPS через reverse proxy
  • Backup вне сервера

Нужно добавить вручную: домен, https через reverse proxy, backup вне сервера.

Частично

Надёжная

Конфигурация для предсказуемой эксплуатации и наблюдаемости.

  • Отдельная БД
  • Healthcheck
  • Внешний мониторинг
  • Лимиты CPU и памяти

Нужно добавить вручную: внешний мониторинг, лимиты cpu и памяти.

Собрать под свой сервер

Генератор конфигурации

Ответьте на пять вопросов и скачайте готовый комплект FreshRSS.

Работает локально
01 Есть домен?
02 Какой reverse proxy?
03 Архитектура сервера
04 Где хранить данные?

Укажите абсолютный путь для отдельного диска, например /srv/freshrss.

05 Требуется VPN-доступ?

Комплект готов к сборке

Архив создаётся в браузере. Ответы никуда не отправляются.

Скриншоты

Скриншоты ещё не добавлены.

Быстрый запуск

Сначала прочитайте полную инструкцию: в ней описаны доступ извне, backup и расположение данных.

Подготовить настройкиcp .env.example .env
Запуститьdocker compose up -d
Проверить состояниеdocker compose ps

Пошаговая инструкция

1. Проверьте сервер Ubuntu или Debian

Нужны Ubuntu 22.04+ или Debian 12+, Docker Engine и Compose v2.24+. Выделите минимум 1 CPU, 512 МБ RAM и 2 ГБ диска; рекомендуется 1 ГБ RAM и запас диска под историю статей и backup. Официальный образ заявляет amd64, arm64 и armv7.

docker --version
docker compose version

2. Подготовьте рецепт и независимые секреты

mkdir -p ~/services/freshrss
cd ~/services/freshrss
cp .env.example .env
chmod 600 .env
login_password="$(openssl rand -hex 24)"
api_password="$(openssl rand -hex 24)"
db_password="$(openssl rand -hex 24)"
sed -i "s|^FRESHRSS_ADMIN_PASSWORD=.*|FRESHRSS_ADMIN_PASSWORD=$login_password|" .env
sed -i "s|^FRESHRSS_ADMIN_API_PASSWORD=.*|FRESHRSS_ADMIN_API_PASSWORD=$api_password|" .env
sed -i "s|^FRESHRSS_DB_PASSWORD=.*|FRESHRSS_DB_PASSWORD=$db_password|" .env
unset login_password api_password db_password

Секреты состоят только из букв и цифр: entrypoint 1.29.1 выполняет first-run option strings через shell eval, поэтому пробелы и shell-метасимволы здесь недопустимы. Все три значения должны отличаться. Сохраните их в менеджере паролей: API-клиент использует не пароль web-входа, а отдельный API password.

Все переменные .env:

  • FRESHRSS_PORT — локальный web-порт, по умолчанию 8080;
  • FRESHRSS_BASE_URL — точный внешний URL с https, без завершающего /; отдельный поддомен надёжнее subpath;
  • FRESHRSS_ADMIN_USER — ASCII-alphanumeric логин первого администратора, отличный от секретов и меняемый только до первой инициализации;
  • FRESHRSS_ADMIN_PASSWORD и FRESHRSS_ADMIN_API_PASSWORD — независимые alphanumeric пароли form auth и Google Reader/Fever API;
  • FRESHRSS_ADMIN_EMAIL — email первого администратора;
  • FRESHRSS_DB_PASSWORD — отдельный обязательный пароль PostgreSQL;
  • FRESHRSS_DB_NAME и FRESHRSS_DB_USER — имя базы и роли, меняются только до первого запуска;
  • FRESHRSS_TIME_ZONE — часовой пояс IANA;
  • FRESHRSS_CRON_MIN — минуты встроенного cron; безопасное значение 13,43 обновляет ленты дважды в час без синхронного запуска в нулевую минуту;
  • FRESHRSS_TRUSTED_PROXY — доверие forwarded client-IP и external-auth headers; безопасный default 0, не меняйте на широкую сеть;
  • FRESHRSS_DATA_VOLUME, FRESHRSS_EXTENSIONS_VOLUME и FRESHRSS_DB_VOLUME — имена постоянных volumes;
  • FRESHRSS_BACKUP_DIR — каталог итоговых архивов на хосте.

freshrss-data хранит конфигурацию, пользователей и служебные файлы; freshrss-extensions — сторонние расширения; freshrss-database — PostgreSQL.

3. Запустите детерминированную установку

docker compose config
docker compose pull
docker compose up -d --wait
docker compose exec freshrss cli/health.php
docker compose exec freshrss cli/list-users.php

FRESHRSS_INSTALL только при пустом data volume создаёт production-конфигурацию с PostgreSQL, form auth, выключенным anonymous access, включённым API, английским языком и точным base URL. FRESHRSS_USER создаёт администратора. Изменение этих переменных после первой инициализации не меняет существующую учётную запись.

Запуск на VPS

Оставьте bind 127.0.0.1:${FRESHRSS_PORT}:80: web доступен только HTTPS proxy на этом хосте. PostgreSQL не имеет published port. В firewall откройте только SSH, HTTP и HTTPS. До старта настройте DNS, замените FRESHRSS_BASE_URL и домен в одном proxy-примере. Не приглашайте недоверенных пользователей: они могут заставить сервер получать URL из внутренней сети.

Доступ в доверенной локальной сети

Предпочтителен SSH-туннель ssh -L 8080:127.0.0.1:8080 user@server; для него до первого старта задайте FRESHRSS_BASE_URL=http://localhost:8080. Для постоянного LAN-доступа замените localhost bind в Compose на конкретный private IP, задайте совпадающий base URL и ограничьте порт firewall. Не используйте 0.0.0.0 без сетевых ограничений.

Домен, HTTPS и API-клиенты

Используйте отдельный host вроде https://rss.example.com без завершающего / и укажите его в .env и Caddy, Nginx или Traefik. Caddy получает сертификат автоматически, Nginx ожидает Certbot, Traefik использует resolver letsencrypt. Proxy сохраняет Host, передаёт X-Forwarded-Proto и Authorization, который нужен некоторым Google Reader API-клиентам. FreshRSS не требует WebSocket, поэтому upgrade-заголовки намеренно отсутствуют. Не заменяйте и не удаляйте CSP, которую выдаёт FreshRSS; upstream прямо предупреждает не переопределять её в proxy.

FRESHRSS_TRUSTED_PROXY=0 не доверяет forwarded client IP и заголовкам external auth. Обычный form auth и API при точном base_url работают без широкого trusted range. Если external auth действительно нужен, укажите только точный IP/CIDR последнего защищённого proxy: лишний адрес позволяет подделать пользователя.

Резервное копирование

chmod +x backup.sh restore.sh
./backup.sh

Скрипт останавливает FreshRSS вместе со встроенным cron, оставляет PostgreSQL работающим для native pg_dump, архивирует полные data и extensions, .env и Compose, затем запускает приложение. Это согласованный полный backup. OPML недостаточно: он не содержит статьи, пользователей, пароли feed, частоту обновления, user agent и XPath scraping rules. Зашифруйте архив, скопируйте его за пределы сервера и регулярно проверяйте restore.

Восстановление

Restore необратимо заменяет data, extensions и PostgreSQL. Используйте ту же версию FreshRSS и активный .env, затем:

./restore.sh ./backups/freshrss-YYYYMMDDTHHMMSSZ.tar
docker compose exec freshrss cli/health.php

Скрипт сначала делает страховочный backup текущего состояния, пересоздаёт три volumes, восстанавливает native dump и запускает FreshRSS. Сохранённый configuration.env оставляется только для сравнения. Процедура ещё не прошла практический restore-тест; сначала испытайте копию на отдельном сервере.

Обновление FreshRSS

Сделайте backup и прочитайте release notes. Замените точный тег freshrss/freshrss:1.29.1 на проверенную версию, не используйте latest, затем:

docker compose pull
docker compose up -d --wait
docker compose exec freshrss cli/health.php
docker compose logs --tail=200 freshrss

Миграции приложения применяются при старте. Не обновляйте FreshRSS и PostgreSQL одновременно: это сохраняет однозначный путь отката.

PostgreSQL major update

Тег postgres:18-alpine закреплён отдельно. Смена major требует нового data volume: старый сервер не должен читать каталог новой major и наоборот. Остановите FreshRSS, сохраните native pg_dump и полный data/extensions backup, создайте новый volume с новым образом и восстановите dump. Upstream также предлагает cli/db-backup.php и cli/db-restore.php для переносимого SQLite export каждого пользователя. Не удаляйте старый volume до проверки новой базы.

Откат

Не запускайте старый FreshRSS поверх данных после миграций. Верните прежние точные теги FreshRSS и PostgreSQL и восстановите полный pre-update архив через restore.sh. После неудачной смены PostgreSQL major подключите прежний образ только к сохранённому старому volume либо восстановите его dump в пустой кластер той же major.

Остановка и полное удаление

docker compose down сохраняет данные. После проверки внешнего backup удалить всё безвозвратно:

docker compose down
docker volume rm freshrss-data freshrss-extensions freshrss-database
rm -rf ~/services/freshrss

Если имена volumes изменены в .env, подставьте фактические значения.

Источники: Docker и first run, backup и OPML, access control и SSRF, server CSP и PostgreSQL upgrades.

Диагностика

FreshRSS не становится healthy

docker compose ps
docker compose logs --tail=200 freshrss database
docker inspect --format '{{json .State.Health}}' "$(docker compose ps -q freshrss)"
docker compose exec freshrss cli/health.php

Проверьте три обязательных разных секрета, состояние PostgreSQL, свободный диск и first-run ошибки. Пароли должны быть alphanumeric без пробелов и shell-символов. Если пустая установка оборвалась до завершения, изучите логи и только затем удалите пустые volumes и повторите старт; никогда не удаляйте рабочие данные.

Неверный redirect, URL или WebSub callback

FRESHRSS_BASE_URL должен точно совпадать с внешним URL: схема, host, необязательный порт и путь, без завершающего /. Значение применяется только при первой установке; для существующего instance измените base_url в data config.php по официальной инструкции, затем пересоздайте контейнер. Проще и надёжнее использовать отдельный поддомен, а не subpath.

API-клиент не входит

Убедитесь, что клиент использует FRESHRSS_ADMIN_API_PASSWORD, а не пароль web form, и endpoint Google Reader API на том же HTTPS host. Проверьте, что Nginx передаёт Authorization; Caddy и Traefik делают это по умолчанию. WebSocket FreshRSS не нужен.

Ленты с внутренних адресов доступны

Это поведение FreshRSS 1.29.1, а не ошибка рецепта. Не добавляйте wildcard internal-host allowlist: такой поддерживаемой переменной в этой версии нет, а разрешение всех адресов создало бы ложное ощущение защиты. Для недоверенных пользователей запретите container egress к loopback, RFC1918, link-local и cloud metadata средствами firewall/сети либо разместите FreshRSS в отдельной сети.

После настройки proxy неверен IP клиента

Безопасный FRESHRSS_TRUSTED_PROXY=0 отключает обработку forwarded client IP. Если точный IP нужен, доверяйте только последнему proxy IP/CIDR и защитите соединение до FreshRSS. Широкая сеть позволяет подделать IP и заголовки Remote-User/X-WebAuth-User, вплоть до входа администратором.

Расширение ломает страницу или CSP

Отключите стороннее расширение через UI либо восстановите extensions из backup. Не маскируйте ошибку отключением предупреждения и не переопределяйте Content-Security-Policy в reverse proxy: FreshRSS выдаёт собственную CSP.

Ошибка 502 от reverse proxy

С хоста выполните curl -I http://127.0.0.1:8080/. Проверьте upstream, firewall и namespace proxy. Из контейнера 127.0.0.1 указывает на сам proxy-контейнер, а не на FreshRSS на хосте; используйте host gateway или общую закрытую сеть.

Официальные источники

Последний релиз: 2026-05-20 · GitHub Stars: 15 892 · данные проверены 1 сент. 2026 г., 00:22 UTC

Отказ от ответственности

Fossary — независимый информационный каталог, не связанный с разработчиками представленных приложений. Мы собираем сведения из открытых источников и проверяем опубликованные рецепты, но не разрабатываем, не распространяем и не контролируем эти приложения.

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