2012-02-08 11 views
12

Voglio che la mia app Rails 3.1 riduca fino a 1 web dyno alle 8am, quindi fino a 0 web dynos alle 17:00.Heroku Cedar: Come scalare i dynos WEB in base all'ora del giorno

MA, non desidero registrarmi per un servizio a pagamento e non posso contare sul fatto che il mio computer di casa sia connesso a Internet.

Sembra che lo Scheduler di Heroku dovrebbe rendere questo banale. Qualche soluzione o link rapidi?

+0

Per chiarire/semplificare: da rubino, come si aggiunge 1 nuova web dyno alla tua app esistente? – dnszero

risposta

11

La risposta è 'sì' si può fare questo da scheduler ed è banale una volta che si conosce la risposta:

  1. Aggiungi un Heroku config var con il tuo nome app: config Heroku: aggiungere APP_NAME: bla
  2. Aggiungere gioiello 'Heroku' al vostro Gemfile
  3. al fine di verificare, manualmente scalare su/giù la vostra applicazione: ps Heroku: scala web = 2
  4. Aggiungi un compito rastrello per lib/task/scheduler.rake:

    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. Aggiungi l'addon Scheduler: addons Heroku: aggiungere scheduler: serie

  6. Utilizzare l'interfaccia di pianificazione Web per aggiungere "rake spin_up" in qualunque momento ti piace
  7. aggiungere un'attività rake spin_down e ne programmi la ogni volta.

Note: Fase 1 è necessario perché non riuscivo a trovare qualsiasi altro modo per essere certi del nome App (e io uso 'messa in scena' e ambienti di 'produzione' per le mie applicazioni

.

Il passaggio 3 è necessario perché altrimenti il ​​comando ruby ​​commette errori poiché richiede di accettare (via Sì/Nessuna risposta) che ti verranno addebitati i soldi come risultato di questa azione

Al punto 4, I couldn ' Troviamo tutti i documenti su come fare questo con una chiave API tramite la gemma di heroku, quindi sembra che sia richiesto l'utente/pass.

Spero che questo aiuti qualcun altro!

+0

restituisce l'errore "RestClient :: UnprocessableEntity: 422 Unprocessable Entity" – istan

+0

Hai saltato il passaggio 3? Altrimenti, non ho idea di cosa potrebbe causare (assumendo lo stesso stack e tutto). Ma potresti provare a salvare l'errore e vedere cosa dice. – dnszero

+0

Se stai ricevendo un 422 significa che non hai detto a heroku che cosa si intende fare il tuo processo di lavoro. Dai un'occhiata alla documentazione di heroku qui https://devcenter.heroku.com/articles/delayed-job Ti dirà di creare un Procfile che contenga la tua definizione di lavoratore. – joshuacronemeyer

0

Se si sta utilizzando lo stack di cedro, non sarà possibile ridimensionare a zero i dynos Web senza modificare il procfile e la distribuzione.

Inoltre, perché preoccuparsi se si ottiene un banco di prova gratuito al mese (750 ore di prova, un po 'più di un mese)?

3

È possibile adattare il processo di web a zero

heroku ps:scale web=0

o di nuovo a 1 via

heroku ps:scale web=1

si sarebbe poi avere un compito impostato per funzionare a 8 che lo scala e uno che corre a 17 che lo riduce. Heroku potrebbe richiedere che tu verifichi il tuo account (es. Inserisci i dati della carta di credito) per utilizzare lo Scheduler di Heroku più poi dovresti avere la gemma di Heroku all'interno della tua app e le tue credenziali Heroku, in modo che possa accendere o spegnere la tua app.

Ma come dice Neil - ricevi 750 ore al mese gratis che non possono essere trasferite nel mese successivo, quindi perché non lasciarlo sempre in esecuzione?

+1

Mio male, intendevo scalare da 1 banco a 2. Il mio obiettivo è quello di evitare il fastidioso tempo di rotazione di 20 secondi durante la giornata lavorativa (e di supportare Heroku pagandoli per questo, piuttosto che hackingare con Pingdom, ecc.). – dnszero

11

Solo implementato questo approccio (buona risposta sopra @dnszero), ho pensato di aggiornare la risposta con la nuova API di Heroku.

Aggiungi il tuo nome applicazione come una variabile di configurazione 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 

questo è con Heroku (2.31.2), Heroku-API (0.3.5)

0

O, se si desidera utilizzare un servizio invece di implementare il proprio, provare http://scaledynos.herokuapp.com/ - è scalabile in base all'ora del giorno

1

Quindi ho deciso di implementarlo nel 2017 e ho visto che la gemma di Heroku usata dalla risposta accettata è stata deprecata a favore della gemma "platform-api". Ho solo pensato di pubblicare ciò che ha funzionato per me, dal momento che non ho visto nessun altro post con una risposta più aggiornata.

Ecco il mio file di rake in grado di scalare i miei lanci di Internet per un conteggio di 2. Ho usato 'httparty' gemma di fare una richiesta di patch con intestazioni appropriate alle API della piattaforma, secondo il loro docs, nella sezione "Formazione" .

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 
0

come aggiornamento di @ risposta di Ren, di Heroku Platform API gem rende il tutto veramente facile.

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>}] 
}) 
Problemi correlati