- Add CloudFront distribution with S3 origin - Configure S3 bucket with website hosting - Add Origin Access Control (OAC) for security - Configure SPA error handling (404/403 -> index.html) - Add Cloudflare DNS records (commented out due to invalid token) - Add deployment script for future updates - Update outputs to include CloudFront info
70 lines
2.0 KiB
Bash
Executable File
70 lines
2.0 KiB
Bash
Executable File
#!/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}"
|