Introdução
Se você ainda não está cansado de repetir as mesmas tarefas mundanas para atualizar seus servidores de aplicativos e colocar seu projeto online, provavelmente ficará eventualmente. A alegria que você sente ao desenvolver seu projeto tende a diminuir quando se trata das partes chatas da administração do sistema (por exemplo, fazer upload da sua base de código, alterar configurações, executar comandos repetidamente, etc.)
Mas não tema! Capistrano, a ferramenta de automação de tarefas, está aqui para ajudar.
Neste artigo da DigitalOcean, vamos criar uma configuração de servidor sólida como uma rocha, executando a versão mais recente do CentOS para hospedar aplicativos Ruby-on-Rails usando Nginx e Passenger. Continuaremos aprendendo como automatizar o processo de implantação – e atualizações – usando a ferramenta de automação baseada em Ruby, Capistrano.
Nota: Este artigo baseia-se no conhecimento do nosso artigo anterior sobre Capistrano: Automatização de Implantações com Capistrano: Primeiros Passos. Para obter um bom conhecimento da ferramenta, o que é altamente recomendado se você pretende usá-la, é aconselhável ler antes de continuar com este texto. Da mesma forma, se você gostaria de aprender mais sobre como preparar uma gota fresca para implantações de aplicativos baseados em Rails com Passenger (e Nginx), confira o artigo Como Implantar Aplicativos Rails Usando Passenger Com Nginx.
Nota: O Capistrano depende do Git para implantações. Para saber mais, considere ler os artigos da comunidade da DigitalOcean sobre o assunto clicando aqui.
Glossário
1. Preparando o Servidor de Implantação
- Atualizando e Preparando o Sistema Operacional
- Configurando o Ambiente Ruby e Rails
- Baixando e Instalando Servidores de Aplicativos e HTTP.
- Criando o Script de Gerenciamento do Nginx
- Configurando o Nginx para Implantação de Aplicativos
- Baixando e Instalando o Capistrano
- Criando um Usuário do Sistema para Implantação
2. Preparando Aplicações Rails para Implantação baseada em Git com o Capistrano
- Criando uma Aplicação Básica Ruby-On-Rails
- Criando um Repositório Git
3. Trabalhando com o Capistrano para Automatizar Implantações
- Instalando o Capistrano dentro do Diretório do Projeto
- Trabalhando com
config/deploy.rb
dentro do Diretório do Projeto - Trabalhando com
config/deploy/production.rb
dentro do Diretório do Projeto - Implantando no Servidor de Produção
Preparando o Servidor de Implantação
Nota: Para ter uma melhor compreensão da seção abaixo, que pode ser considerada um resumo detalhado, confira o artigo completo sobre o assunto: Como implantar aplicativos Rails usando o Passenger com Nginx.
Atualizando e preparando o sistema operacional
Execute o seguinte comando para atualizar as ferramentas padrão do seu droplet baseado em CentOS:
yum -y update
Instale o conjunto contendo as ferramentas de desenvolvimento executando o seguinte comando:
yum groupinstall -y 'development tools'
Alguns dos pacotes que precisamos para este tutorial (por exemplo, libyaml-devel, nginx etc.) não são encontrados no repositório oficial do CentOS.
Execute o seguinte para adicionar o repositório EPEL:
sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'
yum -y update
Finalmente, para instalar algumas bibliotecas e ferramentas adicionais, execute o seguinte comando:
yum install -y curl-devel nano sqlite-devel libyaml-devel
Configurando o ambiente Ruby e Rails
Nota: Esta seção é um resumo do nosso artigo dedicado Como instalar o Ruby 2.1.0 no CentOS 6.5.
Execute os seguintes dois comandos para instalar o RVM e criar um ambiente de sistema para o Ruby:
curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm reload
rvm install 2.1.0
Já que o Rails precisa de um interpretador JavaScript, também precisaremos configurar o Node.js.
Execute o seguinte para baixar e instalar o nodejs usando yum
:
yum install -y nodejs
Execute o seguinte comando usando o gem
do Ruby para baixar e instalar o rails
:
gem install bundler rails
Baixando e instalando Servidores de Aplicativos e HTTP
Nota: Se seu VPS tiver menos de 1 GB de RAM, será necessário realizar o procedimento abaixo para preparar um espaço de SWAP de disco de 1024 MB para ser usado como um recipiente temporário de dados (substituto de RAM). Como os servidores DigitalOcean vêm com discos SSD rápidos, isso realmente não constitui um problema ao realizar as tarefas de instalação de aplicativos do servidor.
# Criar um espaço de SWAP de 1024 MB
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap
Phusion Passenger
O gerenciador de pacotes padrão do Red Hat Linux, RPM (RPM Package Manager), fornece aplicativos contidos em arquivos .rpm
. Infelizmente, no caso do Passenger, eles estão bastante desatualizados. Portanto, estaremos utilizando o RubyGem, mais uma vez, para baixar e instalar a versão mais recente disponível do Passenger – versão 4.
Utilize o seguinte comando para simplesmente baixar e instalar o Passenger:
gem install passenger
Nginx
Nota: Normalmente, para baixar e instalar o Nginx, você poderia adicionar o repositório EPEL (como já fizemos) e obter o Nginx via yum
. No entanto, para fazer o Nginx funcionar com o Passenger, seu código fonte deve ser compilado com os módulos necessários.
Execute o seguinte para começar a compilar o Nginx com o módulo nativo do Passenger:
passenger-install-nginx-module
Ao executar o comando, pressione Enter e confirme sua escolha de linguagem(s) (ou seja, Ruby, no nosso caso). Você pode usar as teclas de seta e a barra de espaço para selecionar somente Ruby, se desejar.
Use <space> to select.
If the menu doesn't display correctly, ensure that your terminal supports UTF-8.
‣ ⬢ Ruby
⬢ Python
⬢ Node.js
⬡ Meteor
No próximo passo, escolha Item 1
:
1. Yes: download, compile and install Nginx for me. (recommended)
The easiest way to get started. A stock Nginx 1.4.4 with Passenger
support, but with no other additional third party modules, will be
installed for you to a directory of your choice.
E pressione Enter para continuar.
Agora, o código fonte do Nginx será baixado, compilado e instalado com suporte ao Passenger.
Nota: Esta ação pode demorar um pouco – provavelmente mais do que se gostaria ou espera!
Criando o Script de Gerenciamento do Nginx
Após compilar o Nginx, para controlá-lo com facilidade, precisamos criar um script de gerenciamento simples.
Execute os seguintes comandos para criar o script:
nano /etc/rc.d/init.d/nginx
Copie e cole o conteúdo abaixo:
#!/bin/sh
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0
nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"
lockfile=/var/lock/subsys/nginx
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
start
}
reload() {
configtest || return $?
echo -n $”Reloading $prog: ”
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
Pressione CTRL+X e confirme com Y para salvar e sair.
Defina o modo deste script de gerenciamento como executável:
chmod +x /etc/rc.d/init.d/nginx
Configurando o Nginx para Implantação de Aplicativos
Neste último passo da configuração de nossos servidores, precisamos criar um bloco de servidor Nginx, que se traduz aproximadamente nos hosts virtuais do Apache.
Como você pode se lembrar de ter visto durante a instalação do Passenger no Nginx, este procedimento consiste em adicionar um bloco de código ao arquivo de configuração do Nginx nginx.conf
. Por padrão, a menos que você indique o contrário, este arquivo pode ser encontrado em /opt/nginx/conf/nginx.conf
.
Digite o seguinte comando para abrir este arquivo de configuração para editá-lo com o editor de texto nano:
nano /opt/nginx/conf/nginx.conf
Como primeiro passo, encontre o nó http {
e adicione o seguinte imediatamente após as diretivas passenger_root
e passenger_ruby
:
# Apenas para fins de desenvolvimento.
# Remova esta linha quando carregar um aplicativo real.
# Apenas para * TESTES *.
passenger_app_env development;
Role para baixo no arquivo e encontre server { ..
. Comente a localização padrão, ou seja:
..
# location / {
# root html;
# index index.html index.htm;
# }
..
E defina a raiz do seu aplicativo padrão:
# Defina a pasta onde você irá implantar sua aplicação.
# Estamos usando: /home/deployer/apps/my_app
root /home/deployer/apps/my_app/public;
passenger_enabled on;
Pressione CTRL+X e confirme com Y para salvar e sair.
Execute o seguinte para recarregar o Nginx com a nova configuração da aplicação:
# !! Lembre-se de criar um script de gerenciamento do Nginx
# seguindo o artigo principal de implantação do Rails para CentOS
# vinculado no início desta seção.
/etc/init.d/nginx restart
Para verificar o status do Nginx, você pode usar:
/etc/init.d/nginx status
Observação: Para saber mais sobre o Nginx, consulte Como Configurar o Servidor Web Nginx em um VPS.
Baixando e Instalando o Capistrano
Uma vez que temos nosso sistema pronto, obter a versão mais recente do Capistrano, graças ao RubyGems, é fácil.
Você pode simplesmente usar o seguinte para obter a versão 3 do Capistrano:
gem install capistrano
Criando um Usuário de Sistema para Implantação
Neste passo, vamos criar um usuário do sistema CentOS para executar as ações de implantação. Este será o usuário que o Capistrano utilizará.
Observação: Para manter as coisas básicas, vamos criar um usuário deployer
com privilégios necessários. Para uma configuração mais completa, considere usar o exemplo de grupos do tutorial de introdução ao Capistrano.
Crie um novo usuário do sistema deployer
:
adduser deployer
Configure a senha do deployer
:
passwd deployer
# Insira uma senha
# Confirme a senha
Edite o arquivo /etc/sudoers
usando o editor de texto nano
:
nano /etc/sudoers
Role o arquivo para baixo e encontre onde root
está definido:
..
## A seção COMMANDS pode ter outras opções adicionadas a ela.
##
## Permitir que o root execute qualquer comando em qualquer lugar
root ALL=(ALL) ALL
..
Acrescente o seguinte logo após root ALL=(ALL) ALL
:
deployer ALL=(ALL) ALL
Esta seção do arquivo /etc/sudoers
deve ficar assim agora:
..
## A seção COMMANDS pode ter outras opções adicionadas a ela.
##
## Permitir que o root execute qualquer comando em qualquer lugar
root ALL=(ALL) ALL
deployer ALL=(ALL) ALL
..
Pressione CTRL+X e confirme com Y para salvar e sair.
Preparando Aplicações Rails para Implantação com Capistrano Baseado em Git
Uma vez que tenhamos nosso sistema pronto, com todas as aplicações necessárias configuradas e funcionando corretamente, podemos prosseguir com a criação de uma aplicação Rails exemplar para usar como amostra.
Na segunda etapa, vamos criar um repositório Git e enviar a base de código para um local central e acessível no Github para o Capistrano usar em implantações.
Nota: Aqui, estamos criando uma aplicação de exemplo. Para as implantações reais, você deve realizar estas ações por conta própria, após garantir que tudo esteja devidamente salvo – só por precaução! Além disso, observe que você precisará executar o Capistrano de um local diferente do servidor onde a aplicação precisa ser implantada.
Criando uma Aplicação Básica Ruby-On-Rails
Nota: O passo abaixo é para criar uma aplicação Rails substituta para experimentar o Capistrano.
Tendo o Ruby e o Rails já instalados, nos resta apenas um único comando para começar.
Execute o seguinte comando para fazer o Rails criar uma nova aplicação chamada my_app:
# Crie uma aplicação Rails de exemplo
rails new my_app
# Entre no diretório da aplicação
cd my_app
# Crie um recurso de exemplo
rails generate scaffold Task title:string note:text
# Crie um banco de dados de exemplo
RAILS_ENV=development rake db:migrate
Para testar se a sua aplicação está configurada corretamente e tudo está funcionando bem, entre no diretório do aplicativo e execute um servidor simples via rails s
:
# Entre no diretório do aplicativo
cd my_app
# Execute um servidor simples
rails s
# Agora você deverá conseguir acessá-lo visitando: http://[o IP do seu droplet]:3000
# Para encerrar o processo do servidor,
# Pressione CTRL+C
# Criando um Repositório Git
Observação: Para aprender mais sobre como trabalhar com o Git, confira o tutorial Como Usar o Git Efetivamente nas páginas da comunidade da DigitalOcean.
Observação: Para seguir esta seção, você precisará de uma conta no Github. Alternativamente, você pode configurar um droplet para hospedar seu próprio repositório Git seguindo este artigo da DigitalOcean sobre o assunto. Se optar por fazê-lo, certifique-se de usar a URL relevante nos arquivos de implantação.
Vamos usar as instruções de exemplo fornecidas pelo Github para criar um repositório de origem.
Execute os seguintes comandos autoexplicativos dentro do diretório my_app
para iniciar um repositório:
# !! Esses comandos devem ser executados em
# sua máquina de desenvolvimento, de onde você irá
# implantar em seu servidor.
# As instruções podem variar ligeiramente dependendo de
# sua escolha de sistema operacional.
#
# Certifique-se de definir os caminhos corretos para a aplicação
# caso contrário, o Nginx pode não ser capaz de localizá-la.
# Inicie o repositório
git init
# Adicione todos os arquivos ao repositório
git add .
# Faça o commit das mudanças
git commit -m "first commit"
# Adicione o link do seu repositório Github
# Exemplo: git remote add origin [email protected]:[nome de usuário]/[nome do projeto].git
git remote add origin [email protected]:user123/my_app.git
# Crie uma chave RSA/SSH
# Siga as instruções na tela
ssh-keygen -t rsa
# Visualize o conteúdo da chave e adicione-a ao seu Github
# copiando e colando da sessão remota atual
# visitando: https://github.com/settings/ssh
# Para aprender mais sobre o processo,
# visite: https://help.github.com/articles/generating-ssh-keys
cat /root/.ssh/id_rsa.pub
# Configure suas informações do Github
# Username:
# Uso: git config --global user.name "[seu nome de usuário]"
git config --global user.name "user123"
# Email:
# Uso: git config --global user.email "[seu email]"
git config --global user.email "[email protected]"
# Envie o código fonte do projeto para sua conta do Github
git push -u origin master
Trabalhando com Capistrano para Automatizar Implantações
Como você se lembrará do nosso primeiro artigo sobre o Capistrano, o modo de começar a usar a biblioteca é instalando-a dentro do diretório do projeto. Nesta seção, veremos como fazer isso, seguido pela criação de arquivos necessários para configurar os servidores.
Instalando o Capistrano Dentro do Diretório do Projeto
Outro passo simples em nosso artigo é instalar os arquivos do Capistrano. O comando abaixo criará alguns diretórios e arquivos a serem usados pela ferramenta para a implantação.
Execute o seguinte para iniciar (ou seja, instalar) os arquivos do Capistrano:
cap install
# mkdir -p config/deploy
# criar config/deploy.rb
# criar config/deploy/staging.rb
# criar config/deploy/production.rb
# mkdir -p lib/capistrano/tasks
# Capified
Trabalhando com config/deploy.rb dentro do diretório do projeto
O arquivo deploy.rb
contém argumentos e configurações relevantes para o(s) servidor(es) de implantação. Aqui, diremos ao Capistrano para qual(is) servidor(es) gostaríamos de nos conectar e implantar e como fazer isso.
Nota: Ao editar o arquivo (ou definir as configurações), você pode comentá-las ou adicionar novas linhas. Certifique-se de não ter algumas configurações de exemplo substituindo aquelas que você está adicionando.
Execute o seguinte para editar o arquivo usando o editor de texto nano
:
nano config/deploy.rb
Adicione o seguinte bloco de código, modificando-o conforme suas próprias configurações:
# Defina o nome da aplicação
set :application, 'my_app'
# Defina onde o Capistrano pode acessar o repositório de origem
# set :repo_url, 'https://github.com/[nome de usuário]/[nome da aplicação].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'
# Defina onde colocar o código da sua aplicação
set :deploy_to, "/home/deployer/apps/my_app"
set :pty, true
set :format, :pretty
# Defina as instruções pós-deploy aqui.
# Uma vez que o deploy estiver completo, o Capistrano
# começará a executá-las conforme descrito.
# Para aprender mais sobre a criação de tarefas,
# confira:
# http://capistranorb.com/
# namespace: deploy do
# desc 'Reinicie a aplicação'
# task :restart do
# on roles(:app), in: :sequence, wait: 5 do
# # Seu mecanismo de reinício aqui, por exemplo:
# execute :touch, release_path.join('tmp/restart.txt')
# end
# end
# after :publishing, :restart
# after :restart, :clear_cache do
# on roles(:web), in: :groups, limit: 3, wait: 10 do
# # Aqui podemos fazer qualquer coisa como:
# # dentro do release_path faça
# # execute :rake, 'cache:clear'
# # end
# end
# end
# end
Pressione CTRL+X e confirme com Y para salvar e sair.
Trabalhando com config/deploy/production.rb Dentro do Diretório do Projeto
Nota: Semelhante ao deploy.rb
, você precisará fazer algumas alterações no arquivo production.rb
. É melhor modificar o código em vez de anexar o bloco abaixo.
Execute o seguinte para editar o arquivo usando o editor de texto nano
:
nano config/deploy/production.rb
Insira as configurações do seu servidor, semelhantes às abaixo:
# Definir funções, usuário e endereço IP do servidor de implantação
# role :nome, %{[usuário]@[endereço IP]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db, %w{[email protected]}
# Definir servidor(es)
server '162.243.74.190', user: 'deployer', roles: %w{web}
# Opções SSH
# Veja a seção de exemplo comentada no arquivo
# para mais opções.
set :ssh_options, {
forward_agent: false,
auth_methods: %w(password),
password: 'user_deployers_password',
user: 'deployer',
}
Pressione CTRL+X e confirme com Y para salvar e sair.
Implantando no Servidor de Produção
Depois de concluirmos as configurações, é hora de implantar.
Execute o seguinte código em sua máquina de desenvolvimento para implantar no servidor de produção. Como definido nos arquivos acima, o Capistrano irá:
-
Conectar-se ao servidor de implantação
-
Baixe a fonte do aplicativo
-
Realize as ações de implantação (ou seja, reinicie a aplicação do passageiro)
cap production deploy
Para saber mais sobre o Capistrano e o que ele pode fazer, considere ler a documentação do Capistrano.
<div class=“autor”>Enviado por: <a
href=“https://twitter.com/ostezer”>O.S. Tezer</a></div>