EBEloy R. Becerra Daly

perfil.dalyko.com · Astro 7 SSR · Cloud Run

Eloy R. Becerra Daly

Desarrollo de software, integración de sistemas y despliegue en producción.

Este sitio es la muestra de trabajo. No es una plantilla: cada decisión —renderizado en servidor, contenido tipado, analítica sin cookies, contenedor endurecido y despliegue continuo— está tomada a propósito y explicada aquí.

TypeScriptPythonReactC#PostgreSQLDockerCloud RunAPI REST
~5.000

commits en el sistema de trading, 10 meses a dedicación casi completa

~45.000

leads migrados con corte del sistema anterior en una sola jornada

14

locales con hreflang y redirección por idioma del navegador

Proyectos

Cuatro trabajos, con sus números.

Filtrar:
destacadoprivado

Sistema de trading algorítmico

2025 – 2026

Proyecto propio · Plataforma de decisión automatizada: microservicios en Python, front en React/TypeScript, integración en C# y entrenamiento de modelos en GPU.

~5.000
commits
10 meses
a dedicación casi completa
  • Microservicios en Python con responsabilidades separadas: decisión, riesgo, análisis cuantitativo, aprendizaje y orquestación.
  • Front-end de gestión en React y TypeScript (Vite), con sistema de diseño propio y aplicación de escritorio empaquetada.
  • Integración en C# con una plataforma externa de terceros y capa de ejecución sobre puertos dedicados.
  • PostgreSQL con esquema particionado y control de escritura única por partición.
  • Entrenamiento en GPU, con ciclo de evaluación y validación reproducible.

Repositorio privado por la naturaleza del proyecto. Puedo enseñar el código y la arquitectura en una conversación técnica.

PythonTypeScriptReactC#PostgreSQLDockerGPU
destacado

Migración de CRM e integración con la web

2024 – 2025

Asset Lighthouse · Sustitución completa del CRM heredado con migración de ~45.000 leads y sincronización automática con el sitio corporativo mediante API y webhooks.

~45.000
leads migrados
10 s
por ciclo de publicación
1 jornada
de corte, sin parar el negocio

Proyecto de transformación con plan formal de siete fases, del mapeo de procesos a la explotación.

  • Modelo de datos: ~85 campos personalizados, diccionario de API entregado a los proveedores y matriz de 8 roles con 5 niveles de permiso.
  • Migración: ~400 fichas de inventario y cerca de 45.000 leads de cinco años, con mapeo de campos y depuración de 122 registros erróneos.
  • Corte en una sola jornada, con toda la plantilla movilizada y sin interrupción del servicio.
  • Integración CRM ↔ web por API REST y webhooks: la publicación pasó de manual a 10 segundos por ciclo, sincronizada cada 15-30 minutos.
API RESTWebhooksZapierWordPressPostgreSQLZoho

Plataforma web corporativa en 14 idiomas

2024 – 2025

Asset Lighthouse · Sitio corporativo multiidioma con hreflang, redirección por idioma del navegador, certificado SSL EV e integración con el CRM.

14
locales con hreflang
~400
fichas sincronizadas
  • 14 locales (es, en, fr, de, nl-BE, nl-NL, pl, sv, nb, da, is, cs, ru, uk) con hreflang y redirección automática según el idioma del navegador.
  • Gestión de dominio, hosting y certificado SSL EV, incluida la documentación legal para su emisión.
  • Integración con el CRM: alta, modificación y baja de fichas sincronizadas automáticamente.
  • Coordinación de dos proveedores de desarrollo y redacción de las especificaciones técnicas.
WordPressPHPJavaScriptSEOhreflangSSL EV

Cadena de suministro internacional y comercio electrónico

2022 – 2024

Zion Iber Group Ltd. · Diseño y contratación de una cadena de suministro España-Israel, con modelo de coste por referencia y tienda en línea propia.

25
variables en el modelo de coste
16
referencias con control documental
  • Cadena de extremo a extremo: origen EXW en bodega, almacén de consolidación, puerto seco, puerto de destino y punto de venta, con transitaria, almacén, courier y agente de aduanas contratados.
  • Modelo de coste puesto en destino con 25 variables por referencia (clasificación arancelaria, aranceles, impuestos especiales, IVA, transporte y paletización).
  • 4 contratos internacionales bajo EXW Incoterms® 2020 y matriz de control documental de 11 puntos sobre 16 referencias.
  • Tienda WooCommerce con sincronización de stock y catálogo.

Proyecto interrumpido en fase de pre-lanzamiento por el conflicto de octubre de 2023.

WooCommerceWordPressModelado de costesIncoterms

Integración y despliegue continuo

De git push a producción, sin claves en el repositorio.

Pulsa cualquier etapa para ver el comando real y el motivo de la decisión.

01 · Disparador

El flujo arranca con un push a main o a mano desde la interfaz de Actions. Sin ramas de release ni pasos manuales intermedios: el repositorio es la fuente de verdad de lo que está en producción.

.github/workflows/deploy.yml
on:
  push:
    branches: [main]
  workflow_dispatch:

02 · Verificar

Node 24 con caché de npm, comprobación de tipos y build completo. El esquema Zod de la colección de proyectos se valida aquí: un campo mal escrito en el frontmatter rompe el build, no la página en producción.

job: verificar
npm ci
npx astro check --minimumseverity error
npm run build

03 · Autenticar

