Skip to content

Commit de2b54d

Browse files
committed
initial commit
0 parents  commit de2b54d

File tree

4 files changed

+318
-0
lines changed

4 files changed

+318
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
### 1.0.0: February 21st, 2019
2+
* Initial release

README.md

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# Sync Script
2+
3+
Syncing Bedrock-based WordPress environments with WP-CLI aliases and `rsync`.
4+
5+
## Installation
6+
7+
Create a new `scripts/` directory in your Bedrock directory (`site/`) and place the sync script inside of there.
8+
9+
Make sure that `sync.sh` is executable (`chmod u+x sync.sh`).
10+
11+
## Configuration
12+
13+
Edit the variables at the top of `sync.sh` to match the settings for your environments:
14+
15+
* `DEVDIR` — Local path to uploads directory
16+
* `DEVSITE` — Local dev URL
17+
* `PRODDIR``user@hostname:/path/to/uploads/`
18+
* `PRODSITE` — Production URL
19+
* `STAGDIR``user@hostname:/path/to/uploads/`
20+
* `STAGSITE` — Staging URL
21+
22+
The Kinsta version of the script is slightly different:
23+
24+
* `REMOTEDIR``user@hostname:/www/example_123/public/shared/uploads/`
25+
* `PRODPORT` — Production port
26+
* `STAGPORT` — Staging port
27+
28+
### WP-CLI aliases
29+
30+
WP-CLI aliases must be properly setup in order for the sync script to work. Open `wp-cli.yml` and setup the aliases for your environments.
31+
32+
#### Trellis WP-CLI aliases
33+
34+
```yml
35+
# site/wp-cli.yml
36+
path: web/wp
37+
38+
@development:
39+
ssh: vagrant@example.test/srv/www/example.com/current
40+
@staging:
41+
ssh: web@staging.example.com/srv/www/example.com/current
42+
@production:
43+
ssh: web@example.com/srv/www/example.com/current
44+
```
45+
46+
Test the aliases to make sure they're working:
47+
48+
```sh
49+
$ wp @development
50+
$ wp @staging
51+
$ wp @production
52+
```
53+
54+
#### Trellis + Kinsta WP-CLI aliases
55+
56+
```yml
57+
# site/wp-cli.yml
58+
path: web/wp
59+
60+
@development:
61+
ssh: vagrant@example.test/srv/www/example.com/current
62+
@staging:
63+
ssh: example@1.2.3.4:54321/www/example_123/public/current/web
64+
@production:
65+
ssh: example@1.2.3.4:12345/www/example_123/public/current/web
66+
```
67+
68+
### `.gitignore`
69+
70+
Open `.gitignore` in your Bedrock directory (`site/`) and add the following:
71+
72+
```
73+
# WP-CLI
74+
*_development*.sql
75+
```
76+
77+
When you sync down to your local development environment a database backup is performed with `wp db export`. This helps you safely recover your database if you accidentally sync, and by making this modification to `.gitignore` you're ensuring that your local database export doesn't accidentally get commited to your git repository.
78+
79+
### Slack notification
80+
81+
Uncomment the lines near the end of the script if you'd like to enable the Slack notification for when the sync directory is up or horizontal.
82+
83+
Make sure to [create a new incoming webhook](https://api.slack.com/incoming-webhooks) and updating the URL in the script, as well as the channel.
84+
85+
## Usage
86+
87+
If your local development environment is a VM, don't run the sync script from inside of the VM — run it on your host machine.
88+
89+
Navigate to the `site/scripts/` directory to use the sync script.
90+
91+
Possible sync directions:
92+
93+
```sh
94+
# Sync production down to development
95+
$ ./sync.sh production development
96+
97+
# Sync staging down to development
98+
$ ./sync.sh staging development
99+
100+
# Sync development up to producton
101+
$ ./sync.sh development production
102+
103+
# Sync development up to staging
104+
$ ./sync.sh development staging
105+
106+
# Sync production to staging
107+
$ ./sync.sh production staging
108+
109+
# Sync staging to production
110+
$ ./sync.sh staging production
111+
```
112+
113+
## Troubleshooting
114+
115+
### Unable to connect to development
116+
117+
Make sure that your local development setup is up and running.
118+
119+
### Unable to connect to production or staging
120+
121+
Make sure that you're able to successfully connect with a SSH connection with the same details configured for the same WP-CLI alias.
122+
123+
If your SSH connection doesn't fail, make sure WordPress is first already installed.
124+
125+
## Support
126+
127+
[Shoot me an email](mailto:ben@roots.io) with any issues you run into.
128+
129+
You can re-download the latest version by visiting [https://roots.io/product-links/](https://roots.io/product-links/).

sync-kinsta.sh

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#!/bin/bash
2+
3+
# Syncing Trellis & Bedrock-based WordPress environments with WP-CLI aliases (Kinsta version)
4+
# Copyright (c) Ben Word
5+
6+
DEVDIR="web/app/uploads/"
7+
DEVSITE="https://example.test"
8+
DEVPORT="22"
9+
10+
REMOTEDIR="example@1.2.3.4:/www/example_123/public/shared/uploads/"
11+
12+
PRODPORT="12345"
13+
PRODSITE="https://example.com"
14+
15+
STAGPORT="54321"
16+
STAGSITE="https://staging-example.kinsta.cloud"
17+
18+
FROM=$1
19+
TO=$2
20+
21+
bold=$(tput bold)
22+
normal=$(tput sgr0)
23+
24+
case "$1-$2" in
25+
production-development) DIR="down ⬇️ " FROMSITE=$PRODSITE; FROMDIR=$REMOTEDIR; FROMPORT=$PRODPORT; TOPORT=$DEVPORT; TOSITE=$DEVSITE; TODIR=$DEVDIR; ;;
26+
staging-development) DIR="down ⬇️ " FROMSITE=$STAGSITE; FROMDIR=$REMOTEDIR; FROMPORT=$STAGPORT; TOPORT=$DEVPORT; TOSITE=$DEVSITE; TODIR=$DEVDIR; ;;
27+
development-production) DIR="up ⬆️ " FROMSITE=$DEVSITE; FROMDIR=$DEVDIR; FROMPORT=$DEVPORT; TOPORT=$PRODPORT; TOSITE=$PRODSITE; TODIR=$REMOTEDIR; ;;
28+
development-staging) DIR="up ⬆️ " FROMSITE=$DEVSITE; FROMDIR=$DEVDIR; FROMPORT=$DEVPORT; TOPORT=$STAGPORT; TOSITE=$STAGSITE; TODIR=$REMOTEDIR; ;;
29+
production-staging) DIR="horizontally ↔️ "; FROMSITE=$PRODSITE; FROMDIR=$REMOTEDIR; FROMPORT=$PRODPORT; TOPORT=$STAGPORT; TOSITE=$STAGSITE; TODIR=$REMOTEDIR; ;;
30+
staging-production) DIR="horizontally ↔️ "; FROMSITE=$STAGSITE; FROMDIR=$REMOTEDIR; FROMPORT=$STAGPORT; TOPORT=$PRODPORT; TOSITE=$PRODSITE; TODIR=$REMOTEDIR; ;;
31+
*) echo "usage: $0 production development | staging development | development staging | development production | staging production | production staging" && exit 1 ;;
32+
esac
33+
34+
read -r -p "
35+
🔄 Would you really like to ⚠️ ${bold}reset the $TO database${normal} ($TOSITE)
36+
and sync ${bold}$DIR${normal} from $FROM ($FROMSITE)? [y/N] " response
37+
38+
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
39+
# Change to site directory
40+
cd ../ &&
41+
echo
42+
43+
# Make sure both environments are available before we continue
44+
availfrom() {
45+
local AVAILFROM
46+
AVAILFROM=$(wp "@$FROM" option get home 2>&1)
47+
if [[ $AVAILFROM == *"Error"* ]]; then
48+
echo "❌ Unable to connect to $FROM"
49+
exit 1
50+
else
51+
echo "✅ Able to connect to $FROM"
52+
fi
53+
};
54+
availfrom
55+
56+
availto() {
57+
local AVAILTO
58+
AVAILTO=$(wp "@$TO" option get home 2>&1)
59+
if [[ $AVAILTO == *"Error"* ]]; then
60+
echo "❌ Unable to connect to $TO"
61+
exit 1
62+
else
63+
echo "✅ Able to connect to $TO"
64+
fi
65+
};
66+
availto
67+
echo
68+
69+
# Export/import database, run search & replace
70+
wp "@$TO" db export &&
71+
wp "@$TO" db reset --yes &&
72+
wp "@$FROM" db export - | wp "@$TO" db import - &&
73+
wp "@$TO" search-replace "$FROMSITE" "$TOSITE" &&
74+
75+
# Sync uploads directory
76+
chmod -R 755 web/app/uploads/ &&
77+
if [[ $DIR == "horizontally"* ]]; then
78+
[[ $FROMDIR =~ ^(.*): ]] && FROMHOST=${BASH_REMATCH[1]}
79+
[[ $FROMDIR =~ ^(.*):(.*)$ ]] && FROMDIR=${BASH_REMATCH[2]}
80+
[[ $TODIR =~ ^(.*): ]] && TOHOST=${BASH_REMATCH[1]}
81+
[[ $TODIR =~ ^(.*):(.*)$ ]] && TODIR=${BASH_REMATCH[2]}
82+
83+
ssh -p $FROMPORT -o ForwardAgent=yes $FROMHOST "rsync -aze 'ssh -o StrictHostKeyChecking=no -p $TOPORT' --progress $FROMDIR $TOHOST:$TODIR"
84+
elif [[ $DIR == "down"* ]]; then
85+
rsync -chavzP -e "ssh -p $FROMPORT" --progress "$FROMDIR" "$TODIR"
86+
else
87+
rsync -az -e "ssh -p $TOPORT" --progress "$FROMDIR" "$TODIR"
88+
fi
89+
90+
# Slack notification when sync direction is up or horizontal
91+
# if [[ $DIR != "down"* ]]; then
92+
# USER="$(git config user.name)"
93+
# 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
94+
# fi
95+
echo -e "\n\n🔄 Sync from $FROM to $TO complete.\n\n ${bold}$TOSITE${normal}\n"
96+
fi

