oont-dev/sync-prod-to-dev.sh
nomadics9 1d6f52f692 init
2025-02-09 17:33:40 +03:00

147 lines
4.4 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# sync-prod-to-dev.sh
#
# 1. Dump the Production WordPress DB using mysqldump
# 2. Transfer the dump file to Dev (optional step if needed)
# 3. Import the dump into Dev using mysql
# 4. Use WP-CLI on Dev to run search-replace for the domain
#
# Assumes:
# - You have MySQL credentials for both Prod and Dev
# - WP-CLI is installed on Dev
# - The Dev WordPress site is configured (wp-config.php) in the DEV_WP_PATH
# - SSH is set up between local/Dev and Prod (if they are separate servers)
#
# Note: For dev environment, typical domain is "http://localhost:8080" or "http://dev.example.com".
#
# IMPORTANT: This will overwrite your Dev database each time it's run.
####################################
# COPY THEMES AND PLUGINS
####################################
echo "=== Copying Themes, plugins & uploads ==="
cp -r /var/www/oont/oont-contents/themes/ /var/www/html/wp-content
cp -r /var/www/oont/oont-contents/plugins/ /var/www/html/wp-content
cp -r /var/www/oont/uploads /var/www/html/wp-content
cp -r /var/www/oont/uploads-webpc/ /var/www/html/wp-content
####################################
# 1. CONFIGURE THESE VARIABLES
####################################
# --- Production DB ---
PROD_DB_HOST="${PROD_DB_HOST}"
PROD_DB_USER="${PROD_DB_USER}"
PROD_DB_PASS="${PROD_DB_PASS}"
PROD_DB_NAME="${PROD_DB_NAME}"
# --- Dev DB ---
DEV_DB_HOST="${WORDPRESS_DB_HOST}"
DEV_DB_USER="${WORDPRESS_DB_USER}"
DEV_DB_PASS="${WORDPRESS_DB_PASSWORD}"
DEV_DB_NAME="${WORDPRESS_DB_NAME}"
# Temporary SQL dump file
SQL_FILE="/tmp/prod-dump.sql"
# Old (production) and New (dev) domain
OLD_DOMAIN="${PROD_DOMAIN}"
NEW_DOMAIN="${DEV_DOMAIN}"
####################################
# 2. DUMP PRODUCTION DB
####################################
apt update && apt install mariadb-client
echo -e "\033[31mDo you want to dump the latest DB? [y/N]: \033[0m"
read -n 1 -r
echo # move to a new line
# Check the response (if the first character is y/Y, proceed)
if [[ "$REPLY" =~ ^[Yy]$ ]]; then
echo "=== Dumping Production DB from ${PROD_DB_HOST} ==="
mysqldump --single-transaction \
-h "${PROD_DB_HOST}" \
-u "${PROD_DB_USER}" \
-p"${PROD_DB_PASS}" \
--add-drop-table \
"${PROD_DB_NAME}" \
> "${SQL_FILE}" &
# Capture the PID of the mysqldump job
DUMP_PID=$!
echo "Mysqldump started (PID: $DUMP_PID). Monitoring file size..."
# While the dump is still running, show file size every 5 seconds
while kill -0 "$DUMP_PID" 2>/dev/null; do
CURRENT_SIZE=$(du -h "${SQL_FILE}" 2>/dev/null | cut -f1)
echo "Current dump size: $CURRENT_SIZE"
sleep 5
done
# Wait for mysqldump to finish (or capture its exit code)
wait "$DUMP_PID"
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
echo "Dump completed successfully!"
else
echo "Dump failed with exit code $EXIT_CODE"
fi
else
echo "Skipping database dump."
fi
####################################
# 3. IMPORT INTO DEV DB
####################################
echo "=== Importing dump into Dev DB on ${DEV_DB_HOST} ==="
mysql \
-h "${DEV_DB_HOST}" \
-u "${DEV_DB_USER}" \
-p"${DEV_DB_PASS}" \
"${DEV_DB_NAME}" \
< "${SQL_FILE}"
if [ $? -ne 0 ]; then
echo "ERROR: Failed to import into dev DB."
exit 1
fi
####################################
# 4. SEARCH & REPLACE WITH WP-CLI
####################################
echo "=== Running WP-CLI search-replace to fix domain: ${OLD_DOMAIN} -> ${NEW_DOMAIN} ==="
cd "${DEV_WP_PATH}" || {
echo "ERROR: Cannot cd into dev WP path: ${DEV_WP_PATH}"
exit 1
}
# We do two replacements to handle both http and https references.
# If your production is strictly https, you can remove the http line.
# If your prod is strictly http, you can remove the https line.
# Otherwise, let's do both for completeness.
# Replace https://OLD_DOMAIN with http://NEW_DOMAIN
php -d memory_limit=512M /usr/local/bin/wp search-replace "https://${OLD_DOMAIN}" "http://${NEW_DOMAIN}" --skip-columns=guid --allow-root
php -d memory_limit=512M /usr/local/bin/wp search-replace "http://${OLD_DOMAIN}" "http://${NEW_DOMAIN}" --skip-columns=guid --allow-root
# If you want your dev site to be https too, adjust accordingly.
if [ $? -ne 0 ]; then
echo "ERROR: WP-CLI search-replace failed."
exit 1
fi
####################################
# 5. CLEANUP (OPTIONAL)
####################################
# echo "=== Removing SQL file: ${SQL_FILE} ==="
# rm -f "${SQL_FILE}"
#
echo "=== Done! Your Dev DB is now synced from Prod and domain references updated. ==="