Sitio web oficial de la Fundación Equitracción - Gestión forestal sostenible con tracción equina y desarrollo personal transformador.
- Diseño Dual B2B/B2C - Sistema de diseño adaptable según el tipo de servicio
- Blog Dinámico - Sistema de gestión de contenidos con Supabase
- Formularios Funcionales - Contacto y newsletter integrados
- SEO Optimizado - Sitemap, robots.txt, meta tags y Schema.org
- Seguridad Robusta - JWT, rate limiting, validación de inputs
- Admin Panel - Panel de administración protegido para gestión de contenidos
- Framework: Astro 5.x (SSR híbrido)
- Estilos: Tailwind CSS 4.x
- Base de Datos: Supabase
- Autenticación: JWT + httpOnly cookies
- Tipografía: Crimson Pro & Crimson Text (Google Fonts)
- Hosting: Vercel / Netlify / VPS
/
├── public/ # Assets estáticos
├── src/
│ ├── components/ # Componentes Astro reutilizables
│ ├── layouts/ # Layouts base
│ ├── pages/ # Páginas del sitio
│ │ ├── api/ # Endpoints de API
│ │ └── admin/ # Panel de administración
│ ├── lib/ # Utilidades y lógica
│ │ ├── auth/ # Autenticación JWT
│ │ ├── validation/ # Validación y sanitización
│ │ └── security/ # Rate limiting
│ └── styles/ # Estilos globales
├── scripts/ # Scripts de deployment
├── .env.example # Template de variables de entorno
├── PRODUCTION_SETUP.md # Guía de configuración de producción
├── SECURITY.md # Documentación de seguridad
└── package.json
- Node.js 18 o superior
- npm o pnpm
- Cuenta de Supabase (para backend)
- Clonar el repositorio:
git clone https://github.com/tu-usuario/equitraccion.git
cd equitraccion/website- Instalar dependencias:
npm install- Configurar variables de entorno:
cp .env.example .envEdita .env con tus credenciales (ver Variables de Entorno).
- Configurar Supabase:
Consulta SUPABASE_SETUP.md para crear las tablas necesarias.
- Iniciar servidor de desarrollo:
npm run devAbre http://localhost:4321 en tu navegador.
Variables críticas para el funcionamiento del sitio:
# Supabase
SUPABASE_URL=https://tu-proyecto.supabase.co
SUPABASE_ANON_KEY=tu_clave_anonima
SUPABASE_SERVICE_ROLE_KEY=tu_clave_de_servicio
# Autenticación
JWT_SECRET=secreto_de_32_caracteres_minimo
ADMIN_EMAIL=admin@equitraccion.com
ADMIN_PASSWORD=hash_bcrypt_de_la_contraseña
# Sitio
SITE_URL=https://equitraccion.com
NODE_ENV=production
# Seguridad
SESSION_SECRET=secreto_de_sesion_32_caracteres
RATE_LIMIT_MAX=100
RATE_LIMIT_WINDOW=900000PRODUCTION_SETUP.md para instrucciones detalladas sobre cómo generar valores seguros.
# Desarrollo
npm run dev # Iniciar servidor de desarrollo
# Build
npm run build # Compilar para producción
npm run preview # Previsualizar build de producción
# Verificación
npm run verify-env # Verificar configuración de variables
npm run check # Verificar código Astro
npm run security-audit # Auditoría de seguridad de dependencias
# Pre-deployment
npm run pre-deploy # Verificar config + buildEl sitio implementa múltiples capas de seguridad:
- ✅ Autenticación JWT con cookies httpOnly
- ✅ Rate limiting (login, API, formularios)
- ✅ Headers de seguridad HTTP (CSP, HSTS, X-Frame-Options, etc.)
- ✅ Validación y sanitización de inputs
- ✅ Protección contra XSS, CSRF, SQL Injection
- ✅ Contraseñas hasheadas con bcrypt
Documentación completa: Ver SECURITY.md
- Verificar configuración:
npm run verify-env- Auditoría de seguridad:
npm run security-audit- Build de prueba:
npm run build
npm run preview- Desplegar:
Vercel (Recomendado):
vercel --prodNetlify:
netlify deploy --prodVPS:
Consulta PRODUCTION_SETUP.md → Opción C
- PRODUCTION_SETUP.md - Guía completa de despliegue
- SECURITY.md - Documentación de seguridad
- SUPABASE_SETUP.md - Configuración de base de datos
/- Home/fundacion- Sobre la fundación/servicios-forestales- Servicios B2B/desarrollo-personal- Servicios B2C/formacion- Cursos y talleres/blog- Blog/contacto- Formulario de contacto/legal- Aviso legal/privacidad- Política de privacidad/cookies- Política de cookies
/admin/login- Login de administrador/admin/posts- Gestión de blog posts/admin/posts/new- Crear nuevo post/admin/posts/edit/[id]- Editar post
El sitio usa tres modos visuales:
-
B2B (Servicios Forestales)
- Colores: Tierra, marrón oscuro
- Tono: Profesional, técnico
-
B2C (Desarrollo Personal)
- Colores: Verde, tonos cálidos
- Tono: Personal, emocional
-
Hybrid (Home, Blog, Fundación)
- Fusión de ambos estilos
- Equilibrio profesional/personal
- Headings: Crimson Pro (serif elegante)
- Body: Crimson Text (legibilidad óptima)
--color-brand-primary: #8B4513 (marrón tierra)
--color-brand-secondary: #D2691E (marrón cálido)
--color-accent-green: #6B8E23 (verde oliva)
--color-accent-warm: #CD853F (beige tostado)- Crear archivo en
src/pages/:
---
import BaseLayout from '../layouts/BaseLayout.astro';
import Header from '../components/Header.astro';
import Footer from '../components/Footer.astro';
---
<BaseLayout
title="Título | Equitracción"
description="Descripción para SEO"
mode="hybrid"
>
<Header mode="hybrid" />
<main>
<!-- Contenido -->
</main>
<Footer />
</BaseLayout>- Añadir al menú en
src/components/Header.astro
- Crear archivo en
src/pages/api/:
import type { APIRoute } from 'astro';
export const POST: APIRoute = async ({ request }) => {
// Lógica del endpoint
return new Response(JSON.stringify({ success: true }), {
status: 200,
headers: { 'Content-Type': 'application/json' }
});
};- Aplicar rate limiting si es necesario (ver ejemplos en
src/pages/api/auth/)
Las rutas bajo /admin/* se protegen automáticamente con el middleware.
Para verificar autenticación en una página:
---
import { isAuthenticated, getAuthenticatedUser } from '../lib/auth/jwt';
if (!isAuthenticated(Astro)) {
return Astro.redirect('/admin/login');
}
const user = getAuthenticatedUser(Astro);
---Solución: Verificar que ADMIN_EMAIL y ADMIN_PASSWORD estén en .env
Solución: Verificar que todas las variables SUPABASE_* estén configuradas
Solución: En producción con múltiples servidores, implementar Redis para almacenamiento compartido
Solución: Verificar que el middleware esté activo en src/middleware.ts
- Email: info@equitraccion.com
- Teléfono: +34 681 298 028
- Web: https://equitraccion.com
Copyright © 2025 Fundación Equitracción. Todos los derechos reservados.
Última actualización: 2025-01-06