Rails e Dropbox

Buongiorno a tutti.
In una applicazione rails che sto scrivendo devo interagire con le api
di
DropBox, perci mi sono scaricato la gemma dropbox-api e, dopo averla
configurata, ho aggiunto un semplice servizio che invia i file a
dropbox.
In locale funziona.

Su heroku no, mi da un errore di timeout sul metodo che esegue l’upload
del
file.
Ma la cosa curiosa che se mi collego alla console di heroku (heroku run
console) e invoco manualmente il servizio il tutto funziona
perfettamente.

Quindi mi viene il dubbio che su heroku queste cose non si possano fare?

Il codice interessato qui:
https://github.com/emadb/scrooge/blob/master/app/controllers/invoices_controller.rb

intorno alla 62 (che va scommentata)
Il servizio questo:

https://github.com/emadb/scrooge/blob/master/app/services/drop_box_service.rb
e va in timeout sulla riga 5.

Grazie a tutti.
Buona Pasqua.

come imposti le variabili:

DROPBOX_FOLDER

DROPBOX_TOKEN
DROPBOX_SECRET

? “heroku config” le menziona?

2013/3/29 Emanuele DelBono [email protected]

Sisi sono configurate come variabili di ambiente. E’ stato il mio primo
dubbio, ma ho provato a collegarmi alla console e tutto funzionava.
:slight_smile:

2013/3/29 maurizio de magnis [email protected]

Ciao Emanuele,

Che errore ti dà Heroku?
Conta che su Heroku una richiesta deve essere evasa tassativamente entro
30
secondi, altrimenti và in timeout.
Per svolgere operazioni in background devi usare i worker.

Ci dici qualcosa in più sulla tua configurazione di Heroku e Rails
(versioni ecc)?

Ciao,

Matteo

Il giorno 29 marzo 2013 22:07, Emanuele DelBono
[email protected]ha scritto:

Ciao Matteo.
Non sapevo del limite dei 30 seconda (mea culpa)…in effetti l’errore
potrebbe (e parrebbe essere quello):

2013-03-31T17:05:57+00:00 app[web.1]: Started GET “/invoices/15” for
79.17.94.83 at 2013-03-31 17:05:57 +0000
2013-03-31T17:06:27+00:00 heroku[router]: at=error code=H12
desc=“Request
timeout” method=GET path=/invoices/15
host=scrooge.codiceplastico.comfwd=“79.17.94.83” dyno=web.1
connect=14ms service=30001ms status=503 bytes=0
2013-03-31T17:06:28+00:00 app[web.1]: Timeout::Error (Timeout::Error):
2013-03-31T17:06:28+00:00 app[web.1]:
2013-03-31T17:06:28+00:00 app[web.1]: Processing by
InvoicesController#show
as HTML
2013-03-31T17:06:28+00:00 app[web.1]: Parameters: {“id”=>“15”}
2013-03-31T17:06:28+00:00 app[web.1]: Rendered invoices/show.html.haml
within layouts/pdf_invoice.html (0.2ms)
2013-03-31T17:06:28+00:00 app[web.1]:
2013-03-31T17:06:28+00:00 app[web.1]:
app/services/drop_box_service.rb:5:in upload' 2013-03-31T17:06:28+00:00 app[web.1]: ***************WICKED*************** 2013-03-31T17:06:28+00:00 app[web.1]: Rendered text template (0.0ms) 2013-03-31T17:06:28+00:00 app[web.1]: app/controllers/invoices_controller.rb:65:inshow’
2013-03-31T17:06:28+00:00 app[web.1]: Sent data /app/public/17 -
nsa/.pdf
(1.1ms)
2013-03-31T17:06:28+00:00 app[web.1]: Completed 500 Internal Server
Error
in 30889ms

Qui devo generare un pdf e inviarlo su dropbox.

La versione di rails è la 3.2.11 e heroku per ora è configurato nella
versione “free” con 1 solo dyno web.

Grazie per la dritta.
A presto

2013/3/31 Matteo C. [email protected]

Quindi secondo voi, se il problema è il timeout dei 30 sec, con un
Delayed
Job risolvo?

