#!/usr/bin/env bash # ============================================================ # entrypoint.sh - Avvia dashboard web + multiple sync (o singola) # ============================================================ # Supporta due modalità: # 1. Singola sync: (compatibilità) lancia un solo sync.sh # 2. Multiple sync: parse SYNC_CONFIGS JSON e lancia più istanze # ============================================================ set -euo pipefail mkdir -p /data/state /data/local WEB_PORT="${WEB_PORT:-8080}" SYNC_CONFIGS="${SYNC_CONFIGS:-}" echo "[ENTRYPOINT] Avvio dashboard web su porta ${WEB_PORT}..." python3 -u /app/web/app.py & WEB_PID=$! echo "[ENTRYPOINT] Dashboard avviata (PID: ${WEB_PID})" # --- Funzione cleanup --- cleanup() { echo "[ENTRYPOINT] Arresto in corso..." kill "${WEB_PID}" 2>/dev/null || true # Termina tutti gli sync in background jobs -p | xargs -r kill 2>/dev/null || true wait 2>/dev/null || true echo "[ENTRYPOINT] Arresto completato." } trap cleanup SIGTERM SIGINT # --- Determina se usare single sync o multi-sync --- if [ -z "${SYNC_CONFIGS}" ]; then # Modalità SINGOLA: lancia un sync.sh come prima echo "[ENTRYPOINT] Avvio sincronizzazione (singola)..." /usr/local/bin/sync.sh & SYNC_PID=$! wait -n "${WEB_PID}" "${SYNC_PID}" 2>/dev/null || true else # Modalità MULTI: parse JSON e lancia multiple istanze echo "[ENTRYPOINT] Rilevate multiple sync, parsing configurazione..." # Parse JSON e lancia sync per ogni configurazione python3 << 'PYTHON_EOF' import json import os import subprocess import signal import time sync_configs_json = os.environ.get('SYNC_CONFIGS', '[]') try: configs = json.loads(sync_configs_json) except json.JSONDecodeError: print("[ERROR] SYNC_CONFIGS non è JSON valido") exit(1) if not configs or len(configs) == 0: print("[ERROR] SYNC_CONFIGS è vuoto") exit(1) print(f"[ENTRYPOINT] Avvio {len(configs)} sync...") processes = [] for i, cfg in enumerate(configs): sync_id = cfg.get('id', f'sync{i}') bucket = cfg.get('bucket', 'default') state_dir = f"/data/state/{sync_id}" print(f"[ENTRYPOINT] Avvio sync {i+1}/{len(configs)}: {sync_id} (bucket: {bucket})") # Crea directory di stato os.makedirs(state_dir, exist_ok=True) # Lancia sync.sh in background con STATE_DIR specifico env = os.environ.copy() env['STATE_DIR'] = state_dir proc = subprocess.Popen( ['/usr/local/bin/sync.sh'], env=env ) processes.append((sync_id, proc)) print(f"[ENTRYPOINT] Tutte le sync avviate.") # Attendi che uno dei processi termini try: while True: for sync_id, proc in processes: ret = proc.poll() if ret is not None: print(f"[ENTRYPOINT] Sync {sync_id} è terminata con codice {ret}") raise KeyboardInterrupt() time.sleep(1) except KeyboardInterrupt: print("[ENTRYPOINT] Terminazione in corso...") for sync_id, proc in processes: try: proc.terminate() except: pass for sync_id, proc in processes: try: proc.wait(timeout=5) except: proc.kill() PYTHON_EOF fi cleanup