Spaces:
Sleeping
Sleeping
| import os | |
| import subprocess | |
| import sys | |
| import logging | |
| from logging.handlers import RotatingFileHandler | |
| from datetime import datetime | |
| import threading | |
| import time | |
| # โโโโโโโโโโโโโโโ UTF-8 Windows โโโโโโโโโโโโโโโ | |
| if os.name == 'nt': | |
| import ctypes | |
| ctypes.windll.kernel32.SetConsoleCP(65001) | |
| ctypes.windll.kernel32.SetConsoleOutputCP(65001) | |
| # โโโโโโโโโโโโโโโ Rรฉpertoires de logs โโโโโโโโโโโโโโโ | |
| BASE_DIR = os.path.dirname(os.path.abspath(__file__)) | |
| LOG_DIR = os.path.join(BASE_DIR, "logs") | |
| os.makedirs(LOG_DIR, exist_ok=True) | |
| # โโโโโโโโโโโโโโโ Logger central โโโโโโโโโโโโโโโ | |
| central_logger = logging.getLogger("Holokia") | |
| central_logger.setLevel(logging.INFO) | |
| console_handler = logging.StreamHandler(sys.stdout) | |
| console_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")) | |
| central_file_handler = RotatingFileHandler( | |
| os.path.join(LOG_DIR, "holokia.log"), | |
| maxBytes=5*1024*1024, | |
| backupCount=5, | |
| encoding="utf-8" | |
| ) | |
| central_file_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")) | |
| central_logger.addHandler(console_handler) | |
| central_logger.addHandler(central_file_handler) | |
| central_logger.info("๐ Dรฉmarrage de tous les services Holokia Avatar") | |
| central_logger.info(f"๐ Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") | |
| # โโโโโโโโโโโโโโโ Services โโโโโโโโโโโโโโโ | |
| SERVICES = { | |
| "TTS": {"script": "services/tts_service.py", "port": 5000, "prefix": "[TTS]"}, | |
| "STT": {"script": "services/stt_service.py", "port": 5001, "prefix": "[STT]"}, | |
| "LLM": {"script": "services/llm_service.py", "port": 5002, "prefix": "[LLM]"}, | |
| "LiveStream": {"script": "services/live_stream_service.py", "port": 5003, "prefix": "[Live]"}, | |
| # "Backend": {"script": os.path.join(BASE_DIR, "app/main.py"), "port": int(os.getenv("PORT", 8000)), "prefix": "[Backend]"} | |
| } | |
| processes = {} | |
| # โโโโโโโโโโโโโโโ Fonction pour crรฉer un logger par service โโโโโโโโโโโโโโโ | |
| def create_service_logger(name): | |
| logger = logging.getLogger(name) | |
| logger.setLevel(logging.INFO) | |
| file_handler = RotatingFileHandler( | |
| os.path.join(LOG_DIR, f"{name}.log"), | |
| maxBytes=5*1024*1024, | |
| backupCount=3, | |
| encoding="utf-8" | |
| ) | |
| file_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")) | |
| # Eviter d'ajouter plusieurs handlers si dรฉjร crรฉรฉ | |
| if not logger.handlers: | |
| logger.addHandler(console_handler) | |
| logger.addHandler(file_handler) | |
| return logger | |
| # โโโโโโโโโโโโโโโ Dรฉmarrer un service โโโโโโโโโโโโโโโ | |
| def start_service(name, info): | |
| prefix = info["prefix"] | |
| port = info["port"] | |
| script = info["script"] | |
| service_logger = create_service_logger(name) | |
| # Ajuster PYTHONPATH | |
| #env = os.environ.copy() | |
| #env["PYTHONPATH"] = f"{BASE_DIR};{os.path.dirname(script)};{env.get('PYTHONPATH','')}" | |
| service_logger.info(f"{prefix} ๐ Dรฉmarrage du service sur le port {port} ...") | |
| proc = subprocess.Popen( | |
| [sys.executable, script], | |
| stdout=sys.stdout, | |
| stderr=sys.stderr, | |
| bufsize=1, | |
| universal_newlines=True, | |
| #env=env | |
| ) | |
| # Les logs des services apparaรฎtront directement dans stdout | |
| return proc | |
| # โโโโโโโโโโโโโโโ Lancement de tous les services โโโโโโโโโโโโโโโ | |
| for name, info in SERVICES.items(): | |
| proc = start_service(name, info) | |
| processes[name] = proc | |
| central_logger.info("โ๏ธ Tous les services ont รฉtรฉ lancรฉs. Ctrl+C pour arrรชter.") | |
| # โโโโโโโโโโโโโโโ Boucle de surveillance โโโโโโโโโโโโโโโ | |
| try: | |
| while True: | |
| for name, proc in list(processes.items()): | |
| ret = proc.poll() | |
| if ret is not None: | |
| central_logger.error(f"{SERVICES[name]['prefix']} โ Service arrรชtรฉ ! Code: {ret}") | |
| proc_new = start_service(name, SERVICES[name]) | |
| processes[name] = proc_new | |
| time.sleep(2) | |
| except KeyboardInterrupt: | |
| central_logger.info("โน Arrรชt de tous les services...") | |
| for name, proc in processes.items(): | |
| proc.terminate() | |
| central_logger.info("โ Tous les services ont รฉtรฉ arrรชtรฉs.") | |