- Estructura en 4 partes: preparación, servidor, HTTPS/producción, operación
- Sección DNS detallada para Bluehost cPanel + mensaje exacto en inglés
para delegar a un asistente técnico
- Configuración Nginx como reverse proxy con SSL terminado en el servidor
- Certbot + Let's Encrypt con renovación automática
- docker-compose en modo producción (bind 127.0.0.1:8080)
- Activación del modo webhook paso a paso
- Health check HTTP integrado en Nginx
- Tabla de rutas absolutas de todos los archivos
- Troubleshooting expandido para 8 escenarios de error
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- migrations/001_initial_schema.sql: DDL idempotente con CREATE TABLE/INDEX IF NOT EXISTS
- database.py: run_migrations() aplica .sql pendientes en orden; init_db() queda como alias
- health.py: servidor aiohttp en puerto 8080 — GET /health, GET /health/history, POST /webhook
Watcher loop alerta al admin por Telegram si el poller no actualiza en N horas
- config.py: webhook_url, webhook_secret, health_port, health_alert_hours
- poller.py: on_poll_done callback (conecta con health.record_poll)
- main.py: arranca HealthServer, llama run_migrations, modo webhook opt-in via WEBHOOK_URL
- Dockerfile + docker-compose.yml + .dockerignore
- pyproject.toml: aiohttp>=3.9
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El endpoint de notificaciones del PJ usa nombres distintos a los documentados:
- fechaNotificacion (no fecha)
- descripcionDespacho (no juzgado)
- descripcionCircunscripcion (no circunscripcion)
- codActuacionCaso — campo nuevo, necesario para descargar PDF
El botón PDF usaba codNotificacionOrigen como ID de actuación;
corregido a codActuacionCaso.
Manejo explícito de 403 en listar_notificaciones como CSJAuthError.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- utils/rate_limiter.py: ventana deslizante 20 req/60s por chat_id,
aplicado en todos los handlers de telegram_bot.py
- database.py: tabla invite_codes (un solo uso por código), funciones
crear_invite_code() y verificar_y_consumir_invite_code()
- onboarding.py: verifica primero en DB (un solo uso), fallback al
INVITE_CODE del .env (ilimitado, para uso interno)
- scripts/generar_codigo.py: genera 1 o N códigos de invitación
- scripts/rotar_fernet_key.py: re-cifra todos los tenants y el .env
con nueva FERNET_KEY, backup automático de .env antes de escribir
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Paso a paso para delegar el deploy a equipo técnico:
usuario dedicado, uv, .env seguro, cifrado de credenciales,
systemd service, firewall UFW, monitoreo con journalctl,
procedimiento de actualización y troubleshooting.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bot de Telegram para monitoreo de notificaciones judiciales del PJ Paraguay.
Multi-tenant con onboarding conversacional, audit log, y polling automático.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>