Gemini
feat: add detailed logging
01d5a5d
#!/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