#!/usr/bin/env bash set -euo pipefail # --- Réglages (surchageables en Variables/Secrets HF) --- : "${GITHUB_REPO_API_URL:=https://github.com/chourmovs/RFPmasterApi.git}" : "${GITHUB_REPO_CORE_URL:=https://github.com/chourmovs/RFPmaster.git}" : "${GITHUB_TOKEN:=}" # si besoin pour repos privés : "${API_MODULE:=rfp_api_app}" # module exposant 'app' : "${API_APP_ATTR:=app}" : "${BRANCH_API:=}" # ex: main ; vide = HEAD : "${BRANCH_CORE:=}" # ex: main : "${WORKSPACE:=/home/user/workspace}" # Assure que ~/.local/bin (pip --user) est dans le PATH export PATH="/home/user/.local/bin:/usr/local/bin:/usr/bin:/bin:${PATH}" API_DIR="${WORKSPACE}/RFPmasterApi" CORE_DIR="${WORKSPACE}/RFPmaster" # contiendra rfp_parser/ echo "===== Application Startup at $(date '+%F %T') =====" echo "[startup] WORKSPACE=${WORKSPACE}" mkdir -p "${WORKSPACE}" clone_or_update () { local repo_url="$1" target="$2" branch="$3" if [ ! -d "${target}/.git" ]; then echo "[git] cloning ${repo_url} -> ${target}" if [ -n "${GITHUB_TOKEN}" ]; then git -c http.extraHeader="Authorization: Basic $(printf 'oauth2:%s' "${GITHUB_TOKEN}" | base64 -w0)" \ clone --depth=1 ${branch:+-b "${branch}"} "${repo_url}" "${target}" else git clone --depth=1 ${branch:+-b "${branch}"} "${repo_url}" "${target}" fi else echo "[git] updating ${target}" git -C "${target}" fetch --depth=1 origin if [ -n "${branch}" ]; then git -C "${target}" checkout -q "${branch}" || true fi git -C "${target}" reset --hard ${branch:+origin/"${branch}"} ${branch:+"$(true)"} || git -C "${target}" reset --hard origin/HEAD fi } # --- Clone/update des deux repos --- clone_or_update "${GITHUB_REPO_API_URL}" "${API_DIR}" "${BRANCH_API}" clone_or_update "${GITHUB_REPO_CORE_URL}" "${CORE_DIR}" "${BRANCH_CORE}" # Safe dir pour Git (HF) git config --global --add safe.directory "${API_DIR}" || true git config --global --add safe.directory "${CORE_DIR}" || true # --- Installation des dépendances Python (au run) --- echo "[pip] Checking uvicorn presence..." if ! command -v uvicorn >/dev/null 2>&1; then echo "[pip] uvicorn not found → installing requirements" if [ -f "${API_DIR}/requirements.txt" ]; then # --user pour installer dans ~/.local et éviter les droits root python -m pip install --user --no-cache-dir -r "${API_DIR}/requirements.txt" else # garde-fou minimal python -m pip install --user --no-cache-dir fastapi "uvicorn[standard]" requests pandas openpyxl fi else echo "[pip] uvicorn OK" fi # (Optionnel) si ton repo CORE a aussi un requirements.txt : if [ -f "${CORE_DIR}/requirements.txt" ]; then echo "[pip] Installing CORE requirements" python -m pip install --user --no-cache-dir -r "${CORE_DIR}/requirements.txt" || true fi # --- PYTHONPATH : on expose les deux répertoires (API + CORE/rfp_parser) --- export PYTHONPATH="${API_DIR}:${CORE_DIR}:${PYTHONPATH:-}" # --- Sanity checks imports --- echo "[check] importing ${API_MODULE}" python - <<'PY' "${API_MODULE}" import importlib, sys m = sys.argv[1] importlib.import_module(m) print(f"[check] import {m}: OK") PY echo "[check] importing rfp_parser" python - <<'PY' import importlib importlib.import_module("rfp_parser") print("[check] import rfp_parser: OK") PY # --- Lancement Uvicorn --- cd "${API_DIR}" echo "[uvicorn] launching ${API_MODULE}:${API_APP_ATTR} on 0.0.0.0:7860" exec uvicorn "${API_MODULE}:${API_APP_ATTR}" --host 0.0.0.0 --port 7860