Improve the frontend 3
This commit is contained in:
@@ -1,9 +1,12 @@
|
||||
"""
|
||||
Enhanced Base Database Configuration for All Microservices
|
||||
Provides DatabaseManager with connection pooling, health checks, and multi-database support
|
||||
|
||||
Fixed: SSL configuration now uses connect_args instead of URL parameters to avoid asyncpg parameter parsing issues
|
||||
"""
|
||||
|
||||
import os
|
||||
import ssl
|
||||
from typing import Optional, Dict, Any, List
|
||||
from sqlalchemy import create_engine, text
|
||||
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
|
||||
@@ -43,14 +46,17 @@ class DatabaseManager:
|
||||
connect_timeout: int = 30,
|
||||
**engine_kwargs
|
||||
):
|
||||
# Add SSL parameters to database URL if PostgreSQL
|
||||
if "postgresql" in database_url.lower() and "ssl" not in database_url.lower():
|
||||
separator = "&" if "?" in database_url else "?"
|
||||
# asyncpg uses 'ssl=require' or 'ssl=verify-full', not 'sslmode'
|
||||
database_url = f"{database_url}{separator}ssl=require"
|
||||
logger.info(f"SSL enforcement added to database URL for {service_name}")
|
||||
|
||||
self.database_url = database_url
|
||||
|
||||
# Configure SSL for PostgreSQL via connect_args instead of URL parameters
|
||||
# This avoids asyncpg parameter parsing issues
|
||||
self.use_ssl = False
|
||||
if "postgresql" in database_url.lower():
|
||||
# Check if SSL is already configured in URL or should be enabled
|
||||
if "ssl" not in database_url.lower() and "sslmode" not in database_url.lower():
|
||||
# Enable SSL for production, but allow override via URL
|
||||
self.use_ssl = True
|
||||
logger.info(f"SSL will be enabled for PostgreSQL connection: {service_name}")
|
||||
self.service_name = service_name
|
||||
self.pool_size = pool_size
|
||||
self.max_overflow = max_overflow
|
||||
@@ -58,13 +64,27 @@ class DatabaseManager:
|
||||
# Configure pool for async engines
|
||||
# Note: SQLAlchemy 2.0 async engines automatically use AsyncAdaptedQueuePool
|
||||
# We should NOT specify poolclass for async engines unless using StaticPool for SQLite
|
||||
|
||||
# Prepare connect_args for asyncpg
|
||||
connect_args = {"timeout": connect_timeout}
|
||||
|
||||
# Add SSL configuration if needed (for asyncpg driver)
|
||||
if self.use_ssl and "asyncpg" in database_url.lower():
|
||||
# Create SSL context that doesn't verify certificates (for local development)
|
||||
# In production, you should use a proper SSL context with certificate verification
|
||||
ssl_context = ssl.create_default_context()
|
||||
ssl_context.check_hostname = False
|
||||
ssl_context.verify_mode = ssl.CERT_NONE
|
||||
connect_args["ssl"] = ssl_context
|
||||
logger.info(f"SSL enabled with relaxed verification for {service_name}")
|
||||
|
||||
engine_config = {
|
||||
"echo": echo,
|
||||
"pool_pre_ping": pool_pre_ping,
|
||||
"pool_recycle": pool_recycle,
|
||||
"pool_size": pool_size,
|
||||
"max_overflow": max_overflow,
|
||||
"connect_args": {"command_timeout": connect_timeout},
|
||||
"connect_args": connect_args,
|
||||
**engine_kwargs
|
||||
}
|
||||
|
||||
@@ -342,12 +362,16 @@ def init_legacy_compatibility(database_url: str):
|
||||
"""Initialize legacy global variables for backward compatibility"""
|
||||
global engine, AsyncSessionLocal
|
||||
|
||||
# Add SSL parameters to database URL if PostgreSQL
|
||||
if "postgresql" in database_url.lower() and "ssl" not in database_url.lower():
|
||||
separator = "&" if "?" in database_url else "?"
|
||||
# asyncpg uses 'ssl=require' or 'ssl=verify-full', not 'sslmode'
|
||||
database_url = f"{database_url}{separator}ssl=require"
|
||||
logger.info("SSL enforcement added to legacy database URL")
|
||||
# Configure SSL for PostgreSQL if needed
|
||||
connect_args = {}
|
||||
if "postgresql" in database_url.lower() and "asyncpg" in database_url.lower():
|
||||
if "ssl" not in database_url.lower() and "sslmode" not in database_url.lower():
|
||||
# Create SSL context that doesn't verify certificates (for local development)
|
||||
ssl_context = ssl.create_default_context()
|
||||
ssl_context.check_hostname = False
|
||||
ssl_context.verify_mode = ssl.CERT_NONE
|
||||
connect_args["ssl"] = ssl_context
|
||||
logger.info("SSL enabled with relaxed verification for legacy database connection")
|
||||
|
||||
engine = create_async_engine(
|
||||
database_url,
|
||||
@@ -355,7 +379,8 @@ def init_legacy_compatibility(database_url: str):
|
||||
pool_pre_ping=True,
|
||||
pool_recycle=300,
|
||||
pool_size=20,
|
||||
max_overflow=30
|
||||
max_overflow=30,
|
||||
connect_args=connect_args
|
||||
)
|
||||
|
||||
AsyncSessionLocal = async_sessionmaker(
|
||||
|
||||
Reference in New Issue
Block a user