🧱 refactor(bootstrap): separar init_db do startup
Extrai o bootstrap de banco e seed para uma rotina dedicada, mantendo init_db apenas como alias legado de compatibilidade para evitar quebra nos fluxos existentes. Remove o bootstrap automatico do startup do app HTTP e do container principal, deixando o processo de atendimento responsavel apenas por subir a aplicacao e nao por preparar schema ou popular dados. Alinha compose, exemplos de systemd, documentacao e testes para o novo fluxo explicito de bootstrap, com a suite completa validada em 211 testes.main
parent
a5b28182d9
commit
be4992f9c6
@ -0,0 +1,81 @@
|
||||
"""
|
||||
Rotina dedicada de bootstrap de banco de dados.
|
||||
Cria tabelas e executa seed inicial de forma explicita, fora do startup do app.
|
||||
"""
|
||||
|
||||
from app.core.settings import settings
|
||||
from app.db.database import Base, engine
|
||||
from app.db.mock_database import MockBase, mock_engine
|
||||
from app.db.models import Tool
|
||||
from app.db.mock_models import (
|
||||
ConversationTurn,
|
||||
Customer,
|
||||
Order,
|
||||
RentalContract,
|
||||
RentalFine,
|
||||
RentalPayment,
|
||||
RentalVehicle,
|
||||
ReviewSchedule,
|
||||
Vehicle,
|
||||
)
|
||||
from app.db.mock_seed import seed_mock_data
|
||||
from app.db.tool_seed import seed_tools
|
||||
|
||||
|
||||
def bootstrap_databases(
|
||||
*,
|
||||
run_tools_seed: bool | None = None,
|
||||
run_mock_seed: bool | None = None,
|
||||
) -> None:
|
||||
"""Cria tabelas e executa seed inicial em ambos os bancos."""
|
||||
print("Inicializando bancos...")
|
||||
failures: list[str] = []
|
||||
|
||||
should_seed_tools = settings.auto_seed_tools if run_tools_seed is None else bool(run_tools_seed)
|
||||
should_seed_mock = (
|
||||
settings.auto_seed_mock and settings.mock_seed_enabled
|
||||
if run_mock_seed is None
|
||||
else bool(run_mock_seed)
|
||||
)
|
||||
|
||||
try:
|
||||
print("Criando tabelas MySQL (tools)...")
|
||||
Base.metadata.create_all(bind=engine)
|
||||
if should_seed_tools:
|
||||
print("Populando tools iniciais...")
|
||||
seed_tools()
|
||||
else:
|
||||
print("Seed de tools desabilitada por configuracao.")
|
||||
print("MySQL tools OK.")
|
||||
except Exception as exc:
|
||||
print(f"Aviso: falha no MySQL (tools): {exc}")
|
||||
failures.append(f"tools={exc}")
|
||||
|
||||
try:
|
||||
print("Criando tabelas MySQL (dados ficticios)...")
|
||||
MockBase.metadata.create_all(bind=mock_engine)
|
||||
if should_seed_mock:
|
||||
print("Populando dados ficticios iniciais...")
|
||||
seed_mock_data()
|
||||
else:
|
||||
print("Seed mock desabilitada por configuracao.")
|
||||
print("MySQL mock OK.")
|
||||
except Exception as exc:
|
||||
print(f"Aviso: falha no MySQL mock: {exc}")
|
||||
failures.append(f"mock={exc}")
|
||||
|
||||
if failures:
|
||||
raise RuntimeError(
|
||||
"Falha ao inicializar bancos do orquestrador: " + " | ".join(failures)
|
||||
)
|
||||
|
||||
print("Bancos inicializados com sucesso!")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""Executa o bootstrap dedicado quando chamado via modulo."""
|
||||
bootstrap_databases()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=AI Orquestrador Database Bootstrap
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
User=vitor
|
||||
Group=vitor
|
||||
WorkingDirectory=/opt/orquestrador
|
||||
EnvironmentFile=/opt/orquestrador/.env.prod
|
||||
Environment=PATH=/opt/orquestrador/venv/bin
|
||||
ExecStart=/opt/orquestrador/venv/bin/python -m app.db.bootstrap
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
Loading…
Reference in New Issue