#!/bin/bash # consolidate-clavitor-db-auto.sh # NON-INTERACTIVE VERSION for SSH execution set -e DB="${1:-/opt/clavitor-web/clavitor.db}" BACKUP="${DB}.backup.$(date +%Y%m%d_%H%M%S)" # AUTO-CONFIRM MODE FORCE="${FORCE:-0}" echo "=== Clavitor DB Production Consolidation ===" echo "Target: $DB" echo "" # Show current state echo "=== Current State ===" sqlite3 "$DB" <<'EOF' SELECT "=== Row Counts ==="; SELECT "accounts: " || COUNT(*) FROM accounts; SELECT "domain_scopes: " || COUNT(*) || " (KEEP)" FROM domain_scopes; SELECT "incidents: " || COUNT(*) FROM incidents; SELECT "incident_updates: " || COUNT(*) FROM incident_updates; SELECT "login_codes: " || COUNT(*) || " (DROP)" FROM login_codes; SELECT "maintenance: " || COUNT(*) || " (CHECK)" FROM maintenance; SELECT "outages: " || COUNT(*) || " (CHECK)" FROM outages; SELECT "pops: " || COUNT(*) || " (KEEP)" FROM pops; SELECT "sessions: " || COUNT(*) || " (DROP)" FROM sessions; SELECT "telemetry: " || COUNT(*) || " (KEEP)" FROM telemetry; SELECT "uptime: " || COUNT(*) || " (KEEP)" FROM uptime; SELECT "uptime_daily: " || COUNT(*) || " (KEEP)" FROM uptime_daily; SELECT "uptime_spans: " || COUNT(*) || " (KEEP)" FROM uptime_spans; SELECT "vaults: " || COUNT(*) || " (DROP)" FROM vaults; SELECT "=== POP Status ==="; SELECT status || ": " || COUNT(*) FROM pops GROUP BY status; EOF # Create backup echo "" echo "=== Creating Backup ===" cp "$DB" "$BACKUP" echo "✓ Backup: $BACKUP" echo "" echo "=== Phase 1: Drop Unused Tables ===" sqlite3 "$DB" <<'EOF' PRAGMA foreign_keys = OFF; DROP TABLE IF EXISTS login_codes; DROP TABLE IF EXISTS sessions; DROP TABLE IF EXISTS vaults; PRAGMA foreign_keys = ON; EOF echo "✓ Dropped: login_codes, sessions, vaults" echo "" echo "=== Phase 2: Check Status Table Merge ===" MAINT_COUNT=$(sqlite3 "$DB" "SELECT COUNT(*) FROM maintenance") OUTAGE_COUNT=$(sqlite3 "$DB" "SELECT COUNT(*) FROM outages") INCIDENT_COUNT=$(sqlite3 "$DB" "SELECT COUNT(*) FROM incidents") echo "Maintenance: $MAINT_COUNT, Outages: $OUTAGE_COUNT, Incidents: $INCIDENT_COUNT" if [[ $INCIDENT_COUNT -eq 0 && ($MAINT_COUNT -gt 0 || $OUTAGE_COUNT -gt 0) ]]; then echo "Merging maintenance and outages into incidents..." sqlite3 "$DB" <<'EOF' PRAGMA foreign_keys = OFF; -- Migrate maintenance to incidents INSERT INTO incidents (title, status, date, node_ids, created_at) SELECT 'Maintenance: ' || COALESCE(reason, 'Scheduled'), CASE WHEN end_at IS NULL THEN 'active' ELSE 'resolved' END, datetime(start_at, 'unixepoch'), '', COALESCE(start_at, strftime('%s', 'now')) FROM maintenance; -- Migrate outages to incidents INSERT INTO incidents (title, status, date, node_ids, created_at) SELECT COALESCE(description, 'Service Outage'), CASE WHEN status = 'resolved' THEN 'resolved' WHEN end_at = '' THEN 'investigating' ELSE 'monitoring' END, start_at, node_id, COALESCE(strftime('%s', start_at), strftime('%s', 'now')) FROM outages; DROP TABLE IF EXISTS maintenance; DROP TABLE IF EXISTS outages; PRAGMA foreign_keys = ON; EOF echo "✓ Merged maintenance ($MAINT_COUNT) and outages ($OUTAGE_COUNT) into incidents" else echo "Skipped merge (incidents has data or no source data)" fi echo "" echo "=== Phase 3: Vacuum and Optimize ===" sqlite3 "$DB" <<'EOF' VACUUM; ANALYZE; EOF echo "✓ Database optimized" echo "" echo "=== Final State ===" sqlite3 "$DB" ".tables" echo "" echo "=== Done ===" echo "Backup: $BACKUP" echo "To restore: cp $BACKUP $DB"