This commit is contained in:
Pratik
2020-01-13 15:44:02 +05:30
parent 47192d84bd
commit 714ca3bbc3
2 changed files with 45 additions and 28 deletions

View File

@@ -3,13 +3,14 @@
Bash script that simplifies Borg backup for Wordpress websites. Bash script that simplifies Borg backup for Wordpress websites.
## Purpose ## Purpose
Make backup easy for a server running multiple Wordpress websites. Make backup easy for a server running multiple Wordpress websites.
_borg_ is an amazing backup solution, but if you have multiple websites running on the same server - you wpuld need to create a script each for those websites for automating _borg_ backup. You would also need to spend sometime manually initializing a new repo for each of those websites, generate a passphrase, copy the passphrase immediately, _export_ the passphrase in a new script. _borg_ is an amazing backup solution, but if you have multiple websites running on the same server - you would need to create a script for each of those websites, for automating _borg_ backup. You would also need to spend sometime manually initializing a new repo for each of those websites, generate a passphrase for each, copy the passphrases immediately, `export` the passphrases in a new script.
This script is designed specifically to ease those issues. You provide where your Wordpress is installed and where you want the backup to be stored and a unique name for the website - the script takes care of the rest. It'll create a strong enough passphrase, initialize the repo, then perform the actual backup. This script eases those issues. Provide where your Wordpress is installed and where you want the backup to be stored and a unique name for the website - this script takes care of the rest. It'll create a strong enough passphrase, initialize the repo, then perform the actual backup.
On subsequent executions, it'll read the passphrase file and perform an incremental backup.**** On subsequent executions, it'll read the passphrase file and perform an incremental backup.
## Status ## Status
@@ -19,8 +20,9 @@ NEEDS FURTHER TESTING.
## Usage ## Usage
### Prerequisites ### Prerequisites
- Any Linux distribution that support "_apt_"
- A user having _sudo_ access to the server - Any Linux distribution that support `apt`
- A user having `sudo` access to the server
### Examples ### Examples
@@ -35,7 +37,7 @@ $ wget -q https://raw.githubusercontent.com/pratiktri/wordpress_borg_backup
### Available Options ### Available Options
Run the script with below option (--help or -h) to see all available options:- Run the script with below option (`--help` or `-h`) to see all available options:-
```console ```console
$ sudo ./wp_borg_backup.sh --help $ sudo ./wp_borg_backup.sh --help
@@ -61,17 +63,18 @@ Usage:
### What does the script do? ### What does the script do?
- Install _borgbackup_ if not installed - Install _**borgbackup**_ if not installed
- Install _wp-cli_ if not installed - Install _**wp-cli**_ if not installed
- Backup the Wordpress database using _wp-cli_ - Backup the Wordpress database using _**wp-cli**_
- Initialize _borg_ repository if --backup-dir is empty - Initialize _**borg**_ repository if **--backup-dir** is empty
- Generates a passphrase - Generates a passphrase
- Saves the passphrase to /home/[user]/.config/borg directory - Saves the passphrase to **/home/[user]/.config/borg** directory
- Secures the passphrase file by "chmod 400" - Secures the passphrase file by making it readable only to the root user (`chmod 400`)
- Performs the backup - Performs the backup
## FAQ ## FAQ
Q - Is the passphrase saved on the server in plain-text
Q - Is the passphrase saved on the server in plain-text?
Ans - Yes. Ans - Yes.
@@ -83,6 +86,11 @@ However, it does restrict access to the file only to _root_ user. If someone has
export BORG_PASSPHRASE=[your-passphrase] export BORG_PASSPHRASE=[your-passphrase]
``` ```
Q - Does this auto schedule backup
Ans - No
You would need to do that manually.
### Roadmap ### Roadmap
@@ -109,4 +117,3 @@ distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
**

View File

