File size: 4,072 Bytes
2009f7f
 
b0ab4f8
 
 
 
 
 
 
 
b8994e7
 
 
 
b0ab4f8
 
 
 
2009f7f
 
 
 
 
 
b7fe75a
 
 
2009f7f
537fa66
2009f7f
 
 
 
 
 
 
 
 
 
 
 
 
537fa66
2009f7f
 
 
b7fe75a
 
 
2009f7f
 
 
 
 
 
 
 
 
 
 
 
 
 
537fa66
2009f7f
 
 
b7fe75a
537fa66
b7fe75a
537fa66
 
90285a7
2009f7f
537fa66
 
2009f7f
b7fe75a
537fa66
2009f7f
b7fe75a
 
 
 
 
 
537fa66
 
2009f7f
 
b7fe75a
 
 
 
 
f142109
b7fe75a
 
 
6d236c6
b7fe75a
 
 
f142109
6d236c6
f142109
 
 
6d236c6
f142109
6d236c6
f142109
90285a7
 
f142109
b0ab4f8
6d236c6
90285a7
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
#!/bin/sh
set -eu
# ------------------------------------------------------------
# 0) Load env file shipped with repo (backend/env)
# ------------------------------------------------------------
ENV_FILE="/app/backend/env"
if [ -f "$ENV_FILE" ]; then
  echo "[BOOT] Loading env from $ENV_FILE"
  set -a
  . "$ENV_FILE"
  echo "[CHECK] SMTP_HOST set? ${SMTP_HOST:+yes}"
  echo "[CHECK] SMTP_PORT set? ${SMTP_PORT:+yes}"
  echo "[CHECK] SMTP_USER set? ${SMTP_USER:+yes}"
  echo "[CHECK] SMTP_PASS set? ${SMTP_PASS:+yes}"
  set +a
else
  echo "[BOOT] No env file at $ENV_FILE (continuing without it)"
fi
DATA_ROOT="/app/inference-data"
ERA5_SUBDIR="ERA5_Germany"
ERA5_PATH="$DATA_ROOT/$ERA5_SUBDIR"

MODEL_ROOT="/app/model-artifacts"

# ------------------------------------------------------------
# 1) ERA5 Dataset laden (nur wenn fehlt/leer)
# ------------------------------------------------------------
if [ ! -d "$ERA5_PATH" ] || [ -z "$(ls -A "$ERA5_PATH" 2>/dev/null)" ]; then
  echo "[BOOT] Downloading dataset dspunituebingen/era5 -> $DATA_ROOT (ERA5_Germany/**)"
  python - <<'PY'
import os
from huggingface_hub import snapshot_download

token = os.getenv("HF_TOKEN") or os.getenv("HUGGINGFACEHUB_API_TOKEN")

snapshot_download(
    repo_id="dspunituebingen/era5",
    repo_type="dataset",
    local_dir="/app/inference-data",
    allow_patterns=["ERA5_Germany/**"],
    token=token,
)
print("[BOOT] ERA5 ready at /app/inference-data/ERA5_Germany")
PY
fi

# ------------------------------------------------------------
# 2) Modell-Repo laden (nur wenn fehlt/leer)
# ------------------------------------------------------------
if [ ! -d "$MODEL_ROOT" ] || [ -z "$(ls -A "$MODEL_ROOT" 2>/dev/null)" ]; then
  echo "[BOOT] Downloading model dspunituebingen/windproject-model -> $MODEL_ROOT"
  python - <<'PY'
import os
from huggingface_hub import snapshot_download

token = os.getenv("HF_TOKEN") or os.getenv("HUGGINGFACEHUB_API_TOKEN")

snapshot_download(
    repo_id="dspunituebingen/windproject-model",
    repo_type="model",
    local_dir="/app/model-artifacts",
    token=token,
)
print("[BOOT] Model ready at /app/model-artifacts")
PY
fi

# ------------------------------------------------------------
# 3) Env Vars für backend/app/main.py
# ------------------------------------------------------------
export APP_ENV="server"
export SERVER_HOST="0.0.0.0"
export SERVER_PORT="${PORT:-7860}"

export ERA5_DIR="$ERA5_PATH"
export FORECAST_MODEL_DIR="$MODEL_ROOT"

# Kompatibilitäts-Aliase (falls andere Module das erwarten)
export MODEL_DIR="$MODEL_ROOT"

# Turbine curves (liegen im Repo)
if [ -f "/app/backend/wind-power-climate-ml/data/turbine_power_curves.json" ]; then
  export TURBINE_CURVES_JSON="/app/backend/wind-power-climate-ml/data/turbine_power_curves.json"
elif [ -f "/app/backend/wind-power-climate-ml/Data/turbine_power_curves.json" ]; then
  export TURBINE_CURVES_JSON="/app/backend/wind-power-climate-ml/Data/turbine_power_curves.json"
else
  echo "[FATAL] turbine_power_curves.json not found in expected repo paths."
  exit 1
fi

echo "[CONFIG] ERA5_DIR=$ERA5_DIR"
echo "[CONFIG] FORECAST_MODEL_DIR=$FORECAST_MODEL_DIR"
echo "[CONFIG] TURBINE_CURVES_JSON=$TURBINE_CURVES_JSON"

# ------------------------------------------------------------
# 4) Start Uvicorn (robust: import app.main)
# ------------------------------------------------------------
export PYTHONPATH="/app/backend:/app/backend/model:/app/backend/wind-power-climate-ml/src:${PYTHONPATH:-}"

echo "[CHECK] /app/backend/app listing:"
ls -lah /app/backend/app || true

python - <<'PY'
import importlib, traceback
try:
    m = importlib.import_module("app.main")
    print("[BOOT] app.main imported OK. Has app?", hasattr(m, "app"))
    print("[BOOT] app =", getattr(m, "app", None))
except Exception:
    print("[FATAL] Import of app.main failed. Full traceback:")
    traceback.print_exc()
    raise SystemExit(1)
PY

# Uvicorn: lade app.main:app (entspricht /app/backend/app/main.py)
exec python -m uvicorn app.main:app --host 0.0.0.0 --port "${PORT:-7860}" --log-level info