Workload Identity Federation: GitHub obtiene un token OIDC de corta vida y lo intercambia por credenciales de GCP. No hay claves de cuenta de servicio en el repositorio ni en los secretos. Sin proveedor configurado, el job se omite en lugar de fallar.

permissions: id-token: write
uses: google-github-actions/auth@v2
  workload_identity_provider: ${{ vars.GCP_WIF_PROVIDER }}
  service_account: ${{ vars.GCP_SERVICE_ACCOUNT }}

04 · Construir

Cloud Build compila desde el Dockerfile multi-stage. La imagen final no lleva dependencias de compilación ni código fuente, y corre con usuario sin privilegios.

1deps · npm ci (cacheable)
2build · npm run build → dist/
3runtime · solo dist/ + prod deps
Dockerfile · runtime
FROM node:24-alpine AS runtime
RUN npm ci --omit=dev
COPY --from=build /app/dist ./dist
RUN adduser -u 10001 -S astro
USER astro
EXPOSE 8080

05 · Desplegar y publicar

Servicio propio, no dentro del monolito: este sitio no escribe en base de datos ni genera auditoría, así que no hay razón para acoplarlo. La región es europe-west1 porque los domain mappings de Cloud Run no existen en europe-southwest1.

CNAMEperfil → ghs.googlehosted.com.escalamin 0 · max 5 · 512Mi · 1 vCPUsecretoANALYTICS_SALT ← Secret Manager
gcloud run deploy perfil-web \
  --source . --region=europe-west1 \
  --port=8080 --cpu=1 --memory=512Mi \
  --min-instances=0 --max-instances=5 \
  --set-secrets=ANALYTICS_SALT=...:latest

Medición

Medir a la organización que lee, no a la persona que mira.

Sin cookies y sin almacenamiento en el navegador: no se accede a información del terminal, así que no procede banner de consentimiento. La IP se usa en memoria y nunca se guarda.

Recorrido de una petición

  1. GET / llega a Cloud Run

    x-forwarded-for · user-agent · x-client-region

  2. middleware.ts filtra qué cuenta

    no /api/ · no /_ · sin extensión de fichero

  3. derivarVisitaId() — la IP muere aquí

    SHA-256(sal_diaria | ip | ua) → 16 caracteres

  4. registrar() escribe JSON a stdout

    Cloud Logging → BigQuery · nunca bloquea la petición

  5. Astro SSR responde en streaming

    al salir: sendBeacon → POST /api/evento → 204

Derivación en vivo · SHA-256 real en tu navegador
ANALYTICS_SALT:

Cambia la IP o rota el día: el identificador cambia por completo y no hay forma de volver atrás. Nadie puede ser seguido entre días ni entre sitios.

Atribución por destinatario. Cada candidatura se envía con ?ref=, leído en servidor y propagado por los enlaces. Sin persistir nada en tu navegador.

Pruébalo: la cabecera del evento de arriba cambia al instante.

Decisiones de arquitectura

Cada una con su alternativa descartada.

Astro con renderizado en servidor

Cero JavaScript por defecto: el HTML se genera en servidor y solo se hidrata lo marcado como isla. SSR y no estático por dos motivos concretos: leer ?ref= en tiempo de petición y emitir la respuesta en streaming.

Descartado: generación estática pura — habría exigido analítica en cliente. Las rutas que no la necesiten pueden marcarse con prerender = true: la decisión es por ruta, no global.

Contenido tipado con Zod

Los proyectos viven en Markdown bajo una colección con esquema. El frontmatter se valida en compilación: la diferencia entre descubrir un error en CI y descubrirlo en un cliente.

schema: z.object({
  titulo: z.string(),
  metricas: z.array(z.object({
    valor: z.string(),
    etiqueta: z.string() })),
})

Contenedor endurecido

Tres etapas, superficie mínima en la imagen final y proceso sin privilegios. dumb-init propaga SIGTERM para que Cloud Run drene conexiones al escalar a cero.

sin dev depssin código fuenteUID 10001SIGTERM limpio

Servicio propio, no dentro del monolito

La plataforma es un monolito modular por coherencia transaccional y auditoría con hash-chain. Esas razones no aplican a un sitio que no escribe en base de datos ni participa en transacciones.

Descartado: europe-southwest1, más cercana, pero sin domain mappings de Cloud Run. Sin balanceador HTTPS en el proyecto, el mapeo nativo es la vía probada.

SEO técnico y accesibilidad, sin dependencias

canonical por páginaOpen GraphJSON-LD Person + ORCIDsitemap-index.xmlrobots.txtHTML semánticoaria-current en navegaciónprefers-reduced-motiontokens propios, cero CSS de terceros

Contacto

Puedo enseñar el código y la arquitectura en una conversación técnica.

Incluido el sistema de trading, cuyo repositorio es privado: pantalla compartida, recorrido por los microservicios y las decisiones que hay detrás.

Ficha

Sitioperfil.dalyko.comServicioperfil-web · europe-west1Códigoelb8-dev/dalyko-web · MITCorreodaly@icam.esORCID0009-0008-6684-6726

Enviar un comentario

Llega a eloy@dalyko.com · respuesta en un día laborable

Se envía únicamente lo que escribes aquí, más la atribución ref=. Sin cookies ni seguimiento adicional.

Mensaje registrado

Gracias. Te respondo desde eloy@dalyko.com en un día laborable.

Referencia: