{"id":10206,"date":"2016-01-15T16:11:06","date_gmt":"2016-01-15T14:11:06","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=10206"},"modified":"2016-01-10T00:12:59","modified_gmt":"2016-01-09T22:12:59","slug":"running-rails-application-deis","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/","title":{"rendered":"Running a Rails Application on Deis"},"content":{"rendered":"<p>In the last couple of years, we have seen a lot of development in the devops field. It\u2019s becoming much easier for developers to provision servers and deploy their applications on those servers just with a couple of key strokes. Since the start of the SaaS and PaaS products (even before we knew them as that), we have seen a vast number of companies and communities try to make our lives easier by developing smart tools that will fit into our workflow seamlessly.<\/p>\n<p>As a side effect, or perhaps intentionally, we\u2019ve also seen the open-source community create tools to not just make the workflow easier but to cut costs and enable us to make great software without thinking about the costs of the hardware.<\/p>\n<p>Amazon with its huge selection of web services (<a href=\"https:\/\/aws.amazon.com\/\">AWS<\/a>) and the like have made our lives much easier when it comes to incorporating infrastructure and tools in the cloud. Then there are <a href=\"https:\/\/www.chef.io\/chef\/\">Chef<\/a> and <a href=\"https:\/\/puppetlabs.com\/\">Puppet<\/a> that made provisioning servers a breeze. Then came containerization in the form of <a href=\"https:\/\/www.docker.com\/\">Docker<\/a>, although some would argue that containers, or at least the idea around them, existed well before Docker came along.<\/p>\n<h2>Enter Deis<\/h2>\n<p>The newest addition to this collection of tools is <a href=\"http:\/\/deis.io\/\">Deis<\/a>. This lightweight application platform deploys and scales <a href=\"http:\/\/docs.deis.io\/en\/latest\/understanding_deis\/concepts\/#concepts-twelve-factor\">Twelve-Factor<\/a> apps as <a href=\"http:\/\/docs.deis.io\/en\/latest\/understanding_deis\/concepts\/#concepts-docker\">Docker containers<\/a> across a cluster of <a href=\"http:\/\/docs.deis.io\/en\/latest\/understanding_deis\/concepts\/#concepts-coreos\">CoreOS<\/a> machines. Deis will wrap a release of your application in a Docker container and deploy it to one (or multiple) machines running on CoreOS.<\/p>\n<p>After that, you will be able to scale, manage, limit, and do much more to your application. Also, because Deis is an application platform, you as an administrator can change and customize the platform itself. It\u2019s basically having your own, self-hosted <a href=\"https:\/\/www.heroku.com\/\">Heroku<\/a>. The folks at <a href=\"https:\/\/www.engineyard.com\/\">Engine Yard<\/a>, and all the contributors that created Deis, have done a marvelous job.<\/p>\n<h3>Preparing for Deis<\/h3>\n<p>To get some things straight from the start, this tutorial will be about running a Rails application on Deis. If you haven\u2019t seen the concepts and architecture that powers Deis, I recommend checking out the <a href=\"http:\/\/docs.deis.io\/en\/latest\/understanding_deis\/\">Understanding Deis<\/a> page. If you do not have Deis installed and would like to follow this tutorial as you read, you can head over to the <a href=\"http:\/\/docs.deis.io\/en\/latest\/installing_deis\/#installing-deis\">installation guide<\/a>.<\/p>\n<p>To run Deis smoothly, you\u2019ll need a cluster of servers, three at minimum. Although Deis comes with Vagrantfiles that can provision and install the platform on virtual machines, I strongly recommend using servers in the cloud if you don\u2019t have a very powerful computer. I tried using Vagrant on my MacBook Air 2013, and let\u2019s just say it didn\u2019t go well. For this tutorial, I used AWS, but <a href=\"http:\/\/docs.deis.io\/en\/latest\/installing_deis\/quick-start\/#choose-a-provider\">the documentation has instructions<\/a> on installing Deis on any of the most popular cloud providers.<\/p>\n<h3>Preparing for the application<\/h3>\n<p>Before we start, there\u2019s a bit to know about deploying applications on Deis. Any applications or service that can be run inside a Docker container can be deployed to Deis. In order to be scaled horizontally, applications must follow <a href=\"http:\/\/12factor.net\/\">Heroku\u2019s Twelve-Factor methodology<\/a> and store state in external backing services.<\/p>\n<p>This means that data should be written to a database, images should not be persisted to the local filesystem (they should be uploaded to a cloud provider), dependencies should be isolated, logging should be enabled, and so on. By complying to these 12 factors, you can easily scale your application inside Deis on demand.<\/p>\n<p>On the bright side, most modern applications are stateless, have proper logging, and have nicely isolated external services and dependencies. This makes them horizontally scalable inside Deis.<\/p>\n<p>The application that we\u2019ll be using for this tutorial is <a href=\"https:\/\/github.com\/railstutorial\/sample_app_rails_4\">a sample made by Michael Hartl<\/a>, for his book <em>Ruby On Rails Tutorial (3rd ed)<\/em>. It\u2019s basically a minimal Twitter clone, where users can register, follow other users, and post microposts. Users can also change their profile settings and view their profiles and the profiles of other users on the application.<\/p>\n<h2>Deploying a Ruby Application on Deis<\/h2>\n<p>Deis as a PaaS allows multiple ways of deploying an application.<\/p>\n<p>The first is using buildpacks. These pieces of software are basically scripts that prepare your code for execution by the Deis controller. Buildpacks are useful if you\u2019re interested in following Heroku\u2019s best practices for building applications or if you\u2019re deploying an application that already runs on Heroku. This can make the transition from Heroku to Deis seamless.<\/p>\n<p>Deployment is very easy, just like on Heroku. From the project directory, we need to register a new application on Deis. This is done by running:<\/p>\n<pre class=\" brush:php\">deis create<\/pre>\n<p>You will see an output similar to this:<\/p>\n<pre class=\" brush:php\">Creating Application... done, created aerial-nonesuch\r\nGit remote deis added\r\nremote available at ssh:\/\/git@deis.mydomain.com:2222\/aerial-nonesuch.git<\/pre>\n<p>Note that the URL and the application name might be different in your case. When you run the <code>deis create<\/code> command, Deis will not only register a new application, but it will also add a new git remote to your repo with the name <code>deis<\/code>. This is the remote where we will push our code to be deployed. It\u2019s just like Heroku, where the Heroku toolbelt adds a new remote called <code>heroku<\/code>.<\/p>\n<p>After creating the application on Deis, the next thing to do is to deploy the application by Git push:<\/p>\n<pre class=\" brush:php\">sample_app_rails_4 git:(master) git push deis master\r\nCounting objects: 948, done.\r\nDelta compression using up to 4 threads.\r\nCompressing objects: 100% (484\/484), done.\r\nWriting objects: 100% (948\/948), 429.01 KiB | 0 bytes\/s, done.\r\nTotal 948 (delta 428), reused 941 (delta 424)\r\n-----&gt; Ruby app detected\r\n-----&gt; Compiling Ruby\/Rails\r\n-----&gt; Using Ruby version: ruby-2.0.0\r\n-----&gt; Installing dependencies using bundler 1.9.7\r\n       Running: bundle install --without development:test --path vendor\/bundle --binstubs vendor\/bundle\/bin -j4 --deployment\r\n       Fetching gem metadata from https:\/\/rubygems.org\/...........\r\n       Fetching version metadata from https:\/\/rubygems.org\/...\r\n       Fetching dependency metadata from https:\/\/rubygems.org\/..\r\n       * gems omitted *\r\n       Bundle complete! 28 Gemfile dependencies, 51 gems now installed.\r\n       Gems in the groups development and test were not installed.\r\n       Bundled gems are installed into .\/vendor\/bundle.\r\n       Bundle completed (29.38s)\r\n       Cleaning up the bundler cache.\r\n-----&gt; Writing config\/database.yml to read from DATABASE_URL\r\n       Detected manifest file, assuming assets were compiled locally\r\n\r\n       ###### WARNING:\r\n       No Procfile detected, using the default web server (webrick)\r\n       https:\/\/devcenter.heroku.com\/articles\/ruby-default-web-server\r\n\r\n-----&gt; Discovering process types\r\n       Default process types for Ruby -&gt; rake, console, web, worker\r\n-----&gt; Compiled slug size is 26M\r\n\r\n-----&gt; Building Docker image\r\nremote: Sending build context to Docker daemon 28.13 MB\r\nStep 0 : FROM deis\/slugrunner\r\n# Executing 3 build triggers\r\nTrigger 0, RUN mkdir -p \/app\r\nStep 0 : RUN mkdir -p \/app\r\n ---&gt; Using cache\r\nTrigger 1, WORKDIR \/app\r\nStep 0 : WORKDIR \/app\r\n ---&gt; Using cache\r\nTrigger 2, ADD slug.tgz \/app\r\nStep 0 : ADD slug.tgz \/app\r\n ---&gt; 3da1998b04a2\r\nRemoving intermediate container 3286b3de2ee2\r\nStep 1 : ENV GIT_SHA 0f9caa12bf8315633b6ff366e638d29f349c8ee2\r\n ---&gt; Running in 3eb69115c0d9\r\n ---&gt; 475d97558564\r\nRemoving intermediate container 3eb69115c0d9\r\nSuccessfully built 475d97558564\r\n-----&gt; Pushing image to private registry\r\n\r\n-----&gt; Launching...\r\n       done, sample:v2 deployed to Deis\r\n\r\n       http:\/\/sample.mydomain.com\r\n\r\n       To learn more, use `deis help` or visit http:\/\/deis.io\r\n\r\nTo ssh:\/\/git@deis.mydomain.com:2222\/sample.git\r\n * [new branch]      master -&gt; master<\/pre>\n<p>A small disclaimer: Parts of the output have been omitted to save up some space. Also, note that your output might be different. Nevertheless, let\u2019s analyze the output we received from the deploy.<\/p>\n<p>First, we can see that we pushed our code to a git repository. Then, Deis recognized our application as a Rails app and used a buildpack for Ruby on Rails applications. It created our bundle by fetching the required gems for our app from <a href=\"https:\/\/rubygems.org\/\">RubyGems<\/a> (the output is omitted to save space).<\/p>\n<p>After it completes the bundle, it changes the <code>DATABASE_URL<\/code> variable in the <code>config\/database.yml<\/code> file. It basically expects our application to have a database set up. If you haven\u2019t noticed, we still haven\u2019t mentioned anything about a database. We will look into this in a moment.<\/p>\n<p>The next step is booting the server. Since the sample application does not have a <code>Procfile<\/code>, it boots our application using <a href=\"https:\/\/rubygems.org\/gems\/webrick\/versions\/1.3.1\">Webrick<\/a> by default. If we wanted to boot our application using a different server, we could have added a <code>Procfile<\/code> with the commands needed to boot our app on that particular server.<\/p>\n<p>This is where it gets interesting. In the next step, Deis containerizes our application with Docker. The Docker image that it creates is based off of <a href=\"https:\/\/hub.docker.com\/r\/deis\/slugrunner\/\">deis\/slugrunner<\/a>. Slugrunner takes a gzipped tarball of a \u201ccompiled\u201d application via stdin or from a URL, letting you run a command in that application environment or start a process defined in the application Procfile.<\/p>\n<p>If you take a look at the logs above, you\u2019ll notice that <code>slugrunner<\/code> first creates the <code>\/app<\/code> path and changes the working directory to it. Then it adds the <code>slug.tgz<\/code> file to <code>\/app<\/code>. With each step, it creates an intermediate container, which it removes at the end. When the container build is finished, <code>slugrunner<\/code> boots up the application.<\/p>\n<p>At the end of the output, we get an informative message with the URL where the application resides, with some other informative links in addition. But if we point our browser to the URL, we\u2019ll get an error. Why, what\u2019s going on?<\/p>\n<h2>Debugging and Attaching a Database<\/h2>\n<p>With the last step, we deployed the application. Although the deploy went smooth, the application is still not working. How can we debug this?<\/p>\n<p>Just like with Heroku, viewing the logs on Deis is really easy. In the application directory, you can run: <code>deis logs -n 100<\/code><\/p>\n<p>This will send the last 100 lines of the logs of the application to STDOUT. In the logs, you\u2019ll notice the following lines:<\/p>\n<pre class=\" brush:php\">sample[web.1]: =&gt; Booting WEBrick\r\nsample[web.1]: =&gt; Rails 4.0.8 application starting in production on http:\/\/0.0.0.0:5000\r\nsample[web.1]: =&gt; Run `rails server -h` for more startup options\r\nsample[web.1]: =&gt; Ctrl-C to shutdown server\r\nsample[web.1]: Exiting\r\nsample[web.1]: (erb):9:in `rescue in &lt;main&gt;': Invalid DATABASE_URL (RuntimeError)<\/pre>\n<p>This tells us that Deis tried to boot the application, but it\u2019s missing the <code>DATABASE_URL<\/code> environment variable which crashes the application. This means that we just need to add an additional configuration to our Deis application. Adding a new environment variable is done via:<\/p>\n<pre class=\" brush:php\">deis config:set ENV_VAR_NAME=value<\/pre>\n<p>Or, in our case, we need to run:<\/p>\n<pre class=\" brush:php\">deis config:set DATABASE_URL=\"some-url-here\"<\/pre>\n<p>But since we don\u2019t have a database running, we don\u2019t know the database url. Let\u2019s spin up a database instance for this application.<\/p>\n<p>There\u2019s a slight problem with this. At the moment of writing this tutorial, Deis does not have an addon\/plugin system like <a href=\"https:\/\/elements.heroku.com\/addons\">Heroku\u2019s Add-ons<\/a>. This means that we can use any \u201cdatabase as a service\u201d provider. Another approach is using the official <a href=\"https:\/\/hub.docker.com\/_\/postgres\/\">Postgres Docker image<\/a> and deploying it to a Amazon EC2 instance. There\u2019s a plethora of options, but for this blog post we will take a very simple (or lazy, if you will) approach.<\/p>\n<p>We will use <a href=\"https:\/\/postgres.heroku.com\/\">Heroku\u2019s Postgres platform<\/a>. The Postgres platform allows us to create a Postgres database with literally two clicks.<\/p>\n<p>When a new database is created, we can grab the database URL from the settings page and add it as an environment variable to our Deis-hosted application:<\/p>\n<pre class=\" brush:php\">deis config:set DATABASE_URL=\"postgres:\/\/username:password@ec2.compute-1.amazonaws.com:some-port\/dbname\"<\/pre>\n<p>The whole flow looks just like adding the Postgres plugin to a Heroku application. After the environment variable has been set, you can simply run:<\/p>\n<pre class=\" brush:php\">deis run \"rake db:migrate\"<\/pre>\n<p>This will execute the migrations, and our application is ready to be used! Head over to <code>http:\/\/sample.&lt;your-domain-here&gt;.com<\/code> to see the application deployed to your Deis cluster.<\/p>\n<h3>Deploying the application using a Dockerfile<\/h3>\n<p>Another option supported by Deis is deployment via a Dockerfile. This is a powerful way to define a portable execution environment built on a base OS of your choosing.<\/p>\n<p>A Dockerfile automates the steps for the creation of a Docker image. However, Dockerfiles must conform to some Deis rules:<\/p>\n<ul>\n<li>The Dockerfile must EXPOSE only one port.<\/li>\n<li>The port must be listening for an HTTP connection.<\/li>\n<li>A default CMD must be specified for running the container.<\/li>\n<\/ul>\n<p>Since our sample application does not have a Dockerfile that we can use, we need to create one. If you do not know how to build a Dockerfile for your Rails application, check out these two posts:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.webcodegeeks.com\/web-development\/running-rails-development-environment-docker\/\">Running a Rails Development Environment in Docker<\/a><\/li>\n<li><a href=\"http:\/\/www.webcodegeeks.com\/ruby\/deploying-docker-rails-app\/\">Deploying Your Docker Rails App<\/a><\/li>\n<\/ul>\n<p>For this Rails application we will use the following Dockerfile:<\/p>\n<pre class=\" brush:php\">FROM ruby:2.0\r\n\r\n# Install apt based dependencies required to run Rails as \r\n# well as RubyGems. As the Ruby image itself is based on a \r\n# Debian image, we use apt-get to install those.\r\nRUN apt-get update &amp;&amp; apt-get install -y \\ \r\n  build-essential \\ \r\n  nodejs\r\n\r\n# Configure the main working directory. This is the base \r\n# directory used in any further RUN, COPY, and ENTRYPOINT \r\n# commands.\r\nRUN mkdir -p \/app \r\nWORKDIR \/app\r\n\r\n# Copy the Gemfile as well as the Gemfile.lock and install \r\n# the RubyGems. This is a separate step so the dependencies \r\n# will be cached unless changes to one of those two files \r\n# are made.\r\nCOPY Gemfile Gemfile.lock .\/ \r\nRUN gem install bundler &amp;&amp; bundle install --without development test --jobs 20 --retry 5\r\n\r\n# Set environment to production\r\nENV RAILS_ENV production \r\nENV RACK_ENV production\r\n\r\n# Copy the main application.\r\nCOPY . .\/\r\n\r\n# Copy config\/database.yml.prod to config\/database.yml\r\nCOPY config\/database.yml.prod config\/database.yml\r\n\r\n# Precompile Rails assets\r\nRUN bundle exec rake assets:precompile\r\n\r\n# Expose port 3000 to the Docker host, so we can access it \r\n# from the outside.\r\nEXPOSE 3000\r\n\r\n# The main command to run when the container starts. Also \r\n# tell the Rails dev server to bind to all interfaces by \r\n# default.\r\nENTRYPOINT [\"bundle\", \"exec\", \"rails\", \"server\", \"-e\", \"production\"]<\/pre>\n<p>The Dockerfile is quite simple; the base image is <code>ruby:2.0<\/code>. Next, we install the <code>build-essential<\/code> package, which is a reference for all the packages needed to compile a Debian package. Then, we install a JavaScript runtime: <code>nodejs<\/code>.<\/p>\n<p>After that, the Dockerfile will create the <code>\/app<\/code> directory which will be the home of our application and will change the working directory to it. Then the Gemfile and the Gemfile.lock files are copied, and the bundle is installed. The whole source code is copied to the image, the 3000 port is exposed, and the Rails server is booted.<\/p>\n<p>If we commit our Dockerfile to the repository and push it to Deis, you\u2019ll notice that Deis will pick up the Dockerfile, and it will not use the Rails buildpack to deploy the application. Instead, Deis will use all of the instructions from the Dockerfile.<\/p>\n<p>This is a neat feature of Deis, because Dockerfiles provide more flexibility to the deployment itself. As you can see, you can do pretty much anything to the base operating system, by changing configurations, exposing ports, installing additional packages, and running any command.<\/p>\n<h3>Deploying the application using a Docker image<\/h3>\n<p>A third option for deploying Rails applications in Deis is using a Docker image. As the documentation states, this is useful for integrating Deis into Docker-based CI\/CD pipelines. This means that you can build the image locally and ship the image wherever you want. Deis can pull the image from both public and private registries.<\/p>\n<p>Let\u2019s build an image using the Dockerfile from the last step. The command to build an image from a Dockerfile is:<\/p>\n<pre class=\" brush:php\">docker build -t &lt;your-username&gt;\/&lt;image-name&gt; .<\/pre>\n<p>In our case, we can run it as:<\/p>\n<pre class=\" brush:php\">docker build -t &lt;your-username&gt;\/sample-rails-application .<\/pre>\n<p>When Docker finishes building the image, we can push it to <a href=\"https:\/\/hub.docker.com\/\">DockerHub<\/a> or a private registry:<\/p>\n<pre class=\" brush:php\">docker push &lt;your-username&gt;\/sample-rails-application<\/pre>\n<p>Since the hard work with the Dockerfile is already done and the image is pushed to DockerHub, we can just ask Deis to pull the image from the registry and deploy it:<\/p>\n<pre class=\" brush:php\">deis pull &lt;your-username&gt;\/sample-rails-application:latest<\/pre>\n<h2>Configuring the Application<\/h2>\n<p>Deis makes configuring your applications quite easy. One way that I already mentioned is to set environment variables.<\/p>\n<p>From the command line, you can see all the available commands for modifying environment variables:<\/p>\n<pre class=\" brush:php\">deis help config\r\n\r\nValid commands for config:\r\n\r\nconfig:list        list environment variables for an app\r\nconfig:set         set environment variables for an app\r\nconfig:unset       unset environment variables for an app\r\nconfig:pull        extract environment variables to .env\r\nconfig:push        set environment variables from .env\r\n\r\nUse 'deis help [command]' to learn more.<\/pre>\n<p>When we were attaching the database as a backing service, we used the following command:<\/p>\n<pre class=\" brush:php\">deis config:set DATABASE_URL=\"some-url-here\"<\/pre>\n<p>As you can see above, Deis even allows you to download all of the environment variables in a <code>.env<\/code> file, so you can start the application locally with the same configuration.<\/p>\n<h3>Use a custom domain<\/h3>\n<p>Using a custom domain for a Deis app is very easy. You can use the <code>deis domains<\/code> command to configure custom domains for an application. Adding a custom domain is done via:<\/p>\n<pre class=\" brush:php\">deis domains:add new-domain.com<\/pre>\n<p>Next, you need to head over to your DNS registrar and set up a CNAME for the new domain to the old one. For example, if the old subdomain for the application was <code>sample.your-domain.com<\/code>, you need make <code>new-domain.com<\/code> be a CNAME to <code>sample.your-domain.com<\/code>.<\/p>\n<h2>Conclusion<\/h2>\n<p>Deis is a super powerful platform, and it\u2019s super configurable. You can do backups and data restores, configure the load balancers, view the logs, monitor the platform with external tools, add SSL to the platform, and so much more. If you want to dig deeper in Deis and see all its customizability and power, I recommend reading the very detailed and helpful <a href=\"http:\/\/docs.deis.io\/en\/latest\/toctree\/#toctree\">documentation<\/a>.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/blog.codeship.com\/running-a-rails-application-on-deis\/\">Running a Rails Application on Deis<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/join-us\/wcg\/\">WCG partner<\/a> Florian Motlik at the <a href=\"http:\/\/blog.codeship.com\/\">Codeship Blog<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In the last couple of years, we have seen a lot of development in the devops field. It\u2019s becoming much easier for developers to provision servers and deploy their applications on those servers just with a couple of key strokes. Since the start of the SaaS and PaaS products (even before we knew them as &hellip;<\/p>\n","protected":false},"author":125,"featured_media":4127,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[95],"class_list":["post-10206","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ruby","tag-rails"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Running a Rails Application on Deis - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"In the last couple of years, we have seen a lot of development in the devops field. It\u2019s becoming much easier for developers to provision servers and\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Running a Rails Application on Deis - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"In the last couple of years, we have seen a lot of development in the devops field. It\u2019s becoming much easier for developers to provision servers and\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-15T14:11:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/04\/rubyonrails-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ilija Eftimov\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@fteem\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ilija Eftimov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/\"},\"author\":{\"name\":\"Ilija Eftimov\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/b0a347492d44c5dca7501616667317ff\"},\"headline\":\"Running a Rails Application on Deis\",\"datePublished\":\"2016-01-15T14:11:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/\"},\"wordCount\":2229,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/04\/rubyonrails-logo.jpg\",\"keywords\":[\"Rails\"],\"articleSection\":[\"Ruby\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/\",\"name\":\"Running a Rails Application on Deis - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/04\/rubyonrails-logo.jpg\",\"datePublished\":\"2016-01-15T14:11:06+00:00\",\"description\":\"In the last couple of years, we have seen a lot of development in the devops field. It\u2019s becoming much easier for developers to provision servers and\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/04\/rubyonrails-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/04\/rubyonrails-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/ruby\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Running a Rails Application on Deis\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/b0a347492d44c5dca7501616667317ff\",\"name\":\"Ilija Eftimov\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4e15cb15248ba112c8d6a3925d4fc237bdff4bfe078c886aa91194df713bf771?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4e15cb15248ba112c8d6a3925d4fc237bdff4bfe078c886aa91194df713bf771?s=96&d=mm&r=g\",\"caption\":\"Ilija Eftimov\"},\"description\":\"Ilija is a full-stack Ruby on Rails developer working as a consultant at Siyelo. He loves experimenting with Ruby and Rails. Blogs regularly at rubylogs.com.\",\"sameAs\":[\"http:\/\/rubylogs.com\/\",\"https:\/\/x.com\/fteem\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/ilija-eftimov\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Running a Rails Application on Deis - Web Code Geeks - 2026","description":"In the last couple of years, we have seen a lot of development in the devops field. It\u2019s becoming much easier for developers to provision servers and","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/","og_locale":"en_US","og_type":"article","og_title":"Running a Rails Application on Deis - Web Code Geeks - 2026","og_description":"In the last couple of years, we have seen a lot of development in the devops field. It\u2019s becoming much easier for developers to provision servers and","og_url":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2016-01-15T14:11:06+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/04\/rubyonrails-logo.jpg","type":"image\/jpeg"}],"author":"Ilija Eftimov","twitter_card":"summary_large_image","twitter_creator":"@fteem","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Ilija Eftimov","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/"},"author":{"name":"Ilija Eftimov","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/b0a347492d44c5dca7501616667317ff"},"headline":"Running a Rails Application on Deis","datePublished":"2016-01-15T14:11:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/"},"wordCount":2229,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/04\/rubyonrails-logo.jpg","keywords":["Rails"],"articleSection":["Ruby"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/","url":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/","name":"Running a Rails Application on Deis - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/04\/rubyonrails-logo.jpg","datePublished":"2016-01-15T14:11:06+00:00","description":"In the last couple of years, we have seen a lot of development in the devops field. It\u2019s becoming much easier for developers to provision servers and","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/04\/rubyonrails-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/04\/rubyonrails-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/ruby\/running-rails-application-deis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Ruby","item":"https:\/\/www.webcodegeeks.com\/category\/ruby\/"},{"@type":"ListItem","position":3,"name":"Running a Rails Application on Deis"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/b0a347492d44c5dca7501616667317ff","name":"Ilija Eftimov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4e15cb15248ba112c8d6a3925d4fc237bdff4bfe078c886aa91194df713bf771?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4e15cb15248ba112c8d6a3925d4fc237bdff4bfe078c886aa91194df713bf771?s=96&d=mm&r=g","caption":"Ilija Eftimov"},"description":"Ilija is a full-stack Ruby on Rails developer working as a consultant at Siyelo. He loves experimenting with Ruby and Rails. Blogs regularly at rubylogs.com.","sameAs":["http:\/\/rubylogs.com\/","https:\/\/x.com\/fteem"],"url":"https:\/\/www.webcodegeeks.com\/author\/ilija-eftimov\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/10206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/125"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=10206"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/10206\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/4127"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=10206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=10206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=10206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}