SSD Nodes Learn Hosting plans →
Посібники Matt ConnorВід Matt Connor

Як встановити FreshRSS на Ubuntu VPS

Встановіть FreshRSS 1.30.1 на Ubuntu 24.04 VPS: Apache, PHP 8.3, MariaDB, virtual host, cron для оновлення стрічок і API для мобільного застосунку.

Що ви створюєте

Self-hosted RSS reader — це feed reader, який працює на сервері, що належить вам. Тому ніхто не може його вимкнути або змінити вміст, який він вам показує. У цьому посібнику FreshRSS розгортається на Ubuntu 24.04 VPS: Apache працює як reverse proxy, PHP — за ним, MariaDB використовується для зберігання даних, а одне cron-завдання отримує нові статті. RSS (really simple syndication) — це формат файлів, які сайт публікує для читання статей програмами. FreshRSS — це PHP-застосунок, який збирає ці файли, зберігає статті та надає вебінтерфейс і API (application programming interface), з яким взаємодіють мобільні застосунки.

Сама інсталяція невелика: розпакувати реліз, створити базу даних, записати один virtual host, запустити інсталятор командного рядка, а потім створити обліковий запис за допомогою cli/create-user.php. Більшість подальших проблем виникає через неправильно налаштоване оновлення стрічок, encoded slashes для mobile API та права власника файлів.

FreshRSS 1.30.4, випущений 21 жовтня 2026 року, є поточним релізом станом на 29 жовтня 2026 року. Для нього потрібен PHP 8.1 або новіший. Ubuntu 24.04 постачається з PHP 8.3, тому достатньо пакетів із репозиторію дистрибутива. Сторонній PHP-репозиторій не потрібен.

Почніть із готового стека LAMP

FreshRSS — це звичайний PHP-застосунок, тому йому потрібна така сама базова інфраструктура, як і будь-якому іншому застосунку. Якщо ви ще не підготували її, спочатку виконайте налаштування стека LAMP для Ubuntu 24.04, а потім поверніться сюди. Коротко:

sudo apt update
sudo apt install -y apache2 mariadb-server php libapache2-mod-php
sudo systemctl enable --now apache2 mariadb

systemctl status apache2 має вивести active (running). Якщо Apache не запускається, зазвичай це означає, що інший процес уже використовує порт 80. sudo ss -ltnp | grep :80 покаже, який саме.

Розширення PHP, потрібні FreshRSS

FreshRSS вважає libxml, cURL, JSON, PDO_MySQL, PCRE і ctype обов’язковими. Також потрібні mbstring, iconv, Zlib і ZipArchive, а в 32-розрядній системі — GMP. В Ubuntu ці розширення встановлюються як пакети дистрибутива:

sudo apt install -y php-curl php-mbstring php-xml php-zip php-mysql php-intl php-gmp
sudo systemctl restart apache2

Перевірте, які розширення PHP фактично завантажив, за допомогою php -m. Відсутнє розширення не заважає інсталятору запуститися. Воно зупиняє інсталяцію на екрані перевірки вимог із червоним рядком, де вказано назву розширення. Це незручний момент для виявлення проблеми, тому перевірте все зараз. Перезапуск Apache важливий, оскільки libapache2-mod-php завантажує PHP у процес Apache. Тому вебсервер не побачить щойно встановлене розширення, доки його не буде перезапущено.

Завантаження релізу

Встановіть FreshRSS поза стандартним web root і налаштуйте Apache для доступу до нього. Якщо каталог застосунку відокремлений від document root, через HTTP буде доступна лише публічна директорія.

cd /tmp
curl -fsSLO https://github.com/FreshRSS/FreshRSS/archive/refs/tags/1.30.4.tar.gz
tar xzf 1.30.4.tar.gz
sudo mv FreshRSS-1.30.4 /srv/freshrss

Тепер налаштуйте дозволи. Документація FreshRSS висуває до них суворі вимоги: web server user має бути власником дерева каталогів, група повинна мати права на читання всіх файлів, а також права на запис у ./data/.

