Desarrollador de Software · Linux · Infraestructura IT · Soporte

Aaron
Brumat

Estudiante del último año de la **Tecnicatura en Desarrollo de Software**. Hago aplicaciones web completas y también me ocupo de lo que las mantiene funcionando: los servidores donde corren, su seguridad y qué hacer cuando algo falla. Tres de ellas están en uso real y se pueden probar sin registrarse.

Python · FastAPI · PostgreSQL · TypeScript · Next.js · Linux · Docker · AWS EC2 · Redes

Rosario, Argentina — disponible para trabajar

Proyectos

Sistemas que construí de punta a punta

Cada uno arranca en un problema concreto y termina en algo que funciona: modelo de datos, API, interfaz, pruebas, despliegue y operación en un servidor propio. Los enlaces llevan al código real y a la aplicación en vivo.

Full-stack · Calidad de datos En producción

Data Center

Una plataforma que revisa los datos de pedidos y envíos de un negocio online, encuentra los que están mal cargados y los convierte en tareas para que alguien los corrija, con responsable y fecha límite. Está hecha con Python y Next.js, y se puede probar sin crear una cuenta.

226 pruebas automatizadas 50+ funciones en su API 45 min de demo sin registrarse

Dashboard: KPIs de calidad calculados sobre filas

El problema

Un pedido con precio negativo, una dirección sin número o un peso imposible parecen detalles, hasta que frenan una entrega o un cobro. Si nadie los ve a tiempo y nadie queda a cargo de corregirlos, los errores se acumulan y no hay forma de saber si la situación mejora o empeora.

La solución

Cada archivo que se carga pasa por un control automático: se revisan las reglas del negocio, se marcan los valores que no tienen sentido y cada problema se convierte en una tarea con prioridad, responsable y plazo. Un panel muestra cómo evoluciona la calidad de los datos. Para probarla, la demo crea un espacio propio con datos de ejemplo que se borra solo al terminar.

Datasets
Carga de archivos CSV, control de que tengan las columnas esperadas, vista previa e historial de cada revisión.
Calidad y anomalías
Reglas por tipo de dato, cada una con su gravedad, más un detector de valores atípicos que marca los registros que casi seguro son un error de carga.
Casos
Cada problema se convierte en una tarea con estado, plazo, responsable, notas e historial, y se puede exportar.
Acceso
Inicio de sesión con usuario o con Google, roles y registro de lo que hace cada usuario. Quien entra a la demo trabaja en un espacio separado de los datos reales.
Backend
FastAPI · SQLAlchemy · Pydantic · Alembic · PostgreSQL 16 · pytest
Frontend
Next.js 16 · React 19 · TypeScript · Tailwind CSS · Recharts
Infraestructura
Cloudflare Worker (Next.js) → EC2 Ubuntu · Caddy → Docker Compose: FastAPI + PostgreSQL 16. La interfaz se sirve desde la red de Cloudflare y la API desde un servidor propio en AWS; los cambios de base de datos se aplican antes de aceptar tráfico y se respalda en cada despliegue.

Decisiones técnicas

Tres cambios para que lo que muestra el sistema sea confiable.

Números que se pueden comprobar

El panel mostraba un impacto en dólares y un puntaje de riesgo que salían de valores inventados: sobre un archivo casi limpio, el riesgo daba 100. Los reemplacé por conteos simples de filas con problemas. Ahora cada número del panel se puede verificar a mano contra el archivo.

calidad = % de filas sin ningún problema
Un detector que no se deja engañar

El detector de valores raros comparaba cada dato contra el promedio, y el promedio se deformaba justamente por los errores que tenía que encontrar: cuantos más errores había, menos detectaba. Lo cambié para que compare contra la mediana, que no se mueve por unos pocos valores extremos, y ahora sigue funcionando aunque una parte grande de los datos esté mal.

promedio → mediana: los errores ya no esconden a otros errores
Una demo pública que no puede tocar los datos reales

La demo usa la misma base que la aplicación real, así que el aislamiento no podía depender de acordarme de protegerlo en cada función nueva. La separación está en el propio modelo de datos y el acceso de la demo está denegado por defecto: si mañana agrego algo y me olvido de protegerlo, queda cerrado en vez de expuesto.

404, no 403: la respuesta no confirma ids ajenos

Full-stack · Reservas y agenda En producción

BarberApp

