Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 129 additions & 27 deletions sync-kinsta.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/bash

# Syncing Trellis & Bedrock-based WordPress environments with WP-CLI aliases (Kinsta version)
# Version 1.1.0
# Version 1.2.0
# Copyright (c) Ben Word

DEVDIR="web/app/uploads/"
Expand All @@ -16,6 +16,44 @@ PRODSITE="https://example.com"
STAGPORT="54321"
STAGSITE="https://staging-example.kinsta.cloud"

LOCAL=false
NO_DB=false
NO_ASSETS=false
POSITIONAL_ARGS=()

while [[ $# -gt 0 ]]; do
case $1 in
--no-db)
NO_DB=true
shift
;;
--no-assets)
NO_ASSETS=true
shift
;;
--local)
LOCAL=true
shift
;;
--*)
echo "Unknown option $1"
exit 1
;;
*)
POSITIONAL_ARGS+=("$1")
shift
;;
esac
done

set -- "${POSITIONAL_ARGS[@]}"

if [ $# != 2 ]
then
echo "Usage: $0 [[--no-db] [--no-assets] [--local]] [ENV_FROM] [ENV_TO]"
exit;
fi

FROM=$1
TO=$2

Expand All @@ -29,12 +67,30 @@ case "$1-$2" in
development-staging) DIR="up ⬆️ " FROMSITE=$DEVSITE; FROMDIR=$DEVDIR; FROMPORT=$DEVPORT; TOPORT=$STAGPORT; TOSITE=$STAGSITE; TODIR=$REMOTEDIR; ;;
production-staging) DIR="horizontally ↔️ "; FROMSITE=$PRODSITE; FROMDIR=$REMOTEDIR; FROMPORT=$PRODPORT; TOPORT=$STAGPORT; TOSITE=$STAGSITE; TODIR=$REMOTEDIR; ;;
staging-production) DIR="horizontally ↔️ "; FROMSITE=$STAGSITE; FROMDIR=$REMOTEDIR; FROMPORT=$STAGPORT; TOPORT=$PRODPORT; TOSITE=$PRODSITE; TODIR=$REMOTEDIR; ;;
*) echo "usage: $0 production development | staging development | development staging | development production | staging production | production staging" && exit 1 ;;
*) echo "usage: $0 [[--no-db] [--no-assets] [--local]] production development | staging development | development staging | development production | staging production | production staging" && exit 1 ;;
esac

read -r -p "
🔄 Would you really like to ⚠️ ${bold}reset the $TO database${normal} ($TOSITE)
and sync ${bold}$DIR${normal} from $FROM ($FROMSITE)? [y/N] " response
if [ "$NO_DB" = false ]
then
DB_MESSAGE=" - ${bold}reset the $TO database${normal} ($TOSITE)"
fi

if [ "$NO_ASSETS" = false ]
then
ASSETS_MESSAGE=" - sync ${bold}$DIR${normal} from $FROM ($FROMSITE)?"
fi

if [ "$NO_DB" = true ] && [ "$NO_ASSETS" = true ]
then
echo "Nothing to synchronize."
exit;
fi

echo
echo "Would you really like to "
echo $DB_MESSAGE
echo $ASSETS_MESSAGE
read -r -p " [y/N] " response

