Skip to content

Instantly share code, notes, and snippets.

@mariochavez
Last active June 17, 2020 18:18
Show Gist options
  • Save mariochavez/9457b41ad74d8b8809bc to your computer and use it in GitHub Desktop.
Save mariochavez/9457b41ad74d8b8809bc to your computer and use it in GitHub Desktop.
Usando Docker con Rails

Usando Docker con Rails para hacer deploy a Producción

Instalar Docker

Hay que seguir las notas en https://docs.docker.com/installation/ para el sistema operativo que esten ejecutando.

Utilizando un contenedor para Postgresql

Vamos a utilizar un container ya listo para trabajar con Postgresql. El siguiente comando se encarga de descargar el container y de ejecutarlo. Si es necesario cambiar el valor de las variables POSTGRES_PASSWORD y POSTGRES_USER a unos más adecuados

$ docker run --name db -e POSTGRES_PASSWORD=manager -e POSTGRES_USER=rails -d postgres

Crear un container para Ruby On Rails

  • Construir una aplicación de Ruby on Rails
  • Agregar las gemas de puma y foreman al grupo de :production
  • Configurar puma
  • Agregar el archivo Dockerfile al root de la aplicación de Rails
  • Agregar el archivo nginx-sites en /config/container

Configurar database.yml

Como vamos a utilizar otro container como base de datos, éste expone en variables de ambiente el usuario, el password y el host, por lo que en la sección de producción de database.yml tenemos que modificarla de la siguiente forma:

production:
  <<: *default
  database: todo_production
  username: <%= ENV['PG_ENV_POSTGRES_USER'] %>
  password: <%= ENV['PG_ENV_POSTGRES_PASSWORD'] %>
  host: <%= ENV['PG_PORT_5432_TCP_ADDR'] %>

Construir y ejecutar el contenerdor

Para construir el contener ejecutamos:

sudo docker build -t marioch/todo .

Una vez finalizado hay que exportar las siguientes variables de ambiente:

export PORT=8080
export SECRET_KEY_BASE=$(rake secret)

Y finalmente podemos ejecutar el contener de la siguente forma:

docker run -p 8080:8080 -e SECRET_KEY_BASE=$SECRET_KEY_BASE --link db:pg marioch/todo

Para ver la aplicación trabajando nos conectamos a la IP del computador donde se está ejecutando el contener y le agregamos el puerto 8080.

# Dockerfile for a Rails application using Nginx and Unicorn
# Select ubuntu as the base image
FROM seapy/ruby:2.2.0
# Install nginx, nodejs and curl
RUN apt-get update -q
RUN apt-get install -qy nginx
RUN apt-get install -qy curl
RUN apt-get install -qy nodejs
RUN apt-get install -y --force-yes libpq-dev
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx
# Install foreman
RUN gem install bundler
RUN gem install foreman
RUN gem install rails
# Add configuration files in repository to filesystem
ADD config/container/nginx-sites.conf /etc/nginx/sites-enabled/default
# Add rails project to project directory
ADD ./ /rails
# set WORKDIR
WORKDIR /rails
ENV RAILS_ENV production
ENV PORT 8080
# bundle install
RUN /bin/bash -l -c "bundle install --without development test"
# Publish port 8080
EXPOSE 8080
# Startup commands
CMD bundle exec rake db:create db:migrate assets:precompile && foreman start -f Procfile
# nginx-sites.conf
server {
root /rails/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_set_header Host $http_host;
if (!-f $request_filename) {
proxy_pass http://localhost:8080;
break;
}
}
location ~* ^/assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
open_file_cache max=1000 inactive=500s;
open_file_cache_valid 600s;
open_file_cache_errors on;
break;
}
}
web: bundle exec puma -p $PORT -C ./config/puma.rb
nginx: /usr/sbin/nginx -c /etc/nginx/nginx.conf
@luisrenemas
Copy link

gracias amigo por compartir el código

@fabdelgado
Copy link

Tienes algún caso en el que se incluya letsencrypt?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment