S SmartDocs
Series: Ricky bash 83 lines · Updated 2026-04-08

deploy-to-ec2.sh

Ricky/Cat Project Final/deploy-to-ec2.sh

#!/usr/bin/env bash
# Sync PawMatch frontend (Next.js) and backend (Flask) to AWS EC2.
# Usage: from the project root (same directory as this script):
#   chmod +x deploy-to-ec2.sh
#   ./deploy-to-ec2.sh
#
# Requires: rsync, ssh. Private key default: ./priv_cat.pem next to this script.

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

REMOTE_USER="${REMOTE_USER:-ubuntu}"
REMOTE_HOST="${REMOTE_HOST:-cat.rickyjuicy.com}"
SSH_KEY="${SSH_KEY:-$SCRIPT_DIR/priv_cat.pem}"
REMOTE_BASE="${REMOTE_BASE:-/home/ubuntu/cat}"

# Local source dirs (repo uses "fp_fixed " with trailing space; fallback without space)
FRONTEND_SRC="${FRONTEND_SRC:-$SCRIPT_DIR/fp_fixed }"
if [[ ! -d "$FRONTEND_SRC" ]]; then
  FRONTEND_SRC="$SCRIPT_DIR/fp_fixed"
fi
BACKEND_SRC="${BACKEND_SRC:-$SCRIPT_DIR/back_web-4}"

REMOTE="${REMOTE_USER}@${REMOTE_HOST}"

if [[ ! -f "$SSH_KEY" ]]; then
  echo "ERROR: SSH private key not found: $SSH_KEY" >&2
  echo "Set SSH_KEY=/path/to/priv_cat.pem or place priv_cat.pem beside this script." >&2
  exit 1
fi

if [[ ! -d "$BACKEND_SRC" ]]; then
  echo "ERROR: Backend directory not found: $BACKEND_SRC" >&2
  exit 1
fi

if [[ ! -d "$FRONTEND_SRC" ]]; then
  echo "ERROR: Frontend directory not found: $FRONTEND_SRC" >&2
  exit 1
fi

chmod 600 "$SSH_KEY" 2>/dev/null || true

# Safe quoting for rsync -e (paths with spaces)
RSYNC_SSH=(ssh -i "$SSH_KEY" -o StrictHostKeyChecking=accept-new)

RSYNC_EXCLUDES=(
  --exclude 'node_modules/'
  --exclude '.next/'
  --exclude 'venv/'
  --exclude '__pycache__/'
  --exclude '*.pyc'
  --exclude '.git/'
  --exclude 'logs/'
  --exclude '*.db-journal'
)

echo "==> Remote: ${REMOTE}:${REMOTE_BASE}"
echo "==> Frontend: $FRONTEND_SRC"
echo "==> Backend:  $BACKEND_SRC"
echo ""

rsync -avz --delete \
  "${RSYNC_EXCLUDES[@]}" \
  -e "${RSYNC_SSH[*]}" \
  "${FRONTEND_SRC}/" \
  "${REMOTE}:${REMOTE_BASE}/frontend/"

rsync -avz --delete \
  "${RSYNC_EXCLUDES[@]}" \
  -e "${RSYNC_SSH[*]}" \
  "${BACKEND_SRC}/" \
  "${REMOTE}:${REMOTE_BASE}/backend/"

echo ""
echo "==> Sync finished."
echo ""
echo "IMPORTANT: Do not commit secrets. On the server, ensure you have:"
echo "  - ${REMOTE_BASE}/backend/.env   (Flask: POE, OpenRouter, JWT, etc.)"
echo "  - ${REMOTE_BASE}/frontend/.env.production.local   (NEXT_PUBLIC_API_BASE=https://cat.rickyjuicy.com)"
echo ""
echo "Then on EC2: install deps, build frontend, restart services — see DEPLOY_EC2.md"

Related articles