#!/bin/zsh # Atualiza incrementalmente a RAG do G-ART usando o banco compartilhado. # # Credenciais: defina RAG_DB_PASSWORD no ambiente ou crie # admin/gart-rag.env (ignorado pelo git). O arquivo pode conter também # RAG_DB_USER, RAG_DB_PORT, OLLAMA_URL e RAG_EMBED_MODEL. set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd -P)" ENV_FILE="$ROOT/admin/gart-rag.env" if [[ -f "$ENV_FILE" ]]; then set -a source "$ENV_FILE" set +a fi PYTHON="${RAG_PYTHON:-}" if [[ -z "$PYTHON" ]]; then for candidate in "$ROOT/admin/.venv/bin/python3" "$ROOT/rag/.venv/bin/python3"; do if [[ -x "$candidate" ]]; then PYTHON="$candidate"; break; fi done fi PYTHON="${PYTHON:-$(command -v python3)}" if ! "$PYTHON" -c 'import psycopg2, requests' >/dev/null 2>&1; then echo "ERRO: o Python da RAG precisa dos pacotes psycopg2 e requests." >&2 echo "Instale-os no ambiente indicado por RAG_PYTHON e tente novamente." >&2 exit 1 fi if [[ -z "${RAG_DB_PASSWORD:-}" ]]; then echo "ERRO: defina RAG_DB_PASSWORD ou configure $ENV_FILE" >&2 exit 1 fi HOST="${RAG_VPS_HOST:-179.197.228.240}" LOCAL_PORT="${RAG_DB_PORT:-55435}" REMOTE_PORT="${RAG_REMOTE_PORT:-55435}" TUNNEL_PID="" cleanup() { if [[ -n "$TUNNEL_PID" ]] && kill -0 "$TUNNEL_PID" 2>/dev/null; then kill "$TUNNEL_PID" 2>/dev/null || true wait "$TUNNEL_PID" 2>/dev/null || true fi } trap cleanup EXIT if ! nc -z 127.0.0.1 "$LOCAL_PORT" 2>/dev/null; then echo "==> Abrindo túnel RAG (127.0.0.1:$LOCAL_PORT)..." ssh -N -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 \ -o ServerAliveCountMax=3 -L "127.0.0.1:$LOCAL_PORT:127.0.0.1:$REMOTE_PORT" \ "${RAG_VPS_USER:-root}@$HOST" & TUNNEL_PID=$! for _ in {1..20}; do nc -z 127.0.0.1 "$LOCAL_PORT" 2>/dev/null && break kill -0 "$TUNNEL_PID" 2>/dev/null || break sleep 0.25 done fi if ! nc -z 127.0.0.1 "$LOCAL_PORT" 2>/dev/null; then echo "ERRO: não foi possível abrir o túnel RAG." >&2 exit 1 fi echo "==> Atualizando RAG do G-ART (incremental)..." cd "$ROOT" exec "$PYTHON" "$ROOT/admin/update_rag.py"