sync.sh

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#!/bin/bash
2+
3+
# Syncing Trellis & Bedrock-based WordPress environments with WP-CLI aliases
4+
# Copyright (c) Ben Word
5+
6+
DEVDIR="web/app/uploads/"
7+
DEVSITE="https://example.test"
8+
9+
PRODDIR="web@example.com:/srv/www/example/shared/uploads/"
10+
PRODSITE="https://example.com"
11+
12+
STAGDIR="web@staging.example.com:/srv/www/example/shared/uploads/"
13+
STAGSITE="https://staging.example.com"
14+
15+
FROM=$1
16+
TO=$2
17+
18+
bold=$(tput bold)
19+
normal=$(tput sgr0)
20+
21+
case "$1-$2" in
22+
production-development) DIR="down ⬇️ " FROMSITE=$PRODSITE; FROMDIR=$PRODDIR; TOSITE=$DEVSITE; TODIR=$DEVDIR; ;;
23+
staging-development) DIR="down ⬇️ " FROMSITE=$STAGSITE; FROMDIR=$STAGDIR; TOSITE=$DEVSITE; TODIR=$DEVDIR; ;;
24+
development-production) DIR="up ⬆️ " FROMSITE=$DEVSITE; FROMDIR=$DEVDIR; TOSITE=$PRODSITE; TODIR=$PRODDIR; ;;
25+
development-staging) DIR="up ⬆️ " FROMSITE=$DEVSITE; FROMDIR=$DEVDIR; TOSITE=$STAGSITE; TODIR=$STAGDIR; ;;
26+
production-staging) DIR="horizontally ↔️ "; FROMSITE=$PRODSITE; FROMDIR=$PRODDIR; TOSITE=$STAGSITE; TODIR=$STAGDIR; ;;
27+
staging-production) DIR="horizontally ↔️ "; FROMSITE=$STAGSITE; FROMDIR=$STAGDIR; TOSITE=$PRODSITE; TODIR=$PRODDIR; ;;
28+
*) echo "usage: $0 production development | staging development | development staging | development production | staging production | production staging" && exit 1 ;;
29+
esac
30+
31+
read -r -p "
32+
🔄 Would you really like to ⚠️ ${bold}reset the $TO database${normal} ($TOSITE)
33+
and sync ${bold}$DIR${normal} from $FROM ($FROMSITE)? [y/N] " response
34+
35+
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
36+
# Change to site directory
37+
cd ../ &&
38+
echo
39+
40+
# Make sure both environments are available before we continue
41+
availfrom() {
42+
local AVAILFROM
43+
AVAILFROM=$(wp "@$FROM" option get home 2>&1)
44+
if [[ $AVAILFROM == *"Error"* ]]; then
45+
echo "❌ Unable to connect to $FROM"
46+
exit 1
47+
else
48+
echo "✅ Able to connect to $FROM"
49+
fi
50+
};
51+
availfrom
52+
53+
availto() {
54+
local AVAILTO
55+
AVAILTO=$(wp "@$TO" option get home 2>&1)
56+
if [[ $AVAILTO == *"Error"* ]]; then
57+
echo "❌ Unable to connect to $TO"
58+
exit 1
59+
else
60+
echo "✅ Able to connect to $TO"
61+
fi
62+
};
63+
availto
64+
echo
65+
66+
# Export/import database, run search & replace
67+
wp "@$TO" db export &&
68+
wp "@$TO" db reset --yes &&
69+
wp "@$FROM" db export - | wp "@$TO" db import - &&
70+
wp "@$TO" search-replace "$FROMSITE" "$TOSITE" &&
71+
72+
# Sync uploads directory
73+
chmod -R 755 web/app/uploads/ &&
74+
if [[ $DIR == "horizontally"* ]]; then
75+
[[ $FROMDIR =~ ^(.*): ]] && FROMHOST=${BASH_REMATCH[1]}
76+
[[ $FROMDIR =~ ^(.*):(.*)$ ]] && FROMDIR=${BASH_REMATCH[2]}
77+
[[ $TODIR =~ ^(.*): ]] && TOHOST=${BASH_REMATCH[1]}
78+
[[ $TODIR =~ ^(.*):(.*)$ ]] && TODIR=${BASH_REMATCH[2]}
79+
80+
ssh -o ForwardAgent=yes $FROMHOST "rsync -aze 'ssh -o StrictHostKeyChecking=no' --progress $FROMDIR $TOHOST:$TODIR"
81+
else
82+
rsync -az --progress "$FROMDIR" "$TODIR"
83+
fi
84+
85+
# Slack notification when sync direction is up or horizontal
86+
# if [[ $DIR != "down"* ]]; then
87+
# USER="$(git config user.name)"
88+
# 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
89+
# fi
90+
echo -e "\n\n🔄 Sync from $FROM to $TO complete.\n\n ${bold}$TOSITE${normal}\n"
91+
fi

0 commit comments

Comments
 (0)