feat: F1 — panel admin web (FastAPI, solo 127.0.0.1, X-Admin-Token, SSH tunnel)
This commit is contained in:
28
main.py
28
main.py
@@ -10,6 +10,7 @@ import asyncio
|
||||
import os
|
||||
import signal
|
||||
import sys
|
||||
import threading
|
||||
|
||||
import structlog
|
||||
from telegram.ext import Application
|
||||
@@ -92,11 +93,34 @@ def _limpiar_env_sensibles() -> None:
|
||||
"WEBHOOK_SECRET",
|
||||
"HEALTH_AUTH_TOKEN",
|
||||
"INVITE_CODE",
|
||||
"ADMIN_TOKEN",
|
||||
)
|
||||
for var in _sensibles:
|
||||
os.environ.pop(var, None)
|
||||
|
||||
|
||||
def _run_admin(settings) -> None:
|
||||
"""Arranca el panel de administración en su propio thread y event loop."""
|
||||
import uvicorn
|
||||
from admin.app import create_app
|
||||
|
||||
if not settings.admin_token:
|
||||
logger.warning("admin_panel_sin_token_no_iniciado")
|
||||
return
|
||||
|
||||
admin_app = create_app(
|
||||
db_path=str(settings.db_path),
|
||||
admin_token=settings.admin_token,
|
||||
data_dir=settings.data_dir,
|
||||
)
|
||||
uvicorn.run(
|
||||
admin_app,
|
||||
host="127.0.0.1",
|
||||
port=settings.admin_port,
|
||||
log_level="warning",
|
||||
)
|
||||
|
||||
|
||||
async def main() -> None:
|
||||
settings = get_settings()
|
||||
_limpiar_env_sensibles()
|
||||
@@ -133,6 +157,10 @@ async def main() -> None:
|
||||
lambda chat_id: poller.revisar_ahora(chat_id=chat_id, es_manual=True)
|
||||
)
|
||||
|
||||
# Panel de administración (thread daemon — muere con el proceso principal)
|
||||
admin_thread = threading.Thread(target=_run_admin, args=(settings,), daemon=True)
|
||||
admin_thread.start()
|
||||
|
||||
# Manejo de señales para shutdown limpio
|
||||
loop = asyncio.get_running_loop()
|
||||
health_server: HealthServer | None = None
|
||||
|
||||
Reference in New Issue
Block a user