Un sistema de turnos para barberías: el cliente reserva online eligiendo entre horarios que están realmente libres, el barbero ve su agenda del día y el dueño administra servicios, personal y horarios. Reemplaza la coordinación por mensajes, que termina en turnos pisados. Hecho con Python y Next.js, y se puede probar sin registrarse.

143 pruebas automatizadas 3 roles con permisos distintos 45 min de demo sin registrarse

Reserva: la grilla solo muestra horarios libres

El problema

Una barbería coordina turnos por mensajes. Dos personas escriben al mismo tiempo, alguien anota mal y el barbero termina con dos clientes a la misma hora. La agenda vive en la cabeza de quien contesta el teléfono, así que nadie más puede consultarla ni corregirla.

La solución

El sistema calcula qué horarios quedan libres según el horario de atención, cuánto dura cada servicio, los turnos ya tomados y las ausencias del barbero. Si dos personas intentan reservar el mismo horario al mismo tiempo, solo una lo consigue. La demo crea una barbería de prueba, con datos, que se borra sola al terminar.

Reservas
Grilla configurable de 15 minutos, antelación mínima, horizonte máximo y ventana de cancelación. Un servicio de 90 minutos ofrece menos horarios que uno de 45, y los extras extienden el turno.
Agenda y estados
Máquina de estados explícita: pendiente, confirmado, completado, cancelado y ausente. Cada respuesta trae las transiciones que ese usuario puede hacer, así que la interfaz nunca ofrece un botón que el servidor va a rechazar.
Administración
Servicios, extras, barberos y horarios de atención, con alta y baja lógica. Desactivar un barbero lo saca de la reserva y le corta el acceso en el mismo momento.
Demo aislada
Una sesión anónima crea su propia barbería y se puede recorrer como cliente, barbero o administrador sobre los mismos datos. Tiene vencimiento, tiempo de inactividad y cupos, y no comparte una sola fila con el local real.
Backend
FastAPI · SQLAlchemy 2 async · Pydantic v2 · Alembic · PostgreSQL 16 · pytest
Frontend
Next.js 16 · React · TypeScript · Tailwind CSS 4 · TanStack Query · Vitest
Infraestructura
Cloudflare Worker (Next.js) → EC2 Ubuntu · Caddy → Docker: FastAPI + PostgreSQL 16. El navegador llama a /api en el mismo dominio y el Worker reenvía al servidor, así que no hay CORS. Las migraciones corren antes de aceptar tráfico y el despliegue respalda la base antes de tocar nada.

Decisiones técnicas

Dos reglas que no dependen de que la pantalla las respete.

El solapamiento lo rechaza la base, no el código

Verificar antes de insertar deja una ventana: dos reservas simultáneas pueden pasar la comprobación y escribirse las dos. Una restricción de exclusión sobre el rango de tiempo cierra esa ventana dentro del motor, y el servicio traduce el rechazo en un mensaje. Dicho simple: aunque el código tuviera un error, la base no acepta dos turnos pisados para el mismo barbero.

EXCLUDE USING gist (barber_id WITH =, tstzrange(starts_at, ends_at) WITH &&)
El cliente no decide de quién es el turno

La versión anterior aceptaba el identificador del cliente y la duración dentro del pedido, así que cualquiera podía reservar a nombre de otro o pedir un turno de cinco minutos para un servicio de una hora. Ahora el dueño sale del token y la duración se calcula del catálogo. En otras palabras: el navegador dejó de poder afirmar cosas que le convienen.

duración = servicio + extras · dueño = token, no el cuerpo

Full-stack · Comercio y punto de venta En producción

StockARG

Un sistema de gestión para comercios: cobra en el mostrador con lector de código de barras, descuenta el stock solo, avisa lo que se está por terminar o vencer y deja registro de cada movimiento. Reemplaza las planillas sueltas. Hecho con Python y Next.js, y se puede probar sin registrarse.

537 pruebas automatizadas 3 roles con permisos propios 45 min de demo sin registrarse

Panel del día: ventas, cobros por medio, más vendidos y estado del stock

El problema

En un comercio chico, clientes, productos, stock y ventas suelen vivir en planillas separadas. Sin registro de los movimientos, un faltante aparece recién en el conteo, nadie sabe qué vendió cada uno y cada corrección depende de recordar dónde estaba el dato correcto.

La solución

Todo pasa por un solo sistema con tres perfiles —dueño, encargado y vendedor— y cada uno ve solo lo que le corresponde. Los precios y los totales los decide el sistema, no la pantalla, así que nadie puede cobrar de menos editando la página. Cada visitante de la demo recibe un comercio de ejemplo propio que se borra solo al terminar.

