#!/bin/bash # Database health check and auto-recovery script # Run this periodically (e.g., via cron) to ensure database persistence set -e LOG_FILE="/var/log/db-health-check.log" TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') log() { echo "[$TIMESTAMP] $1" | tee -a "$LOG_FILE" } log "🔍 Starting database health check..." # Check if PostgreSQL container is running if ! docker ps | grep -q daarion-postgres; then log "❌ PostgreSQL container is not running!" exit 1 fi # Check if database exists if ! docker exec daarion-postgres psql -U postgres -lqt | cut -d \| -f 1 | grep -qw daarion; then log "⚠️ Database 'daarion' does not exist, creating..." docker exec daarion-postgres psql -U postgres -c "CREATE DATABASE daarion;" || { log "❌ Failed to create database" exit 1 } fi # Check if critical tables exist TABLE_COUNT=$(docker exec daarion-postgres psql -U postgres -d daarion -t -c "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public';" 2>/dev/null | tr -d ' ' || echo "0") if [ "$TABLE_COUNT" -lt 5 ]; then log "⚠️ Database has only $TABLE_COUNT tables (expected 20+), applying migrations..." cd /opt/microdao-daarion for f in migrations/*.sql; do log " Applying $(basename $f)..." docker exec -i daarion-postgres psql -U postgres -d daarion < "$f" 2>&1 | grep -v "already exists\|does not exist" || true done log "✅ Migrations applied" fi # Check for missing critical columns log "🔍 Checking for missing columns..." # Check banner_url if ! docker exec daarion-postgres psql -U postgres -d daarion -t -c "SELECT 1 FROM information_schema.columns WHERE table_name = 'microdaos' AND column_name = 'banner_url';" 2>/dev/null | grep -q 1; then log "⚠️ Missing banner_url column, adding..." docker exec daarion-postgres psql -U postgres -d daarion -c "ALTER TABLE microdaos ADD COLUMN IF NOT EXISTS banner_url TEXT;" || log "⚠️ Failed to add banner_url" fi # Check logo_url if ! docker exec daarion-postgres psql -U postgres -d daarion -t -c "SELECT 1 FROM information_schema.columns WHERE table_name = 'microdaos' AND column_name = 'logo_url';" 2>/dev/null | grep -q 1; then log "⚠️ Missing logo_url column, adding..." docker exec daarion-postgres psql -U postgres -d daarion -c "ALTER TABLE microdaos ADD COLUMN IF NOT EXISTS logo_url TEXT;" || log "⚠️ Failed to add logo_url" fi # Check data integrity MICRODAO_COUNT=$(docker exec daarion-postgres psql -U postgres -d daarion -t -c "SELECT COUNT(*) FROM microdaos;" 2>/dev/null | tr -d ' ' || echo "0") log "📊 MicroDAOs in database: $MICRODAO_COUNT" if [ "$MICRODAO_COUNT" -eq 0 ]; then log "⚠️ No MicroDAOs found in database!" log "💡 Consider restoring from backup: /opt/microdao-daarion/db_backups/" fi # Check volume persistence VOLUME_SIZE=$(du -sh /var/lib/docker/volumes/daarion_pgdata/_data/ 2>/dev/null | awk '{print $1}' || echo "unknown") log "📦 Database volume size: $VOLUME_SIZE" log "✅ Health check complete"