PDA

Visualizza la versione completa : Deployment di un progetto rails 2.1


Sirion
07-09-2008, 22:24
Salve

devo far funzionare un progetto rails (versione 2.1 installato su gems 1.1.1) su un server apache con cgi ( o forse sarebbe meglio fastCGI)

il progetto l'ho sviluppato prima tutto in locale, non pensando che sarebbe stato così ostico deployarlo, altrimenti sarei andato per passi incrementali.

Sul server ci sono installate le gems 1.0.1 con rails versione 2.0.1, tuttavia mi è stato detto che con un task di rake è possibile salvare la versione di rails nell'applicazione. Domani tento di scoprire come.

Qualcuno può darmi qualche consiglio per rendere il tutto funzionante? onestamente non ho mai avuto l'occasione di cimentarmi in questo genere di attività, quindi avrei bisogno di alcune dritte.

Per ora sabato ho semplicemente loggato tramite ssh alla mia home sul server e copiato la mia cartella locale del progetto, fondamentalmente sperimentando, ma sempre scontrandomi col prolema della versione (neppure un 'rake --tasks' va) che però conto di risolvere appena scopro il task di rake adeguato.
Ho anche provato a commentare la riga in config/environment.rb che definisce la versione bypassando il controllo ma dà cmq errore su una successiva istruzione (che imposta il formato dei timestamp in utc) la quale effettivamente nella precedente versione di rails era diversa (in pratica il nuovo metodo non esiste)

grazie per qualsiasi consiglio :)

weppos
09-09-2008, 14:48
Innanzi tutto il primo passo che ti consiglio è di uniformare quanto possibile il tuo ambiente locale a quello di production.
Se in locale hai 2.1 aggiorna anche production o fai il downgrade della versione in locale.

Per scoprire i comandi di rake disponibili digita


rake -T

Sirion
09-09-2008, 15:32
dunque il server non è mio ma dell'università, non ho una macchina virtuale a disposizione ma solo un utente con una home.

fondamentalmente per ora ho usato rake rails:freeze:gems sul progetto in locale, l'ho copiato sul server nella mia home.. poi ho creato un link simbolico alla cartella public.

