140 lines
4.6 KiB
Bash
140 lines
4.6 KiB
Bash
|
|
#!/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
|