++ Add Readme + Multiple S3 Configs
This commit is contained in:
111
entrypoint.sh
111
entrypoint.sh
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user