Rails: semana de atualizações
Recentemente foram anunciados duas atualizações nos frameworks Rails. Para quem usava a versão 2.0.2 é recomendado passar a usar 2.0.4 e para quem já usava a 2.1.0 agora deve ir para 2.1.1.
A razão disso foram vulnerabilidades de segurança, especificamente para quem aceitava entrada de dados via XML. Isso foi prontamente corrigido e por isso as atualizações. Essas duas versões subiram hoje e até o fim do dia devem estar replicadas em todas as máquinas Linux compartilhada da Locaweb que suportam Rails.
Leia o resto do artigo para saber o que fazer. Além disso há mais novidades: Locarails versão 1.1.5. Continue lendo.
Atualizando o Rails
Se você é desenvolvedor Rails atualize na sua máquina também. Se estiver fazendo projetos com a versão 2.0.2 faça:
gem install rails –version=2.0.4
E se estiver fazendo projetos em Rails 2.1, faça:
gem install rails –version=2.1.1
No arquivo config/environment.rb do seu projeto em Rails 2.0.2, altere a seguinte linha:
RAILS_GEM_VERSION = ‘2.0.4′
E no mesmo arquivo, para projetos Rails 2.1, altere a mesma linha para:
RAILS_GEM_VERSION = ‘2.1.1′
Caso esteja com o Rails ‘congelado’ (freeze) dentro do diretório vendor/rails do seu projeto, atualize-o com:
rake rails:freeze:gems
Locarails
Finalmente, atualize seu projeto na Locaweb. E, neste ponto, outra atualização: o Locarails ganha versão 1.1.5.
Quando eu criei o Locarails o objetivo foi ajudar os desenvolvedores, principalmente os iniciantes, a utilizar o poder do pacote Capistrano, uma poderosa ferramenta de deployment automatizado. O Locarails deve ser instalado na sua máquina local de desenvolvimento, ele configurará a receita config/deploy.rb que o Capistrano usa, tudo de forma simples e sem codificação envolvida.
Porém, a versão inicial do Locarails funcionava perfeitamente com o Capistrano 2.4.3. Mas alguns dias atrás foi lançada a versão 2.5.0. Isso quebrou a compatibilidade e o Locarails passou a não se comportar corretamente. Eu mesmo já fiz as correções no Capistrano e enviei para apreciação do mantenedor do projeto, mas enquanto não é lançada a versão 2.5.1, resolvi atualizar o próprio Locarails para injetar as correções automaticamente.
Para atualizar ou instalar o Locarails na sua máquina local, faça:
gem install akitaonrails-locarails.
Recomendo refazer o processo inicial, então, a partir do diretório do seu projeto, faça:
cd meu_projeto
locarails . -f
A diretiva -f forçará a atualização da receita do Capistrano com a nova correção. Preencha os dados sobre sua hospedagem que ele pede. Depois, rode apenas uma vez:
cap deploy:setup
Finalmente, para colocar de fato sua aplicação em produção na hospedagem, faça:
cap deploy.
Toda vez que você modificar sua aplicação, apenas faça ‘cap deploy’. O Capistrano auxilia em outros cenários também. Digamos que você subiu na sua conta uma versão com bugs e quer rapidamente voltar seu site para a versão imediatamente anterior. Para isso, sem mexer no seu código ainda, faça apenas:
cap deploy:rollback
E instantaneamente seu site voltará ao ar sem os bugs. Você agora pode corrigí-los na sua máquina local e quando estiver realmente pronto, faça novamente ‘cap deploy’.
Brindes Locarails
Mais do que isso, as receitas do Capistrano permitem muito mais e no Locarails eu embuti algumas receitas que podem ajudá-lo. Por exemplo, digamos que você queira um backup do seu banco de dados MySQL. Para isso faça:
cap db:backup
Ele fará um dump da sua base, compactará utilizando tar e gzip e automaticamente já fará o download para sua máquina local no arquivo com o nome ‘dump.tar.gz’. O tempo do download, claro, dependerá do tamanho da sua base de dados e da velocidade de sua conexão.
Agora, digamos que alguma coisa errada aconteceu à sua base e você quer restaurar os dados que tinha puxado anteriormente. Garanta que existe o backup chamado ‘dump.tar.gz’ no diretório do seu projeto e então faça:
cap db:restore
Ele fará o upload do arquivo ‘dump.tar.gz’ à sua hospedagem e já fará a restauração do banco automaticamente. Cuidado: esta é uma operação destrutiva e ele obviamente apagará os dados do seu banco e colocará seu backup por cima. Tenha certeza do que está fazendo antes de usar este comando.
Finalmente, digamos que você note algum comportamento estranho na sua aplicação Rails e quer rapidamente ver o log para checar. Para isso use o comando:
cap log:tail
Ele fará um ‘tail’ remoto no arquivo ‘production.log’ da sua aplicação Rails. O tail, para quem não conhece, é um comando que ‘observa’ alterações num arquivo texto e já mostra imediatamente na sua tela. Portanto, se usar esse comando ele ficará lendo tudo que aparecer no arquivo de log. Vá no seu browser e faça sua aplicação dar problema e verá essa entrada aparecendo no seu log imediatamente. Cuidado: essa operação consome a banda da sua hospedagem e é recomendada apenas quando for muito necessário. Não deixe ela ligada indefinidamente.
Para usuários avançados, que conhecem os conceitos de SSH, sabe que as hospedagens Locaweb sempre suportaram conexão via SSH. Em especial, se estiver num Linux ou num Mac, você pode gerar um par de chaves - privada e pública - usando o comando “ssh-keygen -t rsa”. Normalmente isso irá gerar o par de chaves ‘~/.ssh/id_rsa’ e ‘~/.ssh/id_rsa.pub’.
Quando você se conecta via SSH ele sempre pede a senha da sua conta. Para não pedir mais senha, você pode adicionar sua chave pública no arquivo ~/.ssh/authorized_keys em sua hospedagem. Para fazer isso automaticamente use o Capistrano novamente. Com as chaves já geradas e seguindo exatamente os nomes descritos acima, use o comando:
cap ssh:upload_key
E pronto, ele fará o upload da sua chave pública e, com isso, não será mais necessário digitar sua senha para entrar na hospedagem. Cuidado: Isso funciona porque o SSH fará a autenticação baseada na chave privada (id_rsa) que somente você tem. A segurança da chave privada é responsabilidade do seu dono e ela nunca deve ser enviada a ninguém nem a outra máquina. Considere sua chave privada algo tão ou mais importante que seu cartão de crédito, que você não mostra nem empresta a ninguém.
Locarails para outros projetos
E quem disse que o Capistrano serve somente para projetos Rails? Se se eu quiser utilizar o Locarails para projetos não Rails, como em PHP por exemplo?
Digamos que você quer controlar seu blog em Wordpress usando Capistrano. Pois bem, crie um diretorio para isso:
mkdir wordpress
Agora, dentro dele, crie um diretorio chamado ‘public’
cd wordpress
mkdir config
mkdir public
Agora descompacte os fontes do wordpress - da maneira que melhor convir, seja simplesmente descomprimir um tar gzip ou fazer algo como svn checkout - na pasta public! Este é o truque!
Agora rode o comando locarails conforme explicado acima:
locarails .
cap deploy:setup
cap deploy
Realmente, eu não fiz esse teste ainda
Mas tecnicamente não há motivos para não funcionar porque a função do Capistrano é simplesmente pegar todos os fontes do seu projeto enviá-los ao servidor, independente da linguagem. No caso, a configuração padrão pensará que é um projeto Rails e inclusive criará o arquivo tmp/restart.txt no servidor imaginando que precisa reiniciar o Phusion Passenger. Mas tudo isso será inócuo à sua aplicação Wordpress e de graça você ganha as funcionalidades de rollback, que um dia pode ser fundamental.
Locarails + Git
E não é só isso. Ainda é uma funcionalidade experimental mas o Locarails já suporta configuração para Git. Além do mais todas as contas Linux da Locaweb automaticamente já suportam Git!
O exemplo mais simples é o seguinte:
rails teste
cd teste
git add .
git commit -a -m “initial commit”
locarails . -m git
cap deploy:setup
cap deploy
Os comandos acima criam um novo projeto Rails, então, de dentro do projeto executa-se o comando locarails com a opção para git. Ele fará algumas perguntas - basta dar enter quando a pergunta oferecer uma resposta padrão - e automaticamente criará um repositório Git remoto no seu servidor e já enviará seu código para lá.
A partir daí, toda vez que modificar seu projeto faça o seguinte:
git commit -a -m “minhas modificacoes”
git push
cap deploy
Isso faz commit das suas modificações no repositório Git local. O ‘git push’ envia apenas as alterações para o repositório remoto no servidor. E o ‘cap deploy’ atualiza apenas o que foi modificado desde o último deployment, aumentando consideravelmente a velocidade das suas atualizações.
Git é um assunto mais avançado que merece um artigo à parte. Aguardem mais novidades sobre isso! E aproveitem para testar o Locarails. Qualquer dúvida em relação a esta ferramenta, enviem e-mail diretamente para mim em fabio.akita@locaweb.com.br.
14 de novembro de 2008 às 0:31
Olá, estou num Mac e estou recebendo o seguinte erro ao rodar o cap deploy:
/Library/Ruby/Gems/1.8/gems/akitaonrails-locarails-1.1.6/lib/locarails/fix.rb:2:Warning: Gem::SourceIndex#search support for String patterns is deprecated
Loading temporary fixes for Capistrano 2.5.x
* executing `deploy’
* executing `deploy:update’
** transaction: start
* executing `deploy:update_code’
* getting (via checkout) revision to /tmp/20081114032914
executing locally: cp -R /Users/Gabriel/Aptana Studio/doce /tmp/20081114032914
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-pvX] source_file target_file
cp [-R [-H | -L | -P]] [-fi | -n] [-pvX] source_file … target_directory
* processing exclusions…
*** [deploy:update_code] rolling back
* executing “rm -rf /home/w2reinos/rails_app/doce/releases/20081114032914; true”
servers: ["doce.megafono.com.br"]
Password:
[doce.megafono.com.br] executing command
command finished
/Library/Ruby/Gems/1.8/gems/akitaonrails-locarails-1.1.6/lib/locarails/copy.rb:47:in `initialize’: No such file or directory - /tmp/20081114032914/REVISION (Errno::ENOENT)
from /Library/Ruby/Gems/1.8/gems/akitaonrails-locarails-1.1.6/lib/locarails/copy.rb:47:in `open’
from /Library/Ruby/Gems/1.8/gems/akitaonrails-locarails-1.1.6/lib/locarails/copy.rb:47:in `deploy!’
from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/recipes/deploy.rb:204:in `load’
from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/configuration/execution.rb:128:in `instance_eval’
from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/configuration/execution.rb:128:in `invoke_task_directly_without_callbacks’
from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/configuration/callbacks.rb:27:in `invoke_task_directly’
from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/configuration/execution.rb:81:in `execute_task’
from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/configuration/namespaces.rb:186:in `send’
… 25 levels…
from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/cli/execute.rb:14:in `execute’
from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/bin/cap:4
from /usr/bin/cap:19:in `load’
from /usr/bin/cap:19
Se puder me ajudar eu gostaria muito que isso funcionasse!
14 de novembro de 2008 às 17:08
@Gabriel, procure nunca usar diretórios de programação com espaço no nome. Veja “Aptana Studio”. Acredito que se você renomear esse diretório para ficar sem o espaço no meio deve funcionar. Vou ver se faço um fix pra isso na gem, mas por enquanto esse é o jeito mais curto.
20 de novembro de 2008 às 8:18
Como posso atualizar as gems do meu servidor , preciso utilizar gem brazilian-rails para a versão 2.0.10 , me falaram de colocar na vendor funciona imediatamente
20 de novembro de 2008 às 18:21
@Marcos, veja este link http://ryandaigle.com/articles/2008/4/1/what-s-new-in-edge-rails-gem-dependencies
26 de novembro de 2008 às 0:09
@Akita
Desculpe postar aqui de novo, mas agora o erro é na migração:
* executing `deploy’
* executing `deploy:update’
** transaction: start
* executing `deploy:update_code’
* getting (via checkout) revision to /var/folders/1B/1B42ch1WH088TP33orawpk+++TI/-Tmp-/20081126030602
executing locally: cp -R /Users/Gabriel/FG2R/docedever /var/folders/1B/1B42ch1WH088TP33orawpk+++TI/-Tmp-/20081126030602
* processing exclusions…
compressing /var/folders/1B/1B42ch1WH088TP33orawpk+++TI/-Tmp-/20081126030602 to /var/folders/1B/1B42ch1WH088TP33orawpk+++TI/-Tmp-/20081126030602.tar.gz
executing locally: tar czf 20081126030602.tar.gz 20081126030602
servers: ["docedever.tempsite.ws"]
** sftp upload /var/folders/1B/1B42ch1WH088TP33orawpk+++TI/-Tmp-/20081126030602.tar.gz -> /tmp/20081126030602.tar.gz
[docedever.tempsite.ws] /tmp/20081126030602.tar.gz
[docedever.tempsite.ws] done
* sftp upload complete
* executing “cd /home/docedever/rails_app/docedever/releases && tar xzf /tmp/20081126030602.tar.gz && rm /tmp/20081126030602.tar.gz”
servers: ["docedever.tempsite.ws"]
[docedever.tempsite.ws] executing command
command finished
* executing `deploy:finalize_update’
* executing “chmod -R g+w /home/docedever/rails_app/docedever/releases/20081126030602″
servers: ["docedever.tempsite.ws"]
[docedever.tempsite.ws] executing command
command finished
* executing “rm -rf /home/docedever/rails_app/docedever/releases/20081126030602/log /home/docedever/rails_app/docedever/releases/20081126030602/public/system /home/docedever/rails_app/docedever/releases/20081126030602/tmp/pids &&\n mkdir -p /home/docedever/rails_app/docedever/releases/20081126030602/public &&\n mkdir -p /home/docedever/rails_app/docedever/releases/20081126030602/tmp &&\n ln -s /home/docedever/rails_app/docedever/shared/log /home/docedever/rails_app/docedever/releases/20081126030602/log &&\n ln -s /home/docedever/rails_app/docedever/shared/system /home/docedever/rails_app/docedever/releases/20081126030602/public/system &&\n ln -s /home/docedever/rails_app/docedever/shared/pids /home/docedever/rails_app/docedever/releases/20081126030602/tmp/pids”
servers: ["docedever.tempsite.ws"]
[docedever.tempsite.ws] executing command
command finished
* executing “find /home/docedever/rails_app/docedever/releases/20081126030602/public/images /home/docedever/rails_app/docedever/releases/20081126030602/public/stylesheets /home/docedever/rails_app/docedever/releases/20081126030602/public/javascripts -exec touch -t 200811260306.32 {} ‘;’; true”
servers: ["docedever.tempsite.ws"]
[docedever.tempsite.ws] executing command
command finished
* executing `deploy:symlink’
* executing `before_symlink’
* executing “test -d /home/docedever/rails_app/docedever/releases/20081126030602/tmp || mkdir -m 755 /home/docedever/rails_app/docedever/releases/20081126030602/tmp”
servers: ["docedever.tempsite.ws"]
[docedever.tempsite.ws] executing command
command finished
* executing “test -d /home/docedever/rails_app/docedever/releases/20081126030602/db || mkdir -m 755 /home/docedever/rails_app/docedever/releases/20081126030602/db”
servers: ["docedever.tempsite.ws"]
[docedever.tempsite.ws] executing command
command finished
* executing “cp /home/docedever/rails_app/docedever/etc/database.yml /home/docedever/rails_app/docedever/releases/20081126030602/config/database.yml”
servers: ["docedever.tempsite.ws"]
[docedever.tempsite.ws] executing command
command finished
* executing “cd /home/docedever/rails_app/docedever/releases/20081126030602 && rake db:migrate RAILS_ENV=production”
servers: ["docedever.tempsite.ws"]
[docedever.tempsite.ws] executing command
*** [err :: docedever.tempsite.ws] rake aborted!
*** [err :: docedever.tempsite.ws]
*** [err :: docedever.tempsite.ws] Unknown MySQL server host ‘200.234.202.120.locaweb.com.br’ (1)
*** [err :: docedever.tempsite.ws]
*** [err :: docedever.tempsite.ws]
*** [err :: docedever.tempsite.ws] (See full trace by running task with –trace)
*** [err :: docedever.tempsite.ws]
** [out :: docedever.tempsite.ws] (in /home/docedever/rails_app/docedever/releases/20081126030602)
command finished
*** [before_symlink] rolling back
*** [deploy:update_code] rolling back
* executing “rm -rf /home/docedever/rails_app/docedever/releases/20081126030602; true”
servers: ["docedever.tempsite.ws"]
[docedever.tempsite.ws] executing command
command finished
command “cd /home/docedever/rails_app/docedever/releases/20081126030602 && rake db:migrate RAILS_ENV=production” failed on docedever.tempsite.ws
26 de novembro de 2008 às 10:39
@Gabriel O erro é este ” Unknown MySQL server host ‘200.234.202.120.locaweb.com.br’”
Provavelmente seu servidor de MySQL ainda não tinha sido criado. Tente se logar diretamente pelo mysql client assim:
mysql -u [seu usuario] -p -d [seu banco de dados] -h [seu servidor mysql]
26 de novembro de 2008 às 17:46
@Akita
Infelizmente ele ta criado sim, tanto que no meu Mac eu uso ele. esse formato (IP+locaweb.com.br) está correto? Eu tentei em outro computador e formatar meu Mac mas os dois não deram certo…
26 de novembro de 2008 às 21:10
aha! Claro que não
é só o Ip