Deploy Your Rails to OpenShift

Kingsley Silas

Screenshot 2015-09-13 10.24.03

OpenShift is Red Hat’s Platform-as-a-Service (PaaS) that allows developers to quickly develop, host, and scale applications in a cloud environment. With OpenShift you have choice of offerings, including online, on-premise, and open source project options.

With Git, developers can deploy web applications in different languages on the platform. OpenShift makes deployment hassle-free and it is also a free and open source software.

In this tutorial, I’ll make a Rails app with a static page and deploy it to the OpenShift platform. The purpose of this tutorial is to see how the deployment process works.

OpenShift Setup

Create an account for free. A free account gives you 3 small gears with a storage capacity of 1gb per gear. OpenShift Gears are secure containers where applications run within OpenShift Nodes. Nodes are instances of Red Hat Enterprise Linux, which is the foundation of OpenShift. In other words, your application resides on Nodes and runs in secure containers within the nodes called Gears.

Other pricing options exists if you need something different, you can compare plans to know more.

Install rhc

Step one is to install the rhc gem, which contains the OpenShift command line tools:

gem install rhc

This installs the gem rhc and its dependencies. Just like git, rhc has a global configuration that can be completed with:

rhc setup

(Assuming you are installing rhc for the first time, which I believe you are.)

You’ll get a prompt asking you to specify your own Openshift server. For this tutorial, we’ll user the server for Openshift online: Just hit enter to accept the default.

Next, enter the OpenShift login credentials you used in registering.

OpenShift can create and store a token on disk which allows to you to access the server without using your password. The key is stored in your home directory and should be kept secret.  You can delete the key at any time by running 'rhc logout'.
Generate a token now? (yes|no)

If you type yes, a token will be created and stored on disk. This token allows you to access the server without using your password.

Finally, enter yes to upload your public SSH key to the OpenShift server to allow key-based SSH access.


The final step to setting this up involves creating a domain. In Openshift, applications are grouped into domains. To create an application, you must first create a domain. Each domain has a unique name, called a namespace.

An OpenShift Online namespace forms part of an application’s URL and is unique to your account. The syntax for an application URL is application– Each username supports a single namespace, but you can create multiple applications within the namespace. If you need multiple namespaces, you need to create multiple accounts using different usernames. Note, you must create a namespace before you can create an application.

OpenShift Online uses a blacklist to restrict the namespaces available to you. The blacklist is maintained on the server. A message warns you that you have chosen a blacklisted name and asks you to choose a different namespace if you try to create or alter a namespace using a blacklisted name. Namespaces may contain a maximum of 16 alphanumeric characters and may not have spaces or symbols.

Enter a unique name after the prompt and you are done. That is all, rhc is now configured.

Generate a Rails App

We need something to deploy. Let’s create a little Rails app to play with on OpenShift. I presume you have the rails gem installed, if not, gem install rails will get you going.

Generate the Rails app:

$ rails new tent
$ rails generate controller pages new

This creates a PagesController with a new method and view. Edit the new page:


<h1>Welcome to Tent</h1>

<p>This is a test page</p>

Change the route root to:


Rails.application.routes.draw do
  root 'pages#new'

We want to use Puma as the web server and PostgreSQL for the database. Puma is one of the web servers OpenShift supports. You can choose to use other web servers, such as Unicorn, Thin, or Passenger.

Now go to the Gemfile and add the following:


group :production do
  gem 'pg'
  gem 'puma', '2.11.1'

Run bundle install after that.

OpenShifting the Rails App

At this point, we want to create a new remote for our app. You need to run this command from the directory above your Rails app (~/parent-directory/rails-app). This is to prevent the creation of a new directory in your app:

rhc app-create tent ruby-2.0 postgresql-9.2

Note: ‘tent’ is the name of the app.

Edit the production configuration in database.yml as shown below:


  adapter: postgresql
  encoding: unicode
  pool: 5

Preparing to Deploy

Now let’s initialize our local repo:

cd tent
git init

Check the details of your app, you’ll need it for deployment:

rhc show-app tent


Get the git URL and replace GIT REMOTE URL with it in the following command:

git remote add openshift GIT REMOTE URL

Let’s merge the remote:

git pull openshift master

You should get a conflict in, we need to ensure it contains the default content. Open your and paste in the following:

#This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment', __FILE__)
run Rails.application

Then, commit your changes:

git add .
git commit -m "fixed conflict in"

I have created an .openshift directory as an example that you can find here. Extract it and override the .openshift directory in your app. The structure of this directory looks like:


The .openshift directory, located in the home directory of your app is a hidden directory where a user can create action hooks, set markers, and create cron jobs. Action hooks are scripts that are executed directly and can be written in Python, PHP, Ruby, bash, etc.

The example repository above also has a config folder with a puma.rb file. This file configures Puma and has the following content:


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


rackup DefaultRackup
environment ENV['RACK_ENV'] || 'development'

Copy this file to your local config directory.

Deploy the App

Push the app to the remote server:

git push openshift master

Note: If you get an error while pushing, repeat the pull request and push again.

Now your application is online. Just visit the application URL from your browser, which is For my ‘tent’ app, it’s:

Migrating the Database

To run a database migration, we need to ssh into our server and set it up:

rhc ssh tent
cd app-root/repo
bundle exec rake db:setup RAILS_ENV=production

If you experience any issues, you can always ssh into your server to fix it using these same commands. Remember that tent in the command above should be replaced with the name of your application.

Checking the Logs

If you ever encounter errors, you’ll want to access the application logs. To check the logs:

rhc ssh tent
vim ruby.log #or replace with postgresql.log

Changing the Web Server

The OpenShift ruby cartridge supports, by default, only Passenger running on Apache. But the Advanced Ruby cartridge allows you to use other popular servers, such as Puma, Unicorn, Thin, Rainbows, and, Passenger. In order to change it, we will use a feature of rhc which allows us to change environment variables. The name of your chosen web server lives in the OPENSHIFT_RUBY_SERVER environment variable.

To select Puma:

rhc env set OPENSHIFT_RUBY_SERVER=puma -a tent

To take effect, you have to restart the application:

rhc app restart tent

You can check which server is running by using this command:

rhc ssh tent '~/advanced-ruby/bin/control server'

If you are using a Gemfile, ensure you have added the appropriate gem of your selected web server. In this case, it looks like:


group :production do
  gem 'puma', '2.11.1'


There are lots of options for hosting a Rails app besides OpenShift. There is a post on SitePoint about Shelly Cloud by Jesse Herrick. Here’s another post on deploying a Rails application to Amazon Web Services (AWS) . Of course, there’s always Heroku. Now, I can recommend OpenShift as a hosting provider for easy deployment.

CSS Master, 3rd Edition