#!/bin/bash # obs-index-sync.sh — indexa sessões Claude/Hermes/OpenCode e sincroniza sessions.db para o volume EasyPanel. # CANÓNICO: este ficheiro vive NO REPO (systemd/obs-index-sync.sh) e é instalado por systemd/install-indexer.sh. # Lição 05-2026: a cópia única em ~/.local/bin perdeu-se e ninguém deu conta durante semanas (F0.5 Pipeline QT #2401). set -uo pipefail DASH_DIR="/media/ealmeida/Dados/Dev/DashDescomplicar" DB_LOCAL="$HOME/.claude-work/sessions.db" REMOTE_HOST="root@5.9.90.70" REMOTE_PATH="/root/data/dashboard-descomplicar/sessions.db" LOG="$HOME/.logs/observability/indexer.log" NODE="/home/ealmeida/.nvm/versions/node/v22.22.2/bin/node" NPX="/home/ealmeida/.nvm/versions/node/v22.22.2/bin/npx" mkdir -p "$(dirname "$LOG")" echo "[$(date -Iseconds)] Inicio" >> "$LOG" # Indexar cd "$DASH_DIR" OBSERVABILIDADE_DB="$DB_LOCAL" "$NPX" tsx api/scripts/sessions-indexer.ts --full >> "$LOG" 2>&1 || true # Checkpoint DB e forcar journal_mode=DELETE para evitar WAL inconsistente python3 -c " import sqlite3, os path = os.path.expanduser(\"$DB_LOCAL\") db = sqlite3.connect(path) db.execute(\"PRAGMA wal_checkpoint(TRUNCATE)\") db.execute(\"PRAGMA journal_mode=DELETE\") db.close() " 2>/dev/null || true # Sincronizar para EasyPanel rsync -az --checksum "$DB_LOCAL" "$REMOTE_HOST:$REMOTE_PATH" >> "$LOG" 2>&1 # Limpar WAL/SHM no host EasyPanel e reiniciar servico Swarm ssh "$REMOTE_HOST" "rm -f /root/data/dashboard-descomplicar/sessions.db-shm /root/data/dashboard-descomplicar/sessions.db-wal && docker service update --detach=true --force descomplicar_dashboard_descomplicar 1>/dev/null 2>&1" >> "$LOG" 2>&1 || true echo "[$(date -Iseconds)] Concluido - $(du -sh "$DB_LOCAL" | cut -f1)" >> "$LOG"