Como subir una app rails a heroku

categorias: rails sysop

tags: rails deploy heroku

Configurar App

si tenemos un sitio en rails (también da soporte python, nodejs, java, clousure…) que queremos subirlo a internet para probarlo Heroku es una gran alternativa. Para poder usar Heroku debemos crearnos una cuenta y instalarlos sus Toolbelt. Un buen punto de partida para hacer todo esto es su QuickStart.

Para deployar en heroku deberemos hacer unos pequeños cambios en nuestro Gemfile. Heroku usa Postgres como base de datos, por lo que deberemos añadir las gemas en entorno de producción. Tambien deberemos poner la gem sqlite3 solo en los grupos development y test.

group :development, :test do
  gem 'sqlite3'
end
group :production do
  gem "pg"
  gem "rails_12factor"
end

Y ejecutar bundle install --without production para actualizar las dependencias. Una vez actualizados debemos realizar un commit para tener la última versión en git.

# => Si todavia no se tiene el proyecto en git, sera necesario añadirlo con 
# => git init
# => git commit -a -m "version inicial"
$ git commit -a -m "Añadidas dependecias para heroku y actualizado Gemfile.lock"

Subir la app

El siguiente paso es crear una nueva app en Heroku. Para ello ejecutamos heroku create

$ heroku create
Creating radiant-island-4647... done, stack is cedar-14
https://radiant-island-4647.herokuapp.com/ | https://git.heroku.com/radiant-island-4647.git
Git remote heroku added

Nos creará un nombre aleatorio, que asignará como repositorio remoto y como subdominio en el cual estará alojado nuestra aplicación.

Si queremos definir el nombre de nuestro subdominio, podemos entrar al entorno de administración de Heroku, crear la app con el nombre que mas nos guste y configurar en nuestra app el repositorio remoto

cd my-project/
$ git init
$ heroku git:remote -a my-project

Una vez configurado, lo único que nos falta es hacer un push de la última versión de nuestra app. Para ello ejecutaremos git push heroku master. Al realizar el push, Heroku adaptará nuestro proyecto (BBDD y logs) para su correcto funcionamiento

$ git push heroku master
Counting objects: 90, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (82/82), done.
Writing objects: 100% (90/90), 21.44 KiB | 0 bytes/s, done.
Total 90 (delta 4), 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.0.0
remote: -----> Installing dependencies using 1.7.12
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:        Installing rake 10.4.2
[...] Instala todas las gemas [...]
remote:        Installing turbolinks 2.5.3
remote:        Your bundle is complete!
remote:        Gems in the groups development and test were not installed.
remote:        It was installed into ./vendor/bundle
remote:        Post-install message from rdoc:
remote:        Depending on your version of ruby, you may need to install ruby rdoc/ri data:
remote:        <= 1.8.6 : unsupported
remote:        = 1.8.7 : gem install rdoc-data; rdoc-data --install
remote:        = 1.9.1 : gem install rdoc-data; rdoc-data --install
remote:        >= 1.9.2 : nothing to do! Yay!
remote:        Bundle completed (34.42s)
remote:        Cleaning up the bundler cache.
remote: -----> Preparing app for Rails asset pipeline
remote:        Running: rake assets:precompile
remote:        I, [2015-03-25T23:07:25.573293 #1159]  INFO -- : Writing /tmp/build_b8e3435b0d8e41346147ce1d18e9b308/public/assets/application-47fe71a3b34a93e1929c175b1755d405.js
remote:        I, [2015-03-25T23:07:25.661104 #1159]  INFO -- : Writing /tmp/build_b8e3435b0d8e41346147ce1d18e9b308/public/assets/application-3942007d31710307dd44000cb1f768c9.css
remote:        Asset precompilation completed (6.79s)
remote:        Cleaning assets
remote:        Running: rake assets:clean
remote:
remote: ###### WARNING:
remote:        You have not declared a Ruby version in your Gemfile.
remote:        To set your Ruby version add this line to your Gemfile:
remote:        ruby '2.0.0'
remote:        # See https://devcenter.heroku.com/articles/ruby-versions for more information.
remote:
remote: ###### WARNING:
remote:        No Procfile detected, using the default web server (webrick)
remote:        https://devcenter.heroku.com/articles/ruby-default-web-server
remote:
remote: -----> Discovering process types
remote:        Procfile declares types -> (none)
remote:        Default types for Ruby  -> console, rake, web, worker
remote:
remote: -----> Compressing... done, 29.8MB
remote: -----> Launching... done, v6
remote:        https://radiant-island-4647.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/radiant-island-4647.git
 * [new branch]      master -> master

Ya solo falta crear las tablas de BBDD ejecutando heroku run rake db:migrate y estaremos dispuesto para visualizar nuestra app con heroku open

En produccion, si no se define en el router.rb, la raiz del dominio no devuelve nada, al contrario que el entorno de desarrollo

Opcional

Posiblemente la primera vez que subamos una app a Heroku nos saldran algunos de los siguientes warnings:

ruby '2.2.1'
web: bundle exec puma -C config/puma.rb

Añadir a Gemfile:

gem 'puma'

Y crear el archivo ./config/puma.rb con:

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  # Worker specific setup for Rails 4.1+
  # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot
  ActiveRecord::Base.establish_connection
end

Ahora solo tenemos que actualizar el código en heroku para tener la nueva versión:

$ git commit -a -m "Corrigiendo warnings de heroku"
$ git push heroku master