#!/bin/bash # Script version VERSION="1.0.0" # Source the logging utilities SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/utils/logging.sh" # Check if port is available check_port() { local port=$1 if lsof -i:${port} > /dev/null 2>&1; then return 1 fi return 0 } # Check if backend is healthy with real-time log display check_backend_health() { local max_attempts=$1 local attempt=1 local backend_url="http://127.0.0.1:${LOCAL_APP_PORT}/health" local backend_log="logs/start.log" local log_pid=0 log_info "Waiting for backend service to be ready (showing real-time logs)..." # Start real-time log display in background if log file exists if [ -f "$backend_log" ]; then echo -e "${GRAY}---Backend logs begin (real-time)---${NC}" tail -f "$backend_log" & log_pid=$! fi while [ $attempt -le $max_attempts ]; do # Non-blocking health check if curl -s -f "$backend_url" &>/dev/null; then # Stop the log display process if [ $log_pid -ne 0 ]; then kill $log_pid >/dev/null 2>&1 echo -e "${GRAY}---Backend logs end---${NC}" fi return 0 fi sleep 1 attempt=$((attempt + 1)) done # Stop the log display process if it's still running if [ $log_pid -ne 0 ]; then kill $log_pid >/dev/null 2>&1 echo -e "${GRAY}---Backend logs end---${NC}" fi return 1 } # Check if frontend is ready with real-time log display check_frontend_ready() { local max_attempts=$1 local attempt=1 local frontend_log="logs/frontend.log" local log_pid=0 log_info "Waiting for frontend service to be ready (showing real-time logs)..." # Don't wait for file to exist, just start tail which will wait for the file echo -e "${GRAY}---Frontend logs begin (real-time)---${NC}" tail -f "$frontend_log" 2>/dev/null & log_pid=$! # Give a small delay to allow initial logs to appear sleep 1 while [ $attempt -le $max_attempts ]; do # Non-blocking ready check - check for "Local:" in the file or the existence of the frontend URL if grep -q "Local:" "$frontend_log" 2>/dev/null || curl -s -f "http://localhost:${LOCAL_FRONTEND_PORT}" &>/dev/null; then # Frontend is ready! Stop the log display process if [ $log_pid -ne 0 ]; then kill $log_pid >/dev/null 2>&1 echo -e "${GRAY}---Frontend logs end---${NC}" fi # Display the frontend URL that was found in the logs if grep -q "Local:" "$frontend_log" 2>/dev/null; then local frontend_url=$(grep "Local:" "$frontend_log" | head -n 1) log_success "Frontend URL detected: $frontend_url" else log_success "Frontend is responding at http://localhost:${LOCAL_FRONTEND_PORT}" fi return 0 fi sleep 1 attempt=$((attempt + 1)) done # Stop the log display process if it's still running if [ $log_pid -ne 0 ]; then kill $log_pid >/dev/null 2>&1 echo -e "${GRAY}---Frontend logs end---${NC}" fi return 1 } # Check if setup is complete check_setup_complete() { log_info "Checking if setup is complete..." # Check if frontend dependencies are installed if [ ! -d "lpm_frontend/node_modules" ] && [ "$BACKEND_ONLY" != "true" ]; then log_error "Frontend dependencies not installed. Please run 'make setup' first." return 1 fi log_success "Setup check passed" return 0 } # Main function to start services start_services() { log_section "STARTING SERVICES" # Parse arguments BACKEND_ONLY="false" while [[ "$#" -gt 0 ]]; do case $1 in --backend-only) BACKEND_ONLY="true" ;; *) log_error "Unknown parameter: $1"; return 1 ;; esac shift done # Check if setup is complete if ! check_setup_complete; then return 1 fi log_step "Loading environment variables" # Load environment variables if [[ -f .env ]]; then export LOCAL_APP_PORT="$(grep '^LOCAL_APP_PORT=' .env | cut -d '=' -f2)" export LOCAL_FRONTEND_PORT="$(grep '^LOCAL_FRONTEND_PORT=' .env | cut -d '=' -f2)" if [[ -z "$LOCAL_APP_PORT" ]]; then export LOCAL_APP_PORT="8002" fi if [[ -z "$LOCAL_FRONTEND_PORT" ]]; then export LOCAL_FRONTEND_PORT="3000" fi else log_error ".env file not found!" return 1 fi log_success "Environment variables loaded" # Check if ports are available log_step "Checking port availability..." if ! check_port ${LOCAL_APP_PORT}; then log_error "Backend port ${LOCAL_APP_PORT} is already in use!" return 1 fi if ! check_port ${LOCAL_FRONTEND_PORT} && [[ "$BACKEND_ONLY" != "true" ]]; then log_error "Frontend port ${LOCAL_FRONTEND_PORT} is already in use!" return 1 fi log_success "All ports are available" # Create logs directory if it doesn't exist mkdir -p logs mkdir -p run # Start backend service log_step "Starting backend service..." nohup bash -c ./scripts/start_local.sh > logs/start.log 2>&1 & echo $! > run/.backend.pid log_info "Backend service started in background with PID: $(cat run/.backend.pid)" # Wait for backend to be healthy log_info "Waiting for backend service to be ready..." if ! check_backend_health 300; then log_error "Backend service failed to start within 300 seconds" return 1 fi log_success "Backend service is ready" # Start frontend service if not backend-only mode if [[ "$BACKEND_ONLY" != "true" ]]; then if [ ! -d "lpm_frontend" ]; then log_error "Frontend directory 'lpm_frontend' not found!" return 1 fi log_step "Starting frontend service..." cd lpm_frontend # Copy environment variables from root directory to frontend directory log_info "Copying environment variables to frontend directory..." if [[ -f "../.env" ]]; then # Extract required environment variables and create frontend .env file grep -E "^(HOST_ADDRESS|LOCAL_APP_PORT)=" "../.env" > .env log_success "Environment variables copied to frontend .env file" else log_warning "Root directory .env file does not exist, cannot copy environment variables" fi # Check if node_modules exists if [ ! -d "node_modules" ]; then log_info "Installing frontend dependencies..." if ! npm install; then log_error "Failed to install frontend dependencies" cd .. return 1 fi log_success "Frontend dependencies installed" fi # Start frontend in background log_info "Starting frontend dev server..." nohup npm run dev > ../logs/frontend.log 2>&1 & echo $! > ../run/.frontend.pid log_info "Frontend service started in background with PID: $(cat ../run/.frontend.pid)" # Wait for frontend to be ready log_info "Waiting for frontend service to be ready..." if ! check_frontend_ready 300; then log_error "Frontend service failed to start within 300 seconds" cd .. return 1 fi log_success "Frontend service is ready" cd .. fi # Display service URLs log_section "Services are running" if [[ "$BACKEND_ONLY" == "true" ]]; then log_info "Backend URL: http://localhost:${LOCAL_APP_PORT}" else log_info "Frontend URL: http://localhost:${LOCAL_FRONTEND_PORT}" log_info "Backend URL: http://localhost:${LOCAL_APP_PORT}" fi } # Execute start services start_services "$@" # Error handling if [[ $? -ne 0 ]]; then log_error "Failed to start services!" exit 1 fi