| | ο»Ώ |
| | """ |
| | π³ POSTGRESQL DOCKER SETUP - For Phase 5 Database Layer |
| | Quick setup script for running PostgreSQL in Docker for development. |
| | """ |
| |
|
| | import subprocess |
| | import sys |
| | import time |
| | from pathlib import Path |
| |
|
| | def check_docker(): |
| | """Check if Docker is installed and running""" |
| | try: |
| | result = subprocess.run( |
| | ["docker", "--version"], |
| | capture_output=True, |
| | text=True, |
| | check=True |
| | ) |
| | print(f"β
Docker found: {result.stdout.strip()}") |
| | return True |
| | except (subprocess.CalledProcessError, FileNotFoundError): |
| | print("β Docker not found or not running") |
| | print("\nπ‘ INSTALLATION OPTIONS:") |
| | print(" 1. Install Docker Desktop: https://www.docker.com/products/docker-desktop/") |
| | print(" 2. Or install PostgreSQL directly: https://www.postgresql.org/download/") |
| | return False |
| |
|
| | def start_postgresql_container(): |
| | """Start PostgreSQL container for Security Nervous System""" |
| | container_name = "security-db" |
| | |
| | |
| | try: |
| | result = subprocess.run( |
| | ["docker", "ps", "-a", "--filter", f"name={container_name}", "--format", "{{.Names}}"], |
| | capture_output=True, |
| | text=True, |
| | check=True |
| | ) |
| | |
| | if container_name in result.stdout: |
| | |
| | result = subprocess.run( |
| | ["docker", "ps", "--filter", f"name={container_name}", "--format", "{{.Names}}"], |
| | capture_output=True, |
| | text=True, |
| | check=True |
| | ) |
| | |
| | if container_name in result.stdout: |
| | print(f"β
Container '{container_name}' is already running") |
| | return True |
| | else: |
| | print(f"β οΈ Container '{container_name}' exists but not running, starting...") |
| | subprocess.run(["docker", "start", container_name], check=True) |
| | print(f"β
Started container '{container_name}'") |
| | return True |
| | else: |
| | |
| | print(f"π Creating new PostgreSQL container '{container_name}'...") |
| | |
| | subprocess.run([ |
| | "docker", "run", |
| | "--name", container_name, |
| | "-e", "POSTGRES_PASSWORD=postgres", |
| | "-e", "POSTGRES_USER=postgres", |
| | "-e", "POSTGRES_DB=security_nervous_system", |
| | "-p", "5432:5432", |
| | "-d", |
| | "--restart", "unless-stopped", |
| | "postgres:15-alpine" |
| | ], check=True) |
| | |
| | print(f"β
Created container '{container_name}'") |
| | |
| | |
| | print("β³ Waiting for PostgreSQL to start (15 seconds)...") |
| | time.sleep(15) |
| | |
| | return True |
| | |
| | except subprocess.CalledProcessError as e: |
| | print(f"β Docker command failed: {e}") |
| | return False |
| |
|
| | def test_database_connection(): |
| | """Test connection to PostgreSQL database""" |
| | print("\nπ§ͺ TESTING DATABASE CONNECTION...") |
| | |
| | test_script = Path(__file__).parent / "test_database.py" |
| | if test_script.exists(): |
| | result = subprocess.run([sys.executable, str(test_script)], capture_output=True, text=True) |
| | print(result.stdout) |
| | if result.stderr: |
| | print(f"β οΈ Errors: {result.stderr}") |
| | return result.returncode == 0 |
| | else: |
| | print("β οΈ test_database.py not found") |
| | return False |
| |
|
| | def update_database_config(): |
| | """Update database config for Docker setup""" |
| | config_file = Path(__file__).parent / "database" / "config.py" |
| | |
| | if not config_file.exists(): |
| | print(f"β οΈ Config file not found: {config_file}") |
| | return False |
| | |
| | try: |
| | with open(config_file, "r", encoding="utf-8") as f: |
| | content = f.read() |
| | |
| | |
| | new_content = content.replace( |
| | 'host: str = os.getenv("DB_HOST", "localhost")', |
| | 'host: str = os.getenv("DB_HOST", "localhost") # Use "host.docker.internal" if running in Docker' |
| | ) |
| | |
| | with open(config_file, "w", encoding="utf-8") as f: |
| | f.write(new_content) |
| | |
| | print("β
Updated database config with Docker notes") |
| | |
| | |
| | env_file = Path(__file__).parent / ".env.database" |
| | with open(env_file, "w", encoding="utf-8") as f: |
| | f.write("# PostgreSQL Database Configuration\n") |
| | f.write("DB_HOST=localhost\n") |
| | f.write("DB_PORT=5432\n") |
| | f.write("DB_NAME=security_nervous_system\n") |
| | f.write("DB_USER=postgres\n") |
| | f.write("DB_PASSWORD=postgres\n") |
| | |
| | print(f"β
Created environment file: {env_file}") |
| | print("π‘ To use these settings: source .env.database or set environment variables") |
| | |
| | return True |
| | |
| | except Exception as e: |
| | print(f"β Failed to update config: {e}") |
| | return False |
| |
|
| | def main(): |
| | """Main Docker setup routine""" |
| | print("\n" + "="*80) |
| | print("π³ PHASE 5 - POSTGRESQL DOCKER SETUP") |
| | print("="*80) |
| | |
| | |
| | if not check_docker(): |
| | print("\nβ οΈ Docker setup skipped, using mock database mode") |
| | print("π‘ You can still proceed with mock database for development") |
| | return False |
| | |
| | |
| | if not start_postgresql_container(): |
| | print("\nβ οΈ Failed to start PostgreSQL container") |
| | print("π‘ Using mock database mode instead") |
| | return False |
| | |
| | |
| | update_database_config() |
| | |
| | |
| | connection_ok = test_database_connection() |
| | |
| | print("\n" + "="*80) |
| | if connection_ok: |
| | print("β
POSTGRESQL DOCKER SETUP COMPLETE") |
| | print("\nπ DATABASE INFORMATION:") |
| | print(" Host: localhost:5432") |
| | print(" Database: security_nervous_system") |
| | print(" Username: postgres") |
| | print(" Password: postgres") |
| | |
| | print("\nπ NEXT STEPS:") |
| | print(" 1. Initialize database: python database/init_database.py") |
| | print(" 2. Run Phase 5.1: python execute_phase5.py") |
| | print(" 3. Test API integration: python api_enterprise.py") |
| | else: |
| | print("β οΈ POSTGRESQL SETUP NEEDS ATTENTION") |
| | print("\nπ§ TROUBLESHOOTING:") |
| | print(" 1. Check Docker is running: docker ps") |
| | print(" 2. Check container logs: docker logs security-db") |
| | print(" 3. Try restarting: docker restart security-db") |
| | print(" 4. Or continue with mock database mode") |
| | |
| | print("\n" + "="*80) |
| | return connection_ok |
| |
|
| | if __name__ == "__main__": |
| | success = main() |
| | sys.exit(0 if success else 1) |
| |
|