I contenuti statici funzionano, la index di default di rails la visualizza (anche se dà errore nel link per testare l'environment).

Su mysql ho solo un database e nessun privilegio per crearne di nuovi. Ergo ho editato con le info di accesso e la socket giusta il file databases.yml nella voce production. Di seguito via console ho settato manualmente la variabile di ambiente RAILS_ENV a 'producion' e ho dato rake db:migrate, che ha avuto successo creando le tabelle giuste e i contenuti esatti.

Da qui devo far funzionare i contenuti dinamici.

Ho cambiato i permessi in log/ e tml/ a 0666 e quelli nella cartella app/ in 0755.
Ho recuperato un sample di .htaccess e definito RewriteBase con l'indirizzo sul server della mia home scrivendo

RewriteBase /~home/

assicurandomi l'esistenza della riga

RewriteRule ^(.*)$ dispatch.cgi [QSA,L]

per usare cgi, non avendo installato sul server nè mod_ruby nè (mi pare) fastCGI.
Ho poi editato la prima riga di dispatch.cgi con il path dato da `which ruby`.

Spero di non aver dimenticato nulla.

Risultato di tutto questo: quanto tento di accedere alla index 'server.it/~home' visualizza giusto il cntenuto statico (tranne la tendina dell'environment). Se tento di accedere ad un controller 'server.it/~home/controller' mi trovo un redirect loop che riempie di entry il log rails (non error_log di apache) di entry

Processing NovelController#index (for <<ip>> at 2008-09-09 17:10:58) [GET]
Session ID: BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2 g6OkZsYXNo
SGFzaHsABjoKQHVzZWR7AA==--749f8872bdd6166cabbd2bcb169c6de949eef913
Parameters: {"action"=>"index", "controller"=>"controller"}
WARNING: You're using the Ruby-based MySQL library that ships with Rails. This library is not suited for production. Please install the C-based MySQL library instead (gem install mysql).
Redirected to server.it/~home/controller
Completed in 0.02467 (40 reqs/sec) | DB: 0.00566 (22%) | 302 Found [server.it/~home/controller]

(ho editato gli indirizzi ip e url)
Il warning non credo sia pertinente col problema che ho adesso e cmq suppongo possa essere ignorato visto che se fosse un problema di db si manifesterebbe in maniera diversa.
altro risultato collaterale è un gran mal di testa

weppos
09-09-2008, 15:46
dunque il server non è mio ma dell'università, non ho una macchina virtuale a disposizione ma solo un utente con una home.

Puoi tranquillamente creare un repository GEM all'interno di una qualsiasi cartella, anche solo della tua home directory.

Per quanto riguarda il deploy, premesso che usando Capistrano fai in 1 minuto quello che altrimenti faresti in ore, procedi così.

1. Fai un checkout dell'intera cartella dal repository in una cartella della homedir.
Se usi svn

svn checkout svn://path/repos/apps homedir/~user/apps

2. Entra in apps ed assicurati di avere i file dispatch.cgi ed il seguente .htacess



AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI

# If you don't want Rails to look in certain directories,
# use the following rewrite rules so that Apache won't rewrite certain requests
#
# Example:
# RewriteCond %{REQUEST_URI} ^/notrails.*
# RewriteRule .* - [L]

# Redirect all requests not available on the filesystem to Rails
# By default the cgi dispatcher is used which is very slow
#
# For better performance replace the dispatcher with the fastcgi one
#
# Example:
# RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
RewriteEngine On

# If your Rails application is accessed via an Alias directive,
# then you MUST also set the RewriteBase in this htaccess file.
#
# Example:
# Alias /myrailsapp /path/to/myrailsapp/public
# RewriteBase /myrailsapp

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]

# In case Rails experiences terminal errors
# Instead of displaying this message you can supply a file here which will be rendered instead
#
# Example:
# ErrorDocument 500 /500.html

ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"


3. Controlla il file di configurazione del database.

4. I permessi di tmp, log devono essere writable per l'utente web. Nel tuo caso non lo erano.
Verifica chi è l'utente web e setta i permessi appropriati. Di norma cgi non viene eseguito dallo stesso utente unix per cui ti tocca dare i permessi di scrittura oltre che a owner, anche a group (se il tuo account è nello steso gruppo di chi esegue cgi, in genere www-data) o addirittura 777 se il tuo utente e quello che esegue l'app non condividono nulla.

5. Avvia l'applicazione da http://il/persorco/pubblico/homedir/~user/apps/public

Ricordati che in teoria solo /public dovrebbe essere mappata all'esterno.
Quindi se hai la possibilità di configurare un vhost punta la directory pubblica a public, altrimenti devi inibire l'accesso pubblico a tutte le altre cartelle o chiunque potrà vedere i tuoi file di configurazione.

Inoltre, ricordati che di default l'environment caricato è development se non specifichi una diversa impostazione.
Su fastcgi e cgi, l'unico modo di cambiare impostazione è agire su una variabile d'ambiente o impostare l'environment in config/environment.rb.

Infine, se hai problemi ad eseguire spostati nella root dell'applciazione e lancia il comando

ruby public/dispatch.cgi

Ora hai l'errore a video.

Sirion
09-09-2008, 16:46
Il problema però è che se cerco di visualizzare l'index di un controller mi dà un redirection loop.
Provato sia con apache che con webrick e il problema è lo stesso, una serie di risposte http di redirezioni.

[09/Sep/2008:18:28:23 CEST] "GET /controller HTTP/1.1" 302 109
- -> /controller

Lo stesso codice sulla mia macchina però funziona perfettamente.

weppos
09-09-2008, 17:07
Hai messo l'htaccess che ti ho postato io?
Cosa c'è scritto nel log di Rails?
Come hai configurato il file di routing?

Sirion
09-09-2008, 17:38
il mio .htaccess lo avevo esattamente identico al file postato qui sopra.
Non ho ancora configurato il file route.rb
Il log di rails a riguardo è candido, tranne un paio di warning
"warning: don't put space before argument parentheses" dovuti ad altre action, non l'index.

Ho però scoperto una cosa interessante. Se salto direttamente ad altre pagine come il controller/action login/login, tutto funziona. Mi spiego: è un sito che tratta di romanzi, dove si puo recensirli, commentarli, taggarli, ecc. Ho inserito un romanzo, l'ho modificato, taggato, commentato. l'unica cosa che non va è la pagina iniziale dove mostro gli ultimi 6 romanzi segnalati.

weppos
09-09-2008, 18:48
Ma se non hai configurato le route, come puoi pensare che funzionino? :bhò:

Sirion
09-09-2008, 18:54
:(
ammetto di non essere esperto, però con le semplici route di default in route.rb dovrebbe tranquillamente mappare l'index di un controller.

ho comunque aggiunto prima la route

map.connect "novel/", :controller => 'novel', :action => 'index'

senza successo. Il resto del sito (e anche le alter index) le visualizza correttamente.
Mi sfugge certamente qualcosa. :confused:

weppos
09-09-2008, 19:57
Ma in locale con webrick funziona?

Loading