Skip to content

Instantly share code, notes, and snippets.

@joelconty
Last active June 18, 2024 01:24
Show Gist options
  • Save joelconty/7988b5b4c78ebce4376dd5f49c0e99e2 to your computer and use it in GitHub Desktop.
Save joelconty/7988b5b4c78ebce4376dd5f49c0e99e2 to your computer and use it in GitHub Desktop.
Quick Dev Site in Laravel
#!/usr/bin/env bash
#This script is intended as a quick laravel development website generator.
#It will ask you for a domain name to use, and it will generate and configure
#several things for you, like a local website that works on a fictitious domain name
#using https.
#
#For example, if you enter mygreatwebsite.lh, you will end up with a local laravel
#website working on https://www.mygreatwebsite.lh
#
#It will configure apache to handle this fictitious domain.
#It will install a self signed SSL certifcate so you can work over https://
#It will create a database and user and update your .env file in laravel
#It will install laravel in your /var/www/mygreatwebsite.lh directory
#
#Requirements: linux, mysql, php
#The script was written on Linux Mint 21, Apache/2.4.54, PHP 8.1.9 and Mysql 8.0.30
#If you have any suggestions for improvements you can email me at joelconty@gmail.com
#Thanks
#Joel
#check that we are running as root or with sudo
if [[ $EUID -ne 0 ]]; then
echo "This script includes some commands that require privileges"
sudo echo ""
fi
#set the domain variable and make sure it is lowercase
ARGDOMAIN=$1
DOMAIN=$(echo $ARGDOMAIN | tr '[:upper:]' '[:lower:]')
if [ -z "$DOMAIN" ]
then
echo "\$DOMAIN is invalid."
echo "Usage: $0 domain.ext"
exit 1
fi
#check that openssl is installed
OPENSSLISINSTALLED=$(which openssl);
if [ -z "$OPENSSLISINSTALLED" ]
then
echo "Openssl was not found in the system. Installing it now."
sudo apt install openssl
fi
#if not already in /etc/hosts, add the domain
if grep -q $DOMAIN /etc/hosts
then
echo "${DOMAIN} already exists in /etc/hosts. skipping."
else
echo "Adding ${DOMAIN} to /etc/hosts file."
sudo echo "" >> /etc/hosts
sudo echo "127.0.0.1 www.${DOMAIN}" >> /etc/hosts
sudo echo "127.0.0.1 ${DOMAIN}" >> /etc/hosts
fi
#create vhost file
echo "Creating ${DOMAIN}.conf in /etc/apache2/sites-available"
VHOSTFILE="/etc/apache2/sites-available/${DOMAIN}.conf"
sudo touch $VHOSTFILE
sudo echo "<VirtualHost *:80>" > $VHOSTFILE
sudo echo " ServerName ${DOMAIN}" >> $VHOSTFILE
sudo echo " ServerAlias www.${DOMAIN}" >> $VHOSTFILE
sudo echo " ServerAdmin joelconty@gmail.com" >> $VHOSTFILE
sudo echo " DocumentRoot /var/www/${DOMAIN}/public" >> $VHOSTFILE
sudo echo " <Directory /var/www/${DOMAIN}/public>" >> $VHOSTFILE
sudo echo " Options Indexes FollowSymLinks" >> $VHOSTFILE
sudo echo " AllowOverride All" >> $VHOSTFILE
sudo echo " Require all granted" >> $VHOSTFILE
sudo echo " </Directory>" >> $VHOSTFILE
sudo echo " ErrorLog \"/var/log/apache2/${DOMAIN}-error_log\"" >> $VHOSTFILE
sudo echo " CustomLog \"/var/log/apache2/${DOMAIN}-access_log\" common" >> $VHOSTFILE
sudo echo "</VirtualHost>" >> $VHOSTFILE
#create ssl vhost file
echo "Creating ${DOMAIN}-ssl.conf in /etc/apache2/sites-available"
SSLVHOSTFILE="/etc/apache2/sites-available/${DOMAIN}-ssl.conf"
sudo touch $SSLVHOSTFILE
sudo echo "<VirtualHost *:443>" > $SSLVHOSTFILE
sudo echo " ServerName ${DOMAIN}" >> $SSLVHOSTFILE
sudo echo " ServerAlias www.${DOMAIN}" >> $SSLVHOSTFILE
sudo echo " ServerAdmin joelconty@gmail.com" >> $SSLVHOSTFILE
sudo echo " <IfModule mod_ssl.c>" >> $SSLVHOSTFILE
sudo echo " SSLEngine on" >> $SSLVHOSTFILE
sudo echo " SSLCertificateFile /etc/apache2/ssl/${DOMAIN}.crt" >> $SSLVHOSTFILE
sudo echo " SSLCertificateKeyFile /etc/apache2/ssl/${DOMAIN}.key" >> $SSLVHOSTFILE
sudo echo " </IfModule>" >> $SSLVHOSTFILE
sudo echo "" >> $SSLVHOSTFILE
sudo echo " DocumentRoot /var/www/${DOMAIN}/public" >> $SSLVHOSTFILE
sudo echo " <Directory /var/www/${DOMAIN}/public>" >> $SSLVHOSTFILE
sudo echo " Options Indexes FollowSymLinks" >> $SSLVHOSTFILE
sudo echo " AllowOverride All" >> $SSLVHOSTFILE
sudo echo " Require all granted" >> $SSLVHOSTFILE
sudo echo " </Directory>" >> $SSLVHOSTFILE
sudo echo " ErrorLog \"/var/log/apache2/${DOMAIN}-error_log\"" >> $SSLVHOSTFILE
sudo echo " CustomLog \"/var/log/apache2/${DOMAIN}-access_log\" common" >> $SSLVHOSTFILE
sudo echo "</VirtualHost>" >> $SSLVHOSTFILE
#create symbolic links of those vhosts files
echo "Creating symbolic links of .conf files in /etc/apache2/sites-enables"
cd /etc/apache2/sites-enabled
sudo ln -s $VHOSTFILE
sudo ln -s $SSLVHOSTFILE
#Now generate ssl self signed certificates
# Define variables
BIN_OPENSSL=$(which openssl)
LOCAL_CERT_PATH=/etc/apache2/ssl/
LOCAL_CERT_CERT=${LOCAL_CERT_PATH}/${DOMAIN}.crt
LOCAL_CERT_KEY=${LOCAL_CERT_PATH}/${DOMAIN}.key
LOCAL_CERT_MAIN_DOMAIN=${DOMAIN}.localhost
LOCAL_CERT_EXTRA_DOMAINS=,DNS.2:*.${DOMAIN}.localhost
declare -a LOCAL_CERT_DOMAINS=(${DOMAIN}.localhost *.${DOMAIN}.localhost)
# Generate SSL certificate
${BIN_OPENSSL} req -x509 -out ${LOCAL_CERT_CERT} -keyout ${LOCAL_CERT_KEY} \
-newkey rsa:2048 -nodes -sha256 \
-subj "/CN=${LOCAL_CERT_MAIN_DOMAIN}" -extensions EXT -config <( \
printf "[dn]\nCN=${LOCAL_CERT_MAIN_DOMAIN}\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS.1:${LOCAL_CERT_MAIN_DOMAIN}${LOCAL_CERT_EXTRA_DOMAINS}\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
# Show results
echo ""
echo "New SSL certificate was generated:"
echo "- Certificate: ${LOCAL_CERT_CERT}"
echo "- Key: ${LOCAL_CERT_KEY}"
echo ""
echo "DNS Names:"
for CERTDOMAIN in "${LOCAL_CERT_DOMAINS[@]}"
do
echo "- ${CERTDOMAIN}"
done
#now generate a laravel app and then move it to its dir in /var/www
cd /tmp/
#creating a laravel app
echo "Creating a laravel app"
su -l ${SUDO_USER} -c "cd /tmp && composer create-project laravel/laravel ${DOMAIN}"
#moving the app to /var/www
echo "Moving the app to /var/www/"
sudo mv /tmp/$DOMAIN /var/www/
echo ""
echo "Creating a database for the laravel app..."
# create random password
DBPASSWORD="$(openssl rand -base64 12)"
# replace "-" with "_" for database username
DBNAME="$(echo $DOMAIN | sed -e s/\\.//)db"
DBUSER="$(echo $DBNAME)user"
# If /root/.my.cnf exists then it won't ask for root password
if [ -f /root/.my.cnf ]; then
sudo mysql -e "CREATE DATABASE ${DBNAME} /*\!40100 DEFAULT CHARACTER SET utf8 */;"
sudo mysql -e "CREATE USER ${DBUSER}@localhost IDENTIFIED BY '${DBPASSWORD}';"
sudo mysql -e "GRANT ALL PRIVILEGES ON ${DBNAME}.* TO '${DBUSER}'@'localhost';"
sudo mysql -e "FLUSH PRIVILEGES;"
# If /root/.my.cnf doesn't exist then it'll ask for root password
else
echo "Please enter the MySQL root user password so that we can create the database and user with the necessary permissions!"
echo "(Note: password will be hidden when typing.)"
read -sp "MySql root user password : " rootpasswd
echo ""
echo ""
sudo mysql -uroot -p${rootpasswd} -e "CREATE DATABASE ${DBNAME} /*\!40100 DEFAULT CHARACTER SET utf8 */;" >> /dev/null
sudo mysql -uroot -p${rootpasswd} -e "CREATE USER ${DBUSER}@localhost IDENTIFIED BY '${DBPASSWORD}';" >> /dev/null
sudo mysql -uroot -p${rootpasswd} -e "GRANT ALL PRIVILEGES ON ${DBNAME}.* TO '${DBUSER}'@'localhost';" >> /dev/null
sudo mysql -uroot -p${rootpasswd} -e "FLUSH PRIVILEGES;" >> /dev/null
fi
echo "These are the settings of your new mysql db:"
echo "DBNAME = ${DBNAME}"
echo "DBUSER = ${DBUSER}"
echo "DBPASSWORD = ${DBPASSWORD}"
#go to the document root
cd /var/www/${DOMAIN}
#replace these values in the .env file
sed -i "s/DB_DATABASE=${DOMAIN}/DB_DATABASE=${DBNAME}/" .env
sed -i "s/DB_USERNAME=root/DB_USERNAME=${DBUSER}/" .env
sed -i "s/DB_PASSWORD=/DB_PASSWORD=${DBPASSWORD}/" .env
sed -i "s/APP_NAME=Laravel/APP_NAME=${DOMAIN}/" .env
sed -i "s/APP_URL=http:\/\/localhost/APP_URL=https://www.${DOMAIN}/" .env
#install barryvdh/laravel-debugbar
su -l ${SUDO_USER} -c "composer require barryvdh/laravel-debugbar"
#Download the fix script and make it executable , then run it
sudo curl -o fix.sh https://gist.githubusercontent.com/joelconty/e26a25543a4858435009e143c092e793/raw/06b5fd17a57db0b6517e0fe2ba007781109db724/fix.sh
sudo chmod +x fix.sh
#also create a clear.sh script
sudo touch clear.sh
sudo echo "#!/usr/bin/env bash" > clear.sh
sudo echo "php artisan config:clear" > clear.sh
sudo echo "php artisan route:clear" > clear.sh
sudo echo "php artisan cache:clear" > clear.sh
sudo echo "php artisan route:clear" > clear.sh
sudo echo "php artisan clear-compiled" > clear.sh
sudo echo "php artisan view:clear" > clear.sh
sudo echo "composer dump-autoload -o" > clear.sh
#run
sudo ./fix.sh
su -l ${SUDO_USER} -c "./clear.sh"
echo "Now restarting the apache2 service..."
sudo systemctl restart apache2
echo "Adding /storage to .gitignore file"
echo "/storage" >> .gitignore
echo "Done..."
echo ""
echo "Now you can visit the site by going to https://www.${DOMAIN}"
echo ""
echo ""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment