Sitio web profesional de Juan Oliver, desarrollado con Astro 5, Svelte 5 y Tailwind CSS v4. Optimizado para Azure Static Web Apps y Netlify con soporte híbrido (SSR).
Versión actual: 3.2.0
/servicios: catálogo detallado de servicios profesionales, renderizado con SSR e hidratado en cliente para mejor SEO y rendimiento./tienda: muestra exclusivamente productos y servicios locales; la integración con el catálogo externo de SYSCOM está implementada pero deshabilitada en producción.Clonar el repositorio
git clone https://github.com/juanoliver/juanoliver-web.git
cd juanoliver-web
Instalar dependencias
pnpm install
Configurar variables de entorno
Copiar .env.example a .env y rellenar los datos de Turso:
cp .env.example .env
Variables requeridas:
TURSO_DATABASE_URL="libsql://..."
TURSO_AUTH_TOKEN="..."
Generar migraciones de base de datos
pnpm db:generate
Si tienes acceso a la BD, puedes sincronizar:
pnpm db:push
Iniciar servidor de desarrollo
pnpm dev
El sitio estará disponible en http://localhost:4321
pnpm dev # Servidor de desarrollo
pnpm build # Compilar para producción
pnpm preview # Vista previa de la build
pnpm check # Validación de tipos TypeScript
pnpm db:generate # Generar migraciones de Drizzle
pnpm db:push # Aplicar cambios directamente a BD
pnpm db:studio # Abrir Drizzle Studio (GUI)
pnpm db:seed # Poblar BD con datos de ejemplo
pnpm netlify:sync-env # Sincronizar .env a Netlify
pnpm social:sync-secrets # Sincronizar .env a GitHub Secrets
Este proyecto está configurado para Azure Static Web Apps en modo Híbrido.
Crear un Azure Static Web App
Configurar las siguientes variables de entorno:
TURSO_DATABASE_URLTURSO_AUTH_TOKENEl archivo staticwebapp.config.json maneja:
El proyecto también soporta despliegue en Netlify:
netlify.toml contiene la configuración de buildEl workflow CI/CD se ejecuta automáticamente:
main: Deploy a producciónstaticwebapp.config.json.env{
"Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
"Content-Security-Policy": "...",
"X-Frame-Options": "SAMEORIGIN",
"X-Content-Type-Options": "nosniff",
"Referrer-Policy": "strict-origin-when-cross-origin",
"Permissions-Policy": "camera=(), microphone=(), geolocation=(), payment=()",
"X-XSS-Protection": "1; mode=block"
}
juanoliver-web/
├── .github/
│ ├── workflows/ # GitHub Actions CI/CD
│ └── instructions/ # Reglas de Snyk
├── public/
│ └── robots.txt # SEO
├── src/
│ ├── components/ # Componentes Astro/Svelte
│ ├── content/
│ │ ├── blog/ # Artículos MDX
│ │ └── docs/ # Documentación Starlight
│ ├── db/ # Drizzle ORM schema & client
│ ├── layouts/ # Layouts de Astro
│ ├── pages/ # Rutas del sitio
│ ├── services/ # Lógica de negocio
│ └── styles/ # CSS global
├── astro.config.mjs # Configuración Astro
├── drizzle.config.ts # Configuración Drizzle
├── staticwebapp.config.json # Azure SWA config
├── tailwind.config.mjs # Configuración Tailwind
└── tsconfig.json # TypeScript config
--color-security-blue: #001a5a --color-security-blue-light: #4a72b2
--color-security-red: #981628 --color-security-yellow: #d19219
--color-security-gray-bg: #d8d8d8 --color-security-gray-text: #656565;
MIT License - Ver archivo LICENSE para más detalles.
Las contribuciones son bienvenidas. Por favor:
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Juan Oliver
© 2025 Juan Oliver. Todos los derechos reservados.