Saltar al contenido
juancespedes.dev
Todos los proyectos
Caso de estudio

Portal corporativo bilingüe con seguridad y accesibilidad medidas

Reconstruí desde cero el portal de una generadora de energía, con 134 páginas en español e inglés sobre WordPress a medida, despliegue con reversión automática y un ethical hacking externo que cerró con 3 hallazgos de severidad baja.

Ficha del proyecto

Rol
Desarrollador full-stack y responsable técnico, de la extracción del diseño al paso a producción
Periodo
jul de 2026 a sept de 2026
  • 134

    páginas publicadas, 67 en español y 67 en inglés generadas desde una sola fuenteFuente: Acta de paso a producción, septiembre de 2026
  • 3 bajos

    hallazgos del ethical hacking externo, sin críticos, altos ni mediosFuente: Informe de la firma auditora externa, septiembre de 2026
  • 96 de 99

    controles de endurecimiento del servidor en verde; los 3 restantes dependían de tercerosFuente: Arnés de endurecimiento del proyecto, 2026
  • 2.211

    commits del portal en unas 8 semanas de trabajoFuente: Historial de git, julio a septiembre de 2026

El problema

El portal anterior eran cuatro instalaciones de WordPress independientes, una por idioma y dominio, alojadas en un tercero. El contenido estaba desactualizado, la versión en inglés no se mantenía y el sitio no cubría las obligaciones colombianas de transparencia (Ley 1712 de 2014) ni de accesibilidad (Resolución 1519 de 2020).

Mi rol

  • Extraje el diseño de Figma y el contenido del sitio anterior con herramientas propias, y lo repliqué página por página.
  • Construí el tema de bloques, dos plugins y el motor que genera las páginas en inglés.
  • Escribí la provisión del servidor, el despliegue y el arnés de endurecimiento, y coordiné con infraestructura los certificados, el DNS y el firewall de aplicaciones.
  • Llevé una auditoría de seguridad interna con más de 100 hallazgos hasta su cierre y acompañé el ethical hacking externo.
  • Preparé el acta de paso a producción, con 9 casos de prueba y 35 evidencias, generada por código.

Restricciones

  • El equipo de Comunicaciones edita el contenido sin un desarrollador y sin poder romper el diseño.
  • Cumplimiento obligatorio de transparencia y de accesibilidad WCAG 2.2 AA para un sitio público.
  • Infraestructura propia de la empresa, detrás de un firewall de aplicaciones corporativo.
  • Fuentes y recursos autoalojados, sin servicios de terceros que recojan datos de los visitantes.
  • Cero enlaces rotos en la migración, porque las direcciones antiguas tenían que seguir funcionando.

Decisiones

  1. 01

    Git como única fuente de verdad

    El administrador de WordPress solo edita contenido. La estructura de los bloques está bloqueada, y el menú y la tabla de rutas viven en el repositorio y se siembran con scripts idempotentes.

    Descartado

    • Configurar el sitio desde el panel de administración
  2. 02

    Motor propio para la versión en inglés

    Las 67 páginas en inglés se generan desde las españolas con un catálogo de traducción por página, así la estructura es idéntica y una guarda impide publicar una traducción a medias.

    Descartado

    • Un plugin de multilenguaje con páginas duplicadas a mano
  3. 03

    Despliegue reproducible con reversión automática

    Cada despliegue empaqueta un commit exacto con su checksum, corre validaciones, respalda la base de datos, cambia de versión de forma atómica y revierte solo si falla la verificación. Revirtió 4 veces en producción sin caída del servicio.

    Descartado

    • Subir archivos por FTP o editar en el servidor
  4. 04

    Política de seguridad de contenido medida con navegador

    La CSP se construyó recorriendo 137 rutas en dos anchos con un navegador real hasta llegar a cero violaciones, en lugar de adivinar qué recursos usa cada página.

    Descartado

    • Copiar una CSP genérica y relajarla cada vez que algo fallara

Arquitectura

Comunicaciones edita contenido en WordPress; todo lo demás llega desde el repositorio por un despliegue verificado. El servidor arma las tablas de datos comerciales desde un CMS headless y enlaza documentos de un almacén compatible con S3.
  1. Fuentes

    • Diseño en FigmaExtraído por API, frame por frame
    • Repositorio gitTema, plugins, rutas y menú
    • Equipo de ComunicacionesEdita solo contenido
  2. Entrega

    • Despliegue verificadoChecksum, validaciones, respaldo y reversión
  3. Servidor

    • WordPress con tema de bloques propioPHP, 67 páginas por idioma
    • Motor de inglésGenera las páginas en inglés
    • MariaDBAccesible solo desde el servidor
  4. Servicios

    • CMS headlessTablas de comercialización, consultadas en el servidor
    • Almacén de documentosCompatible con S3
  5. Visitantes

    • Público del portalEspañol e inglés, WCAG 2.2 AA

Cómo se mueven los datos

  1. Diseño en FigmahaciaRepositorio gitDiseño y tokens replicados
  2. Repositorio githaciaDespliegue verificadoCommit exacto
  3. Despliegue verificadohaciaWordPress con tema de bloques propioCambio atómico de versión
  4. Equipo de ComunicacioneshaciaWordPress con tema de bloques propioContenido
  5. WordPress con tema de bloques propiohaciaMariaDBContenido y configuración
  6. CMS headlesshaciaWordPress con tema de bloques propioDatos con caché y respaldo
  7. WordPress con tema de bloques propiohaciaMotor de inglésHTML en español
  8. Motor de ingléshaciaPúblico del portalPáginas en inglés
  9. WordPress con tema de bloques propiohaciaPúblico del portalPáginas en español
  10. Almacén de documentoshaciaPúblico del portalDocumentos normativos

Resultados

  • El portal pasó a producción con acta firmada por las áreas funcionales y de tecnología, después de 9 casos de prueba ejecutados contra producción.
  • Las 76 direcciones heredadas redirigen con 301 y no quedó ningún enlace roto.
  • Comunicaciones publica y actualiza contenido sin depender de un desarrollador.
  • El sitio se verificó en 27 anchos de pantalla, de 360 a 1.920 px, y los incumplimientos de accesibilidad quedaron en un registro con mediciones y su corrección.

Qué haría distinto

  • Montaría el arnés de seguridad y la medición de la CSP desde la primera semana; buena parte del trabajo de cierre salió de controles que se podían automatizar antes.
  • Pediría desde el inicio un entorno de pruebas con la misma red y el mismo firewall que producción, para no descubrir esas diferencias en la recta final.

Tecnologías

  • WordPress
  • PHP
  • Python
  • Bash
  • MariaDB
  • Directus
  • WCAG 2.2
  • Playwright
  • nginx
  • Linux