++ Add Readme + Multiple S3 Configs

This commit is contained in:
2026-03-18 14:11:45 +01:00
parent d2080c936f
commit cb6536f656
9 changed files with 856 additions and 93 deletions

View File

@@ -1,49 +1,114 @@
#!/usr/bin/env bash
# ============================================================
# entrypoint.sh - Avvia sia il web server che lo script di sync
# entrypoint.sh - Avvia dashboard web + multiple sync (o singola)
# ============================================================
# Gestisce i due processi:
# 1. Flask web dashboard (background)
# 2. Script di sincronizzazione rclone (foreground)
#
# Lo shutdown pulito viene propagato a entrambi i processi.
# 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
# --- Crea directory condivise ---
mkdir -p /data/state /data/local
# --- Porta web (configurabile) ---
WEB_PORT="${WEB_PORT:-8080}"
SYNC_CONFIGS="${SYNC_CONFIGS:-}"
echo "[ENTRYPOINT] Avvio dashboard web su porta ${WEB_PORT}..."
# Avvia il web server Flask in background
# - Usa python3 -u per output unbuffered (log immediati)
python3 -u /app/web/app.py &
WEB_PID=$!
echo "[ENTRYPOINT] Dashboard avviata (PID: ${WEB_PID})"
echo "[ENTRYPOINT] Avvio sincronizzazione..."
# --- Gestione shutdown: termina entrambi i processi ---
# --- Funzione cleanup ---
cleanup() {
echo "[ENTRYPOINT] Arresto in corso..."
# Invia SIGTERM al web server
kill "${WEB_PID}" 2>/dev/null || true
wait "${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
# Avvia lo script di sync in foreground
# Questo è il processo principale: se termina, il container si ferma
/usr/local/bin/sync.sh &
SYNC_PID=$!
# --- 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
# Attendi che uno dei due processi termini
wait -n "${WEB_PID}" "${SYNC_PID}" 2>/dev/null || true
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
# Se siamo qui, un processo è terminato: ferma l'altro
cleanup