| |
| """ |
| 🐳 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) |
|
|