Files
gremiumhub/manage-db.sh

328 lines
10 KiB
Bash
Executable File

#!/bin/bash
# Database Management Script
# Handles backup and restore operations for both SQLite (frontend) and PostgreSQL (backend)
set -e # Exit on any error
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKEND_DIR="$SCRIPT_DIR/legalconsenthub-backend"
FRONTEND_DIR="$SCRIPT_DIR/legalconsenthub"
# Database files
SQLITE_DB="$FRONTEND_DIR/sqlite.db"
SQLITE_BACKUP="$FRONTEND_DIR/sqlite-backup.db"
POSTGRES_BACKUP="$BACKEND_DIR/src/main/resources/legalconsenthub-db-backup.sql"
# PostgreSQL connection details
POSTGRES_HOST="localhost"
POSTGRES_PORT="5432"
POSTGRES_DB="legalconsenthub"
POSTGRES_USER="legalconsenthub"
POSTGRES_PASSWORD="legalconsenthub"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Helper functions
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Check if PostgreSQL container is running
check_postgres() {
# Check if the legalconsenthub-backend container is running
if docker ps --format "table {{.Names}}\t{{.Status}}" | grep -q "legalconsenthub-backend.*Up"; then
# Additional check to see if the database is ready
if docker exec legalconsenthub-backend pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB" &>/dev/null; then
return 0
fi
fi
return 1
}
# Check if PostgreSQL container exists and is running
ensure_postgres_running() {
if ! check_postgres; then
log_error "PostgreSQL container 'legalconsenthub-backend' is not running."
log_error "Please start the container before running backup/restore operations."
exit 1
fi
}
# Create backup of current SQLite database
backup_sqlite() {
log_info "Creating SQLite backup..."
if [ -f "$SQLITE_DB" ]; then
cp "$SQLITE_DB" "$SQLITE_BACKUP"
log_success "SQLite backup created: $SQLITE_BACKUP"
else
log_warning "SQLite database not found: $SQLITE_DB"
fi
}
# Create backup of current PostgreSQL database
backup_postgres() {
log_info "Creating PostgreSQL backup..."
ensure_postgres_running
# Create temporary backup file
local temp_backup="${POSTGRES_BACKUP}.tmp"
# Generate backup with pg_dump
docker exec legalconsenthub-backend pg_dump \
-U "$POSTGRES_USER" \
-d "$POSTGRES_DB" \
--no-owner \
--no-privileges \
--clean \
--if-exists \
> "$temp_backup"
# Add force DROP statements at the beginning
{
echo "--"
echo "-- PostgreSQL database dump"
echo "--"
echo ""
echo "--"
echo "-- Force drop all tables and constraints to ensure clean restoration"
echo "--"
echo ""
echo "DROP TABLE IF EXISTS public.user_organization_roles CASCADE;"
echo "DROP TABLE IF EXISTS public.notification CASCADE;"
echo "DROP TABLE IF EXISTS public.form_element_section CASCADE;"
echo "DROP TABLE IF EXISTS public.form_element_options CASCADE;"
echo "DROP TABLE IF EXISTS public.form_element CASCADE;"
echo "DROP TABLE IF EXISTS public.comment CASCADE;"
echo "DROP TABLE IF EXISTS public.application_form CASCADE;"
echo "DROP TABLE IF EXISTS public.app_user CASCADE;"
echo "DROP TABLE IF EXISTS public.databasechangeloglock CASCADE;"
echo "DROP TABLE IF EXISTS public.databasechangelog CASCADE;"
echo ""
echo "-- Drop any remaining sequences, views, or other objects"
echo "DROP SEQUENCE IF EXISTS public.hibernate_sequence CASCADE;"
echo ""
echo "-- Reset database configuration"
# Skip the first few lines of the original dump (headers) and append the rest
tail -n +4 "$temp_backup"
} > "$POSTGRES_BACKUP"
# Remove temporary file
rm "$temp_backup"
log_success "PostgreSQL backup created with force DROP statements: $POSTGRES_BACKUP"
}
# Restore SQLite database from backup
restore_sqlite() {
log_info "Restoring SQLite database from backup..."
if [ -f "$SQLITE_BACKUP" ]; then
# Remove current database if it exists
if [ -f "$SQLITE_DB" ]; then
rm "$SQLITE_DB"
log_info "Removed current SQLite database"
fi
# Copy backup to current database
cp "$SQLITE_BACKUP" "$SQLITE_DB"
log_success "SQLite database restored from: $SQLITE_BACKUP"
else
log_error "SQLite backup not found: $SQLITE_BACKUP"
exit 1
fi
}
# Restore PostgreSQL database from backup
restore_postgres() {
log_info "Restoring PostgreSQL database from backup..."
if [ ! -f "$POSTGRES_BACKUP" ]; then
log_error "PostgreSQL backup not found: $POSTGRES_BACKUP"
exit 1
fi
ensure_postgres_running
# Terminate all connections and drop/recreate database
log_info "Terminating all connections to PostgreSQL database..."
docker exec legalconsenthub-backend psql \
-U "$POSTGRES_USER" \
-d "postgres" \
-c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$POSTGRES_DB' AND pid <> pg_backend_pid();"
log_info "Dropping and recreating PostgreSQL database..."
docker exec legalconsenthub-backend psql \
-U "$POSTGRES_USER" \
-d "postgres" \
-c "DROP DATABASE IF EXISTS $POSTGRES_DB;"
docker exec legalconsenthub-backend psql \
-U "$POSTGRES_USER" \
-d "postgres" \
-c "CREATE DATABASE $POSTGRES_DB OWNER $POSTGRES_USER;"
# Restore from backup
log_info "Restoring database from backup file..."
docker exec -i legalconsenthub-backend psql \
-U "$POSTGRES_USER" \
-d "$POSTGRES_DB" \
< "$POSTGRES_BACKUP"
log_success "PostgreSQL database restored from: $POSTGRES_BACKUP"
}
# Show usage information
show_usage() {
echo "Database Management Script"
echo ""
echo "Usage: $0 [COMMAND]"
echo ""
echo "Commands:"
echo " backup Create backups of current databases"
echo " restore Restore databases from backups"
echo " backup-sqlite Create backup of SQLite database only"
echo " backup-postgres Create backup of PostgreSQL database only"
echo " restore-sqlite Restore SQLite database from backup only"
echo " restore-postgres Restore PostgreSQL database from backup only"
echo " status Show current status"
echo " help Show this help message"
echo ""
echo "Note: PostgreSQL operations require the 'legalconsenthub-backend' container to be running."
echo ""
echo "Examples:"
echo " $0 backup # Create backups of both databases"
echo " $0 restore # Restore both databases from backups"
echo " $0 backup-sqlite # Backup only SQLite database"
echo " $0 status # Check database status"
}
# Show current status
show_status() {
log_info "Database Status:"
echo ""
# SQLite status
echo "SQLite Database:"
if [ -f "$SQLITE_DB" ]; then
local size=$(du -h "$SQLITE_DB" | cut -f1)
local modified=$(stat -c "%y" "$SQLITE_DB" 2>/dev/null || stat -f "%Sm" "$SQLITE_DB" 2>/dev/null || echo "Unknown")
echo " Current DB: ✅ $SQLITE_DB ($size, modified: $modified)"
else
echo " Current DB: ❌ Not found"
fi
if [ -f "$SQLITE_BACKUP" ]; then
local backup_size=$(du -h "$SQLITE_BACKUP" | cut -f1)
local backup_modified=$(stat -c "%y" "$SQLITE_BACKUP" 2>/dev/null || stat -f "%Sm" "$SQLITE_BACKUP" 2>/dev/null || echo "Unknown")
echo " Backup: ✅ $SQLITE_BACKUP ($backup_size, modified: $backup_modified)"
else
echo " Backup: ❌ Not found"
fi
echo ""
# PostgreSQL status
echo "PostgreSQL Database:"
if check_postgres; then
echo " Container: ✅ legalconsenthub-backend (Running)"
local db_size=$(docker exec legalconsenthub-backend psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -t -c "SELECT pg_size_pretty(pg_database_size('$POSTGRES_DB'));" 2>/dev/null | xargs || echo "Unknown")
echo " Database: ✅ $POSTGRES_DB ($db_size)"
else
echo " Container: ❌ legalconsenthub-backend (Not running or not found)"
echo " Database: ❓ Cannot check (container not available)"
fi
if [ -f "$POSTGRES_BACKUP" ]; then
local backup_size=$(du -h "$POSTGRES_BACKUP" | cut -f1)
local backup_modified=$(stat -c "%y" "$POSTGRES_BACKUP" 2>/dev/null || stat -f "%Sm" "$POSTGRES_BACKUP" 2>/dev/null || echo "Unknown")
echo " Backup: ✅ $POSTGRES_BACKUP ($backup_size, modified: $backup_modified)"
else
echo " Backup: ❌ Not found"
fi
}
# Main script logic
main() {
case "${1:-help}" in
"backup")
log_info "Creating backups of both databases..."
backup_sqlite
backup_postgres
log_success "All backups completed successfully!"
;;
"restore")
log_info "Restoring both databases from backups..."
restore_sqlite
restore_postgres
log_success "All databases restored successfully!"
;;
"backup-sqlite")
backup_sqlite
;;
"backup-postgres")
backup_postgres
;;
"restore-sqlite")
restore_sqlite
;;
"restore-postgres")
restore_postgres
;;
"status")
show_status
;;
"help"|"-h"|"--help")
show_usage
;;
*)
log_error "Unknown command: $1"
echo ""
show_usage
exit 1
;;
esac
}
# Check for required tools
check_dependencies() {
local missing_tools=()
# Check for Docker
if ! command -v docker &> /dev/null; then
missing_tools+=("docker")
fi
if [ ${#missing_tools[@]} -gt 0 ]; then
log_error "Missing required tools:"
for tool in "${missing_tools[@]}"; do
echo " - $tool"
done
echo ""
echo "Please install the missing tools and try again."
exit 1
fi
}
# Run dependency check and main function
check_dependencies
main "$@"