diff --git a/README.md b/README.md index cb9abda..14e4bb6 100644 --- a/README.md +++ b/README.md @@ -83,16 +83,39 @@ kpi_definitions → daily_metrics → trend_analysis ### Prerequisites - Docker and Docker Compose +- PostgreSQL client (psql) - 8GB RAM minimum - 20GB disk space +**🔧 Don't have the prerequisites?** Run the automatic installer: +```bash +chmod +x scripts/install-dependencies.sh +./scripts/install-dependencies.sh +``` + +This will automatically install: +- ✅ PostgreSQL client (psql) +- ✅ Docker & Docker Compose +- ✅ Required utilities (curl, wget, git) + +**Supported OS:** Ubuntu, Debian, CentOS, RHEL, Fedora, Arch Linux, macOS + +--- + ### 1. Clone the Repository ```bash -git clone https://github.com/yourusername/SQL.git +git clone https://github.com/freedbygrace/SQL.git cd SQL ``` -### 2. Start the Database +### 2. Install Dependencies (Optional) +```bash +# Only if you don't have Docker, psql, etc. +chmod +x scripts/install-dependencies.sh +./scripts/install-dependencies.sh +``` + +### 3. Start the Database ```bash docker-compose up -d ``` @@ -101,13 +124,15 @@ This starts: - **PostgreSQL 16** on port `5432` - **DB-UI** web interface on port `3000` -### 3. Initialize the Schema +### 4. Initialize the Schema ```bash chmod +x scripts/setup-database.sh ./scripts/setup-database.sh ``` -### 4. Generate Test Data +**Note:** The script will automatically check for required dependencies and prompt you to install them if missing. + +### 5. Generate Test Data ```bash chmod +x data/generate_data.sh ./data/generate_data.sh @@ -115,7 +140,7 @@ chmod +x data/generate_data.sh ⏱️ **Note:** Data generation takes 15-30 minutes depending on your system. -### 5. Access the Database +### 6. Access the Database **Option A: DB-UI Web Interface** ``` diff --git a/data/generate_data.sh b/data/generate_data.sh index 57b24e8..3196bf6 100644 --- a/data/generate_data.sh +++ b/data/generate_data.sh @@ -32,6 +32,10 @@ NUM_CARDS=200000 NUM_TRANSACTIONS=5000000 FRAUD_PERCENTAGE=7 # 7% of transactions will be fraudulent +# Script directory +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + echo -e "${BLUE}============================================================================${NC}" echo -e "${BLUE}Business Analytics Database - Data Generation${NC}" echo -e "${BLUE}============================================================================${NC}" @@ -43,6 +47,49 @@ echo -e "Cards: ${GREEN}$NUM_CARDS${NC}" echo -e "Transactions: ${GREEN}$NUM_TRANSACTIONS${NC} (${YELLOW}${FRAUD_PERCENTAGE}% fraudulent${NC})" echo -e "${BLUE}============================================================================${NC}" echo "" + +# Check for required dependencies +check_dependencies() { + local missing_deps=() + + # Check for psql + if ! command -v psql >/dev/null 2>&1; then + missing_deps+=("psql (PostgreSQL client)") + fi + + if [ ${#missing_deps[@]} -gt 0 ]; then + echo -e "${RED}✗ Missing required dependencies:${NC}" + for dep in "${missing_deps[@]}"; do + echo -e " - ${YELLOW}$dep${NC}" + done + echo "" + echo -e "${YELLOW}Would you like to run the dependency installer? (y/n)${NC}" + read -r response + if [[ "$response" =~ ^[Yy]$ ]]; then + if [ -f "$PROJECT_ROOT/scripts/install-dependencies.sh" ]; then + chmod +x "$PROJECT_ROOT/scripts/install-dependencies.sh" + "$PROJECT_ROOT/scripts/install-dependencies.sh" + echo "" + echo -e "${GREEN}Dependencies installed. Please re-run this script.${NC}" + exit 0 + else + echo -e "${RED}✗ install-dependencies.sh not found${NC}" + echo -e "${YELLOW}Please install PostgreSQL client manually${NC}" + exit 1 + fi + else + echo -e "${RED}✗ Cannot proceed without required dependencies${NC}" + exit 1 + fi + fi + + echo -e "${GREEN}✓ All required dependencies are installed${NC}" + echo "" +} + +# Run dependency check +check_dependencies + echo -e "${RED}WARNING: This will DELETE all existing data and regenerate it!${NC}" echo -e "${YELLOW}Press Ctrl+C within 5 seconds to cancel...${NC}" sleep 5 diff --git a/docs/QUICKSTART.md b/docs/QUICKSTART.md index 2f83d9a..0a0bd55 100644 --- a/docs/QUICKSTART.md +++ b/docs/QUICKSTART.md @@ -2,6 +2,29 @@ ## 🚀 Get Up and Running in 5 Minutes +### Step 0: Install Dependencies (Optional - 5 minutes) + +**If you don't have Docker, PostgreSQL client (psql), or other required tools:** + +```bash +# Make script executable +chmod +x scripts/install-dependencies.sh + +# Run the installer +./scripts/install-dependencies.sh +``` + +**What this installs:** +- PostgreSQL client (psql) +- Docker & Docker Compose +- Utility packages (curl, wget, git) + +**Supported OS:** Ubuntu, Debian, CentOS, RHEL, Fedora, Arch Linux, macOS + +**Note:** All other scripts will automatically check for dependencies and prompt you to install them if missing. + +--- + ### Step 1: Start Docker Containers (1 minute) ```bash diff --git a/scripts/install-dependencies.sh b/scripts/install-dependencies.sh new file mode 100644 index 0000000..1c974e2 --- /dev/null +++ b/scripts/install-dependencies.sh @@ -0,0 +1,297 @@ +#!/bin/bash + +# ============================================================================ +# Dependency Installation Script +# ============================================================================ +# Automatically detects OS and installs required packages: +# - PostgreSQL client (psql) +# - Docker & Docker Compose +# - curl, wget, git (if missing) +# ============================================================================ + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +echo -e "${BLUE}============================================================================${NC}" +echo -e "${BLUE}Business Analytics Database - Dependency Installer${NC}" +echo -e "${BLUE}============================================================================${NC}" +echo "" + +# Detect OS +detect_os() { + if [[ "$OSTYPE" == "linux-gnu"* ]]; then + if [ -f /etc/os-release ]; then + . /etc/os-release + OS=$ID + VER=$VERSION_ID + else + OS="unknown" + fi + elif [[ "$OSTYPE" == "darwin"* ]]; then + OS="macos" + elif [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]]; then + OS="windows" + else + OS="unknown" + fi + + echo -e "${BLUE}Detected OS: ${GREEN}$OS${NC}" +} + +# Check if command exists +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# Install PostgreSQL client +install_psql() { + echo -e "\n${YELLOW}[1/4] Checking PostgreSQL client (psql)...${NC}" + + if command_exists psql; then + PSQL_VERSION=$(psql --version | awk '{print $3}') + echo -e "${GREEN}✓ psql is already installed (version $PSQL_VERSION)${NC}" + return 0 + fi + + echo -e "${YELLOW}Installing PostgreSQL client...${NC}" + + case $OS in + ubuntu|debian) + sudo apt-get update + sudo apt-get install -y postgresql-client + ;; + centos|rhel|fedora) + sudo yum install -y postgresql + ;; + arch) + sudo pacman -S --noconfirm postgresql-libs + ;; + macos) + if command_exists brew; then + brew install postgresql + else + echo -e "${RED}✗ Homebrew not found. Please install Homebrew first: https://brew.sh${NC}" + exit 1 + fi + ;; + windows) + echo -e "${YELLOW}On Windows, please install PostgreSQL client manually:${NC}" + echo -e " 1. Download from: https://www.postgresql.org/download/windows/" + echo -e " 2. Or use WSL2 with Ubuntu" + echo -e " 3. Or use Docker Desktop (includes psql in containers)" + exit 1 + ;; + *) + echo -e "${RED}✗ Unsupported OS. Please install PostgreSQL client manually.${NC}" + exit 1 + ;; + esac + + if command_exists psql; then + echo -e "${GREEN}✓ PostgreSQL client installed successfully${NC}" + else + echo -e "${RED}✗ Failed to install PostgreSQL client${NC}" + exit 1 + fi +} + +# Install Docker +install_docker() { + echo -e "\n${YELLOW}[2/4] Checking Docker...${NC}" + + if command_exists docker; then + DOCKER_VERSION=$(docker --version | awk '{print $3}' | sed 's/,//') + echo -e "${GREEN}✓ Docker is already installed (version $DOCKER_VERSION)${NC}" + + # Check if Docker daemon is running + if docker ps >/dev/null 2>&1; then + echo -e "${GREEN}✓ Docker daemon is running${NC}" + else + echo -e "${YELLOW}⚠ Docker is installed but daemon is not running${NC}" + echo -e "${YELLOW} Please start Docker and try again${NC}" + fi + return 0 + fi + + echo -e "${YELLOW}Installing Docker...${NC}" + + case $OS in + ubuntu|debian) + # Install Docker using official script + curl -fsSL https://get.docker.com -o /tmp/get-docker.sh + sudo sh /tmp/get-docker.sh + sudo usermod -aG docker $USER + echo -e "${YELLOW}⚠ You may need to log out and back in for Docker group membership to take effect${NC}" + ;; + centos|rhel|fedora) + sudo yum install -y yum-utils + sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + sudo yum install -y docker-ce docker-ce-cli containerd.io + sudo systemctl start docker + sudo systemctl enable docker + sudo usermod -aG docker $USER + ;; + macos) + echo -e "${YELLOW}On macOS, please install Docker Desktop manually:${NC}" + echo -e " Download from: https://www.docker.com/products/docker-desktop" + exit 1 + ;; + windows) + echo -e "${YELLOW}On Windows, please install Docker Desktop manually:${NC}" + echo -e " Download from: https://www.docker.com/products/docker-desktop" + exit 1 + ;; + *) + echo -e "${RED}✗ Unsupported OS for automatic Docker installation${NC}" + exit 1 + ;; + esac + + if command_exists docker; then + echo -e "${GREEN}✓ Docker installed successfully${NC}" + else + echo -e "${RED}✗ Failed to install Docker${NC}" + exit 1 + fi +} + +# Install Docker Compose +install_docker_compose() { + echo -e "\n${YELLOW}[3/4] Checking Docker Compose...${NC}" + + # Check for docker-compose (standalone) or docker compose (plugin) + if command_exists docker-compose || docker compose version >/dev/null 2>&1; then + if command_exists docker-compose; then + COMPOSE_VERSION=$(docker-compose --version | awk '{print $3}' | sed 's/,//') + else + COMPOSE_VERSION=$(docker compose version --short) + fi + echo -e "${GREEN}✓ Docker Compose is already installed (version $COMPOSE_VERSION)${NC}" + return 0 + fi + + echo -e "${YELLOW}Installing Docker Compose...${NC}" + + case $OS in + ubuntu|debian|centos|rhel|fedora) + # Install Docker Compose plugin + COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4) + sudo curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + ;; + macos) + echo -e "${GREEN}✓ Docker Compose is included with Docker Desktop${NC}" + return 0 + ;; + windows) + echo -e "${GREEN}✓ Docker Compose is included with Docker Desktop${NC}" + return 0 + ;; + *) + echo -e "${RED}✗ Unsupported OS for automatic Docker Compose installation${NC}" + exit 1 + ;; + esac + + if command_exists docker-compose; then + echo -e "${GREEN}✓ Docker Compose installed successfully${NC}" + else + echo -e "${RED}✗ Failed to install Docker Compose${NC}" + exit 1 + fi +} + +# Install utility packages +install_utilities() { + echo -e "\n${YELLOW}[4/4] Checking utility packages...${NC}" + + local missing_packages=() + + # Check for required utilities + if ! command_exists curl; then + missing_packages+=("curl") + fi + + if ! command_exists wget; then + missing_packages+=("wget") + fi + + if ! command_exists git; then + missing_packages+=("git") + fi + + if [ ${#missing_packages[@]} -eq 0 ]; then + echo -e "${GREEN}✓ All utility packages are installed${NC}" + return 0 + fi + + echo -e "${YELLOW}Installing missing utilities: ${missing_packages[*]}${NC}" + + case $OS in + ubuntu|debian) + sudo apt-get update + sudo apt-get install -y "${missing_packages[@]}" + ;; + centos|rhel|fedora) + sudo yum install -y "${missing_packages[@]}" + ;; + arch) + sudo pacman -S --noconfirm "${missing_packages[@]}" + ;; + macos) + if command_exists brew; then + brew install "${missing_packages[@]}" + else + echo -e "${YELLOW}⚠ Some utilities are missing but Homebrew is not installed${NC}" + fi + ;; + *) + echo -e "${YELLOW}⚠ Cannot automatically install utilities on this OS${NC}" + ;; + esac + + echo -e "${GREEN}✓ Utility packages installed${NC}" +} + +# Main installation flow +main() { + detect_os + + echo -e "\n${BLUE}Starting dependency installation...${NC}" + echo -e "${YELLOW}This script will install:${NC}" + echo -e " - PostgreSQL client (psql)" + echo -e " - Docker" + echo -e " - Docker Compose" + echo -e " - Utility packages (curl, wget, git)" + echo "" + echo -e "${YELLOW}Some installations may require sudo privileges.${NC}" + echo -e "${YELLOW}Press Ctrl+C to cancel, or wait 5 seconds to continue...${NC}" + sleep 5 + echo "" + + install_psql + install_docker + install_docker_compose + install_utilities + + echo -e "\n${BLUE}============================================================================${NC}" + echo -e "${GREEN}✓ All dependencies installed successfully!${NC}" + echo -e "${BLUE}============================================================================${NC}" + echo "" + echo -e "${YELLOW}Next steps:${NC}" + echo -e " 1. If Docker was just installed, you may need to log out and back in" + echo -e " 2. Start Docker if it's not running" + echo -e " 3. Run: ${GREEN}docker-compose up -d${NC}" + echo -e " 4. Run: ${GREEN}./scripts/setup-database.sh${NC}" + echo -e " 5. Run: ${GREEN}./data/generate_data.sh${NC}" + echo "" +} + +main + diff --git a/scripts/setup-database.sh b/scripts/setup-database.sh index f7f9534..2cbcf95 100644 --- a/scripts/setup-database.sh +++ b/scripts/setup-database.sh @@ -36,6 +36,61 @@ echo -e "User: ${GREEN}$DB_USER${NC}" echo -e "${BLUE}============================================================================${NC}" echo "" +# Check for required dependencies +check_dependencies() { + local missing_deps=() + + # Check for psql + if ! command -v psql >/dev/null 2>&1; then + missing_deps+=("psql (PostgreSQL client)") + fi + + # Check for docker + if ! command -v docker >/dev/null 2>&1; then + missing_deps+=("docker") + fi + + # Check for docker-compose or docker compose + if ! command -v docker-compose >/dev/null 2>&1 && ! docker compose version >/dev/null 2>&1; then + missing_deps+=("docker-compose") + fi + + if [ ${#missing_deps[@]} -gt 0 ]; then + echo -e "${RED}✗ Missing required dependencies:${NC}" + for dep in "${missing_deps[@]}"; do + echo -e " - ${YELLOW}$dep${NC}" + done + echo "" + echo -e "${YELLOW}Would you like to run the dependency installer? (y/n)${NC}" + read -r response + if [[ "$response" =~ ^[Yy]$ ]]; then + if [ -f "$SCRIPT_DIR/install-dependencies.sh" ]; then + chmod +x "$SCRIPT_DIR/install-dependencies.sh" + "$SCRIPT_DIR/install-dependencies.sh" + echo "" + echo -e "${GREEN}Dependencies installed. Please re-run this script.${NC}" + exit 0 + else + echo -e "${RED}✗ install-dependencies.sh not found${NC}" + echo -e "${YELLOW}Please install the following manually:${NC}" + for dep in "${missing_deps[@]}"; do + echo -e " - $dep" + done + exit 1 + fi + else + echo -e "${RED}✗ Cannot proceed without required dependencies${NC}" + exit 1 + fi + fi + + echo -e "${GREEN}✓ All required dependencies are installed${NC}" + echo "" +} + +# Run dependency check +check_dependencies + # Function to execute SQL command execute_sql() { PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "$1" 2>&1 diff --git a/scripts/verify-setup.sh b/scripts/verify-setup.sh index 77a1851..47aae8d 100644 --- a/scripts/verify-setup.sh +++ b/scripts/verify-setup.sh @@ -22,11 +22,43 @@ DB_NAME="${POSTGRES_DB:-business_analytics}" DB_USER="${POSTGRES_USER:-data_analyst}" DB_PASSWORD="${POSTGRES_PASSWORD:-SecurePass123!}" +# Script directory +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + echo -e "${BLUE}============================================================================${NC}" echo -e "${BLUE}Business Analytics Database - Verification${NC}" echo -e "${BLUE}============================================================================${NC}" echo "" +# Check for required dependencies +check_dependencies() { + local missing_deps=() + + # Check for psql + if ! command -v psql >/dev/null 2>&1; then + missing_deps+=("psql (PostgreSQL client)") + fi + + # Check for docker + if ! command -v docker >/dev/null 2>&1; then + missing_deps+=("docker") + fi + + if [ ${#missing_deps[@]} -gt 0 ]; then + echo -e "${RED}✗ Missing required dependencies:${NC}" + for dep in "${missing_deps[@]}"; do + echo -e " - ${YELLOW}$dep${NC}" + done + echo "" + echo -e "${YELLOW}Run the dependency installer:${NC}" + echo -e " ${GREEN}./scripts/install-dependencies.sh${NC}" + exit 1 + fi +} + +# Run dependency check +check_dependencies + # Function to execute SQL and get result execute_sql() { PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -t -c "$1" 2>/dev/null | xargs