Tiny Tiny RSS на бесплатном хостинге

  • Tutorial
image
Данная статья продолжает цикл статей о жизни после закрытия Google Reader и будет рассказывать об опыте настройки Tiny Tiny RSS на hostinger.ru, препятствиях с которыми пришлось столкнуться и, конечно, способах их преодоления. Вас ждёт подробная пошаговая инструкция с картинками, исходным кодом и комментариями.

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


Почему hostinger.ru?


Сразу оговорюсь, я никак не связан с этим сервисом и хочу попросить не начинать споры о том, что бесплатный хостинг – это сплошные проблемы и всегда лучше перейти на платный, а ещё лучше заказать VPS/VDS или поднять сервер дома. Я согласен с тем, что полный контроль всегда лучше, но бесплатное всегда привлекает, не правда ли?

Мой путь по обретению замены Google Reader был довольно длинным и, возможно, ещё не завершён. Я сразу остановился на Tiny Tiny RSS, как на одной из самых функциональных альтернатив, но с хостингом пришлось повозиться. Сначала я попробовал картридж Tiny Tiny RSS для OpenShift, но производительность оказалась настолько низкой, что работать с этим было невозможно. Потом был Heroku и скрипт для установки Tiny Tiny RSS «в один клик», в который, для того чтобы его успешно запустить, пришлось отправить пару коммитов. На Heroku Tiny Tiny RSS заработал прекрасно, но довольно быстро кончился лимит в 10000 записей в БД, который можно увеличить за 9$/мес. Это сумма, за которую можно арендовать VPS/VDS.

В конце концов, я уже был готов переходить на платный хостинг, но натолкнулся на Hostinger. Бесплатный тариф данного сервиса накладывал меньше ограничений, чем многие платные хостинги, и поэтому я решил попробовать. Конечно, стабильность Hostinger оставляет желать лучшего, но всегда есть возможность забрать бекап и развернуть своё приложение где угодно, а заманчивая ценовая политика (бесплатно же) заставила рискнуть.

Итак, начнём…

Этап 1: Установка Tiny Tiny RSS


Заведение аккаунта на hostinger.ru. Перейдите на hostinger.ru и нажмите «Заказать сейчас!».

Подтверждение e-mail.

Заказ бесплатного тарифа.

Выберите себе домен 3 уровня вида <имя>.p.ht и отдельный пароль на этот домен. После некоторой паузы вы получите подобную картинку:
image

Нажимайте «Выбрать».

Ответьте на вопрос: «Какой основной целью для Вас является использование нашего хостинга?». Я отвечал так: «Просто учусь и экспериментирую. Я новичок :)».

Вы попадёте в панель управления вашим сайтом. С ней будет осуществляться основная работа:
image

Для начала, настроим FTP доступ. В письме с темой «Бесплатный Аккаунт Активирован» должны прийти данные для подключения. Используйте пароль от домена, который тоже должен был прийти в письме «Account Created». Для доступа к FTP я использовал Total Commander и включал «Пассивный режим передачи, как web-browser» и отправку каждые 30 секунд команды NOOP. Такие настройки мне показались самыми стабильными.
image

Попробуйте зайти на ftp, там должен одиноко лежать default.php

Cоздадим подкаталог и субдомен для нашего приложения. В панели управления зайдите в пункт «Субдомены» и введите имя каталога и субдомена, например «rss» и вы сможете открывать ваш ридер так rss.<имя>.p.ht.
image

Следующим шагом, создадим БД. Откройте пункт «Базы Данных MySQL». Введите в первых двух полях «ttrss» и в качестве пароля тот же пароль, что и от ftp.
image

Нажмите «Создать».
image

Пришла пора скачать, наконец, Tiny Tiny RSS. Переходите на tt-rss.org и внизу страницы будет ссылка «Download tarball, v1.9».

По завершению закачки откройте ftp и в папку public_html заливайте Tiny-Tiny-RSS-1.9.tar.gz, а папку rss удалите (Возможно, через «Файловый Менеджер» в панели управления залить файл получится быстрее).