sudo chown -R www-data:www-data /srv/freshrss
sudo chmod -R g+r /srv/freshrss
sudo chmod -R g+w /srv/freshrss/data

Якщо пропустити цей крок, інсталятор не зможе записати конфігурацію. PHP працює від імені www-data, а www-data не має права запису в каталог, власником якого є root.

Створення бази даних

FreshRSS підтримує SQLite, MariaDB, MySQL і PostgreSQL. Для SQLite потрібне розширення php-sqlite3, але не потрібне налаштування сервера бази даних. Дані кожного користувача зберігаються в окремому файлі data/users/_user_/db.sqlite. Додавання користувачів не записує їхні дані в один спільний файл SQLite. У цьому посібнику MariaDB використовується як частина LAMP stack.

sudo mariadb -e "CREATE DATABASE freshrss CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mariadb -e "CREATE USER 'freshrss'@'localhost' IDENTIFIED BY 'ReplaceThisPassword';"
sudo mariadb -e "GRANT ALL PRIVILEGES ON freshrss.* TO 'freshrss'@'localhost';"
sudo mariadb -e "FLUSH PRIVILEGES;"

Використовуйте utf8mb4, а не utf8. Стрічки містять emoji та нелатинські системи письма, а старе трибайтове кодування utf8 не може зберігати чотирибайтові символи. Непідтримувані символи спричиняють помилку в стандартному strict mode MariaDB. Усічення залежить від SQL mode та параметрів оператора, наприклад IGNORE.

Віртуальний хост Apache

Загальнодоступний каталог — це p/, а не верхній рівень дерева каталогів. Усе інше, зокрема файл конфігурації, що містить пароль до бази даних, розташовано вище кореневого каталогу документів. Apache ніколи не надаватиме до нього доступ.

<VirtualHost *:80>
	ServerName rss.example.com
	DocumentRoot /srv/freshrss/p/

	<Directory /srv/freshrss/p>
		AllowOverride AuthConfig FileInfo Indexes Limit
		Require all granted
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/freshrss_error.log
	CustomLog ${APACHE_LOG_DIR}/freshrss_access.log combined

	AllowEncodedSlashes On
</VirtualHost>

Збережіть це у файлі /etc/apache2/sites-available/freshrss.conf і ввімкніть його:

sudo a2enmod rewrite
sudo a2ensite freshrss
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2

Команда configtest має вивести Syntax OK. Параметр AllowEncodedSlashes On може здаватися необов’язковим, але це не так: API Google Reader надсилає ідентифікатори стрічок, що містять %2F. Без цієї директиви Apache відхиляє такі запити, тому мобільні застосунки не можуть синхронізуватися, хоча вебінтерфейс працює належним чином.

Додайте HTTPS перед входом

Ви збираєтеся ввести пароль на цьому сайті, тому спочатку отримайте сертифікат. Спрямуйте A-запис на сервер, потім виконайте налаштування Certbot для Apache в Ubuntu і запустіть sudo certbot --apache -d rss.example.com. Certbot змінить конфігурацію віртуального хоста для порту 443 і додасть перенаправлення. Перевірте за допомогою curl -I https://rss.example.com/. Команда має повернути 200 або перенаправити на сторінку входу.

Запустіть інсталятор із командного рядка

FreshRSS має інсталятор у браузері, але версію для командного рядка можна запускати повторно, і вона зберігає точний запис вибраних параметрів.

sudo -u www-data php /srv/freshrss/cli/do-install.php \
  --default-user admin --auth-type form --environment production \
  --base-url https://rss.example.com --language en --api-enabled \
  --db-type mysql --db-host localhost --db-user freshrss \
  --db-password 'ReplaceThisPassword' --db-base freshrss
sudo -u www-data php /srv/freshrss/cli/create-user.php \
  --user admin --password 'a-long-passphrase' --api-password 'a-different-passphrase'

