Publique sua aplicação com Heroku

Criado por Terence Lee, @hone02
Traduzido por Maujor, site do Maujor

Instale Heroku

Siga os passos intitulados “Introduction” e “Set up” constantes na página Getting Started on Heroku with Ruby para se cadastrar, instalar Heroku CLI e fazer login.

COACH: Fale sobre os benefícios do uso da plataforma Heroku para publicação vs uso de servidores tradicionais.

Preparando sua app

Atualizando o banco de dados

Em primeiro lugar precisamos fazer com que nosso banco de dados funcione na plataforma Heroku, que usa um banco de dados diferente. Altere o seguinte em Gemfile:

gem 'sqlite3'

para

group :development do
  gem 'sqlite3'
end
group :production do
  gem 'pg'
end

Rode bundle install --without production para configurar suas dependências.

Não se esqueça de fazer git add . e git commit -m "Utilizando postgres como banco de dados de producao" para adicionar esta mudança ao seu branch master antes de enviar ao heroku mais tarde.

COACH: You can talk about RDBMS and the different ones out there, plus include some details on Heroku’s dependency on PostgreSQL.

COACH: Você pode falar sobre RDBMS e as diferenças para outros sistemas de gerenciamento bem como apresentar alguns detalhes das dependências em Heroku no PostgreSQL.

Sistema de controle de versão

Para começar vamos adicionar nosso código em um sistema de controle de versão. Você pode fazer isso executando os seguintes comandos no terminal:

git init
git add .
git commit -m "initial commit"

COACH: Agora é uma ótima oportunidade para falar sobre sistemas de controle de versão e git.

Publicando sua app

Criando a app

Precisamos criar nossa aplicação heroku executando heroku create no terminal. Esta ação mostrará no terminal o seguinte:

Creating app... done, ⬢ young-reaches-87845
https://young-reaches-87845.herokuapp.com/ | https://git.heroku.com/young-reaches-87845.git

Neste caso “young-reaches-87845” é o nome da sua aplicação

Fazendo o pushing do código

A seguir precisamos fazer o push do código para o heroku excutando git push heroku master. Você verá a saída do push como mostrado a seguir:

Counting objects: 115, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (97/97), done.
Writing objects: 100% (115/115), 25.62 KiB | 0 bytes/s, done.
Total 115 (delta 10), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.2.4
remote: -----> Installing dependencies using bundler 1.11.2
remote:        Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
remote:        Fetching gem metadata from https://rubygems.org/..........
remote:        Fetching version metadata from https://rubygems.org/...
remote:        Fetching dependency metadata from https://rubygems.org/..
remote:        Installing concurrent-ruby 1.0.2
...
remote: -----> Launching...
remote:        Released v5
remote:        https://young-reaches-87845.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/young-reaches-87845.git
 * [new branch]      master -> master

O envio estará terminado com êxito quando aparecer o texto “Launching…” como mostrado anteriomente.

Migrando o banco de dados

Precisamos migrar nosso banco de dados tal como fizemos localmente durante o workshop:

heroku run rake db:migrate

Depois que esse comando for executado você poderá acessar a app na sua URL. Para a aplicação que desenvolvemos nesse exemplo abra: https://young-reaches-87845.herokuapp.com/. Opcionalmente, para visitar a página, você pode executar heroku open no terminal.

Notas finais

A plataforma Heroku tem suas peculiaridades. Nela os aplicativos são executados em tempo real dentro de um ambiente efêmero - isso significa que (exceto para informações armazenadas em seu banco de dados) quaisquer arquivos criados por seu aplicativo irá desaparecer quando ele for reiniciado (por exemplo, quando você atualiza para uma nova versão).

Sistema de arquivos efêmero

Cada container dyno cria seu próprio sistema de arquivos efêmero contendo uma cópia do mais recente código publicado. Durante o período de vida do dyno os processos nele rodando usam um sistema de arquivos que são escritos em um rascunho temporário, contudo nenhum destes arquivos são visíveis para processamento em qualquer outro dyno, tais arquivos serão descartados no momento em que o dyno for parado ou restartado. Por exemplo, isso acontece sempre que o dyno é substituido em decorrência uma implantação de aplicativos e, também, em média uma vez por dia, pois assim está previsto pelo mecanismo de gestão nativo do dyno.

No tutorial para criação do App a funcionalidade que prevê a gravação de arquivos em uma Idea, permite escrever arquivos no diretório public/uploads das suas aplicações . Você pode constatar o armazenamento efêmero em Heroku seguindo os seguintes passos:

  1. Inicie a aplicação executando o comando heroku open
  2. Adicione uma nova Idea e nela uma imagem
  3. Reinicie a aplicação executando o comando heroku restart
  4. Volte para a página da Idea e recarregue - a imagem não será mais visível
Contornando o armazenamento efêmero

É óbvio que armazenamento efêmero não é conveniente quando se trata de uma aplicação real, mas existem métodos para contornar o problema que são usados em muitos websites populares.

O método mais comum consiste em se usar um serviço de hospedagem externo, tais como, Amazon S3 (Simple Storage Service) ou Rackspace CloudFiles para hospedar os assets da aplicação. Tais serviços disponibilizam (por um custo baixo - em geral $0.10 por GB) armazenamento ‘na nuvem’ (os arquivos podem ser hospedados em qualquer lugar) proporcionando um armazenamento persistente para sua aplicação.

Não é do escopo deste tutorial detalhar a hospedagem ‘na nuvem’, mas se você estiver interessado em mais informações à respeito seguem alguns links úteis:

Como sempre, se você precisar de mais informações ou assistência pergunte aos seus coaches.