Skip to content

Instantly share code, notes, and snippets.

@mariochavez
Last active June 17, 2020 18:18
Show Gist options
  • Select an option

  • Save mariochavez/9457b41ad74d8b8809bc to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown

gracias amigo por compartir el código

@fabdelgado
Copy link
Copy Markdown

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