imetting/start-conda.sh

140 lines
4.6 KiB
Bash
Executable File

#!/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