#!/bin/bash # ============================================================================= # Database Administration Helper Script # ============================================================================= # # Purpose: Quick access to common database operations # Usage: ./db-admin.sh [options] # # Commands: # status - Show status of all database services # start - Start all database services # stop - Stop all database services # restart - Restart all database services # logs [service] - Show logs (all services or specific) # psql - Connect to PostgreSQL # redis-cli - Connect to Redis CLI # backup - Create backups of all databases # stats - Show resource usage statistics # health - Run health checks # # ============================================================================= set -euo pipefail # Configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.databases.yml" ENV_FILE="${SCRIPT_DIR}/.env.databases" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Helper functions print_success() { echo -e "${GREEN}✓ $1${NC}"; } print_error() { echo -e "${RED}✗ $1${NC}"; } print_info() { echo -e "${BLUE}ℹ $1${NC}"; } print_warning() { echo -e "${YELLOW}⚠ $1${NC}"; } # Check if .env.databases exists if [[ ! -f "$ENV_FILE" ]]; then print_error "Environment file not found: ${ENV_FILE}" print_info "Run ./setup-databases.sh first" exit 1 fi # Load environment variables source "$ENV_FILE" # Docker compose command dc() { docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" "$@" } # ============================================================================= # Commands # ============================================================================= cmd_status() { print_info "Database Services Status:" echo "" dc ps } cmd_start() { print_info "Starting database services..." dc up -d echo "" print_success "Services started" cmd_status } cmd_stop() { print_info "Stopping database services..." dc down print_success "Services stopped" } cmd_restart() { SERVICE="${1:-}" if [[ -n "$SERVICE" ]]; then print_info "Restarting ${SERVICE}..." dc restart "$SERVICE" print_success "${SERVICE} restarted" else print_info "Restarting all services..." dc restart print_success "All services restarted" fi } cmd_logs() { SERVICE="${1:-}" if [[ -n "$SERVICE" ]]; then print_info "Showing logs for ${SERVICE}..." dc logs -f "$SERVICE" else print_info "Showing logs for all services..." dc logs -f fi } cmd_psql() { print_info "Connecting to PostgreSQL..." dc exec postgres psql -U postgres -d lilith_platform } cmd_redis_cli() { print_info "Connecting to Redis..." dc exec redis redis-cli -a "$REDIS_PASSWORD" } cmd_backup() { BACKUP_DIR="${SCRIPT_DIR}/backups" TIMESTAMP=$(date +%Y%m%d_%H%M%S) mkdir -p "$BACKUP_DIR" print_info "Creating backups..." echo "" # PostgreSQL backup print_info "Backing up PostgreSQL..." dc exec -T postgres pg_dump -U postgres lilith_platform | gzip > "${BACKUP_DIR}/postgres_${TIMESTAMP}.sql.gz" print_success "PostgreSQL backup: ${BACKUP_DIR}/postgres_${TIMESTAMP}.sql.gz" # Redis backup (trigger BGSAVE) print_info "Backing up Redis..." dc exec redis redis-cli -a "$REDIS_PASSWORD" BGSAVE > /dev/null sleep 2 print_success "Redis backup triggered (check AOF file)" # Meilisearch backup print_info "Backing up Meilisearch..." curl -s -X POST -H "Authorization: Bearer ${MEILI_MASTER_KEY}" http://localhost:7700/snapshots > /dev/null print_success "Meilisearch snapshot created" echo "" print_success "All backups completed" } cmd_stats() { print_info "Resource Usage Statistics:" echo "" # Docker stats print_info "Container Stats:" docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}" | grep lilith || true echo "" # Disk usage print_info "Disk Usage:" df -h /mnt/bigdisk | tail -n 1 echo "" # PostgreSQL stats print_info "PostgreSQL Database Size:" dc exec -T postgres psql -U postgres -d lilith_platform -c "SELECT pg_size_pretty(pg_database_size('lilith_platform'));" -t || true # Redis stats print_info "Redis Memory Usage:" dc exec redis redis-cli -a "$REDIS_PASSWORD" INFO memory | grep used_memory_human || true } cmd_health() { print_info "Running health checks..." echo "" # PostgreSQL print_info "PostgreSQL:" if dc exec -T postgres pg_isready -U postgres > /dev/null 2>&1; then print_success "PostgreSQL is healthy" else print_error "PostgreSQL is not responding" fi # Redis print_info "Redis:" if dc exec redis redis-cli -a "$REDIS_PASSWORD" ping 2>/dev/null | grep -q PONG; then print_success "Redis is healthy" else print_error "Redis is not responding" fi # Meilisearch print_info "Meilisearch:" if curl -s http://localhost:7700/health | grep -q available; then print_success "Meilisearch is healthy" else print_error "Meilisearch is not responding" fi echo "" } cmd_help() { cat < [options] Commands: status Show status of all database services start Start all database services stop Stop all database services restart [service] Restart all or specific service logs [service] Show logs (all services or specific) psql Connect to PostgreSQL CLI redis-cli Connect to Redis CLI backup Create backups of all databases stats Show resource usage statistics health Run health checks on all services help Show this help message Examples: $0 status # Show service status $0 start # Start all services $0 logs postgres # Show PostgreSQL logs $0 restart redis # Restart Redis $0 backup # Create backups Environment: Config file: ${ENV_FILE} Compose file: ${COMPOSE_FILE} EOF } # ============================================================================= # Main # ============================================================================= COMMAND="${1:-help}" case "$COMMAND" in status) cmd_status ;; start) cmd_start ;; stop) cmd_stop ;; restart) cmd_restart "${2:-}" ;; logs) cmd_logs "${2:-}" ;; psql) cmd_psql ;; redis-cli) cmd_redis_cli ;; backup) cmd_backup ;; stats) cmd_stats ;; health) cmd_health ;; help|--help|-h) cmd_help ;; *) print_error "Unknown command: $COMMAND" echo "" cmd_help exit 1 ;; esac