# Heroku для сайтов с небольшим трафиком

В прошлом году я описывал в статье [Heroku в качестве хостинга сайтов](/2012/03/09/heroku/ "Heroku в качестве хостинга сайтов") о том, как можно использовать Heroku для размещения своих статических сайтов. Но у Heroku есть одна особенность, которая затрудняет его использование в виде обычного хостинга. Если в течение часа к сайту никто не обращался, то сайт "засыпает". И при последующем обращении сначала производиться запуск сайта, на что уходит порядка 30 секунд, и только после этого он оказывается доступным.

В интернете находятся различные рецепты того, как заставить Heroku постоянно поддерживать сайты в рабочем состоянии, если посетителей мало. В качестве вариантов предлагается использовать [newrelic](https://addons.heroku.com/newrelic "New Relic -- Add-ons -- Heroku") (что возможно при использовании Rails), либо просто обращаться к страницам своего сайта, используя [scheduler](https://addons.heroku.com/scheduler "Heroku Scheduler -- Add-ons -- Heroku"). Единственно, везде, где встречал описание шедулера, используется дополнительный процесс в том же приложении, который стоит денег. Немного подумал, а зачем это делать? Если можно просто завести отдельное приложение, на которое возложить данную задачу.

За выходной написал небольшую программу [wake-heroku](https://github.com/Juev/wake-heroku "Wake Heroku"). Сначала думал о том, чтобы задействовать шедулер, но там приходиться часть действий совершать руками, что неудобно, плюс есть ограничения на диапазоны времени, через которое происходит обработка событий (10 минут, час и день -- это все что есть). Поэтому для реализации приложения воспользовался гемом [clockwork](https://github.com/tomykaira/clockwork "A scheduler process to replace cron.").

Для использования сначала клонируем репозиторий:

```shell
$ git clone https://github.com/Juev/wake-heroku.git
$ cd wake-heroku
```

Теперь нам необходимо отредактировать файл worker.rb, в котором необходимо изменить временной интервал, по умолчанию используется 20 минут. И затем указать свои сайты, что необходимо поддерживать в рабочем состоянии. По умолчанию используется только один сайт, но строчку можно клонировать:

```ruby
include Clockwork

every(20.minutes, 'Fetch data from meta-info') do
  Net::HTTP.get(URI('http://meta-info.heroku.com'))
  Net::HTTP.get(URI('http://asdad-sdff.heroku.com'))
  Net::HTTP.get(URI('http://sfsf-werw-wr.heroku.com'))
end
```

Далее необходимо установить на компьютер [Heroku toolbelt](https://toolbelt.heroku.com "Heroku toolbelt"), если не сделали этого ранее. Сохраняем произведенные изменения и создаем новый сайт:

```shell
$ git commit -a -m "New changes"
$ heroku apps:create
$ git push heroku master
$ heroku ps:scale web=0 clock=1
```

После создания нового сайта нами произведена загрузка и конфигурирование. Последняя строка кода отвечает за то, чтобы отключить процесс web и переключиться на использование процесса clock. Теперь каждые 20 минут наши сайты будут опрашиваться с помощью данного приложения и это не позволит им уснуть. И время реакции на действия пользователя будет вполне адекватным.

В данном приложении не используется процесс типа web, поэтому оно будет постоянно активным.

