#!/bin/bash # Enable strict mode set -euo pipefail # Default to HTTP USE_HTTPS=false # Parse arguments for arg in "$@"; do if [[ "$arg" == "--https" ]]; then USE_HTTPS=true fi done # Resolve script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" AI_HUB_DIR="$(realpath "$SCRIPT_DIR/../ai-hub")" TTS_CLIENT_DIR="$SCRIPT_DIR/client-app" AI_HUB_HOST="0.0.0.0" AI_HUB_PORT="8001" APP_MODULE="app.main:app" echo "--- Cleaning up existing processes ---" # Kill existing uvicorn processes on the expected port EXISTING_UVICORN_PID=$(lsof -ti tcp:${AI_HUB_PORT} || true) if [ -n "$EXISTING_UVICORN_PID" ]; then echo "Killing existing process on port ${AI_HUB_PORT} (PID: $EXISTING_UVICORN_PID)" kill -9 "$EXISTING_UVICORN_PID" fi # Kill existing React frontend on port 8000 EXISTING_REACT_PID=$(lsof -ti tcp:8000 || true) if [ -n "$EXISTING_REACT_PID" ]; then echo "Killing existing frontend process on port 8000 (PID: $EXISTING_REACT_PID)" kill -9 "$EXISTING_REACT_PID" fi pushd "$AI_HUB_DIR" > /dev/null pip install -e . SSL_ARGS="" FRONTEND_ENV="" if [ "$USE_HTTPS" = true ]; then echo "--- Generating self-signed SSL certificates ---" # Create a temporary directory for certs SSL_TEMP_DIR=$(mktemp -d) SSL_KEYFILE="${SSL_TEMP_DIR}/key.pem" SSL_CERTFILE="${SSL_TEMP_DIR}/cert.pem" # Generate self-signed certificate openssl req -x509 -nodes -days 1 -newkey rsa:2048 \ -keyout "$SSL_KEYFILE" \ -out "$SSL_CERTFILE" \ -subj "/CN=localhost" # Cleanup function to remove certs on exit cleanup() { echo "--- Cleaning up SSL certificates ---" rm -rf "$SSL_TEMP_DIR" } trap cleanup EXIT SSL_ARGS="--ssl-keyfile $SSL_KEYFILE --ssl-certfile $SSL_CERTFILE" FRONTEND_ENV="HTTPS=true" fi echo "--- Starting AI Hub Server, React frontend, and backend proxy ---" # Run backend and frontend concurrently concurrently \ --prefix "[{name}]" \ --names "aihub,tts-frontend" \ "LOG_LEVEL=DEBUG uvicorn $APP_MODULE --host $AI_HUB_HOST --log-level debug --port $AI_HUB_PORT $SSL_ARGS" \ "cd $TTS_CLIENT_DIR && $FRONTEND_ENV HOST=0.0.0.0 PORT=8000 npm start" popd > /dev/null