Loading repository data…
Loading repository data…
Luis000923 / repository
Código fuente de mi portafolio personal. Implementación de arquitectura limpia con Node.js y Express, seguridad robusta mediante Helmet y Rate Limiting, y visualización de proyectos con Astro. Diseñado para demostrar nivel técnico en desarrollo seguro.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
Este repositorio es el codigo fuente del portfolio personal en produccion. Incluye frontend estatico con Astro y TailwindCSS, y un backend REST con Node.js y Express enfocado en seguridad, validacion y arquitectura limpia.
Sitio en produccion: portafolio.pdsx.org
Para una comprensión profunda de los diferentes aspectos del proyecto, consulte la documentación especializada en la carpeta /DOC:
Portfolio personal de Luis Ernesto Galdamez, desarrollador backend con enfoque en ciberseguridad. El proyecto no es un template generico: expone proyectos reales, certificados dinamicos y un sistema de contacto funcional con SMTP, con metricas de visitas y valoraciones por IP unica.
El proposito es demostrar nivel tecnico real a traves del codigo mismo, no solo en su contenido visual.
| Capa | Tecnologia |
|---|
| Frontend | Astro v6, TailwindCSS v4 |
| Backend | Node.js 22, Express v5 |
| Nodemailer + SMTP Hostinger | |
| Validacion | express-validator |
| Seguridad | Helmet, CORS, rate-limit |
| Gestor de paquetes | pnpm (workspace monorepo) |
El proyecto sigue una separacion estricta entre frontend y backend, comunicandose unicamente via HTTP sobre endpoints REST documentados.
cliente (navegador)
|
| HTTP (fetch)
v
[frontend — Astro SSG] → archivos estaticos en CDN / Hostinger
|
| /api/*
v
[backend — Express API] → Node.js en servidor de Hostinger
|
| fs / SMTP
v
[datos locales / email]
backend-cybersecurity-portfolio/
├── frontend/ # Aplicacion Astro
│ ├── src/
│ │ ├── components/ # Hero, Skills, Projects, Contact, StarWidget...
│ │ ├── layouts/
│ │ └── pages/
│ └── astro.config.mjs
│
├── backend/ # API Express
│ ├── src/
│ │ ├── controllers/
│ │ ├── routes/
│ │ ├── services/ # contact, visits, stars
│ │ ├── middleware/ # error, rate-limit, sanitize
│ │ └── server.js
│ └── .env.example
│
├── public/ # Archivos estaticos compartidos
│ ├── certificates/ # PDFs de certificados
│ └── images/ # Fotos del desarrollador
│
└── pnpm-workspace.yaml
/public/certificates se cargan y renderizan automaticamente sin configuracion adicional.git clone https://github.com/Luis000923/backend-cybersecurity-portfolio.git
cd backend-cybersecurity-portfolio
pnpm install
Copia el archivo de ejemplo y completa con tus credenciales:
cp backend/.env.example backend/.env
Variables requeridas:
NODE_ENV=development
MAIL_HOST=smtp.tuproveedor.com
MAIL_PORT=465
MAIL_SECURE=true
MAIL_USER=tu@dominio.com
MAIL_PASS="tu-contrasena"
MAIL_FROM=tu@dominio.com
MAIL_TO=tu-correo-destino@gmail.com
CORS_ORIGIN=http://localhost:4321
Nota: si la contrasena contiene caracteres especiales como
#, encierra el valor entre comillas dobles en el.env.
pnpm run dev
Esto levanta en paralelo:
http://localhost:4321http://localhost:3000| Medida | Implementacion |
|---|---|
| HTTP Headers | Helmet con CSP restrictiva |
| CORS | Lista blanca por entorno via .env |
| Rate limiting | express-rate-limit por ruta (contact, visits) |
| Validacion de inputs | express-validator en todos los endpoints POST |
| Credenciales | Variables de entorno, nunca en codigo fuente |
| Certificados TLS | Conexion SMTP con SSL/TLS forzado (puerto 465) |
El proyecto esta desplegado en Hostinger con la siguiente separacion:
| Parte | Tipo | Notas |
|---|---|---|
| Frontend | Sitio estatico | Build con pnpm --filter frontend run build |
| Backend | Node.js (VPS/Business) | Proceso persistente con PM2 o equivalente |
Para construir el frontend:
pnpm --filter frontend run build
El directorio frontend/dist/ contiene los archivos listos para subir al servidor web.
Los certificados se sirven como archivos estaticos desde /public/certificates/. Para agregar un nuevo certificado, basta con colocar el archivo PDF en esa carpeta. El componente CertificateCard.astro lo detecta y renderiza automaticamente en la pagina /certificates.
No requiere autenticacion ni base de datos.
MIT — uso libre con atribucion.