#!/bin/bash echo "🚀 Building Production-Optimized BookWyrm Containers..." echo "Optimized build targeting ~400MB final image size" # Exit on any error set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Function to print colored output print_status() { echo -e "${GREEN}✓${NC} $1" } print_warning() { echo -e "${YELLOW}⚠${NC} $1" } print_error() { echo -e "${RED}✗${NC} $1" } # Check if Docker is running if ! docker info >/dev/null 2>&1; then print_error "Docker is not running. Please start Docker and try again." exit 1 fi echo "Building optimized containers for ARM64 architecture..." echo "This will build:" echo -e " • ${YELLOW}bookwyrm-base${NC} - Shared base image (~400MB)" echo -e " • ${YELLOW}bookwyrm-web${NC} - Web server (Nginx + Django/Gunicorn, ~450MB)" echo -e " • ${YELLOW}bookwyrm-worker${NC} - Background workers (Celery + Beat, ~450MB)" echo "" # Step 1: Build optimized base image echo "Step 1/3: Building optimized base image..." cd bookwyrm-base if docker build --platform linux/arm64 -t bookwyrm-base:latest .; then print_status "Base image built successfully!" else print_error "Failed to build base image" exit 1 fi cd .. # Step 2: Build optimized web container echo "" echo "Step 2/3: Building optimized web container..." cd bookwyrm-web if docker build --platform linux/arm64 -t registry.keyboardvagabond.com/library/bookwyrm-web:latest .; then print_status "Web container built successfully!" else print_error "Failed to build web container" exit 1 fi cd .. # Step 3: Build optimized worker container echo "" echo "Step 3/3: Building optimized worker container..." cd bookwyrm-worker if docker build --platform linux/arm64 -t registry.keyboardvagabond.com/library/bookwyrm-worker:latest .; then print_status "Worker container built successfully!" else print_error "Failed to build worker container" exit 1 fi cd .. echo "" echo "🎉 All containers built successfully!" # Show image sizes echo "" echo "📊 Built image sizes:" docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep -E "(bookwyrm-base|bookwyrm-web|bookwyrm-worker)" | grep -v optimized echo "" echo "Built containers:" echo " • registry.keyboardvagabond.com/library/bookwyrm-web:latest" echo " • registry.keyboardvagabond.com/library/bookwyrm-worker:latest" # Ask if user wants to push echo "" read -p "Push containers to Harbor registry? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then echo "" echo "🚀 Pushing containers to registry..." # Login check if ! docker info 2>/dev/null | grep -q "registry.keyboardvagabond.com"; then print_warning "You may need to login to Harbor registry first:" echo "" fi echo "Pushing web container..." if docker push registry.keyboardvagabond.com/library/bookwyrm-web:latest; then print_status "Web container pushed successfully!" else print_error "Failed to push web container" fi echo "" echo "Pushing worker container..." if docker push registry.keyboardvagabond.com/library/bookwyrm-worker:latest; then print_status "Worker container pushed successfully!" else print_error "Failed to push worker container" fi echo "" print_status "All containers pushed to Harbor registry!" else echo "Skipping push. You can push later with:" echo " docker push registry.keyboardvagabond.com/library/bookwyrm-web:latest" echo " docker push registry.keyboardvagabond.com/library/bookwyrm-worker:latest" fi