Create a Ruby on Rails application

How to create, deploy, and monitor your Rails apps with Moss

In this article we’ll see how Moss can create, deploy and monitor a Rails application. We’ll use Fat Free CRM as an example, but other Rails applications can be set up similarly. We also assume that you use git in your development workflow. 

Connect your server to Moss

If you haven’t done it yet, you must have at least one server in Moss. You must be the admin of your Moss’s organization in order to perform this step.

While it doesn’t make much difference, we note that the server we’ve used for this article runs Ubuntu 18.04.

Install Ruby

Now you must log into your server as user moss and install Ruby by any means you feel comfortable with. In this example, we’ll just use the software package that comes with Ubuntu 18.04 (note that Fat Free CRM supports Ruby 2.5).

local$ ssh moss@<server-ip>
$ sudo apt -y install ruby ruby-dev
$ ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]

You must be the admin of your Moss’s organization in order to perform this step.

Install your project’s dependencies

Also as user moss, install everything your project’s gems will require. In the case of Fat Free CRM, the following command applies:

$ sudo apt -y install libmagick++-dev libxml2 libxml2-dev libxslt1.1 libxslt1-dev libyaml-dev mysql-client libmysqlclient-dev libsqlite3-dev nodejs
$ sudo gem install bundle
$ exit

You must be the admin of your Moss’s organization in order to perform this step.

Create your site

Now we’re ready to create our website with Moss. Since Rails is not natively supported in Moss as of this writing, we’ll choose Static as the framework of the site – in this way, Moss won’t install any software that we won’t use in our server.

Create a database connection for your site. In this example, we’ll create database user fat and database fat_free_crm_production. Also use public as the root dir.

Click Create and Moss will start an operation to create your new site.

Deploy your site

Now it’s time to set up your git deployment.

Git repo

The git repo in this example is a fork of Fat Free CRM. The only difference with the upstream is that we’ve updated the file Gemfile.lock with the appropriate dependencies.

Everything not in your git repo must be specified as shared directories or files (files with secrets, user-generated content, application logs, etc). In the case of Fat Free CRM, we specify config/database.yml as a “Shared file”.

Shared paths

Since shared folders and files are not part of our git repo, we must provide them within the folder /home/<site-user>/sites/<your-site-name>/shared/. In this example, we have to create the file config/database.yml in our server with the appropriate content. In particular, it must contain the database name, database username, and database user password we created before. We must do this by logging into our server as the server user that owns our site:

local$ ssh <site-user>@<server-ip>
$ cd sites/fatfreecrm/
$ mkdir shared/config
$ cat > shared/config/database.yml <<EOF
---
development: &development
  adapter: mysql2
  encoding: utf8
  database: fat_free_crm_development
  pool: 5
  username: fat
  password: arandompass

test:
  <<: *development
  database: fat_free_crm_test

production:
  <<: *development
  database: fat_free_crm_production

staging:
  <<: *development
  database: fat_free_crm_staging
EOF

Deployment flow

Now we’ll tell Moss what commands it must run on our server in order to successfully build our application.

In this example we just need to provide a pre-activation script that installs all dependencies, runs database migrations, sets up an admin account, and compiles static assets.

export CI=true DB=mysql RAILS_ENV=production
bundle install --path vendor/bundle
rake db:migrate
rake ffcrm:setup:admin USERNAME=admin PASSWORD=something [email protected]
rake assets:precompile

Once this has been updated, click Deploy.

Start Rails application server

The command bin/rails server starts a Puma application server to run your Ruby application. By default it listens on http://127.0.0.1:3000.

Instead of blindly running such command in a deployment script, we’re going to create a Supervisor process that will restart Puma in case it hangs.

For this, please log into your server as user moss and run the following commands (first adapt the content of the configuration file to your app instead of Fat Free CRM).:

local$ ssh moss@<server-ip>
$ sudo su
$ cat > /etc/supervisor/conf.d/fatfreecrm-puma.conf <<EOF
[program:worker-fatfreecrm-puma]
process_name=%(program_name)s_%(process_num)02d
directory=/home/<site-user>/sites/fatfreecrm/current
environment=RAILS_ENV="production",DB="mysql",CI="true"
command=/home/<site-user>/sites/fatfreecrm/current/bin/rails server
autostart=true
autorestart=true
user=<site-user>
numprocs=1
redirect_stderr=true
stdout_logfile=/home/<site-user>/sites/fatfreecrm/logs/worker-fatfreecrm-puma.log
EOF
$ supervisorctl reload
$ exit
$ exit

Set up Nginx

At this point your application is deployed on your server and it’s reachable locally on port 3000. To make our app globally available, we just need to set up Nginx as a reverse proxy in front of Puma.

Please log into your server as user moss and run the following commands:

local$ sudo moss@<server-ip>
$ sudo su
$ cat >> /etc/openresty/server_params.fatfreecrm <<EOF

# Puma application server
#
location ~ /(.*) {
      proxy_pass  http://127.0.0.1:3000;
}
EOF

Finally, restart Nginx. If everything goes well, your site is ready to go live 😉

Now you can update the appropriate DNS records, wait for them to propagate, and check your application is working as expected.

In our case, we finally have a working deployment of Fat Free CRM with zero-downtime automatic deployments, automatic free HTTPS (via Let’s Encrypt certs), and zero-config monitoring & alerts 😀