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.
 
 
 
 
 
 

272 lines
7.6 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
# VITE_PWA_ENABLED: enable PWA
# VITE_DISABLE_PWA: disable PWA
# 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 " VITE_PWA_ENABLED: enable PWA"
echo " VITE_DISABLE_PWA: disable PWA"
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 " VITE_PWA_ENABLED: true"
echo " VITE_DISABLE_PWA: false"
echo " Target: development"
echo " Port: 5173"
;;
staging)
echo " BUILD_MODE: staging"
echo " NODE_ENV: staging"
echo " VITE_PLATFORM: web"
echo " VITE_PWA_ENABLED: true"
echo " VITE_DISABLE_PWA: false"
echo " Target: staging"
echo " Port: 80 (mapped to 8080)"
;;
production)
echo " BUILD_MODE: production"
echo " NODE_ENV: production"
echo " VITE_PLATFORM: web"
echo " VITE_PWA_ENABLED: true"
echo " VITE_DISABLE_PWA: false"
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 " VITE_PWA_ENABLED: \${VITE_PWA_ENABLED:-true}"
echo " VITE_DISABLE_PWA: \${VITE_DISABLE_PWA:-false}"
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 "$@"