2013/3/31 Emanuele DelBono [email protected]

Risolvi con un delayed job.
Ti consiglio sidekiq http://mperham.github.com/sidekiq/ però.

Ciao,

Matteo

Il giorno 31 marzo 2013 22:19, Emanuele DelBono
[email protected]ha scritto:

Il giorno 01 aprile 2013 00:04, Matteo C.
[email protected]ha scritto:

Risolvi con un delayed job.
Ti consiglio sidekiq http://mperham.github.com/sidekiq/ per.

Ma funziona senza 1 worker dyno ?

Perch a quel punto forse per partire meglio qualche altra cloud
platform
(vedi https://www.appfog.com/, cloudfoundry, openshift, ecc…)

S.

  • 1 per Sidekiq, a patto che il tuo codice sia thread safe, gems
    incluse. Forse se non sei tanto pratico meglio usare Resque o
    DelayedJob.

Devi instanziare un processo in pi, quindi penso che tu esca del piano
free.

Il tuo Procfile diventa qualcosa del genere:

 web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
 worker: bundle exec sidekiq

Se gai un piano free puoi provare un api javascript eseguita lato client
https://github.com/dropbox/dropbox-js pero occhio che devi esporre la
api
key del dropbox c`e’ un probkema di sicurezza
Il giorno 01/apr/2013 00:22, “Fabrizio R.” [email protected] ha
scritto:

Il giorno 01 aprile 2013 00:29, francesco agati <
[email protected]> ha scritto:

Se gai un piano free puoi provare un api javascript eseguita lato client
https://github.com/dropbox/dropbox-js pero occhio che devi esporre la api
key del dropbox c`e’ un problema di sicurezza

Non so le esigenze di Emanuele sul progetto (anche lato economico)

Va bene anche background job lato server.
Heroku ottimo ma 35 $ al mese (se non sbaglio) per app con 1 web dyno +
1
worker dyno … :wink:

S.

Si possono caricare su 2 heroku free condividendo il db (es. redis). Su
uno metti il web, sull’altro metti il worker :slight_smile:

Ovvio, non é il massimo, ma se vuoi rimanere su heroku free e
giocherellare, funziona :stuck_out_tongue:

Sent from Mailbox for iPhone

On Mon, Apr 1, 2013 at 12:42 AM, Sergio B.
[email protected]

Il giorno 01 aprile 2013 00:52, Andrea P. [email protected] ha
scritto:

Si possono caricare su 2 heroku free condividendo il db (es. redis). Su
uno metti il web, sull’altro metti il worker :slight_smile:

Ovvio, non il massimo, ma se vuoi rimanere su heroku free e
giocherellare, funziona

Mmmhhh … non male come idea :slight_smile:

S.

p.s. qualcuno di voi usa altri paas per prime fasi - start dell’app ?
Quando ancora non si sa se app - progetto - impresa avr successo e le
richieste (carico) dell’app sono ancora basse.
Tipo appfog, dotcloud … in alternativa al solito vps - server dedicato

ecc…

Amazon, linode, rackspace, ovh non sono male.
Ma se non sbaglio richiedono un po’ di lavoro di amministrazione, non
sono
“comodi” come un paas.

Grazie a tutti per le dritte. Faccio un po’ di prove.
Per restare nel piano free di heroku e usare delayed_job si pu usare
questa gemma: https://github.com/lostboy/workless

L’ho provata in passato e funziona :slight_smile:

2013/4/1 Sergio B. [email protected]

Riapro il thread perche’ ho risolto e volevo condividere :slight_smile:
In realta’ il timeout e’ un side-effect del problema che era molto piu’
banale.
Su Heroku (come del resto su tutti i cloud) le app non dovrebbero
accedere
al filesystem anche se heroku esiste un ephemeral filesystem (
https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem). Io
scrivevo il file pdf su fs (nella cartella tmp) ma non riuscivo a
rilggerlo, infatti era quello che andava in timeout.

Quindi ho risolto rimuovendo la scrittura su filesystem e lavorando con
i
dati in memoria e tutto funziona.

grazie.
ema

2013/4/1 Emanuele DelBono [email protected]