Punto de venta
Búsqueda en vivo, lector de código de barras y atajos de teclado; cliente, descuento, vuelto y comprobante en PDF. Un precio o un total enviado desde el navegador se rechaza: lo que se cobra lo decide el servidor.
Stock
Niveles por color, alertas de mínimo y de vencimiento, ajustes por conteo, bajas con motivo y compras que reponen. Cada cambio deja un movimiento con quién, cuándo y el stock resultante.
Gestión y reportes
Clientes, proveedores y compras, con importación CSV que primero muestra qué va a pasar. Facturación, ranking, medios de pago y rentabilidad del período, exportables a CSV y PDF.
Acceso
Propietario, encargado y vendedor, sesión en cookie HttpOnly, verificación por correo y auditoría de las acciones sensibles. El vendedor no ve costos ni márgenes.
Backend
FastAPI · SQLAlchemy 2 · Pydantic v2 · Alembic · PostgreSQL 16 · pytest
Frontend
Next.js 16 · React 19 · TypeScript · Tailwind CSS 4
Infraestructura
Cloudflare Worker (Next.js) → EC2 Ubuntu · Caddy → Docker: FastAPI + PostgreSQL 16. Base y usuario propios dentro del servidor compartido, respaldo antes de cada despliegue y correo transaccional por SMTP.

Decisiones técnicas

Tres reglas que no dependen de que la pantalla las respete.

El total lo calcula el servidor

El navegador manda solo qué productos y cuántos. El precio sale de la lista, el descuento del vendedor tiene un tope configurable y un total enviado desde afuera se rechaza con un error visible. Dicho simple: nadie puede cobrar menos editando la página.

total = Σ precio_de_lista × cantidad − descuento (con tope por rol)
Dos cerrojos para la demo pública

Cada consulta filtra por la partición de la demo, y además la capa de datos agrega ese filtro sola y aborta cualquier escritura que cruce de partición. Si mañana una ruta nueva se olvida de filtrar, un visitante igual no puede ver ni tocar los datos reales.

FugaDeParticion: la transacción se aborta, no se cruza el dato
Dos cajas, una sola unidad

Si dos cajas venden la última unidad de un producto al mismo tiempo, las dos pueden ver que hay stock y descontarlo, y el comercio termina con stock negativo. Cada venta bloquea los productos que toca hasta terminar: la segunda espera, ve el stock real y se rechaza si ya no alcanza. La venta y el descuento se guardan juntos o no se guarda nada.

SELECT … FOR UPDATE en la misma transacción que la venta

Este portfolioSitio web

HTML, CSS y JavaScript sin frameworks ni dependencias de terceros: todo lo que se sirve está en el repositorio, incluidas las tipografías, sin nada que compilar. Bilingüe español e inglés, imágenes en WebP y navegación accesible por teclado.

Seguridad

  • Cabeceras propias: CSP, HSTS, nosniff, X-Frame-Options y Permissions-Policy.
  • Cero dependencias de terceros: ningún paquete que auditar ni vulnerabilidad heredada, y ninguna fuente pedida a otro dominio.
  • Formulario saneado contra inyección de encabezados, con campo trampa y tiempo mínimo de completado contra bots.
  • Secretos fuera del repositorio, con escaneo de toda la historia de Git en cada push.
  • HTTPS forzado, 404 real y canal de reporte en /.well-known/security.txt.
HTML · CSS · JavaScript · Cloudflare Pages · GitHub Actions Ver código

Infraestructura y operación

Los servidores donde corren mis proyectos

Las tres aplicaciones corren en servidores Ubuntu que administro yo, en AWS EC2. No hay una plataforma que lo resuelva por mí: el sistema operativo, el firewall, los servicios, el proxy con HTTPS, los respaldos y los despliegues son parte del trabajo.

Arquitectura

El recorrido de una petición, desde el navegador hasta la base de datos.

  1. Visitante Navegador HTTPS a cada subdominio: datacenter, barberapp y stockarg.
  2. Borde Cloudflare DNS y TLS. El frontend Next.js corre en Workers y reenvía /api al servidor.
  3. Servidor AWS EC2 · Ubuntu Acceso por SSH, usuarios y permisos, actualizaciones con apt y firewall con UFW.
  4. Proxy Caddy Proxy inverso con HTTPS: cada subdominio llega a su aplicación.
  5. Servicios Docker Compose API FastAPI y PostgreSQL 16, con base y usuario propios por aplicación.