if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
# Change to site directory
Expand All @@ -44,7 +100,12 @@ if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
# Make sure both environments are available before we continue
availfrom() {
local AVAILFROM
AVAILFROM=$(wp "@$FROM" option get home 2>&1)

if [[ "$LOCAL" = true && $FROM == "development" ]]; then
AVAILFROM=$(wp option get home 2>&1)
else
AVAILFROM=$(wp "@$FROM" option get home 2>&1)
fi
if [[ $AVAILFROM == *"Error"* ]]; then
echo "❌ Unable to connect to $FROM"
exit 1
Expand All @@ -56,42 +117,83 @@ if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then

availto() {
local AVAILTO
AVAILTO=$(wp "@$TO" option get home 2>&1)
if [[ "$LOCAL" = true && $TO == "development" ]]; then
AVAILTO=$(wp option get home 2>&1)
else
AVAILTO=$(wp "@$TO" option get home 2>&1)
fi

if [[ $AVAILTO == *"Error"* ]]; then
echo "❌ Unable to connect to $TO"
echo "❌ Unable to connect to $TO $AVAILTO"
exit 1
else
echo "✅ Able to connect to $TO"
fi
};
availto
echo

# Export/import database, run search & replace
wp "@$TO" db export &&
wp "@$TO" db reset --yes &&
wp "@$FROM" db export - | wp "@$TO" db import - &&
wp "@$TO" search-replace "$FROMSITE" "$TOSITE" &&

# Sync uploads directory
chmod -R 755 web/app/uploads/ &&
if [[ $DIR == "horizontally"* ]]; then
[[ $FROMDIR =~ ^(.*): ]] && FROMHOST=${BASH_REMATCH[1]}
[[ $FROMDIR =~ ^(.*):(.*)$ ]] && FROMDIR=${BASH_REMATCH[2]}
[[ $TODIR =~ ^(.*): ]] && TOHOST=${BASH_REMATCH[1]}
[[ $TODIR =~ ^(.*):(.*)$ ]] && TODIR=${BASH_REMATCH[2]}

ssh -p $FROMPORT -o ForwardAgent=yes $FROMHOST "rsync -aze 'ssh -o StrictHostKeyChecking=no -p $TOPORT' --progress $FROMDIR $TOHOST:$TODIR"
elif [[ $DIR == "down"* ]]; then
rsync -chavzP -e "ssh -p $FROMPORT" --progress "$FROMDIR" "$TODIR"
if [[ "$LOCAL" = true && $TO == "development" ]]; then
wp db export &&
wp db reset --yes &&
wp "@$FROM" db export - | wp db import - &&
wp search-replace "$FROMSITE" "$TOSITE"
elif [[ "$LOCAL" = true && $FROM == "development" ]]; then
wp "@$TO" db export &&
wp "@$TO" db reset --yes &&
wp db export - | wp "@$TO" db import - &&
wp "@$TO" search-replace "$FROMSITE" "$TOSITE"
else
rsync -az -e "ssh -p $TOPORT" --progress "$FROMDIR" "$TODIR"
wp "@$TO" db export &&
wp "@$TO" db reset --yes &&
wp "@$FROM" db export - | wp "@$TO" db import - &&
wp "@$TO" search-replace "$FROMSITE" "$TOSITE"
fi

if [ "$NO_DB" = false ]
then
echo "Syncing database..."
if [[ "$LOCAL" = true && $TO == "development" ]]; then
wp db export &&
wp db reset --yes &&
wp "@$FROM" db export - | wp db import - &&
wp search-replace "$FROMSITE" "$TOSITE"
elif [[ "$LOCAL" = true && $FROM == "development" ]]; then
wp "@$TO" db export &&
wp "@$TO" db reset --yes &&
wp db export - | wp "@$TO" db import - &&
wp "@$TO" search-replace "$FROMSITE" "$TOSITE"
else
wp "@$TO" db export &&
wp "@$TO" db reset --yes &&
wp "@$FROM" db export - | wp "@$TO" db import - &&
wp "@$TO" search-replace "$FROMSITE" "$TOSITE"
fi
fi

if [ "$NO_ASSETS" = false ]
then
echo "Syncing assets..."
# Sync uploads directory
chmod -R 755 web/app/uploads/ &&
if [[ $DIR == "horizontally"* ]]; then
[[ $FROMDIR =~ ^(.*): ]] && FROMHOST=${BASH_REMATCH[1]}
[[ $FROMDIR =~ ^(.*):(.*)$ ]] && FROMDIR=${BASH_REMATCH[2]}
[[ $TODIR =~ ^(.*): ]] && TOHOST=${BASH_REMATCH[1]}
[[ $TODIR =~ ^(.*):(.*)$ ]] && TODIR=${BASH_REMATCH[2]}

ssh -p $FROMPORT -o ForwardAgent=yes $FROMHOST "rsync -aze 'ssh -o StrictHostKeyChecking=no -p $TOPORT' --progress $FROMDIR $TOHOST:$TODIR"
elif [[ $DIR == "down"* ]]; then
rsync -chavzP -e "ssh -p $FROMPORT" --progress "$FROMDIR" "$TODIR"
else
rsync -az -e "ssh -p $TOPORT" --progress "$FROMDIR" "$TODIR"
fi
fi

# Slack notification when sync direction is up or horizontal
# if [[ $DIR != "down"* ]]; then
# USER="$(git config user.name)"
# curl -X POST -H "Content-type: application/json" --data "{\"attachments\":[{\"fallback\": \"\",\"color\":\"#36a64f\",\"text\":\"🔄 Sync from ${FROMSITE} to ${TOSITE} by ${USER} complete \"}],\"channel\":\"#site\"}" https://hooks.slack.com/services/xx/xx/xx
# fi
echo -e "\n\n🔄 Sync from $FROM to $TO complete.\n\n ${bold}$TOSITE${normal}\n"
echo -e "\n🔄 Sync from $FROM to $TO complete.\n\n ${bold}$TOSITE${normal}\n"
fi