← Back to Blog

Deploying WordPress from LocalWP to AWS Lightsail: Manual & Automated Script

This guide explains how to deploy a WordPress site from LocalWP to AWS Lightsail, either manually or using a robust Bash deployment script.

πŸš€ Before You Begin

πŸ—οΈ Set Up AWS Lightsail Instance

πŸ§ͺ Start Site in LocalWP

βœ… Part 1: Manual Deployment β€” Step-by-Step

The manual process uses shell commands to move your site to AWS Lightsail.

πŸ” 1. Prepare Your SSH Key

chmod 400 ~/Downloads/LightsailDefaultKey-eu-central-1.pem

πŸ’Ύ 2. Export the Local Database

Inside the Site Shell from LocalWP:

wp db export ~/Local\ Sites/buzybuzz/app/public/local-site.sql --add-drop-table

πŸ“¦ 3. Zip the wp-content Folder

cd "~/Local Sites/buzybuzz/app/public"
zip -r wp-content.zip wp-content

☁️ 4. Upload Files to Lightsail

scp -i ~/Downloads/LightsailDefaultKey-eu-central-1.pem wp-content.zip bitnami@63.178.84.97:~
scp -i ~/Downloads/LightsailDefaultKey-eu-central-1.pem local-site.sql bitnami@63.178.84.97:~

πŸ–₯ 5. SSH Into Lightsail

ssh -i ~/Downloads/LightsailDefaultKey-eu-central-1.pem bitnami@63.178.84.97

🧹 6. Remove Old wp-content

cd /home/bitnami/stack/wordpress
rm -rf wp-content/*

🧯 7. Unzip wp-content

unzip ~/wp-content.zip -d .

πŸ” 8. Set File Permissions

sudo chown -R bitnami:daemon wp-content
sudo find wp-content -type d -exec chmod 775 {} \;
sudo find wp-content -type f -exec chmod 664 {} \;

πŸ” 9. Get Database Password

grep DB_PASSWORD wp-config.php

πŸ’£ 10. Drop and Recreate DB

/opt/bitnami/mariadb/bin/mariadb -u bn_wordpress -p

In the MariaDB shell:

DROP DATABASE IF EXISTS bitnami_wordpress;
CREATE DATABASE bitnami_wordpress;
EXIT;

πŸ“₯ 11. Import SQL Dump

/opt/bitnami/mariadb/bin/mariadb -u bn_wordpress -p bitnami_wordpress < ~/local-site.sql

πŸ”— 12. Replace URLs

sudo wp search-replace "https://buzybuzz.local" "http://63.178.84.97" --all-tables
sudo wp search-replace "http://buzybuzz.local" "http://63.178.84.97" --all-tables
sudo wp search-replace "buzybuzz.local" "63.178.84.97" --all-tables

🚿 13. Flush Cache and Permalinks

sudo wp cache flush
sudo wp rewrite flush

βœ… Visit your deployed site at:

http://63.178.84.97

🧾 Part 2: Automated Deployment Script

This script automates all the steps above with a few variables to update.

πŸ“œ Deployment Script

# !/bin/bash

set -euo pipefail
trap 'echo -e "\n❌ Error occurred during deployment. Exiting."; exit 1' ERR

# === CONFIGURATION ===
PEM_PATH="$HOME/Downloads/LightsailDefaultKey-eu-central-1.pem"
LOCAL_PATH="$HOME/Local Sites/buzybuzz/app/public"
REMOTE_USER=bitnami
REMOTE_IP=63.178.84.97
SITE_NAME="buzybuzz"
LOCAL_DOMAIN="http://$SITE_NAME.local"
REMOTE_DOMAIN="http://$REMOTE_IP"
REMOTE_WP_DIR="/home/bitnami/stack/wordpress"
REMOTE_HOME="/home/bitnami"

SQL_DUMP="$LOCAL_PATH/local-site.sql"
ZIP_FILE="$LOCAL_PATH/wp-content.zip"

# === Ensure PEM key has correct permissions ===
chmod 400 "$PEM_PATH"

echo "πŸ“€ Exporting DB..."
cd "$LOCAL_PATH" && wp db export "$SQL_DUMP" --add-drop-table

# STEP 4: Zip wp-content
echo "πŸ—œοΈ Zipping wp-content..."
cd "$LOCAL_PATH"
zip -r -q "wp-content.zip" "wp-content"

# === Validate local files ===
echo "βœ… Validating SQL and zip files..."
[[ -f "$ZIP_FILE" ]] || { echo "❌ Missing: $ZIP_FILE"; exit 1; }
[[ -f "$SQL_DUMP" ]] || { echo "❌ Missing: $SQL_DUMP"; exit 1; }

# === Upload files to server ===
echo "πŸ“€ Uploading to server..."
scp -i "$PEM_PATH" "$ZIP_FILE" "$SQL_DUMP" "$REMOTE_USER@$REMOTE_IP:$REMOTE_HOME"

# === Run remote deployment ===
echo "πŸš€ Running remote deployment..."
ssh -i "$PEM_PATH" "$REMOTE_USER@$REMOTE_IP" \
  REMOTE_WP_DIR="$REMOTE_WP_DIR" \
  REMOTE_HOME="$REMOTE_HOME" \
  SITE_NAME="$SITE_NAME" \
  REMOTE_IP="$REMOTE_IP" \
  REMOTE_DOMAIN="$REMOTE_DOMAIN" \
  'bash -s' <<'EOF'
set -euo pipefail
trap 'echo -e "\n❌ Remote deployment failed. Exiting."; exit 1' ERR

echo "🧹 Removing existing wp-content..."
cd "$REMOTE_WP_DIR"
rm -rf wp-content/*

echo "πŸ“¦ Unzipping wp-content..."
unzip -o "$REMOTE_HOME/wp-content.zip" -d "$REMOTE_WP_DIR"

echo "πŸ” Setting permissions on wp-content..."
sudo chown -R bitnami:daemon wp-content
sudo find wp-content -type d -exec chmod 775 {} \;
sudo find wp-content -type f -exec chmod 664 {} \;

echo "πŸ” Reading DB password from wp-config.php..."
PASS=$(grep DB_PASSWORD "$REMOTE_WP_DIR/wp-config.php" | cut -d "'" -f 4)
if [[ -z "$PASS" ]]; then
  echo "❌ Could not extract DB_PASSWORD from wp-config.php"
  exit 1
fi

echo "πŸ“‚ Dropping and recreating database..."
/opt/bitnami/mariadb/bin/mariadb -u bn_wordpress -p"$PASS" -e "DROP DATABASE IF EXISTS bitnami_wordpress; CREATE DATABASE bitnami_wordpress;"

echo "πŸ“… Importing database..."
/opt/bitnami/mariadb/bin/mariadb -u bn_wordpress -p"$PASS" bitnami_wordpress < "$REMOTE_HOME/local-site.sql"

echo "πŸ”— Replacing URLs..."
sudo wp search-replace "https://$SITE_NAME.local" "$REMOTE_DOMAIN" --all-tables
sudo wp search-replace "http://$SITE_NAME.local" "$REMOTE_DOMAIN" --all-tables
sudo wp search-replace "$SITE_NAME.local" "$REMOTE_IP" --all-tables

echo "🧼 Flushing cache and rewrites..."
sudo wp cache flush
sudo wp rewrite flush

echo "βœ… Remote deployment complete!"
EOF

βœ… Summary