Fix file permissions in Laravel

This script fixes permissions and ownership of your laravel files. Save it as fix.sh on the root of your project, make it executable ( chmod +x fix.sh) and edit only the two lines indicated at the beginning of the script to set your username and the name of the group used by your web server (usually www-data). Then just run with sudo ( sudo ./fix.sh ) and start coding!

#!/usr/bin/env bash

#Configure these two variables
MYUSER="joel"
APACHEGROUP="www-data"


#you don't need to edit anything below.

echo "Setting variables..."
SCRIPTPATH=`pwd -P`
BOOTSTRAP="${SCRIPTPATH}/bootstrap/"
BOOTSTRAPCACHE="${SCRIPTPATH}/bootstrap/cache/"
STORAGE="${SCRIPTPATH}/storage"
LOGS="${STORAGE}/logs"
FRAMEWORK="${STORAGE}/framework"


#add my user to the web server group
echo "adding ${MYUSER} to the ${APACHEGROUP} group ..."
usermod -a -G ${APACHEGROUP} ${MYUSER}



#if bootstrap/cache does not exist, create it
if [ ! -d ${BOOTSTRAPCACHE} ]; then
    echo "Creating ${BOOTSTRAPCACHE} directory..."
    mkdir -p ${BOOTSTRAPCACHE}
fi

#if we don't have a .gitignore file in bootstrap/cache, add it
if [ ! -f ${BOOTSTRAPCACHE}/.gitignore ]; then
    echo "Creating .gitignore file in ${BOOTSTRAPCACHE}/..."
    echo '*' > ${BOOTSTRAPCACHE}/.gitignore
    echo '!.gitignore' >> ${BOOTSTRAPCACHE}/.gitignore
fi


#if storage dir does not exist, create it.
if [ ! -d ${STORAGE} ]; then
    echo "Creating ${STORAGE} directory"
    mkdir -p ${STORAGE}
fi


#then, make sure we have debugbar, framework and logs inside storage
#debugbar is not installed by default, but it does not hurt to have it's directory there , ready for when you install it
for DIR in debugbar framework logs db_backups
do
    if [ ! -d ${STORAGE}/${DIR} ]; then
        echo "Creating ${STORAGE}/${DIR} directory..."
        mkdir -p ${STORAGE}/${DIR}
    else
        echo "Checking for existance of  ${STORAGE}/${DIR}...  It exists"
    fi
done

#if we don't have a .gitignore file in storage/framework, add it
if [ ! -f ${FRAMEWORK}/.gitignore ]; then
    echo "Creating .gitignore file in ${FRAMEWORK}..."
    echo 'compiled.php' > ${FRAMEWORK}/.gitignore
    echo 'config.php' >> ${FRAMEWORK}/.gitignore
    echo 'down' >> ${FRAMEWORK}/.gitignore
    echo 'events.scanned.php' >> ${FRAMEWORK}/.gitignore
    echo 'maintenance.php' >> ${FRAMEWORK}/.gitignore
    echo 'routes.php' >> ${FRAMEWORK}/.gitignore
    echo 'routes.scanned.php' >> ${FRAMEWORK}/.gitignore
    echo 'schedule-*' >> ${FRAMEWORK}/.gitignore
    echo 'services.json' >> ${FRAMEWORK}/.gitignore
fi


#then, make sure we have  cache, sessions, testing and views inside storage/framework
for DIR in cache sessions testing views
do
    if [ ! -d ${FRAMEWORK}/${DIR} ]; then
        echo "Creating ${FRAMEWORK}/${DIR} directory..."
        mkdir -p ${FRAMEWORK}/${DIR}
    else
        echo "Checking for existance of  ${FRAMEWORK}/${DIR}...  It exists"
    fi
done


#then, make sure we have a storage/framework/cache/data directory
if [ ! -d ${FRAMEWORK}/cache/data ]; then
    echo "Creating ${FRAMEWORK}/cache/data directory..."
    mkdir -p ${FRAMEWORK}/cache/data
else
    echo "Checking for existance of  ${FRAMEWORK}/cache/data...  It exists"
fi



#if we don't have a .gitignore file in storage/framework/cache/data, add it
if [ ! -f ${FRAMEWORK}/cache/data/.gitignore ]; then
    echo "Creating .gitignore file in ${FRAMEWORK}/cache/data/..."
    echo '*' > ${FRAMEWORK}/cache/data/.gitignore
    echo '!data/' >> ${FRAMEWORK}/cache/data/.gitignore
    echo '!.gitignore' >> ${FRAMEWORK}/cache/data/.gitignore
fi

#if we don't have a .gitignore file in storage/framework/sessions/, add it
if [ ! -f ${FRAMEWORK}/sessions/.gitignore ]; then
    echo "Creating .gitignore file in ${FRAMEWORK}/sessions/..."
    echo '*' > ${FRAMEWORK}/sessions/.gitignore
    echo '!.gitignore' >> ${FRAMEWORK}/sessions/.gitignore
fi

#if we don't have a .gitignore file in storage/framework/testing/, add it
if [ ! -f ${FRAMEWORK}/testing/.gitignore ]; then
    echo "Creating .gitignore file in ${FRAMEWORK}/testing/..."
    echo '*' > ${FRAMEWORK}/testing/.gitignore
    echo '!.gitignore' >> ${FRAMEWORK}/testing/.gitignore
fi

#if we don't have a .gitignore file in storage/framework/views/, add it
if [ ! -f ${FRAMEWORK}/views/.gitignore ]; then
    echo "Creating .gitignore file in ${FRAMEWORK}/views/..."
    echo '*' > ${FRAMEWORK}/views/.gitignore
    echo '!.gitignore' >> ${FRAMEWORK}/views/.gitignore
fi


#make my user and the apache group  own everything in the directory
echo "Fixing ownership on everything..."
chown -R ${MYUSER}:${APACHEGROUP} ${SCRIPTPATH}

#change permissions on files to 644
echo "Setting permissions 0644 on all files... (excluding vendor, node_modules and .git directories)"
find ${SCRIPTPATH} -type f -not -path "${SCRIPTPATH}/vendor/*" -not -path "${SCRIPTPATH}/node_modules/*"  -not -path "${SCRIPTPATH}/.git/*" -exec chmod 0644 {} \;


#change permissions on directories to 755
echo "Setting permissions 0755 on all directories... (excluding vendor, node_modules and .git directories)"
find ${SCRIPTPATH} -type d -not -path "${SCRIPTPATH}/vendor/*" -not -path "${SCRIPTPATH}/node_modules/*"  -not -path "${SCRIPTPATH}/.git/*" -exec chmod 0755 {} \;

#change permissions on bootstrap/cache to 775
echo "Setting permissions 0775 on bootstrap/cache"
chmod 0775 ${BOOTSTRAPCACHE}

#change permissions on the php files that live in bootstrap/cache to 0775
echo "Setting permissions 0775 on php files in bootstrap/cache"
chmod 0775 ${BOOTSTRAPCACHE}/*.php

#if i have any bash scripts in there, make them executable
echo "Making any existing shell scripts executable"
find ${SCRIPTPATH} -type f -iname "*.sh" -exec chmod +x {} \;

#finally fix permissions on storage
echo "Setting 0775 permissions on ${STORAGE}..."
chmod -R 0775 ${STORAGE}

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top