Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
linux:rails_deploy [2017/05/25 13:47] 1891982 |
linux:rails_deploy [2021/08/25 10:33] |
||
---|---|---|---|
Linha 1: | Linha 1: | ||
- | ===== Publicando aplicação rails em produção usando Ubuntu + Rails 4 + Nginx + Unicorn + PostgreSQL + Capistrano ===== | ||
- | Entre na máquina via ssh | ||
- | < | ||
- | $ ssh usuario@app_name.ifce.edu.br | ||
- | </ | ||
- | Obs: Caso a chave ssh do servidor tenha sido alterada, por algum motivo específico, | ||
- | |||
- | < | ||
- | rm ~/ | ||
- | </ | ||
- | |||
- | ==== Criando usuário da aplicação ==== | ||
- | |||
- | É recomendado criar um usuário na máquina com o mesmo nome da aplicação, | ||
- | |||
- | Crie o usuário | ||
- | |||
- | < | ||
- | sudo adduser minha_app | ||
- | </ | ||
- | |||
- | Digite a senha e as informações necessárias até finalizar o processo | ||
- | |||
- | Adicione o usuário ao arquivo sudoers: | ||
- | |||
- | < | ||
- | sudo visudo | ||
- | </ | ||
- | |||
- | No final do arquivo adicione: | ||
- | |||
- | < | ||
- | minha_app ALL=(ALL) NOPASSWD: | ||
- | </ | ||
- | |||
- | Digite Ctrl + O para salvar e depois Ctrl + X para fechar o arquivo | ||
- | |||
- | Logue com esse novo usuário | ||
- | |||
- | < | ||
- | su minha_app | ||
- | </ | ||
- | |||
- | ==== Adicione sua chave ssh ao servidor para se logar sem senha: ==== | ||
- | |||
- | Dê ssh para alguma máquina a fim de criar o diretório ~/.ssh | ||
- | |||
- | < | ||
- | ssh usuario@app_name.ifce.edu.br | ||
- | </ | ||
- | |||
- | Dê um Ctrl+C ao ser solicitado pela senha. | ||
- | |||
- | Adicione sua chave ao arquivo ~/ | ||
- | |||
- | Na sua máquina local pegue a sua chave ssh se existir com o comando (Cuidado para não copiar os espaços): | ||
- | |||
- | < | ||
- | cat ~/ | ||
- | </ | ||
- | |||
- | No servidor adicione a chave ao arquivo: | ||
- | |||
- | < | ||
- | vim ~/ | ||
- | </ | ||
- | |||
- | Cole conteúdo da chave nesse arquivo | ||
- | |||
- | Salve e teste | ||
- | |||
- | |||
- | |||
- | ==== Instalando o RVM ==== | ||
- | |||
- | **Instalando o Curl** | ||
- | |||
- | < | ||
- | $ sudo apt-get update | ||
- | $ sudo apt-get install curl | ||
- | </ | ||
- | |||
- | <fc #ff0000> | ||
- | Obs: caso tenha algum problema ao baixar o rvm, verifique os seus servidores DNS no arquivo: / | ||
- | </fc> | ||
- | |||
- | < | ||
- | $ curl -L get.rvm.io | bash -s stable | ||
- | </ | ||
- | |||
- | |||
- | Caso ocorra o seguinte erro, rode o comando sugerido pelo próprio erro: | ||
- | |||
- | GPG signature verification failed for '/ | ||
- | try downloading the signatures: | ||
- | |||
- | Rode: | ||
- | |||
- | < | ||
- | command curl -sSL https:// | ||
- | </ | ||
- | |||
- | E depois rode novamente os comandos abaixo para finalizar a instalação do rvm: | ||
- | |||
- | < | ||
- | $ curl -L get.rvm.io | bash -s stable | ||
- | $ source ~/ | ||
- | </ | ||
- | |||
- | Agora é preciso instalar os requisitos para instalar o ruby e instalar também a gem bundles para gerenciar as outras gems do projeto: | ||
- | |||
- | < | ||
- | $ rvm requirements | ||
- | $ rvm install 2.0.0 (Utilize a versão que vc estiver trabalhando no projeto atual) | ||
- | $ rvm use 2.0.0 --default | ||
- | $ rvm rubygems current | ||
- | $ gem install bundler | ||
- | </ | ||
- | |||
- | ==== Instale a lib de dependência do PostgreSQL, Imagemagick e Git ==== | ||
- | |||
- | |||
- | < | ||
- | $ sudo apt-get install libpq-dev imagemagick git-core | ||
- | </ | ||
- | |||
- | Crie o usuário do postgresql da forma que você preferir | ||
- | |||
- | Crie o Banco de Dados do Sistema no Postgresql | ||
- | |||
- | |||
- | ==== Instalando e configurando o Nginx ==== | ||
- | |||
- | < | ||
- | $ sudo apt-get install nginx | ||
- | $ nginx -h | ||
- | $ cat / | ||
- | $ / | ||
- | $ sudo service nginx start | ||
- | $ sudo service nginx status (Ele deve estar rodando agora!) | ||
- | </ | ||
- | |||
- | Crie o arquivo nginx.conf no diretório config do seu projeto rails: | ||
- | |||
- | < | ||
- | upstream unicorn { | ||
- | server unix:/ | ||
- | } | ||
- | |||
- | server { | ||
- | listen 80 default_server deferred; | ||
- | root / | ||
- | |||
- | location ^~ /assets/ { | ||
- | gzip_static on; | ||
- | expires max; | ||
- | add_header Cache-Control public; | ||
- | } | ||
- | |||
- | try_files $uri/ | ||
- | location @unicorn { | ||
- | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||
- | proxy_set_header Host $http_host; | ||
- | proxy_redirect off; | ||
- | proxy_pass http:// | ||
- | } | ||
- | |||
- | error_page 500 502 503 504 /500.html; | ||
- | client_max_body_size 20M; | ||
- | keepalive_timeout 120; | ||
- | } | ||
- | </ | ||
- | |||
- | Adicione a gem do Unicorn ao projeto. Adicione a seguinte linha no arquivo Gemfile: | ||
- | |||
- | < | ||
- | gem ' | ||
- | </ | ||
- | |||
- | Crie a configuração do unicorn em config/ | ||
- | |||
- | < | ||
- | root = "/ | ||
- | working_directory root | ||
- | |||
- | pid "# | ||
- | |||
- | stderr_path "# | ||
- | stdout_path "# | ||
- | |||
- | worker_processes Integer(ENV[' | ||
- | timeout 30 | ||
- | preload_app true | ||
- | |||
- | listen '/ | ||
- | |||
- | before_fork do |server, worker| | ||
- | Signal.trap ' | ||
- | puts ' | ||
- | Process.kill ' | ||
- | end | ||
- | |||
- | defined? | ||
- | ActiveRecord:: | ||
- | end | ||
- | |||
- | after_fork do |server, worker| | ||
- | Signal.trap ' | ||
- | puts ' | ||
- | end | ||
- | |||
- | defined? | ||
- | ActiveRecord:: | ||
- | end | ||
- | |||
- | # Force the bundler gemfile environment variable to | ||
- | # reference the capistrano " | ||
- | before_exec do |_| | ||
- | ENV[' | ||
- | end | ||
- | </ | ||
- | |||
- | Crie o arquivo config/ | ||
- | |||
- | < | ||
- | #!/bin/sh | ||
- | set -e | ||
- | |||
- | # when to timeout a request, a lower value limits the risk that | ||
- | # a long running process will block all connections | ||
- | TIMEOUT=${TIMEOUT-60} | ||
- | |||
- | # the path to the app, dynamically populate from the capistrano | ||
- | # definition | ||
- | APP_ROOT=/ | ||
- | |||
- | # where we're going to store unicorns pid file, must match what is | ||
- | # specified in unicorn.rb.erb | ||
- | PID=$APP_ROOT/ | ||
- | CMD=" | ||
- | AS_USER=deploy | ||
- | set -u | ||
- | |||
- | OLD_PIN=" | ||
- | |||
- | sig () { | ||
- | test -s " | ||
- | } | ||
- | |||
- | oldsig () { | ||
- | test -s $OLD_PIN && kill -$1 `cat $OLD_PIN` | ||
- | } | ||
- | |||
- | workersig () { | ||
- | workerpid=" | ||
- | | ||
- | test -s " | ||
- | } | ||
- | |||
- | run () { | ||
- | if [ "$(id -un)" = " | ||
- | eval $1 | ||
- | else | ||
- | su -c " | ||
- | fi | ||
- | } | ||
- | |||
- | case " | ||
- | start) | ||
- | sig 0 && echo >&2 " | ||
- | run " | ||
- | ;; | ||
- | stop) | ||
- | sig QUIT && exit 0 | ||
- | echo >&2 "Not running" | ||
- | ;; | ||
- | force-stop) | ||
- | sig TERM && exit 0 | ||
- | echo >&2 "Not running" | ||
- | ;; | ||
- | kill_worker) | ||
- | workersig QUIT $2 && exit 0 | ||
- | echo >&2 " | ||
- | ;; | ||
- | restart|reload) | ||
- | sig USR2 && echo reloaded OK && exit 0 | ||
- | echo >&2 " | ||
- | run " | ||
- | ;; | ||
- | upgrade) | ||
- | if sig USR2 && sleep 2 && sig 0 && oldsig QUIT | ||
- | then | ||
- | n=$TIMEOUT | ||
- | while test -s $OLD_PIN && test $n -ge 0 | ||
- | do | ||
- | printf ' | ||
- | done | ||
- | echo | ||
- | |||
- | if test $n -lt 0 && test -s $OLD_PIN | ||
- | then | ||
- | echo >&2 " | ||
- | exit 1 | ||
- | fi | ||
- | exit 0 | ||
- | fi | ||
- | echo >&2 " | ||
- | run " | ||
- | ;; | ||
- | reopen-logs) | ||
- | sig USR1 | ||
- | ;; | ||
- | *) | ||
- | echo >&2 " | ||
- | exit 1 | ||
- | ;; | ||
- | esac | ||
- | </ | ||
- | |||
- | Adicione a gem do capistrano ao projeto: | ||
- | |||
- | < | ||
- | $ vim Gemfile | ||
- | |||
- | group : | ||
- | gem ' | ||
- | gem ' | ||
- | gem ' | ||
- | end | ||
- | </ | ||
- | |||
- | Instale a gem do Capistrano | ||
- | |||
- | < | ||
- | $ bundle exec cap install | ||
- | </ | ||
- | |||
- | Atualize o arquivo do Capistrano: Capfile, na raiz do projeto: | ||
- | |||
- | < | ||
- | require ' | ||
- | require ' | ||
- | require ' | ||
- | require ' | ||
- | require ' | ||
- | require ' | ||
- | require ' | ||
- | load ' | ||
- | load ' | ||
- | |||
- | # Load custom tasks from `lib/ | ||
- | Dir.glob(' | ||
- | </ | ||
- | |||
- | |||
- | Atualize o arquivo de Deploy em: config/ | ||
- | |||
- | < | ||
- | set :stages, %w(production staging) | ||
- | set : | ||
- | require ' | ||
- | |||
- | set : | ||
- | set : | ||
- | # require " | ||
- | |||
- | set : | ||
- | set :user, " | ||
- | set :port, 22 | ||
- | |||
- | set : | ||
- | set :use_sudo, false | ||
- | set : | ||
- | |||
- | set :scm, " | ||
- | set : | ||
- | set(: | ||
- | |||
- | default_run_options[: | ||
- | ssh_options[: | ||
- | |||
- | # simple method to create a file from an erb template. Used | ||
- | # to generate dynamic configuration files. | ||
- | def template(from, | ||
- | erb = File.read(from) | ||
- | put ERB.new(erb).result(binding), | ||
- | end | ||
- | </ | ||
- | |||
- | **Crie os arquivos do seu(s) ambiente(s) no diretório config/ | ||
- | Observar exemplo dos arquivos de outros sistemas.** | ||
- | |||
- | ==== Gere e Adicione a chave ssh do servidor no repositório git remoto (no caso o gitlab do ifce) | ||
- | Entre no diretório do ssh: ==== | ||
- | |||
- | < | ||
- | cd ~/.ssh && ls | ||
- | </ | ||
- | |||
- | Verifique se o arquivo **id_rsa.pub** já existe. Caso não existe você deve criá-lo com o seguinte comando: | ||
- | |||
- | < | ||
- | ssh-keygen -t rsa -C " | ||
- | </ | ||
- | |||
- | Apenas fique apertando Enter nos prompts que serão exibidos. Não precisa digitar nada. | ||
- | Agora você precisa copiar o conteúdo da chave pública: **id_rsa.pub** para o repositório git (no caso o gitlab do ifce) | ||
- | |||
- | < | ||
- | Vá no Projeto > Settings > Deploy Keys e crie uma nova, colando o conteúdo da chave no campo Key. | ||
- | </ | ||
- | |||
- | |||
- | ==== Checagem de deploy ==== | ||
- | |||
- | < | ||
- | $ cap production deploy: | ||
- | </ | ||
- | |||
- | ==== Bootstrap de deploy (criação da estrutura de diretórios inicial) ==== | ||
- | |||
- | < | ||
- | cap staging deploy: | ||
- | </ | ||
- | |||
- | |||
- | ==== Configurações finais de deploy ==== | ||
- | |||
- | * Adicione a configuração do ambiente correspondente (production ou staging) ao arquivo: | ||
- | |||
- | < | ||
- | / | ||
- | </ | ||
- | |||
- | * Dê permissões para o arquivo de inicialização do unicorn | ||
- | |||
- | < | ||
- | chmod +x / | ||
- | </ | ||
- | |||
- | * Remova o site padrão do nginx | ||
- | |||
- | < | ||
- | sudo rm / | ||
- | </ | ||
- | |||
- | * Reinicie o nginx | ||
- | |||
- | < | ||
- | sudo service nginx restart | ||
- | </ | ||
- | |||
- | * Deploy | ||
- | |||
- | < | ||
- | $ cap production deploy | ||
- | </ |