Created
October 23, 2025 14:03
-
-
Save Khant-Nyar/39e7034f93fc86ac3363f47031a0746f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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