mirror of
https://github.com/mindverse/Second-Me.git
synced 2026-07-10 09:48:24 +00:00
* feat:remove conda from setup * cool. more code about removing conda & env * optimize script * add python check * optimize setup * optimize setup * add warning info * optimize check * add node check & npm check * add cmake install suggestion * add poetry suggestion * add python command check * add python tools * add poetry * add graphrag poetry install command optimization * active poetry shell * fix duplicated log * avoid poetry multipul active * add sqlite3 check * optimize sqlite3 setup suggestion * optimize * add gitignore * reverse compose detect
263 lines
8.1 KiB
Bash
Executable file
263 lines
8.1 KiB
Bash
Executable file
#!/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
|