Volver a proyectos

Ecommerce para un cliente

En desarrollo

Sublime Ecommerce

Tienda online para un negocio de stickers, remeras sublimadas, DTF y vinilos: catálogo administrable, pedidos, encargos personalizados con Custom Lab y despliegue propio en un VPS.

Proyecto para un cliente, en desarrollo. Las funcionalidades corren en staging; la tienda ya está en el dominio del cliente, en modo mantenimiento mientras se carga el catálogo real. Empezó en Vercel con una base gestionada y lo migré a un VPS propio.

Resultado: 298pruebas automáticas en el repositorio, sobre 18 migraciones de base versionadas.

  • Next.js
  • TypeScript
  • PostgreSQL
  • Docker
  • Traefik

Arquitectura

Infraestructura en el VPS
  1. DominioTienda en el dominio del cliente; staging protegido con contraseñaDNS
  2. ProxyHTTPS automático y ruteo por dominio; www redirige al dominio principalTraefik
  3. AppUn contenedor por entorno, construido con su propia configuraciónNext.js · Docker
  4. BaseUna base por entorno, sin acceso desde internetPostgreSQL
  5. RespaldosDiarios, con copia cifrada fuera del servidor y restauración probadarclone · Drive

Estado de las funcionalidades

Implementado en staging

  • Catálogo administrable desde un panel: categorías, imágenes, variantes, precios y stock con auditoría.
  • Pedidos con reserva de stock y envíos calculados por reglas.
  • Sublime Custom Lab: stickers con quitado de fondo, contorno y armado automático de planchas; el servidor genera el PNG y el PSD para el plotter.
  • Custom Lab de remeras: diseño propio o de catálogo, ubicación y tamaño; el servidor genera el mockup y la estampa a 300 dpi.
  • Cuentas de cliente, puntos de venta y portada editables desde el panel.
  • Encargos copiados automáticamente a Google Drive y cola de avisos.

Infraestructura en producción

  • Migración de Vercel y una base gestionada a un VPS con Docker Compose.
  • Deploy automático de staging al hacer push; la tienda se despliega a mano.
  • Respaldos diarios: 14 días en el servidor y 60 días cifrados en Google Drive.
  • Modo mantenimiento: el público ve una página de aviso y el panel sigue disponible.

Pendiente

  • Pagos con Mercado Pago, sujeto a aprobación del cliente.
  • Emails al cliente y recuperación de contraseña, cuando se elija un proveedor.
  • Quitado de fondo con IA en Custom Lab.
  • Apertura de la tienda al público.

Arquitectura

  • Next.js App Router con TypeScript strict, en modo standalone dentro de Docker.
  • PostgreSQL con migraciones versionadas; los cambios de catálogo, su movimiento de stock y su auditoría se guardan en una sola sentencia SQL.
  • Archivos en disco con rutas públicas y privadas; los adjuntos de los encargos solo se descargan desde el panel.
  • Autorización del panel verificada en el servidor en cada página y acción.

Decisiones de despliegue

  • Una imagen por entorno: parte de las páginas se generan en el build y necesitan la configuración de ese entorno, que entra como secreto y no queda en la imagen.
  • Deploy por pull: el VPS lee GitHub con una clave de solo lectura y GitHub no guarda credenciales del servidor.
  • Traefik compartido con otros servicios del mismo VPS: cada app solo agrega sus etiquetas.
  • La base solo escucha en el propio servidor; nunca queda expuesta a internet.

Código de ejemplo

Deploy automático por pull (extracto)bash
# Runs every minute: deploy the watched branch when it has a new commit.
git --git-dir="$REPO" fetch --quiet --prune origin "+refs/heads/$BRANCH:refs/heads/$BRANCH"
SHA=$(git --git-dir="$REPO" rev-parse "refs/heads/$BRANCH")

[ "$SHA" = "$(cat .deployed-sha 2>/dev/null)" ] && exit 0   # already live
[ "$SHA" = "$(cat .last-attempt 2>/dev/null)" ] && exit 0   # failed once, wait for a new commit
echo "$SHA" > .last-attempt

NEW=$(mktemp -d "$ROOT/.src.XXXXXX")
git --git-dir="$REPO" archive "$SHA" | tar -x -C "$NEW"
mv "$ROOT/src" "$ROOT/src.previous" && mv "$NEW" "$ROOT/src"

if bash "$ROOT/src/deploy/deploy-staging.sh"; then
  echo "$SHA" > .deployed-sha
else
  echo "deploy failed: staging keeps the previous version"
fi

Límites del caso

  • La tienda todavía no está abierta al público: está en modo mantenimiento.
  • No hay cobros en línea; los pagos dependen de la aprobación del cliente.
  • No se publican datos de ventas ni del negocio del cliente.

Enlaces