SPB Git forge

spb/trouve-ka

Public ★ Pinned

Trouve-KA — moteur de recherche web indépendant, Québec-first. Crawler distribué, index OpenSearch, ranking bilingue, galerie d'images. En prod : www.trouve-ka.com

40commits 1branches 0releases
9.2 MBsize
maindefault branch
23 days agolast push
Python 51.9% TypeScript 32.7% JavaScript 4.8% CSS 4.1% Shell 2.9% HTML 1.8% SQL 1.5%
4.5 KB · 120 lines shellscript
Raw Blame History
1#!/bin/sh2# Trouve-KA — démarrage/réparation idempotent d'un node (exécutable à répétition)3# Author: Simon-Pierre Boucher4# Contact: contact@spboucher.ai5#6# Rôle du node lu dans ~/.trouveka-role : hub | search | embed | crawler7#   hub     (M2M32)  : PG+Redis (docker), tunnels OS/embed, pm2 tk-*, ngrok8#   search  (M2M32b) : OpenSearch (docker), tunnels PG/Redis, worker crawl9#   embed   (m4mc)   : service embeddings/rerank, tunnels, worker crawl10#   crawler (autres) : tunnels PG/Redis/OS, worker crawl11#12# Conçu pour tourner sous LaunchDaemon (RunAtLoad) ET à la main ET via la clé13# de guérison du watchdog. Ne touche à rien qui fonctionne déjà.14# Règle d'or : les process python ne parlent qu'à 127.0.0.1 (tunnels ssh15# système = seuls flux LAN, exempts du blocage « réseau local » macOS).1617PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"18export PATH19ROLE=$(cat "$HOME/.trouveka-role" 2>/dev/null || echo crawler)20LOG="$HOME/trouveka-boot.log"21TK="$HOME/trouve-ka"22SSH_OPTS="-i $HOME/.ssh/trouveka_tunnel -N -o ControlMaster=no -o ControlPath=none -o IdentitiesOnly=yes -o IdentityAgent=none -o ForwardAgent=no -o StrictHostKeyChecking=accept-new -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -o ExitOnForwardFailure=yes"23PG_HOST=192.168.2.9024OS_HOST=192.168.2.7725EMBED_HOST=192.168.2.752627log() { echo "$(date '+%F %T') [$ROLE] $*" >> "$LOG"; }2829port_up() { nc -z -w 2 127.0.0.1 "$1" 2>/dev/null; }3031# Tunnel simple : ensure_tunnel <nom> <port_local> <hôte> <port_distant>32ensure_tunnel() {33  port_up "$2" && return 034  pkill -f "trouveka-tunloop-$1" 2>/dev/null35  sleep 136  nohup sh -c "while true; do /usr/bin/ssh $SSH_OPTS -L 127.0.0.1:$2:localhost:$4 simon-pierreboucher@$3; sleep 5; done # trouveka-tunloop-$1" \37    >> "$HOME/trouveka-tunnels.log" 2>&1 &38  log "tunnel $1 (127.0.0.1:$2 → $3:$4) relancé"39}4041# Tunnel double PG+Redis vers le hub42ensure_pg_redis_tunnel() {43  port_up 15432 && port_up 16379 && return 044  pkill -f "trouveka-tunloop-pg" 2>/dev/null45  sleep 146  nohup sh -c "while true; do /usr/bin/ssh $SSH_OPTS -L 127.0.0.1:15432:localhost:5432 -L 127.0.0.1:16379:localhost:6379 simon-pierreboucher@$PG_HOST; sleep 5; done # trouveka-tunloop-pg" \47    >> "$HOME/trouveka-tunnels.log" 2>&1 &48  log "tunnel pg+redis relancé"49}5051wait_port() { # $1 = port, $2 = secondes max52  t=053  while [ "$t" -lt "${2:-60}" ]; do54    port_up "$1" && return 055    sleep 256    t=$((t+2))57  done58  log "attente port $1 : délai dépassé (${2:-60}s)"59  return 160}6162ensure_worker() {63  pgrep -f trouveka.crawler.worker >/dev/null && return 064  [ -x "$TK/.venv/bin/python" ] || { log "worker : venv absent"; return 1; }65  # Au boot : laisser les tunnels s'établir avant de lancer le worker66  wait_port 15432 6067  cd "$TK" && nohup .venv/bin/python -m trouveka.crawler.worker >> "$HOME/trouveka-crawler.log" 2>&1 &68  log "worker crawl relancé"69}7071ensure_colima() {72  docker info >/dev/null 2>&1 && return 073  log "colima/docker arrêté : démarrage"74  colima start >> "$LOG" 2>&175}7677case "$ROLE" in78  hub)79    ensure_colima80    cd "$TK" && docker compose up -d postgres redis >> "$LOG" 2>&181    ensure_tunnel search 9210 "$OS_HOST" 920082    ensure_tunnel embed 8191 "$EMBED_HOST" 809183    # pm2 : ressusciter la liste sauvegardée puis relancer tout process en erreur84    if ! pm2 pid tk-api >/dev/null 2>&1 || [ -z "$(pm2 pid tk-api 2>/dev/null)" ]; then85      pm2 resurrect >> "$LOG" 2>&186      log "pm2 resurrect"87    fi88    ERRORED=$(pm2 jlist 2>/dev/null | grep -o '"name":"[^"]*","pm2_env":{"status":"errored"' | grep -o 'tk-[a-z0-9-]*')89    for name in $ERRORED; do pm2 restart "$name" >> "$LOG" 2>&1; log "pm2 restart $name (errored)"; done90    # ngrok : LaunchAgent gui absent après reboot sans session → filet nohup91    if ! pgrep -f "ngrok http" >/dev/null; then92      nohup ngrok http --url=www.trouve-ka.com 3000 >> "$HOME/trouve-ka-ngrok.log" 2>&1 &93      log "ngrok relancé"94    fi95    ;;96  search)97    ensure_colima98    docker start trouveka-opensearch >/dev/null 2>&199    ensure_pg_redis_tunnel100    ensure_worker101    ;;102  embed)103    if ! pgrep -f "services.embedding.server" >/dev/null; then104      cd "$TK" && nohup .venv-embed/bin/uvicorn services.embedding.server:app --host 0.0.0.0 --port 8091 >> "$HOME/trouveka-embed.log" 2>&1 &105      log "service embeddings relancé"106    fi107    ensure_pg_redis_tunnel108    ensure_tunnel os 19200 "$OS_HOST" 9200109    ensure_worker110    ;;111  crawler|*)112    ensure_pg_redis_tunnel113    ensure_tunnel os 19200 "$OS_HOST" 9200114    ensure_worker115    ;;116esac117118log "boot.sh terminé"119exit 0120