#!/bin/bash # Deployment notification script using Resend API # Sends email notifications for deployment events # # Usage: ./notify.sh [message] [commit_sha] # event_type: success, failure, rollback, rollback_failed, maintenance_start, maintenance_end # message: Optional custom message # commit_sha: Optional commit SHA for context # # Required environment variables: # DEPLOY_NOTIFY_EMAIL - Recipient email address # # Reads Resend API key from: # /run/secrets/resend-api-key (container) # ./secrets/app/resend-api-key.txt (local) # # Exit codes: # 0 - Notification sent (or skipped if not configured) # 1 - Notification failed set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" EVENT_TYPE="${1:-}" MESSAGE="${2:-}" COMMIT_SHA="${3:-${CI_COMMIT_SHORT_SHA:-unknown}}" if [[ -z "$EVENT_TYPE" ]]; then echo "Usage: $0 [message] [commit_sha]" exit 1 fi # Get recipient email NOTIFY_EMAIL="${DEPLOY_NOTIFY_EMAIL:-}" if [[ -z "$NOTIFY_EMAIL" ]]; then echo "DEPLOY_NOTIFY_EMAIL not set, skipping notification" exit 0 fi # Get Resend API key RESEND_API_KEY="" if [[ -f "/run/secrets/resend-api-key" ]]; then RESEND_API_KEY=$(cat /run/secrets/resend-api-key) elif [[ -f "$PROJECT_ROOT/secrets/app/resend-api-key.txt" ]]; then RESEND_API_KEY=$(cat "$PROJECT_ROOT/secrets/app/resend-api-key.txt") fi if [[ -z "$RESEND_API_KEY" ]]; then echo "WARNING: Resend API key not found, skipping notification" exit 0 fi # Determine subject and styling based on event type case "$EVENT_TYPE" in "success") SUBJECT="Deployment Successful - MotoVaultPro" STATUS_COLOR="#22c55e" STATUS_EMOJI="[OK]" STATUS_TEXT="Deployment Successful" DEFAULT_MESSAGE="Version $COMMIT_SHA is now live." ;; "failure") SUBJECT="Deployment Failed - MotoVaultPro" STATUS_COLOR="#ef4444" STATUS_EMOJI="[FAILED]" STATUS_TEXT="Deployment Failed" DEFAULT_MESSAGE="Deployment of $COMMIT_SHA failed. Check pipeline logs." ;; "rollback") SUBJECT="Auto-Rollback Executed - MotoVaultPro" STATUS_COLOR="#f59e0b" STATUS_EMOJI="[ROLLBACK]" STATUS_TEXT="Rollback Executed" DEFAULT_MESSAGE="Automatic rollback was triggered. Previous version restored." ;; "rollback_failed") SUBJECT="CRITICAL: Rollback Failed - MotoVaultPro" STATUS_COLOR="#dc2626" STATUS_EMOJI="[CRITICAL]" STATUS_TEXT="Rollback Failed" DEFAULT_MESSAGE="Rollback attempt failed. Manual intervention required immediately." ;; "maintenance_start") SUBJECT="Maintenance Mode Started - MotoVaultPro" STATUS_COLOR="#6366f1" STATUS_EMOJI="[MAINTENANCE]" STATUS_TEXT="Maintenance Mode Active" DEFAULT_MESSAGE="Application is in maintenance mode for database migration." ;; "maintenance_end") SUBJECT="Maintenance Mode Ended - MotoVaultPro" STATUS_COLOR="#22c55e" STATUS_EMOJI="[ONLINE]" STATUS_TEXT="Maintenance Complete" DEFAULT_MESSAGE="Maintenance window complete. Application is online." ;; *) echo "Unknown event type: $EVENT_TYPE" exit 1 ;; esac # Use custom message or default FINAL_MESSAGE="${MESSAGE:-$DEFAULT_MESSAGE}" TIMESTAMP=$(date -u +"%Y-%m-%d %H:%M:%S UTC") # Build HTML email HTML_BODY=$(cat <

MotoVaultPro

${STATUS_EMOJI} ${STATUS_TEXT}
${FINAL_MESSAGE}
Environment: Production
Commit: ${COMMIT_SHA}
Time: ${TIMESTAMP}
EOF ) # Send email via Resend API echo "Sending notification: $EVENT_TYPE" echo " To: $NOTIFY_EMAIL" echo " Subject: $SUBJECT" # Build JSON payload JSON_PAYLOAD=$(cat <", "to": ["$NOTIFY_EMAIL"], "subject": "$SUBJECT", "html": $(echo "$HTML_BODY" | jq -Rs .) } EOF ) # Send via Resend API RESPONSE=$(curl -s -w "\n%{http_code}" \ -X POST \ -H "Authorization: Bearer $RESEND_API_KEY" \ -H "Content-Type: application/json" \ -d "$JSON_PAYLOAD" \ "https://api.resend.com/emails") HTTP_CODE=$(echo "$RESPONSE" | tail -n1) BODY=$(echo "$RESPONSE" | sed '$d') if [[ "$HTTP_CODE" == "200" ]] || [[ "$HTTP_CODE" == "201" ]]; then echo " OK: Notification sent successfully" exit 0 else echo " ERROR: Failed to send notification (HTTP $HTTP_CODE)" echo " Response: $BODY" exit 1 fi