В панели управления откройте «SSH Консоль» и последовательно вводите следующие команды:
cd public_html
tar zxfv Tiny-Tiny-RSS-1.9.tar.gz
mv Tiny-Tiny-RSS-1.9 rss


Удалите Tiny-Tiny-RSS-1.9.tar.gz через FTP, он нам больше ну нужен.

Откройте ваш ридер rss.<имя>.p.ht и вы увидите страницу настройки Tiny TinyRSS. Заполняйте параметры вашей БД. И нажимайте «Test configuration».
image

После того как проверка пройдёт успешно, нажмите «Initialize database», а затем «Save configuration».

Вот, собственно, и закончилась предварительная настройка.

Вы можете зайти в ваш ридер при помощи логина «admin» и пароля «password» (который лучше сразу сменить).

Этап 2: Настройка логирования


Настроим сервер на вывод логов в определенный файл. Для этого добавьте в файл public_html/rss/.htaccess следующие команды, предварительно заменив «u466982574» на ваше имя пользователя (указано в панели управления)
# Increase execution time 
php_value max_execution_time 300

# PHP error handling for development servers
# http://perishablepress.com/advanced-php-error-handling-via-htaccess/
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
php_value error_log /home/u466982574/public_html/PHP_errors.log
php_value error_reporting -1
php_value log_errors_max_len 0

<Files PHP_errors.log>
 Order allow,deny
 Deny from all
 Satisfy All
</Files>


Данный файл, кроме того, что заставляет php записывать все ошибки в файл, увеличивает максимальное время выполнения скрипта (не уверен, что это помогает на Hostinger, но лишнем явно не будет)

Откройте public_html/rss/config.php и замените строку
define('LOG_DESTINATION', 'sql');

на
define('LOG_DESTINATION', '');

Это заставит Tiny TinyRSS писать ошибки не в БД, а в файл из предыдущего пункта. Дело в том, что на Hostinger, по крайней мере у меня, частая проблема – это недоступность БД, при возникновении которой сообщение об ошибке просто теряется.

Этап 3: Автоматическое обновление


Необходимо настроить автоматическое обновление ридера и здесь уже начинаются проблемы. Hostinger поддерживает CRON-задачи, то есть возможность запускать произвольный скрипт через равные промежутки времени.

CRON-задача и параметры update.php


В Tiny TinyRSS для обновления нужно вызвать скрипт update.php с параметром --feed, но Hostinger запрещает передавать параметры в CRON-задачах. Значит, нужно создать скрипт, который будет вызывать update.php и передавать ему нужные параметры. Назовём этот скрипт update_with_params.php:

#!/usr/bin/env php
<?php
  ob_implicit_flush(true);
  echo "PHP version: " . phpversion() . PHP_EOL;
  echo "Max execution time: ".ini_get("max_execution_time")." seconds" . PHP_EOL;
  
  define( 'UPDATE_IMPLICIT_PARAMS', 'feeds' ); 
  require_once "update.php";
?>


Также, нам придётся изменить update.php и добавить следующий код:

  if (defined('UPDATE_IMPLICIT_PARAMS')) {
    $impl_params = array_map("trim", explode(",", UPDATE_IMPLICIT_PARAMS));
    
    if( !is_array($options) )
      $options=array();
     
    $options = array_merge( $options, array_fill_keys($impl_params, ''));
  }


после строки:

$options = getopt("", $longopts);


CRON-задача и версия PHP


Вторая проблема с CRON-задачами на Hostinger состоит в том, что они вызываются под PHP 5.2, а Tiny TinyRSS требует не меньше, чем PHP 5.3. Для решения этой проблемы заведём новый скрипт, который будет вызывать update_with_params.php удалённо, как браузер, и назовём его update_external.php. Замените rss.name.p.htна адрес к вашему ридеру.