@@ -33,7 +33,6 @@
# Health check # Health check
# Best Practice # Best Practice
# Enable Bash Strict mode
# Pretty print STDOUT # Pretty print STDOUT
# TODO - Check on other OSes # TODO - Check on other OSes
@@ -41,6 +40,16 @@
# Debian 8, 9 # Debian 8, 9
# Tested on Debian 10 # Tested on Debian 10
#### Bash Strict mode
# Catch the error in case mysqldump fails (but gzip succeeds) in `mysqldump |gzip`
set -o pipefail
# Exit on error. Append "|| true" if you expect an error.
set -o errexit
# Do not allow use of undefined vars. Use ${VAR:-} to use an undefined VAR
set -o nounset
# Exit on error inside any functions or subshells.
set -o errtrace
# No root - no good # No root - no good
[[ "$(id --user)" != "0" ]] && { [[ "$(id --user)" != "0" ]] && {
echo -e "ERROR: You must be root to run this script.\nUse sudo and execute the script again." echo -e "ERROR: You must be root to run this script.\nUse sudo and execute the script again."
@@ -162,7 +171,7 @@ main() {
esac esac
done done
# Check if mandatory items were provided or not # Check if mandatory items were provided
if [[ -z "${project_name}" ]]; then if [[ -z "${project_name}" ]]; then
echo "ERROR: Script requires a project name (--project-name | -pname) parameter" 2>STDERR echo "ERROR: Script requires a project name (--project-name | -pname) parameter" 2>STDERR
usage usage
@@ -181,7 +190,7 @@ main() {
exit 8 exit 8
fi fi
# if blank - do something # if blank - do nothing
if [[ -n "${storage_quota}" ]]; then if [[ -n "${storage_quota}" ]]; then
storage_quota="--storage-quota=${storage_quota}" storage_quota="--storage-quota=${storage_quota}"
fi fi
@@ -226,7 +235,7 @@ main() {
fi fi
fi fi
#If borg is currently running AND it is backing up the same website - quit # If borg is currently running AND is backing up the same website -> quit
if (pidof -x borg > /dev/null) && $(pgrep --list-full --count "${wp_src_dir}") -gt 0 ; then if (pidof -x borg > /dev/null) && $(pgrep --list-full --count "${wp_src_dir}") -gt 0 ; then
echo "${wp_src_dir} is being backed up from another process" 2>STDERR | tee -a "${LOGFILE}" echo "${wp_src_dir} is being backed up from another process" 2>STDERR | tee -a "${LOGFILE}"
echo "This process will now exit" 2>STDERR | tee -a "${LOGFILE}" echo "This process will now exit" 2>STDERR | tee -a "${LOGFILE}"
@@ -241,7 +250,7 @@ main() {
echo "Successfully Installed wp-cli" | tee -a "${LOGFILE}" echo "Successfully Installed wp-cli" | tee -a "${LOGFILE}"
else else
wp_cli_installed="$?" wp_cli_installed="$?"
echo "ERROR: Could not install wp-cli. Program will continue to backup the site data..." 2>STDERR | tee -a "${LOGFILE}" echo "ERROR: Could not install wp-cli. Script will continue to backup the site data..." 2>STDERR | tee -a "${LOGFILE}"
fi fi
fi fi
@@ -260,6 +269,7 @@ main() {
readonly directory_owner=$(stat --format='%U' "${wp_src_dir}") readonly directory_owner=$(stat --format='%U' "${wp_src_dir}")
sudo -u "${directory_owner}" wp db --quiet export "/tmp/${TS}_database.sql" --add-drop-table --path="${wp_src_dir}" sudo -u "${directory_owner}" wp db --quiet export "/tmp/${TS}_database.sql" --add-drop-table --path="${wp_src_dir}"
# Extra mv step required as the owner of the wordpress directory (sudo -u) may not have access to backup directory
if mv "/tmp/${TS}"_database.sql "${bkp_DB_dir}/${TS}_database.sql" >> "${LOGFILE}" 2>&1; then if mv "/tmp/${TS}"_database.sql "${bkp_DB_dir}/${TS}_database.sql" >> "${LOGFILE}" 2>&1; then
echo "DB backed up successfully" | tee -a "${LOGFILE}" echo "DB backed up successfully" | tee -a "${LOGFILE}"
else else
@@ -334,7 +344,7 @@ main() {
export BORG_PASSPHRASE="${borg_passphrase}" export BORG_PASSPHRASE="${borg_passphrase}"
# Do the actual backup # Do the actual backup
# We run it on a lower priority so it does not disturb others # We run it on a lower IO priority so it does not disturb other processes
if ionice -c 2 -n 7 borg create \ if ionice -c 2 -n 7 borg create \
--verbose \ --verbose \
--filter AMEsd \ --filter AMEsd \