alexis boissonnat.

ab.

#Devops

Improving the interactions and relationship between development and IT operations gives us more effective delivery and production systems that are more stable and maintainable. Creating a DevOps culture requires attention to team organization, work practices, reporting lines, and incentives - leading to joint responsibility for faster and safer delivery.

Due to our team size, I did not have no other choice than integrating devops principles and apply them all along my development process.

Deploy RoR application on Apache with Capistrano

May 13, 2015

This tutorial assumes that you already have a working installation of an Apache server.

Install Phusion Passenger

Phusion Passenger has been by far the easiest way I’ve found for managing multiple Rails application instances on top of either Apache or Nginx. It comes as a gem and has custom modules for both major web servers.

# Install gem
$> gem install passenger
# Install passenger for apache2 (then follow the instructions)
$> passenger-install-apache2-module

Then you will need to update your apache configuration (as in the passenger instructions).

First, create a file called /etc/apache2/mods-available/passenger.load and input the following code :

# /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /home/boissonnat/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/passenger-4.0.59/buildout/apache2/mod_passenger.so

Second, create a file called /etc/apache2/mods-available/passenger.conf and input the following code :

# /etc/apache2/mods-available/passenger.conf
<IfModule mod_passenger.c>
  PassengerRoot /home/boissonnat/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/passenger-4.0.59
  PassengerDefaultRuby /home/boissonnat/.rbenv/versions/2.1.5/bin/ruby
</IfModule>

Then, enable the passenger module in Apache and restart the server.

$> sudo a2enmod passenger
$> sudo service apache2 restart
# Check passenger is activated :
$> apache2ctl -t -D DUMP_MODULES

PostgreSQL

Last but not least, you will need a DB engine. I mainly use PostgreSQL. Here is the installation process.

# install postgreSQL
$> sudo apt-get install postgresql-9.3
# Set the default password
$> sudo -u postgres psql postgres
\password

Capistrano

First create and init a new remote on your server

Capistrano needs git to update your code source. You can use any git repository as it is accessible from your server. Sometimes you could have a repository inside your local network and a server outside this network. In this case, your server will not be able to pull your code source. You can still create a git repository on your server, add it as a remote and push to it for capistrano. Here is how :

On server

# Server side
# Create a folder with the .git extension
$> mkdir myapp.git
# Init a bare git repository
$> cd myapp.git
$> git init --bare

On local

# Client side
# Note here we call this new remote 'preprod'
$> git remote add preprod bob@your.server:/somewhere/myapp.git
# Then push your branch (use to the preprod) to this new repository
$> git push preprod master

Capify your application

Add this following code into your Gemfile

group :development do
    gem 'capistrano'
end

And then :

$> cd /path/to/your/app
$> bundle

And finally :

$> cd /path/to/your/app
$> cap install

Capistrano settings

Capistrano is very well documented. By following the comments, first edit your /config/deploy.rb and then your specific environments settings in config/deploy/my_env.rb

Setup Apache

You need to create and setup permissions for the folder which will be used to deploy your app.

# Create the folder
$> mkdir /var/www/myapp
# Set the group to www-data (the apache group)
$> sudo chgrp -R www-data /var/www/myapp
# Set the user to your deployer user
$> sudo chown -R yourdeployer /var/www/myapp
# Allow group to update the folder
$> sudo chmod -R 775 /var/www/myapp

Then you need to create a virtual host to your current folder. Create a new file called myapp.conf in /etc/apache2/site-available

$> touch /etc/apache2/site-available/myapp.conf
$> nano /etc/apache2/site-available/myapp.conf
<VirtualHost *:80>
        ServerName www.yourhost.com
        # In case of several virtual host based on path :
          # ServerName IP
          # ServerPath /path/
        DocumentRoot /var/www/myapp/current/public
        <Directory /var/www/myapp/current/public>
                # This relaxes Apache security settings.
                AllowOverride all
                # MultiViews must be turned off.
                Options -MultiViews
                # Uncomment this if you're on Apache >= 2.4:
                Require all granted
        </Directory>
</VirtualHost>

Don’t forget the .conf extension. Without this extension Apache is not able to treat it.

Finally, you need to activate your site :

$> sudo a2ensite myapp
# And reload apache
$> service apache2 reload

Deploy your application

$> cd /path/to/your/app
$> cap production deploy

Install Ruby on Rails on Ubuntu server

May 12, 2015

This article shows how to install ruby and rails on Ubuntu through rbenv

Install ruby

We are going to install Ruby through rbenv.

Install some dependencies for Ruby

The following set of dependencies just below contains everything you need to run Rails application on Ubuntu server. Look at them carefully.

$> sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties

Install rbenv

We prefer here to use rbenv instead of RVM to its permissions management. Let’s clone rbenv in home_dir

$> git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

Now we will add ~/.rbenv/bin to our $PATH for access to the rbenv command-line utility.

$> echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc

Add rbenv init to your shell to enable shims and autocompletion.

$> echo 'eval "$(rbenv init -)"' >> ~/.bashrc

Install ruby-build

Installing ruby-build as an rbenv plugin will give you access to the rbenv install command.

$> git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

Install Ruby versions

rbenv offers some useful command like list or install. Install the ruby version that suits you as simple as that :

# list all available versions:
$> rbenv install -l
# install a Ruby version:
$> rbenv install 2.1.5

Set the global version of Ruby

$> rbenv global 2.1.5

Installs shims for all Ruby executables known to rbenv (i.e., ~/.rbenv/versions//bin/). Run this command after you install a new version of Ruby, or install a gem that provides commands.

$> rbenv rehash

Install rails

Now Ruby is installed, you can install rails by typing :

# rails installation
$> gem install rails

# Or installing a specific version
$> gem install rails --version 4.2.0

# Activate rails executable
$> rbenv rehash

# Check rails installation (and version)
$> rails -v
Rails 4.2.0

Note

You don’t need to specify --no-ri --no-rdoc every time you install a gem in production: just add gem: --no-rdoc --no-ri to ~/.gemrc (create that file if it doesn’t already exist) and don’t worry about ri or rdoc again in production.

Use public RSA key for SSH connection

November 10, 2014

It is really useful to use a SSH connection through public key instead of having to type the password each time (especially if you are using a very complex password).

Create a .ssh folder on your server

First of all, server side, you need to create an .ssh folder in your home dir. This is where you will keep your public keys.

# server side
$> mkdir ~/.ssh

Copy your ssh key on the server

Then, you need to copy your public RSA key on the server. Remember that this public key belongs to a machine. If you plan on connecting to your server through several computers, you will need to reproduce this step for each of them.

# client side
$> cat ~/.ssh/id_rsa.pub | ssh bill@xxx.xxx.xxx.xxx 'cat - >> ~/.ssh/authorized_keys'

Update rights for user to use your public key

Change the permissions of the authorized_keys:

# server side
$> sudo chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh/