Skip to content

Instantly share code, notes, and snippets.

@annedorko
Created April 8, 2018 09:26
Show Gist options
  • Save annedorko/730f9db075c6c288c3b332af53850c18 to your computer and use it in GitHub Desktop.
Save annedorko/730f9db075c6c288c3b332af53850c18 to your computer and use it in GitHub Desktop.
Find and update all WordPress sites on Ubuntu 16.04
#!/bin/bash
# Find, backup, and update all WordPress installations
# In progress, test for your configuration first
# Requires wp-cli and tar to be installed
# https://wp-cli.org/
#
# Written for storing backups on mounted drive, but you can set to whatever folder you want
# Backs up databse and wp-content every other day
# Zips backups to save storage space
# Organized by BACKUP FOLDER > Date > Domain
# TODO: Deletes backup folders older than 8 days (i.e. keeps 4 backups at a time)
# Updates all core, database, plugins, themes
# Emails notification of update
today=$(date +'%Y-%m-%d')
yesterday=$(date -d "yesterday" '+%Y-%m-%d')
mount_folder=/PATH/TO/BACKUP/FOLDER
site_list=$mount_folder/records/sites-${today}.txt
# Detect WordPress sites
# & store results in text file
# Change /var/www to match the folder where your store WordPress sites
find /var/www -name 'wp-config.php' -exec dirname {} \; > ${site_list}
# Colors
red="\e[31m"
green="\e[32m"
bold="\e[1m"
redbold="\e[31;1m"
greenbold="\e[32;1m"
boldoff="\e[22m"
invert="\e[7m"
reset="\e[0m"
# WordPress Install Directory = $wordpress_dir
# === Site URL = "$(basename $(dirname "$wordpress_dir"))"
# === Site Root Path = "$(basename "$site_dir")"
while read wordpress_dir; do
# SET VARIABLES
domain=$(basename $(dirname "$wordpress_dir"))
backup_folder=${mount_folder}/${today}/${domain}
yesterday_folder=${mount_folder}/${yesterday}/${domain}
# Take backups every other day
# i.e. when neither today or yesterday have a folder
if [ ! -d "${backup_folder}" ] && [ ! -d "${yesterday_folder}" ]; then
sudo mkdir -p ${backup_folder}
sudo chown -R user:user ${backup_folder} # Change user:user to match your configuration
echo -e "${green}${bold}Created:${boldoff}${reset} Backup at ${backup_folder}"
# Backup database
dbname=${domain}-${today}.sql
dbexport=${backup_folder}/${dbname}
sudo -u anne -i -- wp db export ${dbexport} --path=${wordpress_dir}
if tar -zcf ${dbexport}.tar.gz ${dbexport}
then
rm ${dbexport}
echo -e "${greenbold}Zipped:${boldoff} ${dbexport}${reset}"
else
echo -e "${redbold}Error:${boldoff} Problem with ${dbexport}${reset}"
fi
# Backup wp-content
wpname=${domain}-wp-content
wpexport=${backup_folder}/${wpname}
if tar -zcf ${wpexport}.tar.gz ${wordpress_dir}
then
echo -e "${greenbold}Zipped:${boldoff} wp-content for ${invert}${domain}${reset}"
else
echo -e "${redbold}Error:${boldoff} Problem zipping ${bold}wp-content${boldoff} for ${invert}${domain}${reset}"
fi
else
echo -e "${bold}SKIPPED:${boldoff} ${domain} backed up recently."
fi # End if directory statement (skips backups already completed)
# Delete archive folders older than 8 days to save space
# TODO: Test run FIND command in one week
# sudo find ${mount_folder} -type d -ctime +8 -not -path "${mount_folder}/records/" | xargs rm -rf
# Run updates on current site
# Store output messages to txt files in backup folder
update_file=${backup_folder}/update
sudo -u user -i -- wp core update --path=${wordpress_dir} > ${update_file}-core.txt # Update user to your Linux user
sudo -u user -i -- wp core update-db --path=${wordpress_dir} > ${update_file}-db.txt # Update user to your Linux user
sudo -u user -i -- wp plugin update --all --path=${wordpress_dir} > ${update_file}-plugins.txt # Update user to your Linux user
sudo -u user -i -- wp theme update --all --path=${wordpress_dir} > ${update_file}-theme.txt # Update user to your Linux user
echo -e "${greenbold}Updated:${boldoff} Ran wp-cli updates for ${invert}${domain}${reset} ${green}core, database, plugins, and themes${reset}"
done < ${site_list}
echo "WordPress backups and updates run on ${today}!" | mail -s "WordPress updates run on ${today}" admin@example.com -r "server@example.com"
echo "WordPress backups and upgrades completed."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment