Heroku Cedar: как масштабировать web dynos на основе времени суток

Я хочу, чтобы мое приложение Rails 3.1 масштабировалось до 1 web dyno в 8 утра, а затем до 0 web dynos в 5 вечера.

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

похоже, что планировщик Heroku должен сделать это тривиальным. Любые быстрые решения или ссылки?

8 ответов


ответ "да" вы можете сделать это из планировщика, и это тривиально, как только вы знаете ответ:

  1. добавить Heroku config var с именем приложения: heroku config: добавить APP_NAME: blah
  2. добавить камень "heroku" в Gemfile
  3. для проверки вручную масштабируйте вверх / вниз свое приложение: heroku ps: scale web=2
  4. добавьте задачу rake в lib/tasks / scheduler.рейк:

    desc "Scale up dynos"
    task :spin_up => :environment do
      heroku = Heroku::Client.new('USERNAME', 'PASSWORD')
      heroku.ps_scale(ENV['APP_NAME'], :type=>'web', :qty=>2)
    end
    # Add a similar task to Spin down
    
  5. добавить аддон планировщика: heroku аддоны: добавить планировщик: стандартный

  6. используйте веб-интерфейс планировщика, чтобы добавить "rake spin_up" в любое время, когда вам нравится
  7. добавьте задачу Rake spin_down и запланируйте ее на любой момент.

Примечания: Шаг 1 необходим, потому что я не мог найти другого способа убедиться в имени приложения (и я использую "промежуточные" и "производственные" среды для своих приложений.

Шаг 3 требуется, потому что в противном случае ошибки команды ruby, как это требует, чтобы вы сначала согласились (через Да/нет ответа), что вам будут сняты деньги в результате этого действия.

на шаге 4 я не смог найти никаких документов о том, как это сделать с помощью ключа API через Heroku gem, поэтому похоже, что требуется user/pass.

надеюсь, это поможет кому-то еще!


просто реализовал этот подход (хороший ответ выше @dnszero), думал, что я обновлю ответ с новым API Heroku.

добавьте имя приложения в качестве переменной конфигурации heroku

 require 'heroku-api'
  desc "Scale UP dynos"
   task :spin_up => :environment do
     heroku = Heroku::API.new(:api_key => 'YOUR_ACCOUNT_API_KEY')
     heroku.post_ps_scale(ENV['APP_NAME'], 'web', 2)
   end

это с heroku (2.31.2), heroku-api (0.3.5)


вы можете масштабировать свой веб-процесс до нуля на

heroku ps:scale web=0

или вернуться к 1 через

heroku ps:scale web=1

затем вам нужно будет установить задачу для запуска в 8, которая масштабирует его, и один, который работает в 17, который масштабирует его. Heroku может потребовать от вас подтвердить свою учетную запись (т. е. ввести данные кредитной карты), чтобы использовать Heroku Scheduler plus, тогда вам придется иметь Heroku gem внутри вашего приложения и ваши учетные данные Heroku, чтобы он мог включить ваше приложение или выключено.

но, как говорит Нил , вы получаете 750hrs в месяц бесплатно, который не может перейти в следующий месяц, так почему бы просто не оставить его работать все время?


см. Также этот полный gist, который также имеет дело с правильной командой для использования из планировщика Heroku:https://gist.github.com/maggix/8676595


поэтому я решил реализовать это в 2017 году и увидел, что драгоценный камень Heroku, используемый принятым ответом, был устаревшим в пользу драгоценного камня "платформа-api". Я просто подумал, что опубликую то, что сработало для меня, так как я не видел никаких других сообщений с более современным ответом.

вот мой файл рейка, который масштабирует мои веб-Динамо до числа 2. Я использовал драгоценный камень "httparty", чтобы сделать запрос патча с соответствующими заголовками к API платформы, согласно их docs, в Секция "формирование".

require 'platform-api'
require 'httparty'

desc "Scale UP dynos"
task :scale_up => :environment do
  headers = {
    "Authorization" => "Bearer #{ENV['HEROKU_API_KEY']}",
    "Content-Type" => "application/json",
    "Accept" => "application/vnd.heroku+json; version=3"
  }

  params = {
    :quantity => 2,
    :size => "standard-1X"
  }

  response = HTTParty.patch("https://api.heroku.com/apps/#{ENV['APP_NAME']}/formation/web", body: params.to_json, headers: headers)

  puts response
end

Если вы работаете в стеке cedar, вы не сможете масштабироваться до нуля web dynos без изменения файла procfile и развертывания.

кроме того, зачем беспокоиться, если вы получаете один бесплатный dyno в месяц (750 dyno часов, чуть больше месяца на самом деле)?


или, если вы хотите использовать сервис вместо реализации собственного, попробуйте http://scaledynos.herokuapp.com/ -- он масштабируется в зависимости от времени суток


в качестве обновления для ответа на @Рен, в Heroku платформа API gem делает это очень легко.

heroku = PlatformAPI.connect_oauth(<HEROKU PLATFORM API KEY>)
heroku.formation.batch_update(<HEROKU APP NAME>, {"updates" => 
  [{"process" => <PROCESS NAME>, 
  "quantity" => <QUANTITY AS INTEGER>, 
  "size" => <DYNO SIZE>}]
})