#!/usr/bin/env php
<?php
  echo "PHP version: " . phpversion() . PHP_EOL;
  echo "Max execution time: ".ini_get("max_execution_time")." seconds" . PHP_EOL;
  
  $url = "http://rss.name.p.ht/update_with_params.php";
  $ch = curl_init($url); 
 
  try 
  {
    if ( $ch === FALSE )
        throw new Exception('failed to initialize');

    $startTime = microtime(true);
    $result = curl_exec($ch);
    echo 'Execution time '. (microtime(true) - $startTime) . ' sec' . PHP_EOL;
 
    if (FALSE === $result )
      throw new Exception('Curl error ' . curl_errno($ch) . ' , ' . curl_error($ch) );
    
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE );
    
    if ( $code != 200 )
      throw new Exception( "Page returned error code $code" );
 
  } 
  catch(Exception $e) 
  {
    trigger_error( sprintf('ERROR #%d: %s\n', $e->getCode(), $e->getMessage()), E_USER_ERROR );
  }
  
  curl_close($ch);
 ?>


Настройка CRON-задачи


Осталось настроить наш скрипт на автоматический запуск. Для этого перейдите в пункт «Cron-Задачи» панели управления и настройте так, как на картинке:
image

Нажмите «Создать»

Теперь каждые 5 минут будет вызываться скрипт обновляющий ридер. Логи его работы вы можете найти в пункте «Результаты Cron-Задач» панели управления:
image

Вот собственно и всё.
image

Разбор полётов


На данный момент я пользуюсь Tiny Tiny RSS на Hostinger и вполне доволен, однако, я вижу несколько потенциальный проблем, которые могут проявить себя в дальнейшем:
  • Ограничение на время выполнения скрипта. Трудно сказать насколько Hostinger подчиняется параметру max_execution_time в .htaccess, но сейчас обновление моих лент занимает 45 секунд и Hostinger не прерывает выполнение
  • В логах появляются сообщения «Too many connections» и «MySQL server has gone away» свидетельствующие о том, что соединение с БД рвётся во время выполнения скрипта. Теоретически, это не должно быть проблемой, если происходит не постоянно и если разработчики Tiny Tiny RSS аккуратно работают с транзакциями (что, на первый взгляд, похоже на правду)
  • Несколько часов доступ к ридеру был закрыт, потом всё восстановилось. Пришлось подождать
  • Разработчики Tiny Tiny RSS выступают против модификации своего продукта под ограничения виртуальных хостингов и мой патч, с описанными здесь изменениями, не был принят. Это может сказаться в дальнейшем, с выпуском новых версий.


Заключение


В статье была описана установка Tiny Tiny RSS на Hostinger, и я постарался непредвзято оценить возможность использования такого решения. С моей точки зрения, пользоваться данным решением вполне возможно, особенно, учитывая его главное преимущество – бесплатность. Но решать, конечно, как всегда вам, благо, для того, чтобы попробовать уже не нужно проходить путь настройки с самого начала.

Если вы знаете способы улучшения скриптов или настроек, пожалуйста, укажите их в комментариях. Кроме того, опишите, пожалуйста, причину в комментариях, если вы ставите минус.
Share post

Similar posts

