Setup Mojolicious using Vagrant
Tags: perl, mojolicious, vagrant
Published: 2021-02-16 13:42:48

In this article, we cover how to set up the Mojolicious development environment using the Vagrant.

We also cover:

- Installation of VirtualBox
- Installation of Vagrant
- Create Vagrantfile
- Execute vagrant

# Vagrant Introduction

A Vagrant is a tool focused on giving a uniform development environment across different operating systems. It manages virtual machine environments and lowers the development environment setup time. It also helps in getting rid of the "**works on my machine**" phrase commonly used by software developers.

## Installation

Before installing Vagrant, we need to install VirtualBox on our operating systems. 

If you are using MacOS, 

```shell
brew update && brew upgrade
brew install virtualbox # Virtualbox installation
brew install vagrant    # Vagrant Installation
```

On Debian/Ubuntu OS,

```shell
sudo apt update
sudo apt install virtualbox
sudo apt install vagrant
```

On RHEL/CentOS

```shell
yum install virtualbox
yum install vagrant
```

To verify that the installation, run the following command that will print the Vagrant version:

```shell
vagrant --version
```

```shell
#Output
Vagrant 2.2.14
```

# Getting Started

Setting up the vagrant is fairly easy. We need to create a new directory to setup the root of the application.

```shell
mkdir vagrant_mojo
cd vagrant_mojo
```

Setup the Vagrantfile

```shell
vagrant init
```

Above command creates Vagrantfile in the current diretory i.e. **vagrant_mojo**

```shell
#Output
A Vagrantfile has been placed in this directory. You are now
ready to vagrant up your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
vagrantup.com for more information on using Vagrant.
```

Clear all the content of the 'Vagrantfile'

```shell
Vagrant.configure("2") do |config|
	config.vm.box = "generic/ubuntu2004"
	config.disksize.size = '25GB'
	config.vm.network "forwarded_port", guest: 80, host: 8080
	config.vm.network "forwarded_port", guest: 443, host: 8443
	# Can access 3000 port from parent OS
	config.vm.network "forwarded_port", guest: 3000, host: 3000
	
	# mysql
  config.vm.network "forwarded_port", guest: 3306, host: 30306
  
  # If you are using postgres uncheck this
  # config.vm.network "forwarded_port", guest: 5432, host: 54320
  
  # For SSH
  config.ssh.forward_agent = true
  
  # Current folder is synced with the Vagrant VM /vagrant_data directory
  config.vm.synced_folder "./", "/vagrant_data"
  
  config.vm.provider "virtualbox" do |vb|
  	vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
  	vb.memory = "5192"
  end
  
  # IMPORTANT: Vagrant run this shell script setup.sh during the configuration.
  config.vm.provision:shell, path: "setup.sh"
end
	
```

Create a new file **setup.sh** and update the following content

```shell
#!/bin/bash

install_mojolicious() {
  echo "Installing Mojolicious"
  sudo curl -L https://cpanmin.us | perl - -M https://cpan.metacpan.org -n Mojolicious
}

install_mysql() {
  echo "Installing MariaDB on vagrant machine"
  sudo apt update
  sudo apt install mariadb-server -y
}

install_perl_module() {
	echo "Installing the Perl Module"
  sudo cpan install DateTime -y
  sudo cpan install DBIx::Class -y
  sudo cpan install Crypt::PBKDF2 -y
  sudo cpan install Mouse -y
  sudo cpan install Email::Valid -y
  sudo cpan install Mojolicious::Plugin::Authentication -y
  sudo cpan install Mojolicious::Plugin::StaticCache -y
}

setup_mojolicious() {
# Setting up the Mojolicious APP
	cd /vagrant_data
	mojo generate app vagrant_mojo
}

main() {
  install_mojolicious
  install_mysql
  install_perl_module
  setup_mojolicious
}
main
```

Save and exit the file. And run the following command.

```shell
vagrant up
```

This will take a little time to finish it up.  Once the installation is done.  Mojo app is already created under the "/vagrant_data".

```shell
vagrant ssh
cd /vagrant_data/vagrant_mojo
morbo script/vagrant_mojo
```

It will start the webserver at http://127.0.0.1:3000. Go to you browser of the operating system and type **http://localhost:3000**. 

Now, you can do any changes from your main OS under the synced directory. It will change the app by default in ubuntu OS (VirtualBox). It also preserves the environment from regular OS updates.