Cómo lo opero

Lo que hago en los servidores, con las mismas herramientas que un equipo de sistemas.

Sistema
Administro servidores Ubuntu en AWS EC2: acceso por SSH, usuarios y permisos, actualizaciones con apt y firewall con UFW.
Servicios
Gestiono los servicios con systemd y Docker Compose: qué corre, cómo arranca y cómo se reinicia después de un cambio.
Diagnóstico
Cuando algo falla, primero leo: logs del sistema con journalctl y logs de cada contenedor. Busco la causa antes de tocar nada.
Red y seguridad
DNS y proxy en Cloudflare, HTTPS con Caddy, solo los puertos necesarios abiertos y cabeceras CSP y HSTS en cada aplicación.
Respaldos
Backup de la base antes de cada despliegue, para poder volver a la versión anterior si algo sale mal.

Despliegue: backup de la base build de las imágenes migraciones con Alembic arranque de los servicios revisión de logs

Fallas que diagnostiqué

Síntoma, causa y arreglo de un problema real de producción.

La demo de BarberApp fallaba solo en producción

Las 143 pruebas pasaban, pero la primera sesión de demo en el servidor devolvía error. El log de la API mostraba que PostgreSQL rechazaba el identificador de la demo: medía 43 caracteres y la columna admitía 36. Las pruebas corrían sobre SQLite, que no controla el largo de los textos. Amplié la columna con una migración y agregué una prueba que compara el identificador contra el largo real.

value too long for type character varying(36) → VARCHAR(64)

Stack

Con qué construyo y opero estos sistemas

Solo lo que aparece en el código de mis proyectos, en los servidores que los sostienen o en una certificación.

Sistemas Linux
Ubuntu Server · SSH · Bash · apt · systemd · journalctl · usuarios y permisos · servicios · UFW · backups
Cloud / DevOps
AWS EC2 · Docker · Docker Compose · Git y GitHub · despliegues con migraciones (Alembic)
Redes
TCP/IP · DNS · HTTP/HTTPS · TLS · proxy inverso (Caddy) · Cloudflare
Seguridad
JWT · OAuth 2.0 · roles y permisos · bcrypt · cookies HttpOnly · CSP y HSTS · CORS · escaneo de secretos
Desarrollo
Python (FastAPI, SQLAlchemy, Pydantic) · TypeScript (Next.js, React) · APIs REST · pytest
Bases de datos
PostgreSQL · MySQL · SQL · modelado relacional
En curso
Network Technician Career Path de Cisco: redes, direccionamiento, troubleshooting y seguridad

Durante la cursada también trabajé con C#, Django y Flask. No los uso en los proyectos que muestro acá, así que los dejo listados sin protagonismo.

Perfil

Me interesa la parte que no se ve

Vivo en Rosario, Santa Fe, y estoy en el último año de la **Tecnicatura en Desarrollo de Software**. Soy desarrollador, pero lo que más me atrae es lo que no se ve desde la pantalla: cómo se modelan los datos, cómo se protege una API y cómo se sostiene un sistema una vez que ya está en producción.

Mis proyectos son la forma en que aprendo. Data Center empezó siendo un dashboard y terminó siendo el lugar donde tuve que decidir **qué métricas eran defendibles**, por qué un detector de anomalías fallaba en silencio y cómo aislar un espacio de prueba público de los datos reales sin depender de acordarme de protegerlo.

Desplegarlos en servidores propios —configurar el sistema operativo, el firewall, el proxy y los certificados, y encontrar en los logs por qué algo falla— me llevó a la **infraestructura y la seguridad**. Por eso me certifiqué en Linux Essentials, estoy cursando redes con Cisco y apunto a la **ciberseguridad**, con las bases bien firmes primero.

Cómo puedo aportar

Busco sumarme a un equipo IT. Esto es lo que ya hice en cada tipo de puesto.

Desarrollo de software
Aplicaciones completas —interfaz, API y base de datos— con pruebas automatizadas y reglas de negocio que viven en el servidor. Tres sistemas en producción, con demo pública y código abierto.
Administración de sistemas
Servidores Ubuntu propios: acceso por SSH, usuarios y permisos, actualizaciones, firewall y servicios con systemd. Certificado en Linux Essentials, con 24 laboratorios sobre un sistema real.
Infraestructura / DevOps
Contenedores con Docker Compose, proxy inverso con HTTPS, DNS en Cloudflare y despliegues con backup previo y migraciones automáticas.
Soporte / Help desk
Diagnostico fallas a partir de logs, estoy formándome en redes y troubleshooting con Cisco y tengo experiencia real atendiendo clientes, con caja, terminales de cobro y stock.

