Harden database startup for Portainer

This commit is contained in:
masterdev
2026-06-16 22:34:07 +01:00
parent 038570646c
commit 6bee04a8e1
5 changed files with 51 additions and 4 deletions

View File

@@ -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)