443 lines
8.8 KiB
Markdown
443 lines
8.8 KiB
Markdown
|
|
# 🚀 Guía Rápida de Deployment - AmayoWeb
|
||
|
|
|
||
|
|
## Pre-requisitos
|
||
|
|
|
||
|
|
- [ ] Node.js 18+ instalado
|
||
|
|
- [ ] npm o pnpm
|
||
|
|
- [ ] Cuenta de Cloudflare configurada
|
||
|
|
- [ ] Dominio configurado (docs.amayo.dev, api.amayo.dev)
|
||
|
|
- [ ] Servidor VPS (opcional, si usas Nginx)
|
||
|
|
|
||
|
|
## 📦 1. Frontend (AmayoWeb)
|
||
|
|
|
||
|
|
### Instalación
|
||
|
|
```bash
|
||
|
|
cd AmayoWeb
|
||
|
|
npm install
|
||
|
|
```
|
||
|
|
|
||
|
|
### Variables de Entorno
|
||
|
|
Crear `.env` en `AmayoWeb/`:
|
||
|
|
```env
|
||
|
|
VITE_DISCORD_CLIENT_ID=991062751633883136
|
||
|
|
VITE_APP_VERSION=2.0.0
|
||
|
|
```
|
||
|
|
|
||
|
|
### Build de Producción
|
||
|
|
```bash
|
||
|
|
npm run build
|
||
|
|
```
|
||
|
|
|
||
|
|
Esto genera la carpeta `dist/` lista para deployment.
|
||
|
|
|
||
|
|
### Deployment en Vercel/Netlify
|
||
|
|
|
||
|
|
**Vercel:**
|
||
|
|
```bash
|
||
|
|
npm install -g vercel
|
||
|
|
vercel --prod
|
||
|
|
```
|
||
|
|
|
||
|
|
**Netlify:**
|
||
|
|
```bash
|
||
|
|
npm install -g netlify-cli
|
||
|
|
netlify deploy --prod --dir=dist
|
||
|
|
```
|
||
|
|
|
||
|
|
### Deployment Manual (VPS con Nginx)
|
||
|
|
```bash
|
||
|
|
# Copiar archivos al servidor
|
||
|
|
scp -r dist/* user@server:/var/www/docs.amayo.dev/
|
||
|
|
|
||
|
|
# Configurar Nginx (ver NGINX_CONFIG.md en README/)
|
||
|
|
sudo nano /etc/nginx/sites-available/docs.amayo.dev
|
||
|
|
sudo ln -s /etc/nginx/sites-available/docs.amayo.dev /etc/nginx/sites-enabled/
|
||
|
|
sudo nginx -t
|
||
|
|
sudo systemctl reload nginx
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🔐 2. Backend Security Setup
|
||
|
|
|
||
|
|
### A. Configurar Cloudflare
|
||
|
|
|
||
|
|
1. **Login a Cloudflare Dashboard**
|
||
|
|
- Ir a tu dominio
|
||
|
|
|
||
|
|
2. **SSL/TLS**
|
||
|
|
- Modo: `Full (strict)`
|
||
|
|
- Always Use HTTPS: `On`
|
||
|
|
- Minimum TLS Version: `1.2`
|
||
|
|
|
||
|
|
3. **Firewall Rules**
|
||
|
|
|
||
|
|
**Regla 1: Bloquear bots maliciosos**
|
||
|
|
```
|
||
|
|
Campo: User Agent
|
||
|
|
Operador: contains
|
||
|
|
Valor: curl|wget|python|scrapy
|
||
|
|
Acción: Block
|
||
|
|
```
|
||
|
|
|
||
|
|
**Regla 2: Rate limiting**
|
||
|
|
```
|
||
|
|
Campo: Request Rate
|
||
|
|
Operador: greater than
|
||
|
|
Valor: 30 requests per minute
|
||
|
|
Acción: Challenge
|
||
|
|
```
|
||
|
|
|
||
|
|
**Regla 3: Validar headers**
|
||
|
|
```
|
||
|
|
Campo: X-Requested-With
|
||
|
|
Operador: does not equal
|
||
|
|
Valor: XMLHttpRequest
|
||
|
|
Acción: Block
|
||
|
|
```
|
||
|
|
|
||
|
|
4. **Security Settings**
|
||
|
|
- Security Level: `High`
|
||
|
|
- Bot Fight Mode: `On`
|
||
|
|
- Challenge Passage: `30 minutes`
|
||
|
|
|
||
|
|
5. **Rate Limiting**
|
||
|
|
```
|
||
|
|
/api/auth/* - 3 requests/minute per IP
|
||
|
|
/api/* - 30 requests/minute per IP
|
||
|
|
```
|
||
|
|
|
||
|
|
6. **Page Rules**
|
||
|
|
```
|
||
|
|
docs.amayo.dev/*
|
||
|
|
- Cache Level: Standard
|
||
|
|
- Browser Cache TTL: 4 hours
|
||
|
|
- Always Online: On
|
||
|
|
|
||
|
|
api.amayo.dev/*
|
||
|
|
- Cache Level: Bypass
|
||
|
|
- Security Level: High
|
||
|
|
```
|
||
|
|
|
||
|
|
### B. Actualizar archivo de configuración
|
||
|
|
|
||
|
|
Editar `AmayoWeb/public/.well-known/api-config.json`:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"endpoint": "https://api.amayo.dev/api",
|
||
|
|
"version": "2.0.0",
|
||
|
|
"features": {
|
||
|
|
"rateLimit": true,
|
||
|
|
"cors": true,
|
||
|
|
"csrf": true
|
||
|
|
},
|
||
|
|
"security": {
|
||
|
|
"requiresToken": true,
|
||
|
|
"allowedOrigins": [
|
||
|
|
"https://docs.amayo.dev",
|
||
|
|
"https://amayo.dev"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🖥️ 3. Backend (Node.js/Express)
|
||
|
|
|
||
|
|
### Instalar Dependencias
|
||
|
|
```bash
|
||
|
|
npm install helmet express-rate-limit cors winston
|
||
|
|
```
|
||
|
|
|
||
|
|
### Crear Middleware de Seguridad
|
||
|
|
|
||
|
|
**`middleware/security.js`:**
|
||
|
|
```javascript
|
||
|
|
import rateLimit from 'express-rate-limit';
|
||
|
|
import helmet from 'helmet';
|
||
|
|
import cors from 'cors';
|
||
|
|
|
||
|
|
// CORS Configuration
|
||
|
|
export const corsOptions = {
|
||
|
|
origin: ['https://docs.amayo.dev', 'https://amayo.dev'],
|
||
|
|
credentials: true,
|
||
|
|
methods: ['GET', 'POST', 'PUT', 'DELETE'],
|
||
|
|
allowedHeaders: [
|
||
|
|
'Content-Type',
|
||
|
|
'Authorization',
|
||
|
|
'X-Client-Token',
|
||
|
|
'X-Requested-With',
|
||
|
|
'X-Timestamp'
|
||
|
|
]
|
||
|
|
};
|
||
|
|
|
||
|
|
// Rate Limiters
|
||
|
|
export const apiLimiter = rateLimit({
|
||
|
|
windowMs: 60 * 1000,
|
||
|
|
max: 30,
|
||
|
|
message: 'Too many requests'
|
||
|
|
});
|
||
|
|
|
||
|
|
export const authLimiter = rateLimit({
|
||
|
|
windowMs: 60 * 1000,
|
||
|
|
max: 3,
|
||
|
|
skipSuccessfulRequests: true
|
||
|
|
});
|
||
|
|
|
||
|
|
// Cloudflare Validation
|
||
|
|
export const cloudflareOnly = (req, res, next) => {
|
||
|
|
const cfIp = req.headers['cf-connecting-ip'];
|
||
|
|
if (!cfIp) {
|
||
|
|
return res.status(403).json({ error: 'Direct access forbidden' });
|
||
|
|
}
|
||
|
|
next();
|
||
|
|
};
|
||
|
|
|
||
|
|
// Security Headers
|
||
|
|
export const securityHeaders = helmet({
|
||
|
|
hsts: { maxAge: 31536000, includeSubDomains: true, preload: true },
|
||
|
|
noSniff: true,
|
||
|
|
xssFilter: true,
|
||
|
|
frameguard: { action: 'deny' }
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
**Aplicar en `server.js`:**
|
||
|
|
```javascript
|
||
|
|
import express from 'express';
|
||
|
|
import cors from 'cors';
|
||
|
|
import {
|
||
|
|
corsOptions,
|
||
|
|
apiLimiter,
|
||
|
|
authLimiter,
|
||
|
|
cloudflareOnly,
|
||
|
|
securityHeaders
|
||
|
|
} from './middleware/security.js';
|
||
|
|
|
||
|
|
const app = express();
|
||
|
|
|
||
|
|
// Aplicar middlewares
|
||
|
|
app.use(securityHeaders);
|
||
|
|
app.use(cloudflareOnly);
|
||
|
|
app.use(cors(corsOptions));
|
||
|
|
|
||
|
|
// Rate limiting
|
||
|
|
app.use('/api/', apiLimiter);
|
||
|
|
app.use('/api/auth/', authLimiter);
|
||
|
|
|
||
|
|
// Ocultar información del servidor
|
||
|
|
app.disable('x-powered-by');
|
||
|
|
|
||
|
|
// Routes
|
||
|
|
app.use('/api/auth', authRoutes);
|
||
|
|
app.use('/api/bot', botRoutes);
|
||
|
|
|
||
|
|
// Error handler
|
||
|
|
app.use((err, req, res, next) => {
|
||
|
|
console.error(err);
|
||
|
|
res.status(500).json({ error: 'Internal server error' });
|
||
|
|
});
|
||
|
|
|
||
|
|
const PORT = process.env.PORT || 3000;
|
||
|
|
app.listen(PORT, () => {
|
||
|
|
console.log(`Server running on port ${PORT}`);
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🌐 4. Nginx Configuration (VPS)
|
||
|
|
|
||
|
|
Si usas VPS, configurar Nginx (ver `README/NGINX_SECURITY_CONFIG.md` para configuración completa):
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Descargar IPs de Cloudflare actualizadas
|
||
|
|
curl https://www.cloudflare.com/ips-v4 > /tmp/cloudflare-ips-v4.txt
|
||
|
|
curl https://www.cloudflare.com/ips-v6 > /tmp/cloudflare-ips-v6.txt
|
||
|
|
|
||
|
|
# Configurar Nginx
|
||
|
|
sudo nano /etc/nginx/sites-available/api.amayo.dev
|
||
|
|
|
||
|
|
# Testear configuración
|
||
|
|
sudo nginx -t
|
||
|
|
|
||
|
|
# Recargar
|
||
|
|
sudo systemctl reload nginx
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## ✅ 5. Verificación Post-Deployment
|
||
|
|
|
||
|
|
### Tests de Seguridad
|
||
|
|
|
||
|
|
**1. Verificar que el backend solo acepta requests de Cloudflare:**
|
||
|
|
```bash
|
||
|
|
# Esto debe fallar (403 Forbidden)
|
||
|
|
curl https://api.amayo.dev/api/bot/stats
|
||
|
|
|
||
|
|
# Esto debe funcionar (desde el navegador con el sitio)
|
||
|
|
# Abrir: https://docs.amayo.dev/docs
|
||
|
|
```
|
||
|
|
|
||
|
|
**2. Verificar Rate Limiting:**
|
||
|
|
```bash
|
||
|
|
# Hacer múltiples requests rápidos
|
||
|
|
for i in {1..35}; do
|
||
|
|
curl https://api.amayo.dev/api/bot/stats
|
||
|
|
done
|
||
|
|
# Debe dar error 429 después de 30 requests
|
||
|
|
```
|
||
|
|
|
||
|
|
**3. Verificar CORS:**
|
||
|
|
```bash
|
||
|
|
# Desde un dominio no permitido debe fallar
|
||
|
|
curl -H "Origin: https://evil.com" https://api.amayo.dev/api/bot/stats
|
||
|
|
```
|
||
|
|
|
||
|
|
**4. Verificar Headers de Seguridad:**
|
||
|
|
```bash
|
||
|
|
curl -I https://docs.amayo.dev/
|
||
|
|
# Debe incluir: X-Frame-Options, X-Content-Type-Options, etc.
|
||
|
|
```
|
||
|
|
|
||
|
|
### Tests Funcionales
|
||
|
|
|
||
|
|
**1. Navegación:**
|
||
|
|
- [ ] https://docs.amayo.dev/ carga correctamente
|
||
|
|
- [ ] https://docs.amayo.dev/docs muestra documentación
|
||
|
|
- [ ] https://docs.amayo.dev/terms muestra términos
|
||
|
|
- [ ] https://docs.amayo.dev/privacy muestra política de privacidad
|
||
|
|
- [ ] Sidebar de navegación funciona
|
||
|
|
- [ ] Scroll suave entre secciones
|
||
|
|
|
||
|
|
**2. Seguridad:**
|
||
|
|
- [ ] No se puede acceder directamente a la IP del backend
|
||
|
|
- [ ] Rate limiting funciona
|
||
|
|
- [ ] CORS configurado correctamente
|
||
|
|
- [ ] Headers de seguridad presentes
|
||
|
|
- [ ] SSL/TLS funcionando (candado verde)
|
||
|
|
|
||
|
|
**3. Performance:**
|
||
|
|
- [ ] Caché funcionando (verificar Network tab)
|
||
|
|
- [ ] Tiempos de carga < 2 segundos
|
||
|
|
- [ ] No errores en console
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📊 6. Monitoreo
|
||
|
|
|
||
|
|
### Configurar Alertas en Cloudflare
|
||
|
|
|
||
|
|
1. **Alertas de Seguridad:**
|
||
|
|
- Rate limiting exceeded
|
||
|
|
- Firewall events
|
||
|
|
- DDoS attacks
|
||
|
|
|
||
|
|
2. **Alertas de Rendimiento:**
|
||
|
|
- Origin response time
|
||
|
|
- Error rate increase
|
||
|
|
|
||
|
|
### Logs
|
||
|
|
|
||
|
|
**Backend logs:**
|
||
|
|
```bash
|
||
|
|
# Verificar logs de errores
|
||
|
|
tail -f /var/log/your-app/error.log
|
||
|
|
|
||
|
|
# Verificar logs de seguridad
|
||
|
|
tail -f /var/log/your-app/security.log
|
||
|
|
```
|
||
|
|
|
||
|
|
**Nginx logs:**
|
||
|
|
```bash
|
||
|
|
tail -f /var/log/nginx/api.amayo.dev.error.log
|
||
|
|
tail -f /var/log/nginx/api.amayo.dev.access.log
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🐛 Troubleshooting
|
||
|
|
|
||
|
|
### Frontend no carga
|
||
|
|
```bash
|
||
|
|
# Verificar que el build fue exitoso
|
||
|
|
cd AmayoWeb
|
||
|
|
npm run build
|
||
|
|
# Revisar carpeta dist/
|
||
|
|
|
||
|
|
# Verificar variables de entorno
|
||
|
|
cat .env
|
||
|
|
```
|
||
|
|
|
||
|
|
### API no responde
|
||
|
|
```bash
|
||
|
|
# Verificar que el servidor está corriendo
|
||
|
|
pm2 status
|
||
|
|
# o
|
||
|
|
systemctl status your-api-service
|
||
|
|
|
||
|
|
# Verificar logs
|
||
|
|
pm2 logs
|
||
|
|
```
|
||
|
|
|
||
|
|
### CORS errors
|
||
|
|
```bash
|
||
|
|
# Verificar configuración de CORS en backend
|
||
|
|
# Asegurarse que el dominio está en allowedOrigins
|
||
|
|
```
|
||
|
|
|
||
|
|
### Rate limiting muy restrictivo
|
||
|
|
```javascript
|
||
|
|
// Ajustar en backend/middleware/security.js
|
||
|
|
export const apiLimiter = rateLimit({
|
||
|
|
windowMs: 60 * 1000,
|
||
|
|
max: 60, // Aumentar de 30 a 60
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📝 Checklist Final
|
||
|
|
|
||
|
|
- [ ] Frontend deployed y accesible
|
||
|
|
- [ ] Backend deployed y protegido
|
||
|
|
- [ ] Cloudflare configurado correctamente
|
||
|
|
- [ ] SSL/TLS funcionando
|
||
|
|
- [ ] Rate limiting activo
|
||
|
|
- [ ] CORS configurado
|
||
|
|
- [ ] Headers de seguridad presentes
|
||
|
|
- [ ] Páginas legales accesibles
|
||
|
|
- [ ] Sidebar de navegación funciona
|
||
|
|
- [ ] No errores en console
|
||
|
|
- [ ] Logs configurados
|
||
|
|
- [ ] Alertas configuradas
|
||
|
|
- [ ] Variables de entorno configuradas
|
||
|
|
- [ ] Backup configurado
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎉 ¡Listo!
|
||
|
|
|
||
|
|
Tu sitio ahora está:
|
||
|
|
- ✅ Desplegado y funcional
|
||
|
|
- ✅ Seguro contra ataques comunes
|
||
|
|
- ✅ Protegido por Cloudflare
|
||
|
|
- ✅ Con páginas legales (GDPR compliant)
|
||
|
|
- ✅ Con diseño profesional
|
||
|
|
- ✅ Optimizado para performance
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📚 Documentación Adicional
|
||
|
|
|
||
|
|
- `README/SECURITY_BACKEND_GUIDE.md` - Guía completa de seguridad
|
||
|
|
- `README/NGINX_SECURITY_CONFIG.md` - Configuración de Nginx
|
||
|
|
- `README/CAMBIOS_NOVIEMBRE_2025.md` - Resumen de cambios
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Última actualización:** 6 de Noviembre, 2025
|
||
|
|
**Versión:** 2.0.0
|