Comments 23

    0
    Спасибо. Сразу пробовал на этом хостинге поднять ttrss, но апдейтер не удалось настроить.
    Знаний php нет вообще. Перегрузил акк. Сделал по вашим указаниям.
    Вижу такое. Где туплю? Спасибо.
      0
      Наверное, вы не совсем правильно указали путь к CRON-задаче. В первое поле нужно вводить:
      public_html/rss/update_external.php, а у вас похоже update.php
      0
      Что-то значит на хостинге глючит.
      Во-первых, все верно указал… Во-вторых, даже если так, update.php существует же ведь… да и путь ссылается в ошибке в корень…
        0
        Вот, смотрите, не хватает каталога rss в пути. Ещё задача будет выполняться каждую 5-ю минуту часа, а не каждые 5 минут. Посмотрите ещё раз на картинку в разделе «Настройка CRON-задачи»
          0
          У меня в корне паблик_хтмл.
          И я думал каждых пять минут. теперь ясно. Все работает.
        0
        Но не суть. Фиды обновились. В отчетах по крону просто показывает ересь.
        Спасибо громадное за мануал!
          0
          Конечно, стабильность Hostinger оставляет желать лучшего

          А что не так со стабильностью?
          Сколько использовал его для личных проектов не каких проблем не было, да и поддержка работает отлично.
            0
            Все круто, настроил oneclickpocket, хоткеи аля Google Reader, эмуляцию fever, чтоб читать в reeder на iOS, сменил тему, красота… но… раз в час — очень редко.
            С этим ничего не сделать, я так понимаю? Только платный хостинг брать?
              0
              Вы имеете в виду обновление раз в час? Если так, то у вас, похоже, та же ошибка что и выше:
              задача будет выполняться каждую 5-ю минуту часа, а не каждые 5 минут. Посмотрите ещё раз на картинку в разделе «Настройка CRON-задачи»
                0
                Блин, невнимательный все-таки )
                Снова и снова спасибо. Очень круто.
              0
              Спасибо большое за How to! Со второго раза получилось прикрутить к своему домену )
                0
                Gодскажите как бороться с этим:
                Fatal error: ERROR #0: Page returned error code 503\n in /home/u77777/public_html/rss/update_external.php on line 28
                  0
                  503 значит «сервис временно недоступен». Т.е. единственный вариант подождать, если раньше нормально работало.
                    0
                    Английский я знаю.
                    Почему он не дает сам себя обновить? у других работает? или после хабраэффекта сделали тако еограничение? только мне повезло? даже wget позвращает 503 если через ssh консколь ввести.
                      0
                      1. А что возвращает wget на update_with_params.php? Сколько секунд он работает?
                      2. Это временное явление, т.е. всегда возвращает 503 или раньше работало?
                      3. Что написано в логе public_html/PHP_errors.log?
                      4. У меня, в целом, работает, но бывают периоды, когда hostinger подтупливает. Частые проблемы: отваливается БД «Too many connections» и «MySQL server has gone away» и коды 302 и 503
                        0
                        1. Тоже 503 если делать из ssh консоли.
                        2. Всегда. «Раньше» не было вообще потому поднял ttrss только после вашей статьи ))
                        3. в логах
                        Too many connections in…
                        User already has more than 'max_user_connections' active connections in
                        4. С любого другого хоста — срабатывает нормально (настроил DNS что бы он по этой ссылке ходил раз в пол часа. но это костыль).
                  0
                  Добрый день.
                  После предварительной настройки такая вот беда.
                  Знаний php 0.
                  Fatal error: require_once() [function.require0]: Failed opening required 'lib/Mobile_Detect.php' (include_path='/home/u*********/public_html/rss/include:.:/usr/lib/php') in /home//u*********//public_html/rss/index.php on line 29
                    0
                    Добрый день.
                    Судя по описанию ошибки, система не может найти «lib/Mobile_Detect.php», возможно он не был скопирован. Попробуйте опцию «Перезагрузить Аккаунт» в CPANEL и пройти инструкцию заново.
                    0
                    hostinger в бесплатном варианте только чтобы поиграться
                    У меня скрипт обновляет базу каждый час, а потом я смотрю и вижу, что 2/3 запусков с обломами, потому что база данных недоступна «Too many connections». А периодически и по http зайти не могу.
                      0
                      После обновления на 1.12 перестал обновляться. Пишет:
                      «Please run this script from the command line. Use option „-help“ to display command help if this error is displayed erroneously.»
                      Запустить из ком строки hostinger.ru не позволяет.
                      в update.php параметр feeds есть.Подскажите, как исправить?
                        0
                        Вопрос снят. забыл поправить update.php
                        0
                        А кто нибудь в курсе, почему уже 3 сутки не работает?
                          0
                          У меня работает. Попробуйте переместить все скрипты из папки rss в, скажем, rss2. Иногда Хостингер блокирует папки каким-то образом.

                        Only users with full accounts can post comments. Log in, please.