#!/bin/bash # Exit on error set -e # Project Root Directory PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKEND_DIR="$PROJECT_ROOT/backend" FRONTEND_DIR="$PROJECT_ROOT/frontend" # Define environment names BACKEND_ENV="imetting_backend" FRONTEND_ENV="imetting_frontend" PYTHON_VERSION="3.12" NODE_VERSION="22" echo "========================================" echo "Starting iMeeting with Conda" echo "========================================" # Try to find conda if not in PATH if ! command -v conda &> /dev/null; then echo "Conda not found in PATH, trying common locations..." # Check common installation paths CONDA_PATHS=( "$HOME/miniconda3/bin" "$HOME/anaconda3/bin" "/opt/conda/bin" "$HOME/miniconda/bin" "$HOME/anaconda/bin" "/usr/local/miniconda3/bin" "/usr/local/anaconda3/bin" ) for bin_path in "${CONDA_PATHS[@]}"; do if [ -x "$bin_path/conda" ]; then export PATH="$bin_path:$PATH" echo "Found conda at: $bin_path/conda" break fi done fi if ! command -v conda &> /dev/null; then echo "Error: Conda is still not found." echo "Please ensure Miniconda or Anaconda is installed and accessible." exit 1 fi # Initialize conda for bash script eval "$(conda shell.bash hook)" conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main >/dev/null 2>&1 || true conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r >/dev/null 2>&1 || true version_gte() { [ "$(printf '%s\n' "$1" "$2" | sort -V | head -n 1)" = "$2" ] } node_version_supported_for_vite() { local version="$1" version="${version#v}" if version_gte "$version" "22.12.0"; then return 0 fi if version_gte "$version" "20.19.0" && ! version_gte "$version" "21.0.0"; then return 0 fi return 1 } BACKEND_PYTHON_VERSION="" if conda info --envs | awk '{print $1}' | grep -qx "$BACKEND_ENV"; then BACKEND_PYTHON_VERSION="$(conda run -n "$BACKEND_ENV" python -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' 2>/dev/null | tail -n 1 | tr -d '[:space:]')" if [ "$BACKEND_PYTHON_VERSION" != "$PYTHON_VERSION" ]; then echo "Backend environment '$BACKEND_ENV' is using Python $BACKEND_PYTHON_VERSION, recreating with Python $PYTHON_VERSION..." conda remove -y -n "$BACKEND_ENV" --all else echo "Backend environment '$BACKEND_ENV' already exists with Python $PYTHON_VERSION." fi fi if ! conda info --envs | awk '{print $1}' | grep -qx "$BACKEND_ENV"; then echo "Creating Conda environment '$BACKEND_ENV' with Python $PYTHON_VERSION..." conda create -y -n "$BACKEND_ENV" python=$PYTHON_VERSION -c conda-forge --override-channels fi FRONTEND_NODE_VERSION="" if conda info --envs | awk '{print $1}' | grep -qx "$FRONTEND_ENV"; then FRONTEND_NODE_VERSION="$(conda run -n "$FRONTEND_ENV" node -p 'process.versions.node' 2>/dev/null | tail -n 1 | tr -d '[:space:]')" if node_version_supported_for_vite "$FRONTEND_NODE_VERSION"; then echo "Frontend environment '$FRONTEND_ENV' already exists with Node.js $FRONTEND_NODE_VERSION." else echo "Frontend environment '$FRONTEND_ENV' is using Node.js $FRONTEND_NODE_VERSION, recreating with Node.js $NODE_VERSION..." conda remove -y -n "$FRONTEND_ENV" --all fi fi if ! conda info --envs | awk '{print $1}' | grep -qx "$FRONTEND_ENV"; then echo "Creating Conda environment '$FRONTEND_ENV' with Node.js $NODE_VERSION..." conda create -y -n "$FRONTEND_ENV" nodejs=$NODE_VERSION -c conda-forge --override-channels fi # Start Backend in a subshell echo "Starting backend..." ( eval "$(conda shell.bash hook)" conda activate "$BACKEND_ENV" cd "$BACKEND_DIR" pip install -r requirements.txt python app/main.py ) & BACKEND_PID=$! # Start Frontend in a subshell echo "Starting frontend..." ( eval "$(conda shell.bash hook)" conda activate "$FRONTEND_ENV" cd "$FRONTEND_DIR" npm install npm run dev ) & FRONTEND_PID=$! echo "========================================" echo "iMeeting is starting!" echo "Backend Env: $BACKEND_ENV (PID: $BACKEND_PID)" echo "Frontend Env: $FRONTEND_ENV (PID: $FRONTEND_PID)" echo "Backend URL: http://localhost:8000" echo "Frontend URL: http://localhost:5173" echo "Press Ctrl+C to stop both services." echo "========================================" # Trap Ctrl+C (SIGINT) and kill both processes trap "echo -e '\nStopping services...'; kill $BACKEND_PID $FRONTEND_PID 2>/dev/null; exit 0" SIGINT SIGTERM # Wait for background processes to keep the script running wait $BACKEND_PID $FRONTEND_PID