2012-02-08 13 views
12

Quiero que mi aplicación Rails 3.1 escale hasta 1 dyno web a las 8 a.m. y luego a 0 dynos a las 5 p.m.Cedro Heroku: Cómo escalar dinas WEB según la hora del día

PERO, no quiero registrarme para un servicio pago, y no puedo contar con que mi computadora doméstica esté conectada a internet.

Parece que el programador Heroku debería hacer esto trivial. Cualquier solución rápida o enlaces?

+0

Para aclarar/simplificar: de ruby, ¿cómo agregas 1 nuevo dyno web a tu aplicación existente? – dnszero

Respuesta

11

La respuesta es 'sí' que puede hacer esto desde el planificador y es trivial, una vez que se conoce la respuesta:

  1. Añadir un heroku config var con su nombre de la aplicación: config heroku: añadir APP_NAME: bla
  2. Añadir joya 'heroku' a tu Gemfile
  3. con el fin de verificar, de forma manual escalar hacia arriba/abajo de su aplicación: ps heroku: escala web = 2
  4. Añadir una tarea rastrillo para lib/tareas/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. Añadir el complemento Programador: complementos heroku: añadir planificador: estándar

  6. Uso de la interfaz Programador Web para agregar "spin_up rastrillo" en cualquier momento que desee
  7. añadir una tarea rake spin_down y programarlo para cuando.

Notas: Paso 1 es necesaria porque no podía encontrar ninguna otra manera de estar seguro del nombre de la aplicación (y uso 'puesta en escena' y entornos de 'producción' para mis aplicaciones

.

Se requiere el paso 3 porque, de lo contrario, el comando ruby ​​se cancela ya que requiere que primero acepte (mediante una respuesta Sí/No) que se le cobrará dinero como resultado de esta acción.

En el paso 4, no pude t encuentra cualquier documento sobre cómo hacer esto con una clave API a través de la gema heroku, por lo que parece que se requiere user/pass.

Espero que esto ayude a alguien más!

+0

esto devuelve el error "RestClient :: UnprocessableEntity: 422 Entidad no procesable" – istan

+0

¿Se salteó el paso 3? De lo contrario, no tengo idea de lo que podría causar eso (suponiendo que la misma pila y todo). Pero podrías intentar rescatar el error y ver qué dice. – dnszero

+0

Si obtiene un 422 significa que no le ha contado a heroku qué debe hacer su proceso de trabajo. Eche un vistazo a la documentación de heroku aquí https://devcenter.heroku.com/articles/delayed-job Le dirá que cree un archivo de proceso que contenga la definición de su trabajador. – joshuacronemeyer

0

Si está ejecutando en la pila de cedro, no podrá escalar a cero dindes web sin cambiar el archivo de proc y el despliegue.

Además, ¿por qué molestarse si obtienes un dyno gratis al mes (750 horas dyno, un poco más de un mes de hecho)?

3

Puede ajustar la escala del proceso de banda a cero por

heroku ps:scale web=0

o de nuevo a través de 1

heroku ps:scale web=1

que le continuación, tiene que haber una tarea configurado para ejecutarse a las 8 eso lo escala y uno que corre a los 17 que lo escala hacia abajo. Heroku puede solicitarle que verifique su cuenta (es decir, ingrese los detalles de la tarjeta de crédito) para usar el Programador Heroku más, entonces deberá tener la gema Heroku dentro de su aplicación y sus credenciales Heroku para que pueda activar o desactivar su aplicación.

Pero, como dice Neil, obtienes 750 horas al mes gratis que no pueden renovarse en el próximo mes así que ¿por qué no simplemente dejarlo funcionando todo el tiempo?

+1

Malo, quise escalar de 1 dyno a 2. Mi objetivo es evitar el molesto tiempo de aceleración de 20 segundos durante la jornada laboral (y apoyar a Heroku pagándoles por ello, en lugar de piratear con Pingdom, etc.). – dnszero

11

Acabo de implementar este enfoque (buena respuesta arriba @dnszero), pensé que actualizaría la respuesta con la nueva API de Heroku.

Añadir su nombre de la aplicación como una variable de configuración 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 

esto es con heroku (2.31.2), heroku-api (0.3.5)

1

Así que decidí implementar esto en 2017 y vi que la gema Heroku utilizada por la respuesta aceptada ha quedado en desuso en favor de la gema 'plataforma-api'. Solo pensé en publicar lo que funcionó para mí, ya que no he visto ninguna otra publicación con una respuesta más actualizada.

Aquí está mi archivo de rake que escala mis dindes web a un conteo de 2. Utilicé la gema 'httparty' para hacer una solicitud PATCH con los encabezados apropiados para Platform API, según su docs, en la sección "Formación" .

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

como una actualización de la respuesta de @ Ren, de Heroku Platform API gem lo hace muy fácil.

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>}] 
}) 
Cuestiones relacionadas