126 lines
3.6 KiB
Bash
Executable File
126 lines
3.6 KiB
Bash
Executable File
#!/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"
|