#!/bin/bash # Coderaft DEV — bootstrap (servi par install-dev.coderaft.io) set -e echo "" echo " ╔══════════════════════════════════════════╗" echo " ║ CodeRaft Platform — DEV bootstrap ║" echo " ║ beta whitelistée ║" echo " ╚══════════════════════════════════════════╝" echo "" # B34 (2026-06-01): lire le PAT depuis /dev/tty plutôt que stdin. Permet # d'utiliser le oneliner identique à prod : curl -fsSL ... | bash. # Avec un pipe, stdin = pipe (pas un tty), donc l'ancienne logique [ -t 0 ] # tombait sur le else. /dev/tty est toujours disponible si l'utilisateur a # un terminal. if [ -z "${CODERAFT_DEV_PAT:-}" ]; then if [ -r /dev/tty ]; then read -r -s -p " GitHub PAT (scopes: read:user + read:packages + accès repo coderaft-installer-dev) : " CODERAFT_DEV_PAT < /dev/tty echo "" else echo " ✗ Pas de TTY accessible. Lance avec un PAT via env :" echo " CODERAFT_DEV_PAT=ghp_xxx curl -fsSL https://install-dev.coderaft.io | bash" exit 1 fi fi [ -z "$CODERAFT_DEV_PAT" ] && { echo " ✗ Pas de PAT, abandon"; exit 1; } export CODERAFT_DEV_PAT USER_LOGIN=$(curl -sf -H "Authorization: token $CODERAFT_DEV_PAT" -H "Accept: application/vnd.github+json" https://api.github.com/user 2>/dev/null | python3 -c "import sys,json try: d=json.load(sys.stdin); print(d.get('login','')) except: print('')" 2>/dev/null) [ -z "$USER_LOGIN" ] && { echo " ✗ PAT invalide. Contact: contact@coderaft.io"; exit 1; } echo " ✓ PAT valide pour: $USER_LOGIN" HTTP=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: token $CODERAFT_DEV_PAT" https://api.github.com/repos/LiamJ74/coderaft-installer-dev) if [ "$HTTP" != "200" ]; then echo " ✗ Pas d'accès au repo LiamJ74/coderaft-installer-dev (HTTP $HTTP)." echo " Le PAT doit inclure ce repo dans 'Repository access' (fine-grained)." exit 1 fi echo " ✓ Accès repo coderaft-installer-dev OK" TMP=$(mktemp -d) trap "rm -rf $TMP" EXIT echo " ▶ Téléchargement scripts (tarball)..." TARBALL="$TMP/src.tar.gz" if ! curl -sfL -H "Authorization: token $CODERAFT_DEV_PAT" \ "https://api.github.com/repos/LiamJ74/coderaft-installer-dev/tarball/master" \ -o "$TARBALL"; then echo " ✗ Téléchargement tarball échoué. PAT a-t-il accès au repo LiamJ74/coderaft-installer-dev ?" exit 1 fi TARSIZE=$(stat -f%z "$TARBALL" 2>/dev/null || stat -c%s "$TARBALL" 2>/dev/null || echo 0) if [ "$TARSIZE" -lt 1000 ]; then echo " ✗ Tarball trop petit ($TARSIZE octets) — réponse API invalide." exit 1 fi echo " ▶ Extraction..." if ! tar -xzf "$TARBALL" -C "$TMP" --strip-components=1; then echo " ✗ Extraction tar échouée. Contenu du tmp :" ls -la "$TMP" exit 1 fi rm -f "$TARBALL" if [ ! -f "$TMP/install.sh" ]; then echo " ✗ install.sh absent du tarball extrait." echo " Contenu du dossier $TMP :" ls -la "$TMP" exit 1 fi echo " ✓ Scripts extraits (install.sh présent)" # cd vers le bon répertoire avant exec. # install : cwd=$HOME, install.sh crée le sous-dossier coderaft-dev/ # update/rollback : cwd=$HOME/coderaft-dev où vit docker-compose.yml HOME_DIR="${HOME:-/tmp}" WORK_DIR="$HOME_DIR" TARGET_SCRIPT="$TMP/install.sh" chmod +x "$TARGET_SCRIPT" "$TMP/scripts/"*.sh "$TMP/lib/"*.sh 2>/dev/null || true cd "$WORK_DIR" echo " ▶ Exécution install (cwd: $WORK_DIR)" exec bash "$TARGET_SCRIPT"