3 min de lectura
Como logré vincular Cloudflare R2 con un sistema de ferretería
A principios de este año, fui contratado para desarrollar un sistema para una ferretería. El proyecto, de por sí, presentaba un gran desafío. ¿Por qué?
La ferretería es grande, lo que se traduce en un volumen enorme de productos (más de 9000). Además, la lógica del negocio es compleja: alguien que no frecuenta estos comercios o no realiza trabajos manuales no conoce con precisión los nombres o las variantes de los ítems (por ejemplo, los tornillos y todas sus medidas exactas).
Allí apareció el primer obstáculo: ¿cómo armo un catálogo de ítems y un carrito de compras sobre algo que ni siquiera sé que existe? Por suerte, el comercio contaba con archivos de Excel donde registraban la mayoría de los productos. Automaticé la carga masiva a través de un script en Python, pasando todo en limpio primero a otra hoja de cálculo (columna A para el nombre y columna B para el precio) y de ahí lo migré a PostgreSQL. La base de datos original estaba “organizada” bajo una lógica que solo los empleados entendían y memorizaban.
Sin embargo, tras resolver la estructura del catálogo, surgió el verdadero dilema: ¿y las imágenes? No tenía idea de cómo asignar una imagen a cada ítem. ¿Las sacaba de Google? ¿Infringiría derechos de autor? Si las fotos las tomábamos nosotros, ¿dónde las almacenaríamos? No sabía cómo conectar todas las piezas.
Averiguando en diferentes comunidades y documentación, me encontré con Cloudflare R2. Al entender cómo funcionaba y su costo de salida de datos (egress fees) en cero, supe que estaba salvado. El gran problema estaba resuelto.
Pero hay un detalle interesante: aunque hablo de los inicios del año, fue recién el 27 de octubre cuando descubrí la existencia de R2. Prácticamente seis meses después de pausar el proyecto, encontré la herramienta que me dio la confianza para retomarlo. Cabe admitir que, como me asignaron otras responsabilidades en mi empleo principal, este desarrollo había quedado en tercer plano. Un día, revisando mis notas y con ganas de continuar, decidí proponerle al jefe reactivar el proyecto.
Ahora mismo el sistema está en proceso de desarrollo. Estoy reescribiendo la estructura desde cero, pero aplicando una arquitectura mucho mejor gracias a todo lo que aprendí desde que empecé.
DETALLES TÉCNICOS
- Gestión de transacciones: Ahora las transacciones son atómicas y se envían en un solo paquete. Antes se procesaban de a una, y si algo fallaba a mitad de camino, no había forma de revertir el estado de la base de datos (rollback).
- Almacenamiento seguro: Creé un bucket en Cloudflare R2. Las claves de acceso y tokens están guardados de forma segura como variables de entorno en Netlify. Al ser credenciales de un solo vistazo, no las anoté en ninguna otra parte por seguridad. Si se pierden o se comprometen, se realizará una rotación de claves (re-roll).
- El desafío de la región: La conexión inicial con el bucket fue caótica. Al crearse por defecto en la región de la Unión Europea (EU) y no especificar este parámetro en el archivo de configuración (.env), el backend no lograba conectar. Tardé un par de horas en identificar que la falta de esa variable de entorno era el origen del problema.
- Investigación activa: Actualmente me encuentro auditando la seguridad del bucket y robusteciendo el cifrado de la conexión entre el sistema de la ferretería y el almacenamiento de Cloudflare.