0 FPS
Single Resto — Web & Dashboard

Personal / Client2025

Single Resto — Web & Dashboard

Plataforma full-stack para restaurantes con web de pedidos y dashboard admin — deploy en Docker sobre VPS con notificaciones en tiempo real, pagos con MercadoPago, integración WhatsApp y soporte white-label.

Rol

Desarrollador Principal

Cliente

Personal / Client

Año

2025

Enlaces

Next.jsTailwindCSSReactDockermonorepoPostgreSQLDrizzle ORMmercadopago

Resumen

Single Resto es un sistema completo de gestión para restaurantes que incluye una web de pedidos para los clientes y un dashboard de administración para los operadores del local. El proyecto empezó como un trabajo para un cliente y evolucionó a un template white-label capaz de servir múltiples marcas de restaurantes desde un solo codebase. Representa mi proyecto más orientado a producción hasta la fecha — enfrentando desafíos reales desde procesamiento de pagos hasta infraestructura self-hosted en un VPS.
Web pública del restaurante

Web pública del restaurante

Web Pública

La web orientada al cliente es una aplicación Next.js responsiva donde los comensales pueden: • Explorar el catálogo completo de productos organizado por categorías. • Agregar items a un carrito persistente con controles de cantidad. • Realizar pedidos con opciones de delivery o retiro. • Pagar vía MercadoPago con confirmación automática del pedido. • Ver el estado del local en tiempo real — la web respeta los horarios configurados del restaurante y bloquea el checkout fuera del horario de atención, mostrando alertas claras al usuario.

Flujo Completo de Pedido

Demo completa: explorar productos, agregar al carrito, checkout con control de horarios y colocación de pedido

Checkout y Alertas

Alertas de cambios no guardados, opciones de edición y checkout bloqueado fuera de horario

Dashboard de Administración

El dashboard le da al dueño del restaurante control total sobre su operación: • Panel de pedidos — los pedidos entrantes aparecen en casi-tiempo-real vía SSE (Server-Sent Events) y pueden ser aceptados, preparados y completados con soporte de impresión de tickets. • CRUD de productos — crear, editar y eliminar productos con subida de imágenes a Cloudflare R2, asignación de categorías, precios y toggles de visibilidad. • Configuración del local — establecer horarios, zonas de delivery, dirección del local y activar modo mantenimiento para sacar la web de servicio al instante. • Integración WhatsApp — botones de acción rápida que abren mensajes pre-formateados de WhatsApp para actualizaciones de pedidos, usando una API de WhatsApp self-hosted en un container.

Gestión de Pedidos

Panel de pedidos: recibir, gestionar y procesar pedidos entrantes

Gestión de Productos

Creación de productos, acciones de tabla y gestión de categorías

Subida de Imágenes

Flujo de subida de imágenes con almacenamiento en R2

Configuración del Local

Actualización de dirección del local y configuración de delivery

Arquitectura White-Label

El sistema fue diseñado como template white-label desde el principio. Múltiples marcas de restaurantes pueden operar desde el mismo codebase con temas, logos, catálogos de productos y configuraciones independientes. Cada tenant tiene su propia URL mientras comparte la infraestructura subyacente — reduciendo el overhead de mantenimiento y permitiendo el onboarding rápido de nuevos clientes.

Demo White-Label

Mismo codebase, diferente marca: alternando entre temas de restaurantes

Modo Mantenimiento

Activar modo mantenimiento para sacar el sitio de servicio al instante

Infraestructura & Deploy

Uno de los aspectos más desafiantes y gratificantes de este proyecto fue el deploy self-hosted. Todo el stack corre en un VPS de Oracle Cloud orquestado con Docker Compose: • Container de aplicación — servidor Next.js con SSR y rutas API. • Container de PostgreSQL — base de datos relacional con Drizzle ORM para queries y migraciones type-safe. • Container de API WhatsApp — un servicio local de API de WhatsApp self-hosted que requirió un esfuerzo significativo para configurar y estabilizar, permitiendo al dashboard enviar mensajes automáticos a los clientes. • Cloudflare R2 — almacenamiento de objetos para imágenes de productos, reemplazando el almacenamiento local tradicional con una solución respaldada por CDN. • Reverse proxy — Nginx manejando terminación SSL y routing. Este deploy fue logrado mediante planificación cuidadosa de tareas y organización — habilidades que desarrollé en mis cursadas de ingeniería de software en la facultad — aplicadas aquí en un entorno de producción real por primera vez. Gestionar deploys multi-container en Docker, debuggear networking entre containers y mantener uptime en un VPS me empujó mucho más allá del desarrollo frontend típico.

Notificaciones en Tiempo Real con SSE

En lugar de WebSockets, implementé Server-Sent Events (SSE) para el sistema de notificaciones de pedidos. El dashboard mantiene una conexión persistente con el servidor y recibe actualizaciones push cada vez que se realiza un nuevo pedido. Este enfoque fue elegido por su simplicidad y confiabilidad sobre WebSockets para un flujo de notificaciones unidireccional — el servidor pushea eventos de pedidos al dashboard sin la complejidad de gestión de estado bidireccional.

Logging Centralizado con Wide Events

Implementé un sistema de logging moderno basado en Wide Events (Canonical Log Lines) que reemplazó los console.log dispersos por eventos estructurados y analíticos. En lugar de múltiples líneas de log dispersas, el sistema emite UN evento estructurado por request/acción con todo el contexto necesario: timestamp, request_id, user, action_name, duration_ms, outcome y datos de negocio específicos.
Wide Events en acción — salida estructurada en terminal

Wide Events en acción — salida estructurada en terminal

Ejemplo: Wide Event Estructurado

{
  "timestamp": "2026-02-19T16:40:29.786Z",
  "request_id": "mltot5y2-3pf6a",
  "service": "single-resto",
  "environment": "development",
  "action_name": "updateProduct",
  "duration_ms": 23,
  "outcome": "error",
  "user": {
    "id": "LE58YKCC",
    "role": "admin"
  },
  "error": {
    "type": "ValidationError",
    "code": "VALIDATION_ERROR",
    "message": "Error de validación. Revise los campos."
  }
}

Beneficios del Sistema

• Un solo evento por acción con contexto completo (user, duration, outcome). • Detección automática de errores y resultados usando byethrow. • Queries analíticas: tasa de error por acción, tiempo promedio de respuesta por tenant. • Trazabilidad completa con request_id único por solicitud. • Reducción significativa de ruido en logs comparado con console.log tradicional.

Lo Que Me Enseñó Este Proyecto

Single Resto fue el proyecto que me acercó más al desarrollo profesional. Me expuso a tecnologías y desafíos que nunca había enfrentado: • Docker y orquestación de containers para deploys multi-servicio. • Gestión de infraestructura self-hosted en un VPS — networking, SSL, monitoreo de uptime. • Cloudflare R2 para almacenamiento de objetos de nivel producción. • Integración de pasarela de pagos con MercadoPago. • Arquitectura monorepo para compartir código entre el sitio público y el dashboard. • SSE como alternativa a WebSockets para features en tiempo real. • Logging estructurado y observabilidad con Wide Events. Lo más importante es que fue donde apliqué las habilidades de gestión de proyectos y organización de mis cursadas de ingeniería de software en un contexto de producción real — planificando deploys, gestionando la relación con el cliente y manteniendo un sistema en vivo usado por clientes reales.

Siguiente Proyecto

GSP — Plataforma de Gaussian Splatting

Plataforma self-hosted para subir escenas y orquestar trabajos de render GPU que producen salidas de Gaussian Splatting

Ver Todos los Proyectos