#!/bin/bash # ============================================================================== # NGINX CONFIG DEPLOYMENT SCRIPT (v3) # # This script securely copies NGINX configuration files to a remote server. # It handles "Permission Denied" errors by first uploading files to a # temporary directory, and then using `sudo` to move them to the # protected /etc/nginx/ directory. # # INSTRUCTIONS: # 1. Edit the `REMOTE_USER` and `REMOTE_HOST` variables. # 2. Make the script executable: chmod +x .sh # 3. Run the script: ./.sh # ============================================================================== # --- Configuration --- # PLEASE EDIT THESE TWO VARIABLES with your server details. REMOTE_USER="ubuntu" # Example: ubuntu, ec2-user, root REMOTE_HOST="3.9.182.122" # Example: 192.168.1.100 or my-server.com # --- File & Path Definitions --- KEY_FILE="~/repos/azeem-macbookair.pem" SOURCE_NGINX_CONF="nginx.conf" SOURCE_SITES_DIR="sites-available" # Destination paths on the remote server DEST_NGINX_PATH="/etc/nginx/" DEST_SITES_PATH="/etc/nginx/sites-available/" # Temporary directory on the remote server (relative to the user's home dir) # NOTE: Removed the '~' to make it more compatible with scp. REMOTE_TEMP_DIR="nginx_deploy_temp" # --- Script Logic --- echo "🚀 Starting NGINX configuration deployment to $REMOTE_HOST..." echo "--------------------------------------------------------" # Expand the tilde (~) in the key file path to an absolute path. EVAL_KEY_FILE=$(eval echo "$KEY_FILE") # --- Pre-flight Checks --- if [ ! -f "$EVAL_KEY_FILE" ]; then echo "❌ ERROR: SSH key not found at $EVAL_KEY_FILE" exit 1 fi if [ ! -f "$SOURCE_NGINX_CONF" ]; then echo "❌ ERROR: Source file '$SOURCE_NGINX_CONF' not found." exit 1 fi if [ ! -d "$SOURCE_SITES_DIR" ]; then echo "❌ ERROR: Source directory '$SOURCE_SITES_DIR' not found." exit 1 fi # --- Remote Operations --- # Step 1: Create the temporary directory on the remote server. # This command runs in the user's home directory by default. echo "-> Creating temporary directory on remote server..." ssh -i "$EVAL_KEY_FILE" "${REMOTE_USER}@${REMOTE_HOST}" "mkdir -p $REMOTE_TEMP_DIR" if [ $? -ne 0 ]; then echo "❌ ERROR: Failed to create temporary directory on the remote server. Aborting." exit 1 fi echo " ✅ Remote temporary directory is ready." echo # Step 2: Transfer all files to the temporary directory. # We transfer nginx.conf AND the entire sites-available directory in one command. echo "- Transferring configuration files to temporary location..." scp -i "$EVAL_KEY_FILE" -r "$SOURCE_NGINX_CONF" "$SOURCE_SITES_DIR" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_TEMP_DIR}/" if [ $? -ne 0 ]; then echo "❌ ERROR: File transfer failed. Aborting." exit 1 fi echo " ✅ All files successfully transferred to temporary location." echo # Step 3: Move files from temp to final destination using sudo and clean up. echo "- Moving files into place with sudo and cleaning up..." ssh -i "$EVAL_KEY_FILE" "${REMOTE_USER}@${REMOTE_HOST}" << EOF # Move the main config file sudo mv "$REMOTE_TEMP_DIR/nginx.conf" "${DEST_NGINX_PATH}nginx.conf" # Move the sites-available files sudo mv "$REMOTE_TEMP_DIR/sites-available/"* "$DEST_SITES_PATH" # Remove the temporary directory rm -rf "$REMOTE_TEMP_DIR" echo " -> Verifying Nginx configuration..." # Test the Nginx configuration for syntax errors sudo nginx -t EOF if [ $? -ne 0 ]; then echo "⚠️ WARNING: An error occurred on the remote server during the move or config test." echo "You may need to log in manually to fix it: ssh -i $EVAL_KEY_FILE ${REMOTE_USER}@${REMOTE_HOST}" exit 1 fi echo " ✅ Files moved and temporary directory removed." echo # Step 4: Ask to reload Nginx read -p "Nginx config test was successful. Reload Nginx to apply changes? (y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then echo "- Reloading Nginx on the server..." ssh -i "$EVAL_KEY_FILE" "${REMOTE_USER}@${REMOTE_HOST}" "sudo systemctl reload nginx" echo " ✅ Nginx reloaded." fi # --- Completion --- echo "--------------------------------------------------------" echo "🎉 Deployment complete!"