Запустіть обидві команди від імені www-data. Якщо запустити їх від імені root, будуть створені конфігураційні файли, власником яких є root. Після цього вебінтерфейс не зможе зберігати налаштування. --environment production також має значення, оскільки режим розробки виводить повідомлення PHP на сторінку.

Завантажте https://rss.example.com/ і увійдіть як admin.

Чому стрічки не оновлюються автоматично

Ніщо не опитує ваші стрічки, доки ви не налаштуєте це. Відкриття FreshRSS не планує отримання стрічок; без планувальника використовуйте посилання оновлення в навігаційному меню, щоб отримувати статті вручну. Виправленням є скрипт, який проєкт постачає для цього, app/actualize_script.php, що запускається з cron.

sudo crontab -u www-data -e

Додайте один рядок:

*/20 * * * * php /srv/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1

Інтервал у двадцять хвилин є розумним розкладом, але для кожної стрічки все одно діє власний інтервал оновлення: типове значення — одна година, а для окремих стрічок можна встановити найкоротший інтервал у п’ятнадцять хвилин. Спочатку запустіть його вручну:

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

У разі успішного виконання у виведенні зазначається запуск оновлення, і воно завершується без помилки PHP; назви стрічок з’являються, коли статті додаються або оновлюються. Якщо виведення немає взагалі, перевірте повідомлення про помилки PHP і журнали FreshRSS; сама відсутність виведення не вказує, що причиною є користувач cron. Помилка доступу до data/ означає, що потрібно перевірити власника та права на запис.

Додайте перші стрічки

Натисніть кнопку з плюсом у лівому верхньому куті інтерфейсу, вставте адресу сайту, і FreshRSS автоматично знайде посилання на стрічку. Більшість сайтів досі публікують стрічку, навіть якщо не вказують її явно. Зазвичай вона доступна за адресою /feed, /rss або /atom.xml. Категорії є папками, а переміщення стрічки між ними виконується перетягуванням.

Якщо ви переходите з іншого reader, експортуйте там файл OPML та імпортуйте його на сторінці керування підписками. OPML (outline processor markup language) — стандартний формат списку стрічок. Його підтримує кожен reader, з якого варто переходити. Великий імпорт повільно обробляється під час першого оновлення, оскільки кожна стрічка завантажується один раз. Тому зачекайте завершення першого запуску cron, перш ніж оцінювати швидкість.

Прочитайте це на телефоні

FreshRSS підтримує Google Reader API, який підтримують багато RSS-застосунків. Має бути виконано дві умови. У налаштуваннях автентифікації має бути ввімкнено параметр "Allow API access". Прапорець --api-enabled вище вже встановив це значення. У профілі поле пароля API має містити значення. Цей пароль навмисно відокремлений від пароля для входу, оскільки телефон легше загубити.

Відкрийте https://rss.example.com/api/, щоб автоматично запустити перевірки конфігурації сервера. У робочій конфігурації буде повернуто PASS. Якщо перевірка завершується помилкою, перевірте параметр AllowEncodedSlashes On у virtual host і текст повідомлення про помилку. У застосунку вкажіть адресу сервера як https://rss.example.com/api/greader.php, ім’я користувача — як ім’я вашого користувача FreshRSS, а пароль API — як пароль.

Альтернатива Docker

Якщо ви не хочете самостійно обслуговувати PHP і Apache, проєкт публікує офіційний образ freshrss/freshrss. Один файл compose запускає застосунок і його базу даних разом. Компроміс стандартний: на хості менше компонентів, але в разі несправності потрібно налагоджувати ще один рівень. Для TLS (захисту транспортного рівня) все одно потрібен зворотний проксі. Якщо цей варіант вам більше підходить, основи Docker Compose для VPS описують формат файлу, а рядок cron матиме вигляд docker exec --user www-data freshrss php ./app/actualize_script.php.

Резервні копії та оновлення

