#!/bin/bash # Java Service Template - Quick Start Script # Initializes database 'java_template', establishes Flyway baseline, and starts the application set -e # Exit immediately if a command exits with a non-zero status # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color echo_color() { local color=$1 local message=$2 echo -e "${color}${message}${NC}" } # Check if another instance is already running if pgrep -f "java.*tmpl-api.*SNAPSHOT.jar" > /dev/null; then echo_color $RED "Another instance of the application is already running!" echo_color $YELLOW "Please stop the existing process before starting a new one." exit 1 fi # Configuration - Use environment variables with defaults PORT="${PORT:-48080}" DB_NAME="${DB_NAME:-java_template}" DB_USER="${DB_USER:-postgres}" DB_PASS="${DB_PASS:-postgres}" DB_HOST="${DB_HOST:-localhost}" DB_PORT="${DB_PORT:-5432}" APP_JAR="tmpl-api/target/tmpl-api-0.1.0-SNAPSHOT.jar" echo_color $YELLOW "Starting Java Service Template setup..." echo_color $YELLOW "Using port: $PORT" # Function to check if PostgreSQL is running check_postgres() { echo_color $YELLOW "Checking PostgreSQL connectivity..." if ! command -v psql &> /dev/null; then echo_color $RED "psql command not found. Please install PostgreSQL client." exit 1 fi if ! pg_isready -h "$DB_HOST" -p "$DB_PORT" 2>/dev/null; then echo_color $RED "PostgreSQL server is not running at $DB_HOST:$DB_PORT" echo_color $YELLOW "Please start PostgreSQL server before running this script." exit 1 fi echo_color $GREEN "✓ PostgreSQL is accessible" } # Function to create database create_database() { echo_color $YELLOW "Creating database: $DB_NAME" # Check if database already exists if PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -lqt | cut -d \| -f 1 | grep -qw "$DB_NAME"; then echo_color $GREEN "✓ Database $DB_NAME already exists" return 0 fi # Create database PGPASSWORD="$DB_PASS" createdb -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -O "$DB_USER" "$DB_NAME" echo_color $GREEN "✓ Database $DB_NAME created successfully" } # Function to build the application build_application() { echo_color $YELLOW "Building the application..." if [ ! -f "pom.xml" ]; then echo_color $RED "✗ Pom.xml not found in current directory!" exit 1 fi mvn clean package -DskipTests if [ ! -f "$APP_JAR" ]; then echo_color $RED "✗ Application JAR not found at $APP_JAR after build!" exit 1 fi echo_color $GREEN "✓ Application built successfully" } # Function to establish Flyway baseline and run migrations setup_flyway() { echo_color $YELLOW "Setting up Flyway migrations..." # Run the application once to let Flyway handle the database setup # This will create the flyway_schema_history table and apply migrations JAVA_OPTS="-Dspring.profiles.active=dev,redis -Dspring.main.allow-bean-definition-overriding=true" JAVA_OPTS="$JAVA_OPTS -DDB_HOST=$DB_HOST -DDB_PORT=$DB_PORT -DDB_NAME=$DB_NAME -DDB_USER=$DB_USER -DDB_PASS=$DB_PASS" echo_color $YELLOW "Running application to initialize database with Flyway..." # Run the application briefly to let Flyway do its job # Use a random port to avoid conflicts and ensure quick startup/shutdown timeout 30s java $JAVA_OPTS -Dserver.port=0 -Dmanagement.server.port=0 -jar $APP_JAR || true # The || true ensures the script continues even if timeout kills the process echo_color $GREEN "✓ Flyway setup completed (baseline and migrations applied)" } # Function to start the application properly start_application() { echo_color $YELLOW "Starting the application..." # Set environment variables for the application export DB_HOST=$DB_HOST export DB_PORT=$DB_PORT export DB_NAME=$DB_NAME export DB_USER=$DB_USER export DB_PASS=$DB_PASS # Start the application with the specified port JAVA_OPTS="-Dserver.port=$PORT -Dmanagement.server.port=$PORT" JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=dev,redis -Dspring.main.allow-bean-definition-overriding=true" JAVA_OPTS="$JAVA_OPTS -DDB_HOST=$DB_HOST -DDB_PORT=$DB_PORT -DDB_NAME=$DB_NAME -DDB_USER=$DB_USER -DDB_PASS=$DB_PASS" echo_color $GREEN "✓ Starting application with command: java $JAVA_OPTS -jar $APP_JAR" echo_color $GREEN "✓ Application will be available at: http://localhost:$PORT" echo_color $GREEN "✓ Health endpoint: http://localhost:$PORT/actuator/health" java $JAVA_OPTS -jar $APP_JAR } # Main execution sequence main() { echo_color $YELLOW "=== Step 1: Checking prerequisites ===" check_postgres echo_color $YELLOW "=== Step 2: Building application ===" build_application echo_color $YELLOW "=== Step 3: Creating database '$DB_NAME' ===" create_database echo_color $YELLOW "=== Step 4: Setting up Flyway (baseline and migrations) ===" setup_flyway echo_color $YELLOW "=== Step 5: Starting application ===" start_application } # Run the main function main