Skip to content

Instantly share code, notes, and snippets.

@Khant-Nyar
Created October 23, 2025 14:03
Show Gist options
  • Select an option

  • Save Khant-Nyar/39e7034f93fc86ac3363f47031a0746f to your computer and use it in GitHub Desktop.

Select an option

Save Khant-Nyar/39e7034f93fc86ac3363f47031a0746f to your computer and use it in GitHub Desktop.
#!/bin/bash
# ==========================================
# Laravel Application Deployment Script
# Author: Khant-Nyar
# Date: $(date +%Y-%m-%d)
# ==========================================
set -e
echo "=========================================="
echo "🚀 Laravel Application Deployment Script"
echo "=========================================="
echo ""
#-------------------------------
# Functions
#-------------------------------
ask_if_empty() {
local var_name="$1"
local prompt="$2"
local silent="$3"
local value="${!var_name}"
if [ -z "$value" ]; then
if [ "$silent" = "silent" ]; then
read -srp "$prompt" value
echo ""
else
read -rp "$prompt" value
fi
eval "$var_name=\"$value\""
fi
}
#-------------------------------
# 1. Parse arguments
#-------------------------------
while [[ "$#" -gt 0 ]]; do
case $1 in
--repo) repo_url="$2"; shift ;;
--db-name) db_name="$2"; shift ;;
--db-user) db_user="$2"; shift ;;
--db-pass) db_pass="$2"; shift ;;
--app-url) app_url="$2"; shift ;;
*) echo "Unknown parameter passed: $1"; exit 1 ;;
esac
shift
done
#-------------------------------
# 2. Create system user
#-------------------------------
if id "vs-code" &>/dev/null; then
echo "User 'vs-code' already exists."
else
echo "Creating system user 'vs-code'..."
sudo useradd --system --create-home --shell /usr/sbin/nologin vs-code
fi
#-------------------------------
# 3. Install required packages
#-------------------------------
echo ""
echo "Installing required software (PHP, Apache, MariaDB, Composer, Node.js)..."
sudo apt update -y
sudo apt install -y apache2 mariadb-server php php-cli php-common php-mbstring php-xml php-bcmath php-curl php-zip php-mysql php-gd php-intl unzip git curl nodejs npm composer
#-------------------------------
# 4. Ask for repository info
#-------------------------------
ask_if_empty repo_url "Enter your Laravel Git repository URL: "
repo_name=$(basename "$repo_url" .git)
cd /var/www/ || exit
if [ -d "$repo_name" ]; then
echo "Directory /var/www/$repo_name already exists. Skipping clone."
else
echo "Cloning repository..."
sudo -u vs-code git clone "$repo_url" "$repo_name"
fi
cd "/var/www/$repo_name" || exit
#-------------------------------
# 5. Ask for database info
#-------------------------------
ask_if_empty db_name "Enter database name: "
ask_if_empty db_user "Enter database user: "
ask_if_empty db_pass "Enter database password: " silent
ask_if_empty app_url "Enter Laravel APP_URL (e.g. https://example.com): "
sudo mysql -e "CREATE DATABASE IF NOT EXISTS \`${db_name}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mysql -e "CREATE USER IF NOT EXISTS '${db_user}'@'localhost' IDENTIFIED BY '${db_pass}';"
sudo mysql -e "GRANT ALL PRIVILEGES ON \`${db_name}\`.* TO '${db_user}'@'localhost';"
sudo mysql -e "FLUSH PRIVILEGES;"
#-------------------------------
# 6. Setup .env file
#-------------------------------
if [ -f ".env" ]; then
echo "Updating existing .env file with database info..."
else
echo "Creating new .env file..."
cp .env.example .env
fi
sed -i "s/^DB_DATABASE=.*/DB_DATABASE=${db_name}/" .env || echo "DB_DATABASE=${db_name}" >> .env
sed -i "s/^DB_USERNAME=.*/DB_USERNAME=${db_user}/" .env || echo "DB_USERNAME=${db_user}" >> .env
sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=${db_pass}/" .env || echo "DB_PASSWORD=${db_pass}" >> .env
sed -i "s|^APP_URL=.*|APP_URL=${app_url}|" .env || echo "APP_URL=${app_url}" >> .env
#-------------------------------
# 7. Laravel setup
#-------------------------------
echo ""
echo "Installing Composer and Node dependencies..."
sudo -u vs-code composer install --no-dev --optimize-autoloader
sudo -u vs-code npm install
sudo -u vs-code npm run build
php artisan key:generate
php artisan migrate --force || true
sudo chown -R www-data:www-data /var/www/"$repo_name"
sudo find storage bootstrap/cache -type d -exec chmod 775 {} \;
#-------------------------------
# 8. Apache VirtualHost
#-------------------------------
domain=$(echo "$app_url" | sed 's~http[s]*://~~')
conf_file="/etc/apache2/sites-available/${repo_name}.conf"
if [ ! -f "$conf_file" ]; then
echo "Creating Apache VirtualHost for $domain..."
sudo bash -c "cat > $conf_file" <<EOL
<VirtualHost *:80>
ServerName ${domain}
DocumentRoot /var/www/${repo_name}/public
<Directory /var/www/${repo_name}/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/${repo_name}_error.log
CustomLog \${APACHE_LOG_DIR}/${repo_name}_access.log combined
</VirtualHost>
EOL
sudo a2ensite "${repo_name}.conf"
sudo a2enmod rewrite
sudo systemctl restart apache2
fi
echo ""
echo "=========================================="
echo "✅ Laravel application deployed successfully!"
echo "=========================================="
echo "Path: /var/www/${repo_name}"
echo "Domain: ${app_url}"
echo ""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment