Dashboard Django para gestion de personal, accesos, visitantes, vehiculos y consultas internas.
- Aplicacion desplegada en la VM de Vultr en
https://bonanza.robio-ai.com nginxfuncionando como reverse proxygunicornsirviendo Django en127.0.0.1:8000- SSL emitido con
certbot - Logo activo en la barra superior, favicon y pantalla de login
- Endpoint de placas disponible
- Endpoint de personas disponible
inventario_bonanza/manage.py: entrada de comandos de Djangoinventario_bonanza/inventario_bonanza/: configuracion principal del proyectoinventario_bonanza/gestion_personal/: app principalinventario_bonanza/gestion_personal/services/: reglas reutilizables de dominio, métricas, alcance, fechas y notificacionesinventario_bonanza/static/: estaticos fuente versionablesinventario_bonanza/media/: archivos subidos localmenteinventario_bonanza/staticfiles/: salida local decollectstatic, no versionadaconsulta_people/: fuentes de consulta para personasconsulta_plates/: fuentes de consulta para placasdeploy/: configuracion versionada de Nginx, SSH y Fail2ban
Las vistas conservan la capa HTTP: autorización, parámetros, respuestas y plantillas.
La lógica que se reutiliza está separada en gestion_personal/services/:
scoping.py: acceso a datos por organización.dates.py: rangos indexables para filtros diarios sobre campos de fecha y hora.notifications.py: entrega de alertas de Telegram.lookup_sources.py: carga segura de conectores de consultas externas.hr_analytics.py: métricas agregadas del tablero integral de RRHH.
Los directorios locales con credenciales, datos operativos, cachés, registros,
archivos generados y el entorno virtual se excluyen mediante .gitignore.
En la VM actual el proyecto vive en:
/root/bonanzaServicios del sistema:
bonanza-gunicorn.servicenginx.serviceminio.servicessh.servicefail2ban.service
Ruta de la configuracion de sitio:
/etc/nginx/sites-available/bonanza/etc/nginx/sites-available/bonanza-minio-s3
Certificado SSL:
/etc/letsencrypt/live/bonanza.robio-ai.com/
python3 -m venv venv
venv/bin/pip install -r requirements.txt
venv/bin/python inventario_bonanza/manage.py migrate
venv/bin/python inventario_bonanza/manage.py runservercd /root/bonanza
/root/bonanza/venv/bin/python inventario_bonanza/manage.py migrate --noinput
/root/bonanza/venv/bin/python inventario_bonanza/manage.py collectstatic --noinput
systemctl restart bonanza-gunicorn
systemctl restart nginxDJANGO_SECRET_KEYDEBUGALLOWED_HOSTSCSRF_TRUSTED_ORIGINSAPP_URL
DATABASE_ENGINEDATABASE_NAMEDATABASE_ADMIN_USERDATABASE_ADMIN_PASSWORDDATABASE_DESCRIPTION
GLOBAL_ADMIN_USERNAMEGLOBAL_ADMIN_PASSWORDGLOBAL_ADMIN_EMAIL
MINIO_ROOT_USERMINIO_ROOT_PASSWORDMINIO_ACCESS_KEYMINIO_SECRET_KEYMINIO_BUCKET_NAMEMINIO_ENDPOINT_URLMINIO_CONSOLE_URLMINIO_VOLUMESMINIO_OPTSMINIO_PERSON_PHOTO_PATH
PLATE_LOOKUP_API_TOKENPERSON_LOOKUP_API_TOKENFACE_GALLERY_API_TOKEN
TELEGRAM_BOT_TOKENTELEGRAM_CHAT_IDS
EMAIL_HOSTEMAIL_PORTEMAIL_USE_TLSEMAIL_HOST_USEREMAIL_HOST_PASSWORD
DJANGO_SERVICEMINIO_SERVICENGINX_SITE
/login//logout//role_redirect//global/dashboard//global/placas//global/consultas-personas//server//server/api/
GET /api/plate-lookup/<placa>/
Se debe configurar PLATE_LOOKUP_API_TOKEN y enviar:
X-Plate-Lookup-Token: <token>
curl -H "X-Plate-Lookup-Token: <token>" \
https://bonanza.robio-ai.com/api/plate-lookup/ABC1234/Devuelve un JSON con:
okrecorderrorcuando aplica
La estructura de record incluye:
placaestadopropietariomarcamodeloanioclasetiposerviciousovinmotorsource_errorsnormalized_data
- Si no existe el registro, se crea en estado
pending - La consulta se procesa en segundo plano
- Si faltan credenciales externas, la respuesta puede traer errores por fuente
GET /api/person-lookup/<cedula>/
Se debe configurar PERSON_LOOKUP_API_TOKEN y enviar:
X-Person-Lookup-Token: <token>
curl -H "X-Person-Lookup-Token: <token>" \
https://bonanza.robio-ai.com/api/person-lookup/0102030405/Devuelve un JSON con:
okrecorderrorcuando aplica
La estructura de record incluye:
cedulaestadonombre_completoprocesos_actor_totalprocesos_demandado_totalcitaciones_totalnormalized_datasource_errors
- Si no existe el registro, se crea en estado
pending - La consulta se procesa en segundo plano
- Las fuentes que requieren captcha o navegador pueden reportar error parcial
GET /server/api/
- Requiere sesion autenticada
- El acceso en la interfaz web esta restringido a
global_admin
- host
- uptime
- cpu
- memoria
- discos
- base de datos
- procesos de consulta
- colas de placas y personas
- MinIO escucha solo en
127.0.0.1:9000y127.0.0.1:9001. - El bucket no concede lectura anonima. La ruta
/media-minio/pasa por Django y exige sesion y acceso a la organizacion del archivo. - El puerto 9443 expone la API S3 para el sincronizador autorizado, restringida en UFW a
207.246.68.223. Actualizar la regla si cambia la IP del cliente. collectstaticpublica el contenido deinventario_bonanza/static/
- UFW permite 80/tcp y 443/tcp para la web, limita 22/tcp publico y 22/tcp por
wg0desde10.0.0.0/24, y permite 9443/tcp solo desde207.246.68.223. Los demas puertos entrantes estan denegados. - SSH admite unicamente al usuario
robiotecy nunca aroot. Hacia la IP publica216.128.158.136solo acepta la claverobiotec-2026(huellaSHA256:2Vm+QulZq93o5nv3ZzfJ5ynf+IF/s7E7FAS9iWdmI38); no ofrece contrasena. - Hacia
10.0.0.3por WireGuard, el equipo puede entrar con la contrasena derobioteco con su clave anterior (huellaSHA256:zem4qlWS/6JotIMixFgGoumAoJVqH8NoBwvI+cZZpi4). Las claves autorizadas se guardan en archivos separados bajo/home/robiotec/.ssh/y no se versionan. - Con VPN:
ssh robiotec@10.0.0.3. Sin VPN:ssh robiotec@216.128.158.136usando la clave privada correspondiente arobiotec-2026.MaxAuthTries=3yLoginGraceTime=30reducen intentos por conexion. - Fail2ban supervisa
sshdcon journal de systemd; tras cinco fallos en diez minutos aplica un bloqueo UFW de una hora. - Las configuraciones de SSH y Fail2ban activas tienen copia en
deploy/security/. El bloquedeploy/security/sshd-vpn-match.confse coloca al final de/etc/ssh/sshd_config, despues de los ajustes globales. La configuracion de la web esta endeploy/nginx/bonanza.conf; Certbot administra los certificados en/etc/letsencrypt/. - No borrar
.env,inventario_bonanza/db.sqlite3,MinIO/,venv/,staticfiles/nilogs/durante una limpieza: son datos o componentes de ejecucion. No se versionan.
Comprobaciones:
sshd -t && sshd -T | grep -E 'permitrootlogin|passwordauthentication|maxauthtries'
wg show wg0
ufw status verbose
fail2ban-client status sshd
nginx -t
systemctl is-active ssh fail2ban nginx bonanza-gunicorn minio- Logo principal:
inventario_bonanza/static/img/logo.png - Favicon: el mismo logo
- Login con cabecera visual del proyecto
www.bonanza.robio-ai.comno tiene DNS activo aun- Si se quiere usar
www, hay que crear el A record y volver a emitir el certificado - Revisar si se desea cambiar SQLite por PostgreSQL para produccion
- Confirmar si MinIO sera local definitivo o migrado a otro almacenamiento
- Definir si los tokens de API se consumiran solo internamente o desde sistemas externos
- Rotar
DJANGO_SECRET_KEYpor una clave larga; el cambio cerrara las sesiones actuales.
Ver estado de servicios:
systemctl status bonanza-gunicorn
systemctl status nginxVer logs:
journalctl -u bonanza-gunicorn -f
journalctl -u nginx -f
tail -f logs/django.logVerificacion rapida:
python3 inventario_bonanza/manage.py check