feat: F1 — panel admin web (FastAPI, solo 127.0.0.1, X-Admin-Token, SSH tunnel)

This commit is contained in:
markosbenitez
2026-05-30 01:37:14 -03:00
parent 61a15c5c50
commit 8bd1a0dd5b
12 changed files with 552 additions and 0 deletions

28
main.py
View File

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