Instantly share code, notes, and snippets.

Embed
What would you like to do?
#! /bin/bash
# This script is based on these instructions:
# https://medium.com/@shakyShane/laravel-docker-part-1-setup-for-development-e3daaefaf3c
# It may also later include details from here
# https://medium.com/@shakyShane/laravel-docker-part-2-preparing-for-production-9c6a024e9797
################ Settings
# "latest" values set at time of writing: 2018-12-14
# You are encouraged to get your own values to update this!
laravel_latest=5.7.15
# https://hub.docker.com/_/php/
php_latest=7.3.0
# https://hub.docker.com/_/nginx/
nginx_latest=1.15.7
# https://hub.docker.com/_/mysql/
mysql_latest=8.0.13
debug=true
################ Set version to obtain
if [ -z "$laravel_version" ] ; then
laravel_version="$laravel_latest"
fi
if [ -z "$php_version" ] ; then
php_version="$php_latest"
fi
if [ -z "$nginx_version" ] ; then
nginx_version="$nginx_latest"
fi
if [ -z "$mysql_version" ] ; then
mysql_version="$mysql_latest"
fi
# Set path defaults
if [ -z "$baseDir" ] ; then
baseDir="$(pwd)"
fi
if [ -z "$sourcesDir" ] ; then
sourcesDir="${baseDir}/sources"
fi
if [ -z "$targetDir" ] ; then
targetDir="site"
fi
if [ -z "$sourceFileName" ] ; then
sourceFileName="v${laravel_version}.tar.gz"
fi
if [ -z "$sourceBaseUrl" ] ; then
sourceBaseUrl="https://github.com/laravel/laravel/archive"
fi
if [ -z "$sourceFullUrl" ] ; then
sourceFullUrl="${sourceBaseUrl}/${sourceFileName}"
fi
if [ -z "$sourceFileType" ] ; then
sourceFileType="gzip compressed"
fi
################ Colours
# Based on https://stackoverflow.com/a/20983251
MESSAGE_PREFIX="$(tput setab 4 ; tput setaf 7 ; tput smso)LOG:$(tput sgr0 ; tput setaf 4)"
FAIL_PREFIX="$(tput setab 7 ; tput setaf 1)FAIL:$(tput sgr0 ; tput setaf 1)"
DEBUG_PREFIX="$(tput setab 2 ; tput setaf 0)DEBUG:$(tput sgr0 ; tput setaf 2)"
RESET_SUFFIX="$(tput sgr0)"
################ Output messages
log() {
echo "${MESSAGE_PREFIX} $1${RESET_SUFFIX}"
}
debug() {
if [ -n "$debug" ] ; then
echo "${DEBUG_PREFIX} $1${RESET_SUFFIX}"
fi
}
fail() {
debug "FAILURE"
echo "${FAIL_PREFIX} $1${RESET_SUFFIX}"
exit 1
}
################# Worker Functions
addLine() {
if [ -n "$3" ]; then
rm "$1"
fi
echo "$2" >> "$1"
}
checkSystemStatus() {
docker info >/dev/null 2>/dev/null || fail "Unable to run Docker - are you authorized?"
debug "Docker OK"
docker-compose version >/dev/null 2>/dev/null || fail "Unable to run docker-compose - is it installed?"
debug "Docker-compose OK"
git version >/dev/null 2>/dev/null || fail "Unable to run git - is it installed?"
debug "git OK"
}
getSource() {
if [ -z "$tries" ] ; then
tries=3
else
((tries--))
if [ $tries -le 0 ] ; then
fail "Failed to get the file"
fi
debug "Trying again... ($tries left)"
fi
debug "Creating sources path"
mkdir -p "$sourcesDir" >/dev/null 2>/dev/null || fail "Could not create sources path"
cd "$sourcesDir" >/dev/null 2>/dev/null || fail "Could not enter the sources path"
if [ ! -e "$sourceFileName" ] ; then
debug "Getting laravel-${laravel_version} source"
wget -q "$sourceFullUrl" || fail "Could not retrieve source: $sourceFullUrl"
log "Laravel source obtained"
fi
if [ -e "$sourceFileName" ] ; then
debug "Checking the source is suitable"
if file "$sourceFileName" | grep "$sourceFileType" >/dev/null 2>/dev/null ; then
debug "All good"
else
debug "Not good. Removing."
rm "$sourceFileName"
getSource
fi
fi
cd "${baseDir}"
}
unpackSource() {
if [ -d "${baseDir}/${targetDir}" ] ; then
archiveDate="$(date +%Y%m%d%H%M%S)"
log "Target directory already exists. Archiving to OLD_${archiveDate}_${targetDir}"
mv "${baseDir}/${targetDir}" "${baseDir}/OLD_${archiveDate}_${targetDir}" >/dev/null 2>/dev/null || fail "Unable to archive old target dir"
fi
cd "${sourcesDir}"
if [ ! -d "${sourcesDir}/laravel-${laravel_version}" ] ; then
debug "Unpacking Source to Target via laravel-${laravel_version}"
tar -xzf "${sourcesDir}/${sourceFileName}" || fail "Unable to unpack laravel source files"
log "Source unpacked. Getting dependencies."
cd "laravel-${laravel_version}"
docker run --rm -v $(pwd):/app composer install >/dev/null 2>&1 || fail "Unable to obtain dependencies from composer"
log "Dependencies obtained"
cd ..
fi
mkdir -p "${baseDir}/${targetDir}"
cp -Rf "${sourcesDir}/laravel-${laravel_version}" "${baseDir}/${targetDir}/www"
cd "${baseDir}/${targetDir}"
log "Target created from laravel source"
}
makeDockerConfigFiles() {
dockerFiles="${baseDir}/${targetDir}/Docker"
mkdir -p "$dockerFiles"
debug "Building the Docker Config Files: docker-compose.yml"
file="${dockerFiles}/docker-compose.yml"
rm -f "$file"
addLine "$file" "version: '2'"
addLine "$file" 'services:'
addLine "$file" ' app:'
addLine "$file" ' build:'
addLine "$file" ' context: ./'
addLine "$file" ' dockerfile: app.dockerfile'
addLine "$file" ' working_dir: /var/www'
addLine "$file" ' volumes:'
addLine "$file" ' - ../www/:/var/www'
addLine "$file" ' environment:'
addLine "$file" ' - "DB_PORT=3306"'
addLine "$file" ' - "DB_HOST=database"'
addLine "$file" ' web:'
addLine "$file" ' build:'
addLine "$file" ' context: ./'
addLine "$file" ' dockerfile: web.dockerfile'
addLine "$file" ' working_dir: /var/www'
addLine "$file" ' volumes_from:'
addLine "$file" ' - app'
addLine "$file" ' ports:'
addLine "$file" ' - 8080:80'
addLine "$file" ' database:'
addLine "$file" " image: mysql:${mysql_version}"
addLine "$file" ' volumes:'
addLine "$file" ' - dbdata:/var/lib/mysql'
addLine "$file" ' environment:'
addLine "$file" ' - "MYSQL_DATABASE=homestead"'
addLine "$file" ' - "MYSQL_USER=homestead"'
addLine "$file" ' - "MYSQL_PASSWORD=secret"'
addLine "$file" ' - "MYSQL_ROOT_PASSWORD=secret"'
addLine "$file" ' ports:'
addLine "$file" ' - "33061:3306"'
addLine "$file" 'volumes:'
addLine "$file" ' dbdata:'
debug "Building the Docker Config Files: app"
file="${dockerFiles}/app.dockerfile"
rm -f "$file"
addLine "$file" "FROM php:${php_version}-fpm"
addLine "$file" 'RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client --no-install-recommends'
debug "Building the Docker Config Files: web"
file="${dockerFiles}/web.dockerfile"
rm -f "$file"
addLine "$file" "FROM nginx:${nginx_version}"
addLine "$file" 'ADD vhost.conf /etc/nginx/conf.d/default.conf'
debug "Building the Docker Config Files: vhost"
file="${dockerFiles}/vhost.conf"
rm -f "$file"
addLine "$file" 'server {'
addLine "$file" ' listen 80;'
addLine "$file" ' index index.php index.html;'
addLine "$file" ' root /var/www/public;'
addLine "$file" ' location / {'
addLine "$file" ' try_files $uri /index.php?$args;'
addLine "$file" ' }'
addLine "$file" ' location ~ \.php$ {'
addLine "$file" ' fastcgi_split_path_info ^(.+\.php)(/.+)$;'
addLine "$file" ' fastcgi_pass app:9000;'
addLine "$file" ' fastcgi_index index.php;'
addLine "$file" ' include fastcgi_params;'
addLine "$file" ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;'
addLine "$file" ' fastcgi_param PATH_INFO $fastcgi_path_info;'
addLine "$file" ' }'
addLine "$file" '}'
}
makeLaravelEnvFile() {
webFiles="${baseDir}/${targetDir}/www"
cp "${webFiles}/.env.example" "${webFiles}/.env"
chmod -R 777 "${webFiles}/storage"
}
gitInitAndCommit() {
cd "${baseDir}/${targetDir}"
git init >/dev/null 2>/dev/null || fail "Unable to perform git-init"
git config user.name "Script" || fail "Unable to perform git-config user.name"
git config user.email "script@local" || fail "Unable to perform git-config user.email"
git add Docker www || fail "Unable to add missing files"
file="commit-msg"
rm -f "$file"
addLine "$file" "Initial commit completed"
addLine "$file" "Laravel: $laravel_version PHP: $php_version NGINX: $nginx_version MYSQL: $mysql_version"
addLine "$file" "Based on instructions from: https://medium.com/@shakyShane/laravel-docker-part-1-setup-for-development-e3daaefaf3c"
addLine "$file" "Updated by [Jon "TheNiceGuy" Spriggs](https://jon.sprig.gs) [(github)](https://github.com/JonTheNiceGuy)"
git commit -F "$file" >/dev/null 2>/dev/null || fail "Unable to perform git-commit"
rm -f "$file"
git config --unset user.name || fail "Unable to perform git-config user.name"
git config --unset user.email || fail "Unable to perform git-config user.email"
log "Made git init and git commit"
}
startDockerInstances() {
cd "${baseDir}/${targetDir}/Docker"
log "Starting docker instances"
docker-compose up -d || fail "Unable to bring up the docker containers"
log "Post-installing the laravel environment"
docker-compose exec app php artisan key:generate || fail "Unable to generate a new Laravel Key"
}
log "Building with Laravel: $laravel_version PHP: $php_version NGINX: $nginx_version MYSQL: $mysql_version"
checkSystemStatus
getSource
unpackSource
makeDockerConfigFiles
makeLaravelEnvFile
gitInitAndCommit
startDockerInstances
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment