You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							266 lines
						
					
					
						
							7.3 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							266 lines
						
					
					
						
							7.3 KiB
						
					
					
				
								#!/bin/bash
							 | 
						|
								# TimeSafari Docker Run Script
							 | 
						|
								# Author: Matthew Raymer
							 | 
						|
								# Description: Convenient script to run TimeSafari in different Docker configurations
							 | 
						|
								#
							 | 
						|
								# Usage:
							 | 
						|
								#   ./docker/run.sh dev          # Run development mode
							 | 
						|
								#   ./docker/run.sh staging      # Run staging mode
							 | 
						|
								#   ./docker/run.sh production   # Run production mode
							 | 
						|
								#   ./docker/run.sh custom       # Run custom mode with environment variables
							 | 
						|
								#
							 | 
						|
								# Environment Variables:
							 | 
						|
								#   BUILD_MODE: development, staging, or production
							 | 
						|
								#   NODE_ENV: node environment
							 | 
						|
								#   VITE_PLATFORM: vite platform
							 | 
						|
								#   PWA: automatically enabled for web platforms
							 | 
						|
								#   PORT: port to expose
							 | 
						|
								#   ENV_FILE: environment file to use
							 | 
						|
								
							 | 
						|
								set -e
							 | 
						|
								
							 | 
						|
								# Colors for output
							 | 
						|
								readonly RED='\033[0;31m'
							 | 
						|
								readonly GREEN='\033[0;32m'
							 | 
						|
								readonly YELLOW='\033[1;33m'
							 | 
						|
								readonly BLUE='\033[0;34m'
							 | 
						|
								readonly NC='\033[0m' # No Color
							 | 
						|
								
							 | 
						|
								# Logging functions
							 | 
						|
								log_info() {
							 | 
						|
								    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] [INFO]${NC} $1"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								log_success() {
							 | 
						|
								    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] [SUCCESS]${NC} $1"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								log_warn() {
							 | 
						|
								    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] [WARN]${NC} $1"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								log_error() {
							 | 
						|
								    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR]${NC} $1"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to show usage
							 | 
						|
								show_usage() {
							 | 
						|
								    echo "TimeSafari Docker Run Script"
							 | 
						|
								    echo ""
							 | 
						|
								    echo "Usage: $0 <mode> [options]"
							 | 
						|
								    echo ""
							 | 
						|
								    echo "Modes:"
							 | 
						|
								    echo "  dev         - Development mode with hot reloading"
							 | 
						|
								    echo "  staging     - Staging mode for testing"
							 | 
						|
								    echo "  production  - Production mode"
							 | 
						|
								    echo "  custom      - Custom mode with environment variables"
							 | 
						|
								    echo ""
							 | 
						|
								    echo "Options:"
							 | 
						|
								    echo "  --port <port>     - Custom port (default: 5173 for dev, 8080 for staging, 80 for production)"
							 | 
						|
								    echo "  --env <file>      - Environment file (default: .env.<mode>)"
							 | 
						|
								    echo "  --build-args      - Show build arguments for the mode"
							 | 
						|
								    echo "  --help            - Show this help message"
							 | 
						|
								    echo ""
							 | 
						|
								    echo "Examples:"
							 | 
						|
								    echo "  $0 dev"
							 | 
						|
								    echo "  $0 staging --port 9000"
							 | 
						|
								    echo "  $0 production --env .env.prod"
							 | 
						|
								    echo "  BUILD_MODE=staging $0 custom"
							 | 
						|
								    echo ""
							 | 
						|
								    echo "Environment Variables:"
							 | 
						|
								    echo "  BUILD_MODE: development, staging, or production"
							 | 
						|
								    echo "  NODE_ENV: node environment"
							 | 
						|
								    echo "  VITE_PLATFORM: vite platform"
							 | 
						|
								    echo "  PWA: automatically enabled for web platforms"
							 | 
						|
								    echo "  PORT: port to expose"
							 | 
						|
								    echo "  ENV_FILE: environment file to use"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to show build arguments for a mode
							 | 
						|
								show_build_args() {
							 | 
						|
								    local mode=$1
							 | 
						|
								    echo "Build arguments for $mode mode:"
							 | 
						|
								    echo ""
							 | 
						|
								    case $mode in
							 | 
						|
								        dev)
							 | 
						|
								            echo "  BUILD_MODE: development"
							 | 
						|
								            echo "  NODE_ENV: development"
							 | 
						|
								            echo "  VITE_PLATFORM: web"
							 | 
						|
								            echo "  PWA: enabled (web platform)"
							 | 
						|
								            echo "  Target: development"
							 | 
						|
								            echo "  Port: 5173"
							 | 
						|
								            ;;
							 | 
						|
								        staging)
							 | 
						|
								            echo "  BUILD_MODE: staging"
							 | 
						|
								            echo "  NODE_ENV: staging"
							 | 
						|
								            echo "  VITE_PLATFORM: web"
							 | 
						|
								            echo "  PWA: enabled (web platform)"
							 | 
						|
								            echo "  Target: staging"
							 | 
						|
								            echo "  Port: 80 (mapped to 8080)"
							 | 
						|
								            ;;
							 | 
						|
								        production)
							 | 
						|
								            echo "  BUILD_MODE: production"
							 | 
						|
								            echo "  NODE_ENV: production"
							 | 
						|
								            echo "  VITE_PLATFORM: web"
							 | 
						|
								            echo "  PWA: enabled (web platform)"
							 | 
						|
								            echo "  Target: production"
							 | 
						|
								            echo "  Port: 80"
							 | 
						|
								            ;;
							 | 
						|
								        custom)
							 | 
						|
								            echo "  BUILD_MODE: \${BUILD_MODE:-production}"
							 | 
						|
								            echo "  NODE_ENV: \${NODE_ENV:-production}"
							 | 
						|
								            echo "  VITE_PLATFORM: \${VITE_PLATFORM:-web}"
							 | 
						|
								            echo "  PWA: enabled for web platforms"
							 | 
						|
								            echo "  Target: \${BUILD_TARGET:-production}"
							 | 
						|
								            echo "  Port: \${CUSTOM_PORT:-8080}:\${CUSTOM_INTERNAL_PORT:-80}"
							 | 
						|
								            ;;
							 | 
						|
								        *)
							 | 
						|
								            log_error "Unknown mode: $mode"
							 | 
						|
								            exit 1
							 | 
						|
								            ;;
							 | 
						|
								    esac
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to check if Docker is running
							 | 
						|
								check_docker() {
							 | 
						|
								    if ! docker info > /dev/null 2>&1; then
							 | 
						|
								        log_error "Docker is not running. Please start Docker and try again."
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to check if docker-compose is available
							 | 
						|
								check_docker_compose() {
							 | 
						|
								    if ! command -v docker-compose > /dev/null 2>&1; then
							 | 
						|
								        log_error "docker-compose is not installed. Please install docker-compose and try again."
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to check if required files exist
							 | 
						|
								check_files() {
							 | 
						|
								    local mode=$1
							 | 
						|
								    local env_file=$2
							 | 
						|
								    
							 | 
						|
								    if [ ! -f "Dockerfile" ]; then
							 | 
						|
								        log_error "Dockerfile not found. Please run this script from the project root."
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    if [ ! -f "docker-compose.yml" ]; then
							 | 
						|
								        log_error "docker-compose.yml not found. Please run this script from the project root."
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    if [ -n "$env_file" ] && [ ! -f "$env_file" ]; then
							 | 
						|
								        log_warn "Environment file $env_file not found. Using defaults."
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to run the container
							 | 
						|
								run_container() {
							 | 
						|
								    local mode=$1
							 | 
						|
								    local port=$2
							 | 
						|
								    local env_file=$3
							 | 
						|
								    
							 | 
						|
								    log_info "Starting TimeSafari in $mode mode..."
							 | 
						|
								    
							 | 
						|
								    # Set environment variables based on mode
							 | 
						|
								    case $mode in
							 | 
						|
								        dev)
							 | 
						|
								            export DEV_PORT=${port:-5173}
							 | 
						|
								            if [ -n "$env_file" ]; then
							 | 
						|
								                export DEV_ENV_FILE="$env_file"
							 | 
						|
								            fi
							 | 
						|
								            docker-compose up dev
							 | 
						|
								            ;;
							 | 
						|
								        staging)
							 | 
						|
								            export STAGING_PORT=${port:-8080}
							 | 
						|
								            if [ -n "$env_file" ]; then
							 | 
						|
								                export STAGING_ENV_FILE="$env_file"
							 | 
						|
								            fi
							 | 
						|
								            docker-compose up staging
							 | 
						|
								            ;;
							 | 
						|
								        production)
							 | 
						|
								            export PROD_PORT=${port:-80}
							 | 
						|
								            if [ -n "$env_file" ]; then
							 | 
						|
								                export PROD_ENV_FILE="$env_file"
							 | 
						|
								            fi
							 | 
						|
								            docker-compose up production
							 | 
						|
								            ;;
							 | 
						|
								        custom)
							 | 
						|
								            export CUSTOM_PORT=${port:-8080}
							 | 
						|
								            if [ -n "$env_file" ]; then
							 | 
						|
								                export CUSTOM_ENV_FILE="$env_file"
							 | 
						|
								            fi
							 | 
						|
								            docker-compose up custom
							 | 
						|
								            ;;
							 | 
						|
								        *)
							 | 
						|
								            log_error "Unknown mode: $mode"
							 | 
						|
								            exit 1
							 | 
						|
								            ;;
							 | 
						|
								    esac
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Main script
							 | 
						|
								main() {
							 | 
						|
								    local mode=""
							 | 
						|
								    local port=""
							 | 
						|
								    local env_file=""
							 | 
						|
								    local show_args=false
							 | 
						|
								    
							 | 
						|
								    # Parse command line arguments
							 | 
						|
								    while [[ $# -gt 0 ]]; do
							 | 
						|
								        case $1 in
							 | 
						|
								            dev|staging|production|custom)
							 | 
						|
								                mode="$1"
							 | 
						|
								                shift
							 | 
						|
								                ;;
							 | 
						|
								            --port)
							 | 
						|
								                port="$2"
							 | 
						|
								                shift 2
							 | 
						|
								                ;;
							 | 
						|
								            --env)
							 | 
						|
								                env_file="$2"
							 | 
						|
								                shift 2
							 | 
						|
								                ;;
							 | 
						|
								            --build-args)
							 | 
						|
								                show_args=true
							 | 
						|
								                shift
							 | 
						|
								                ;;
							 | 
						|
								            --help|-h)
							 | 
						|
								                show_usage
							 | 
						|
								                exit 0
							 | 
						|
								                ;;
							 | 
						|
								            *)
							 | 
						|
								                log_error "Unknown option: $1"
							 | 
						|
								                show_usage
							 | 
						|
								                exit 1
							 | 
						|
								                ;;
							 | 
						|
								        esac
							 | 
						|
								    done
							 | 
						|
								    
							 | 
						|
								    # Check if mode is provided
							 | 
						|
								    if [ -z "$mode" ]; then
							 | 
						|
								        log_error "No mode specified."
							 | 
						|
								        show_usage
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    # Show build arguments if requested
							 | 
						|
								    if [ "$show_args" = true ]; then
							 | 
						|
								        show_build_args "$mode"
							 | 
						|
								        exit 0
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    # Check prerequisites
							 | 
						|
								    check_docker
							 | 
						|
								    check_docker_compose
							 | 
						|
								    check_files "$mode" "$env_file"
							 | 
						|
								    
							 | 
						|
								    # Run the container
							 | 
						|
								    run_container "$mode" "$port" "$env_file"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Run main function with all arguments
							 | 
						|
								main "$@" 
							 |