Basic DevOps for deploying an application in Ubuntu VPS

Datetime:2016-08-22 23:55:52          Topic:          Share

As a senior dev guy in the office, I am always asked to help in setting up production environment ready for VPS based on Ubuntu or any other Linux distributions. Today I will cover some basic knowledge that help you deploying your application in any Linux VPS even you are not a DevOps Engineer in your current company. This knowledge also helps you to move forward your dev career in a new shape. In this blog post I used Ubuntu 14.04 LTS as my host for showing and describing all the example commands.

Access to the VPS

Open the terminal and type the following command. Either you will have the password or you will be authenticated by SSH.

ssh root@xxx.xxx.xxx.xxx

The best practice is securing the server access with Public Key Authentication. Last part of this blog post I will explain about setting up the public key authentication.

Okay, you are now in the server. Before jumping on anything I would recommend you to run following command keep updated your server (I am writing this blog post assuming you have very less idea about Linux).

#For debian/Ubuntu Distro
sudo apt-get update; sudo apt-get upgrade
#For Red Hat/Fedora/CentOS Distro
yum -y update

User creation

This is always suggested to create an application deployer user after first time login to the VPS. Following command describes app as a user and the home directory path: /home/app

useradd -s /bin/bash -m -d /home/app -c "app user" app

On the above line I mentioned login shell by -s, the home directory of new user by -d, and comment for new account by -c with useradd command. Putting comment and home directory path is optional event you don’t put it will create by itself.

For creating a password for the app user, type following command and system will ask to type the password twice:

passwd app

Now, you need to grant permission to the app user in order to execute root level commands. Type:

visudo

New windows will open by vim or nano , whatever is the default text editor. And, add following line

app ALL=(ALL) ALL

User creation for deployment is done. Now login as app user to that VPS. Type:

su app

or you can quit from terminal and can login as app user via SSH

ssh app@xxx.xxx.xxx.xxx

Some Important tools installation

#For Debian/Ubuntu distro
sudo apt-get install git git-core build-essential
#Red Hat/CentOS
sudo yum -y group install git git-core "Development Tools"

Before doing anything I will recommend you update the distro. Run following commands

#For Debian/Ubuntu distro
sudo apt-get update
sudo apt-get upgrade
#Red Hat/CentOS
sudo yum upgrade

Definitely, you need a web server to handle the request and pass to your application. I like nginx over apache 2 web server. So, I will cover some basics of Nginx block. Btw, you need to install the nginx server first.

#For Debian/Ubuntu distro
sudo apt-get install nginx
#Red Hat/CentOS
sudo yum install nginx

Nginx block

Open a new file in the directory: /etc/nginx/sites-available with root privileges and a text editor.

sudo nano /etc/nginx/sites-available/example.com

Simple HTML app

server {
  server_name example.com;
  listen 80;
 
  access_log /var/log/nginx/example.com.access.log;
  error_log /var/log/nginx/example.com.error.log;
 
  root /home/app/example.com;
  index index.html index.htm;
 
  location / {
    try_files $uri /index.html;    
  }
}

Node, Ruby or PHP app with build-in server

server {
    listen 80;
    server_name example.com;
 
    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

You need to create a simulink of the block to the sites-enabled directory.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

Restart the Nginx

sudo /etc/init.d/nginx restart

You might need to update the iptables firewall in order to accept the request on 80 port.Just type the following command:

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Almost everything is done. Your VPS is ready to use. I will cover some extra. You can ignore this part.

https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04

Authentication by public key

Generate your SSH key pair. How to: https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/

Login as an app user (or the user you created before) to remove server again. It will take you to the home directory. Now run the following commands.

mkdir .ssh
chmod 700 .ssh

Open a new file: authorized_keys with a text editor and insert your public key (you already generated)

nano .ssh/authorized_keys  #you can use any editor such as VIM

Now, again restrict the permissions of the authorized_keys for security purpose. Run the following command.

chmod 600 .ssh/authorized_keys

I would also recommend you to disable the root login. Just make PermitRootLogin no at /etc/ssh/sshd_config and then restart SSH.

Some other tools

MySQL (RDBMS) Database Installation

#For Debian/Ubuntu distro
sudo apt-get install mysql-server
sudo mysql_secure_installation
sudo mysql_install_db
 
#Red Hat/CentOS
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum update
sudo yum install mysql-server
sudo systemctl start mysqld
sudo mysql_secure_installation

MongoDB (NoSQL) Database Installation

#For Debian/Ubuntu distro
sudo apt-get install -y mongodb-org
 
#Red Hat/CentOS
sudo yum install -y mongodb-org

You are now good to go with your VPS. Happy hacking ��