Last active
June 18, 2024 01:24
-
-
Save joelconty/7988b5b4c78ebce4376dd5f49c0e99e2 to your computer and use it in GitHub Desktop.
Quick Dev Site in Laravel
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
#!/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 [email protected] | |
#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 [email protected]" >> $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 [email protected]" >> $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