Introduction
Automating Deployment of a Laravel LAMP Stack Application using Bash Script
introduces an efficient method for deploying web applications built with Laravel, a popular PHP framework known for its elegant syntax and powerful features.
In this article we’ll explore automating the deployment of a Laravel-based web application on a LAMP (Linux, Apache, MySQL, PHP)
stack using Bash Scripting. By automating this process, we can ensure consistency, reduce manual errors, and speed up deployment times. Whether you’re a developer aiming to simplify deployment or an operations engineer looking to streamline processes, this guide will walk you through the steps to automate your Laravel LAMP stack deployments effectively.
Prerequisites
- Ubuntu Server: Ensure you have an Ubuntu server instance set up and accessible.
- SSH Access: Ensure you can SSH into the Ubuntu server.
- Basic Linux Commands: Familiarity with basic Linux commands and the terminal.
Table of contents
- Introduction
- Prerequisites
- What is a Bash Script
- Automating Laravel LAMP Stack Installation
- Deploying Laravel Application
- Conclusion
What is a Bash Script
A Bash script is a text file containing a series of commands that are executed by the Bash shell (Bourne Again SHell), which is the default command-line interpreter for Unix-like operating systems, including Linux and macOS. Bash scripts are commonly used for automating repetitive tasks, system administration, and complex command-line operations. They can be executed directly from the command line or scheduled to run at specific times using cron jobs or other scheduling tools.
Automating Laravel LAMP Stack Installation
Step 1: Create a script file laravel.sh
and make it an executable.
touch laravel_app.sh && chmod +x laravel_app.sh
We will be using vim as our text editor but you can use nano if that’s what you’re familiar with
Step 2: Open the file in a text editor and press "i" to enter insert mode.
vim laravel_app.sh
Step 3: Let’s start writing our script first by declaring our shebang.
#!/bin/bash
Our script will be divided into functions to handle different tasks. You can declare your function in two ways
function setup() {
}
setup() {
}
and it consists of a
function declaration — “function” (optional)
function name — “setup”
function parameters — “( )” optional
code block — “{ }”
- The function parameter can be empty which means the function does not take any arguments
A function will not execute unless it is called. To call a function simply type out the function name (setup)
setup
Step 4: We need a way to keep track of the line our script is currently running so let’s manipulate the echo command output to make it interactive while running the script. Write a function that changes the colour of our echo output.
# Function to display messages in gold
function gold_echo() {
echo -e "\e[38;5;220m$@\e[0m"
}
Step 5: Write a function that installs the lamp stack (Apache, MySQL and PHP).
function install_lamp() {
# Install PHP
gold_echo "---------------------update php repository-----------------------"
sudo apt update
sudo add-apt-repository ppa:ondrej/php -y
gold_echo "-----------------------Installing Php8.2-----------------------------------------"
sudo apt install php8.2 -y
gold_echo "-------------------------------------Installing php dependencies----------------------------"
sudo apt install php8.2-curl php8.2-dom php8.2-mbstring php8.2-xml php8.2-mysql zip unzip -y
gold_echo "-------------------------- php done ----------------------------------"
#Install Apache web server
gold_echo "----------------------------Installing Apache--------------------------------------------------"
sudo apt install apache2 -y
sudo apt update
sudo systemctl restart apache2
#Install Mysql-server
gold_echo "------------------------------------Installing mysql-server----------------------------------------------"
sudo apt install mysql-server -y
}
Check if there are other PHP extensions that are not currently present in your server.
php -m
Laravel PHP extensions requirements:
✅ Ctype PHP Extension
❌ cURL PHP Extension
❌ DOM PHP Extension
✅ Fileinfo PHP Extension
✅ Filter PHP Extension
✅ Hash PHP Extension
❌ Mbstring PHP Extension
✅ OpenSSL PHP Extension
✅ PCRE PHP Extension
✅ PDO PHP Extension
✅ Session PHP Extension
✅ Tokenizer PHP Extension
❌ XML PHP Extension
The items marked in red were not currently present on my server, so I'll be install them.
sudo apt install php8.2-curl php8.2-dom php8.2-mbstring php8.2-xml php8.2-mysql zip unzip -y
We also need to install zip
and unzip
which will be needed later by composer
Step 6: Write a function to install and setup composer
function composer_setup() {
cd ~
if [ -d "$HOME/composer" ]; then
gold_echo "--------------------------------------Composer Directory Exists--------------------------------------------"
else
mkdir composer
cd composer
gold_echo "-------------------Directory created successfully--------------------------------"
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
gold_echo "------------------- Composer Added Successfully-------------------------"
fi
}
Step 7: Write a function that clones and setup laravel app
function setup_laravel_app() {
cd /var/www/
sudo rm -r ./*
sudo git clone https://github.com/laravel/laravel
sudo chown -R $USER:$USER laravel
cd laravel
#Install dependencies using composer
composer install
cp .env.example .env
php artisan key:generate
sudo chown -R www-data bootstrap/cache
sudo chown -R www-data storage
}
GitHub repo to laravel app
Step 8: Write a function that configures MySQL Server (create database and user)
function conf_mysql() {
cd /var/www/laravel
gold_echo "-------------Setup mysql database and user--------------------------------"
# Configure MySQL database
sudo mysql -uroot -e "CREATE DATABASE laravel_db;"
sudo mysql -uroot -e "CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY '000000';"
sudo mysql -uroot -e "GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost';"
sudo mysql -uroot -e "FLUSH PRIVILEGES;"
gold_echo "-----------------Done with database setup--------------"
gold_echo "------------------Editing .env file--------------------"
sed -i 's/DB_CONNECTION=sqlite/DB_CONNECTION=mysql/' .env
sed -i 's/# DB_HOST=127.0.0.1/DB_HOSTS=127.0.0.1/' .env
sed -i 's/# DB_PORT=3306/DB_PORT=3306/' .env
sed -i 's/# DB_DATABASE=laravel/DB_DATABASE=laravel_db/' .env
sed -i 's/# DB_USERNAME=root/DB_USERNAME=laravel_user/' .env
sed -i 's/# DB_PASSWORD=/DB_PASSWORD=000000/' .env
gold_echo "-------Migrating database--------"
php artisan migrate
}
Username: laravel_user
Database name: laravel_db
Password: 000000
Step 9: Write a function to create a new Apache virtual host to point our new laravel app.
function apache_conf() {
#Setup Virtual host for app
cd ~
sudo tee /etc/apache2/sites-available/laravel.conf <<EOF
<VirtualHost *:80 *:3000>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/laravel/public/
<Directory /var/www/laravel/public/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF
cd ~
sudo a2dissite 000-default.conf
sudo a2enmod rewrite
sudo a2ensite laravel.conf
sudo systemctl restart apache2
}
Step 10: Write a function to call our functions
#Functions
function main() {
install_lamp
composer_setup
setup_laravel_app
conf_mysql
apache_conf
}
#Execute All Functions
main
Save and exit
- Press ESC key
- colon wq (:wq)
- Enter
Deploying Laravel Application
Execute script
./laravel_app.sh
Output:
Conclusion
This guide has provided a step-by-step approach to automating the deployment of a Laravel LAMP stack application using Bash script on an Ubuntu server. By automating these processes, developers and operations engineers can ensure consistency, reduce errors, and expedite deployment times, leading to a more efficient and streamlined application environment.
Top comments (0)