File size: 4,655 Bytes
de63014
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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.")