Harden database startup for Portainer
This commit is contained in:
@@ -6,7 +6,8 @@ from datetime import date, datetime, timezone
|
||||
|
||||
from fastapi import Depends, FastAPI, HTTPException, Query, WebSocket, WebSocketDisconnect
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from sqlalchemy import func, select
|
||||
from sqlalchemy import func, select, text
|
||||
from sqlalchemy.exc import OperationalError
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from .config import get_settings
|
||||
@@ -112,8 +113,23 @@ async def downtime_monitor() -> None:
|
||||
await asyncio.sleep(settings.downtime_check_interval_sec)
|
||||
|
||||
|
||||
async def wait_for_database() -> None:
|
||||
last_error: OperationalError | None = None
|
||||
for _ in range(settings.database_startup_retries):
|
||||
try:
|
||||
with engine.connect() as connection:
|
||||
connection.execute(text("SELECT 1"))
|
||||
return
|
||||
except OperationalError as error:
|
||||
last_error = error
|
||||
await asyncio.sleep(settings.database_startup_retry_delay_sec)
|
||||
if last_error is not None:
|
||||
raise last_error
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
await wait_for_database()
|
||||
Base.metadata.create_all(bind=engine)
|
||||
with SessionLocal() as session:
|
||||
seed_defaults(session)
|
||||
|
||||
Reference in New Issue
Block a user