Ваш стан зберігається у двох компонентах: базі даних і /srv/freshrss/data/. Створіть дамп бази даних за допомогою sudo mysqldump freshrss > freshrss.sql, скопіюйте /srv/freshrss/data/ і зберігайте обидві копії не на цьому сервері. Список підписок також варто час від часу експортувати в OPML, оскільки цей файл дає змогу перенести список каналів до інших програм для читання, які підтримують OPML. Експорт не зберігає специфічні для FreshRSS налаштування, зокрема частоту оновлення, облікові дані, user agent або правила XPath web scraping; щоб зберегти їх, використовуйте також експорт SQLite.

Оновлення полягає в розпакуванні новішого релізу в той самий каталог і повторному виконанні команд для призначення власника. Дотримуйтеся послідовності оновлення проекту від версії до версії та перевіряйте FreshRSS після кожного кроку. FreshRSS застосовує власні міграції бази даних під час наступного завантаження сторінки. Спочатку створіть резервну копію, оскільки невдала міграція бази даних, яку неможливо відновити, призводить до невиправної ситуації. Якщо ви встановили FreshRSS зі старого tarball, наприклад 1.29.1, оновіть його до 1.30.4: security releases серії 1.30.x додають ротацію session ID під час змін автентифікації та обмеження для ZIP-імпорту, а 1.30.4 також оновлює альтернативні Alpine Docker images для усунення критичних вразливостей PHP. Reader — це сервіс із низьким ризиком для запуску і хороший перший кандидат, якщо ви опрацьовуєте список того, що варто розміщувати на власному сервері.

FAQ

Чому мої стрічки оновлюються лише після відкриття FreshRSS?

Відкриття сторінки не запускає планове отримання стрічок. Без планувальника використовуйте посилання оновлення для ручового оновлення. Додайте рядок cron, який викликає app/actualize_script.php від імені користувача www-data, потім один раз запустіть скрипт вручну й перегляньте його вивід. Якщо вивід відсутній, перевірте повідомлення про помилки PHP і журнали FreshRSS, а також переконайтеся, що користувач cron має право запису до data/.

Мобільний застосунок не може підключитися, але вебсайт працює. Чому?

Google Reader API передає кодовані косі риски (%2F) у шляхах запитів, а Apache за замовчуванням відхиляє такі запити. Додайте AllowEncodedSlashes On всередині virtual host і перезавантажте Apache. Перевірте виправлення, відкривши https://rss.example.com/api/. Автоматична перевірка конфігурації має повідомити про PASS. Також перевірте, чи задано пароль API у вашому профілі, оскільки він відрізняється від пароля для входу.

Що вибрати: SQLite чи MariaDB?

Для SQLite потрібне розширення php-sqlite3, але не потрібно керувати сервером бази даних або паролем бази даних. Кожен користувач отримує окремий файл бази даних SQLite, тому додавання другого користувача не створює конкуренції за один спільний файл і не потребує MariaDB. Використовуйте MariaDB, якщо хочете застосовувати сервер бази даних у своєму LAMP stack. Пізніше можна перейти з однієї системи на іншу за допомогою команд експорту та імпорту, тому це рішення не є остаточним.

Інсталятор не може записати конфігурацію. У чому проблема?

В Apache PHP працює від імені www-data, а цей користувач не може записувати до каталогу, власником якого є root. Повторно виконайте sudo chown -R www-data:www-data /srv/freshrss і sudo chmod -R g+w /srv/freshrss/data, а потім знову запустіть інсталятор. Якщо ви вже запускали інсталятор командного рядка від імені root, виправте власника файлів, створених ним у data/, перш ніж повторити спробу.

Які ресурси сервера потрібні для self-hosted RSS reader?

Дуже мало. FreshRSS розрахований на роботу на помірному за ресурсами обладнанні, але їх використання залежить від ваших стрічок, розміру статей і параметрів зберігання. Обсяг диска збільшується відповідно до періоду зберігання, тому в налаштуваннях архівування задайте політику видалення статей, а не зберігайте все безстроково.

Чи була ця стаття корисною?