#!/bin/bash # Frontend deployment script for CloudFront + S3 # This script builds the Next.js app and deploys it to S3 + CloudFront set -e echo "🚀 Starting frontend deployment..." # Colors for output GREEN='\033[0;32m' BLUE='\033[0;34m' RED='\033[0;31m' NC='\033[0m' # No Color # Configuration S3_BUCKET="filamenteka-frontend" REGION="eu-central-1" # Get CloudFront distribution ID from terraform output echo -e "${BLUE}📋 Getting CloudFront distribution ID...${NC}" DISTRIBUTION_ID=$(terraform -chdir=terraform output -raw cloudfront_distribution_id 2>/dev/null || terraform output -raw cloudfront_distribution_id) if [ -z "$DISTRIBUTION_ID" ]; then echo -e "${RED}❌ Could not get CloudFront distribution ID${NC}" exit 1 fi echo -e "${GREEN}✓ Distribution ID: $DISTRIBUTION_ID${NC}" # Build the Next.js app echo -e "${BLUE}🔨 Building Next.js app...${NC}" npm run build if [ ! -d "out" ]; then echo -e "${RED}❌ Build failed - 'out' directory not found${NC}" exit 1 fi echo -e "${GREEN}✓ Build completed${NC}" # Upload to S3 echo -e "${BLUE}📤 Uploading to S3...${NC}" aws s3 sync out/ s3://$S3_BUCKET/ \ --region $REGION \ --delete \ --cache-control "public, max-age=3600" echo -e "${GREEN}✓ Files uploaded to S3${NC}" # Invalidate CloudFront cache echo -e "${BLUE}🔄 Invalidating CloudFront cache...${NC}" INVALIDATION_ID=$(aws cloudfront create-invalidation \ --distribution-id $DISTRIBUTION_ID \ --paths "/*" \ --query 'Invalidation.Id' \ --output text) echo -e "${GREEN}✓ CloudFront invalidation created: $INVALIDATION_ID${NC}" # Get CloudFront URL CF_URL=$(terraform -chdir=terraform output -raw cloudfront_domain_name 2>/dev/null || terraform output -raw cloudfront_domain_name) echo "" echo -e "${GREEN}✅ Deployment complete!${NC}" echo -e "${BLUE}🌐 CloudFront URL: https://$CF_URL${NC}" echo -e "${BLUE}🌐 Custom Domain: https://filamenteka.rs (after DNS update)${NC}" echo "" echo -e "${BLUE}â„šī¸ Note: CloudFront cache invalidation may take 5-10 minutes to propagate globally.${NC}"