Hacia dónde voy

Mi objetivo es la ciberseguridad. Para llegar bien, primero las bases que la sostienen.

  1. Hecho
    Desarrollo de software

    Tres aplicaciones en producción: APIs, bases de datos, autenticación, roles y pruebas automatizadas.

  2. Hecho
    Linux

    Linux Essentials de Cisco aprobado y servidores Ubuntu propios en producción.

  3. En práctica
    Arquitectura y despliegues

    Docker, proxy inverso con HTTPS, backups y migraciones en cada despliegue, en cada proyecto.

  4. En curso
    Redes

    Network Technician Career Path de Cisco Networking Academy: redes, direccionamiento, troubleshooting y seguridad.

  5. En curso
    Ciberseguridad práctica

    Laboratorios en TryHackMe, más videos y documentación para entender cómo se ataca y cómo se defiende un sistema.

  6. Próximo
    Ciberseguridad con Cisco

    Introduction to Cybersecurity y Ethical Hacker, de Cisco Networking Academy.

Trayectoria

Formación y experiencia

Formación

La carrera, más lo que aprendo por mi cuenta para cubrir lo que la cursada no toca.

2024 — actualidad
Tecnicatura en Desarrollo de Software
Terciario Urquiza, Rosario
Último año en curso. Programación, bases de datos, análisis de sistemas y desarrollo de aplicaciones.
Continuo
Aprendizaje autodidacta
Docker, despliegue en Linux, testing y diseño de APIs salieron de necesitarlos en un proyecto real. Hoy sumo seguridad con laboratorios en TryHackMe, videos y documentación.

Certificaciones y cursos

Certificado · Septiembre 2026

Linux Essentials

Programa de Cisco Networking Academy desarrollado junto con NDG y acreditado con un examen integral. Se trabaja sobre un sistema Linux real en máquina virtual, a lo largo de 24 laboratorios: administración desde la línea de comandos, gestión de archivos, usuarios, grupos y permisos, seguridad del sistema, respaldo y restauración, y automatización con scripts de shell. En la práctica, es la misma terminal desde la que despliego y mantengo Data Center, BarberApp y StockARG en servidores Ubuntu.

Línea de comandos · Archivos · Usuarios y grupos · Permisos · Seguridad · Respaldos · Scripting

Cisco Networking Academy · NDG · 24 laboratorios

En curso

Network Technician Career Path

Ruta de Cisco Networking Academy para trabajar como técnico de redes: cómo se arma y se configura una red, cómo se direcciona, cómo se encuentra una falla y cómo se protege. Es la base de redes que sostiene el soporte, la administración de sistemas y la ciberseguridad.

Cisco Networking Academy · 4 cursos

  • Networking Basics
  • Networking Devices and Initial Configuration
  • Network Addressing and Basic Troubleshooting
  • Network Support and Security

Iniciación al Desarrollo con IA BIG school · Marzo 2026 · 6 horas

Experiencia laboral

Fuera de IT, pero con mucho de soporte: atender personas, resolver en el momento, operar terminales de cobro y llevar registros exactos.

03/2025 — 11/2025
Vendedor y atención al cliente
KINGU, Rosario
Atención al cliente, caja y terminales de cobro, control de stock.
02/2024 — 12/2024
Vendedor y control de stock
Almacén Tina, Rosario
Reposición de mercadería, registro de existencias y cobros. De acá salió la idea de StockARG.
11/2023 — 12/2023
Pasantía administrativa
S.I.S.O SRL, Rosario
Carga y corrección de datos en software contable.

Idiomas y otros datos

Español nativo · Inglés avanzado · Licencia de conducir B1 con movilidad propia · Microsoft 365 y Excel · Atención al cliente

Contacto

Hablemos

Busco sumarme a un equipo IT, en desarrollo, administración de sistemas, infraestructura o soporte. Full time, presencial en Rosario, híbrido o remoto. Escribime por el medio que te resulte más cómodo: respondo en 24 a 48 horas.

No hay servidor detrás: el formulario arma el correo y elige tu cliente. También podés escribir directo a aaronbru.dev@gmail.com.