#!/bin/bash # Скрипт для запуска API Gateway с зависимостями для приложения Women Safety # Устанавливаем цветные сообщения GREEN="\033[1;32m" BLUE="\033[1;34m" YELLOW="\033[1;33m" RED="\033[1;31m" RESET="\033[0m" echo -e "${BLUE}🚀 Запуск API Gateway и необходимых сервисов...${RESET}" # Переход в директорию проекта cd "$(dirname "$0")" || { echo -e "${RED}Не удалось перейти в директорию проекта${RESET}"; exit 1; } # Активация виртуального окружения, если оно существует if [ -d "venv" ]; then echo -e "${YELLOW}🔄 Активация виртуального окружения venv...${RESET}" source venv/bin/activate elif [ -d ".venv" ]; then echo -e "${YELLOW}🔄 Активация виртуального окружения .venv...${RESET}" source .venv/bin/activate else echo -e "${YELLOW}⚠️ Виртуальное окружение не найдено, продолжаем без него...${RESET}" fi # Установка переменной PYTHONPATH export PYTHONPATH="${PWD}:${PYTHONPATH}" # Функция для проверки, запущен ли сервис на указанном порту check_service() { local port=$1 local service_name=$2 if lsof -ti:$port > /dev/null 2>&1; then echo -e "${GREEN}✅ Сервис $service_name уже запущен на порту $port${RESET}" return 0 else echo -e "${YELLOW}⚠️ Сервис $service_name не запущен на порту $port${RESET}" return 1 fi } # Функция для запуска сервиса start_service() { local port=$1 local service_path=$2 local service_name=$3 echo -e "${BLUE}🚀 Запуск $service_name на порту $port...${RESET}" cd "$service_path" || { echo -e "${RED}❌ Не удалось перейти в директорию $service_path${RESET}"; return 1; } # Запускаем сервис в фоновом режиме python -m uvicorn main:app --host 0.0.0.0 --port $port & local pid=$! # Ждем 3 секунды и проверяем, запустился ли сервис sleep 3 if kill -0 $pid 2>/dev/null; then echo -e "${GREEN}✅ Сервис $service_name успешно запущен (PID: $pid)${RESET}" # Возвращаемся в корневую директорию cd "$(dirname "$0")" || { echo -e "${RED}Не удалось вернуться в корневую директорию${RESET}"; exit 1; } return 0 else echo -e "${RED}❌ Не удалось запустить сервис $service_name${RESET}" # Возвращаемся в корневую директорию cd "$(dirname "$0")" || { echo -e "${RED}Не удалось вернуться в корневую директорию${RESET}"; exit 1; } return 1 fi } # Проверяем и запускаем пользовательский сервис (создаёт таблицы пользователей) if ! check_service 8001 "User Service"; then start_service 8001 "./services/user_service" "User Service" fi # Проверяем и запускаем сервис календаря if ! check_service 8004 "Calendar Service"; then start_service 8004 "./services/calendar_service" "Calendar Service" fi # Проверяем и запускаем сервис оповещений об экстренных ситуациях if ! check_service 8002 "Emergency Service"; then start_service 8002 "./services/emergency_service" "Emergency Service" fi # Проверяем и запускаем сервис локаций if ! check_service 8003 "Location Service"; then start_service 8003 "./services/location_service" "Location Service" fi # Проверяем и запускаем сервис уведомлений if ! check_service 8005 "Notification Service"; then start_service 8005 "./services/notification_service" "Notification Service" fi # Ждем несколько секунд, чтобы сервисы успели инициализироваться echo -e "${YELLOW}⏳ Ожидаем инициализацию сервисов (5 сек)...${RESET}" sleep 5 # Функция для проверки здоровья сервиса check_health() { local url=$1 local service_name=$2 if curl -s "$url" > /dev/null 2>&1; then echo -e "${GREEN}✅ Проверка здоровья $service_name успешна${RESET}" return 0 else echo -e "${RED}❌ Проверка здоровья $service_name не удалась${RESET}" return 1 fi } # Проверяем здоровье запущенных сервисов check_health "http://localhost:8001/health" "User Service" check_health "http://localhost:8002/health" "Emergency Service" check_health "http://localhost:8003/health" "Location Service" check_health "http://localhost:8004/health" "Calendar Service" check_health "http://localhost:8005/health" "Notification Service" # Теперь запускаем API Gateway echo -e "${BLUE}🔄 Запуск API Gateway на порту 8000...${RESET}" # Порт для API Gateway API_GATEWAY_PORT=8000 # Проверяем, не занят ли порт уже if lsof -ti:$API_GATEWAY_PORT > /dev/null 2>&1; then echo -e "${YELLOW}⚠️ Порт $API_GATEWAY_PORT уже занят, освобождаем...${RESET}" lsof -ti:$API_GATEWAY_PORT | xargs kill -9 sleep 1 fi # Запускаем API Gateway в текущем терминале (не в фоне) echo -e "${GREEN}✅ Запуск API Gateway...${RESET}" cd services/api_gateway || { echo -e "${RED}Не удалось перейти в директорию API Gateway${RESET}"; exit 1; } python -m uvicorn main:app --host 0.0.0.0 --port $API_GATEWAY_PORT --reload