Running Rails 5.0.1 + PostGIS + puma + nginx in production using docker-compose 2
In this post we will learn to
Configure docker compose for a production setup of a PostGIS + Ruby on Rails 5.0.1 application with nginx as proxy server
We will build on the development version of the application we create in my last post here. If you want to follow along then make sure you have that one done.
In this post we will create the production
- Dockerfile for production version of the Rails app
- .env file for production
- nginx proxy configuration for the Rails app (NEW)
- docker-compose.yml file for production
- entrypoint script
TL;DR just run this script:
So what did we do? Most of it is pretty self explanatory, but the tricky part is the nginx configuration and mounting of the volume where the rails assets are stored and accessible for nginx. Note the following docker-compose.yml lines in nginx service. This says when running nginx container please mount any volumes you have from the app container.
And if we look in the app service
This means the app container mounts a named volume called
nginx_config at the defined paths; and finally the top-level volume declarations with:
this makes sure the assets are mounted where Rails would normally put assets. So when we run
rake assets:precompile assets end up in a share volume and are available to other containers. Read more about it here: https://docs.docker.com/compose/compose-file/#/volumes-volumedriver
If we look at our
Dockerfile we will see:
RUN mkdir -p /etc/nginx/conf.d/
COPY ./containers/production/nginx.conf /etc/nginx/conf.d/default.conf
This ensures that our nginx configuration is placed in the shared volume and visible to the nginx container. Similarly our
entrypoint script copies the config to shared volume as well as runs the asset compilation again. This is to make sure that asset changes and nginx config changes are reflected on restart.
When done running this script just run
docker-compose up and make sure that your
SERVER_NAME is in your
In the next post we learn to ship the Rails app and deploy to DigitalOcean.