Geraldino07/Meridian-ChatBot
0
1#!/bin/bash2# =============================================================================3# deploy.sh — Build, push, and deploy Meridian bot to AWS4#5# Prerequisites:6# - AWS CLI configured (aws configure)7# - Docker with buildx installed8# - Terraform >= 1.5 installed9# - .env file with OPENAI_API_KEY in project root10#11# Usage:12# bash deploy.sh13# =============================================================================14 15set -euo pipefail16 17# ── Config ────────────────────────────────────────────────────────────────────18APP_NAME="meridian-bot"19IMAGE_TAG="latest"20PLATFORM="linux/arm64"21AWS_REGION="${AWS_REGION:-us-east-1}"22SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"23TF_DIR="$SCRIPT_DIR/terraform"24ENV_FILE="$SCRIPT_DIR/.env"25 26# ── Colours ───────────────────────────────────────────────────────────────────27GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m'28info() { echo -e "${GREEN}[INFO]${NC} $*"; }29warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }30error() { echo -e "${RED}[ERROR]${NC} $*"; exit 1; }31 32# ── Load OPENAI_API_KEY from .env ─────────────────────────────────────────────33if [[ -f "$ENV_FILE" ]]; then34 info "Reading .env from $ENV_FILE"35 OPENAI_API_KEY=$(grep -E '^OPENAI_API_KEY=' "$ENV_FILE" | head -1 | cut -d'=' -f2- | tr -d '\r\n')36 export OPENAI_API_KEY37else38 warn ".env not found — using OPENAI_API_KEY from environment"39fi40 41# ── Checks ────────────────────────────────────────────────────────────────────42info "Checking prerequisites..."43command -v aws >/dev/null 2>&1 || error "AWS CLI not found. Install: https://aws.amazon.com/cli/"44command -v docker >/dev/null 2>&1 || error "Docker not found."45command -v terraform >/dev/null 2>&1 || error "Terraform not found. Install: https://developer.hashicorp.com/terraform/install"46 47[[ -z "${OPENAI_API_KEY:-}" ]] && error "OPENAI_API_KEY not found in .env or environment."48 49AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)50ECR_URL="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${APP_NAME}"51 52info "AWS Account : $AWS_ACCOUNT_ID"53info "Region : $AWS_REGION"54info "ECR URL : $ECR_URL"55info "Platform : $PLATFORM"56echo ""57 58# ── Step 1: Terraform init + create ECR first ────────────────────────────────59info "Step 1/4 — Initialising Terraform and creating ECR repository..."60cd "$TF_DIR"61terraform init -upgrade -input=false62 63terraform apply \64 -target=aws_ecr_repository.app \65 -var="aws_region=${AWS_REGION}" \66 -var="app_name=${APP_NAME}" \67 -var="openai_api_key=${OPENAI_API_KEY}" \68 -auto-approve -input=false69 70cd - >/dev/null71 72# ── Step 2: Build Docker image for ARM and push to ECR ───────────────────────73info "Step 2/4 — Logging in to ECR..."74aws ecr get-login-password --region "$AWS_REGION" \75 | docker login --username AWS --password-stdin "$ECR_URL"76 77info "Step 2/4 — Building Docker image ($PLATFORM)..."78docker buildx create --use --name meridian-builder 2>/dev/null || \79 docker buildx use meridian-builder80 81docker buildx build \82 --platform "$PLATFORM" \83 --tag "${ECR_URL}:${IMAGE_TAG}" \84 --push \85 "$SCRIPT_DIR"86 87info "Image pushed → ${ECR_URL}:${IMAGE_TAG}"88 89# ── Step 3: Deploy full infrastructure ───────────────────────────────────────90info "Step 3/4 — Deploying EC2 + CloudFront via Terraform..."91cd "$TF_DIR"92terraform apply \93 -var="aws_region=${AWS_REGION}" \94 -var="app_name=${APP_NAME}" \95 -var="openai_api_key=${OPENAI_API_KEY}" \96 -var="image_tag=${IMAGE_TAG}" \97 -auto-approve -input=false98 99# ── Step 4: Print outputs ─────────────────────────────────────────────────────100echo ""101info "Step 4/4 — Deployment complete! 🎉"102echo ""103echo -e " ${GREEN}CloudFront URL${NC} : https://$(terraform output -raw cloudfront_domain)"104echo -e " ${GREEN}EC2 Public IP${NC} : $(terraform output -raw ec2_public_ip)"105echo -e " ${GREEN}ECR URL${NC} : $(terraform output -raw ecr_url)"106echo ""107warn "CloudFront takes 5–10 minutes to fully propagate."108warn "The app takes ~2 minutes to start on first boot (Docker pull)."109warn "To check EC2 startup: ssh ec2-user@\$(terraform output -raw ec2_public_ip)"110warn " then: sudo tail -f /var/log/cloud-init-output.log"111 112cd - >/dev/null113 