67656fa32d
Se añade la integración del script de Monetag (MultiTag: popunder + push + in-page push + vignette) como alternativa a AdSense para monetizar sin depender de que Google apruebe el sitio. Tres interruptores (ver components/Monetag.tsx): 1. `MONETAG_SRC` + `MONETAG_ZONE` en el .env (no versionadas, documentadas en el README). Cualquiera de las dos vacía = no se carga nada. Se leen en el servidor y se pasan como props, así que encender/apagar es tocar el .env + reiniciar, SIN rebuild. Ahora mismo van vacías: la integración queda instalada pero inerte hasta que se pegue la zona del panel de Monetag. 2. El filtro común de publicidad, extraído a lib/ads.ts (`shouldServeAds`): fuera para admins y para quien sea rango 2+ o haya pagado alguna vez. Antes esta lógica vivía dentro de AdSense.tsx; ahora la comparten la etiqueta de AdSense y el script de Monetag desde un único sitio, para que no se puedan desincronizar. 3. El consentimiento «Marketing» del banner, en components/MonetagScript.tsx (cliente). A diferencia de la etiqueta de AdSense, MultiTag escribe cookies y pide permisos, así que NO puede cargarse sin aceptar la categoría. Mismo patrón que Analytics.tsx: useConsent reacciona en caliente, arranca en false. El push de MultiTag necesitará además un sw.js servido desde la raíz del dominio (public/sw.js, descargado del panel). Sin él, el resto de formatos funcionan igual. Verificado: con las variables vacías la web queda idéntica (ni script de Monetag ni cambios) y la etiqueta de AdSense sigue intacta. Con una zona de prueba, el filtro de servidor deja pasar a anónimos y rango 1 sin pagos, y corta a los admins. Sin consentimiento no se inyecta ningún <script> (la zona solo viaja como prop inerte en el payload de React). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
86 lines
4.7 KiB
Markdown
86 lines
4.7 KiB
Markdown
# Nova WoW
|
|
|
|
Portal web para un servidor de World of Warcraft 3.4.3 basado en AzerothCore.
|
|
|
|
- **Framework:** Next.js 16 (App Router) + Tailwind, en `web-next/`
|
|
- **Idiomas:** ES/EN con next-intl
|
|
- **Bases de datos (MySQL):** `django_wow` (la del portal), `acore_auth`, `acore_characters`,
|
|
`acore_world` y `acore_web` (el foro)
|
|
|
|
> La base del portal se sigue llamando `django_wow` por motivos históricos: el portal era una app
|
|
> Django, jubilada el 2026-07-15. Sus tablas llevaban el prefijo `home_` (el nombre de la app) y se
|
|
> renombraron sin él (`home_stripelog` → `stripelog`). Next las consulta con SQL directo, sin ORM.
|
|
|
|
---
|
|
|
|
## 1. Puesta en marcha (desarrollo)
|
|
|
|
```bash
|
|
git clone https://git.nightspire.gg/Inna/NovaWoW.git
|
|
cd NovaWoW/web-next
|
|
npm install
|
|
# crear .env.local con las variables de la sección 2
|
|
npm run dev # http://127.0.0.1:3000
|
|
```
|
|
|
|
## 2. Configuración (`web-next/.env.local`)
|
|
|
|
**No se versiona** (contiene secretos).
|
|
|
|
| Variable | Descripción |
|
|
|---|---|
|
|
| `DB_USER` / `DB_PASSWORD` / `DB_HOST` / `DB_PORT` | Credenciales MySQL (compartidas por las 5 BBDD) |
|
|
| `DB_NAME_DEFAULT` | BD del portal (`django_wow`) |
|
|
| `DB_NAME_AUTH` / `DB_NAME_CHARACTERS` / `DB_NAME_WORLD` / `DB_NAME_WEB` | BBDD de AzerothCore y del foro |
|
|
| `SESSION_SECRET` | Firma de la sesión |
|
|
| `SITE_URL` | Raíz pública del sitio. **De aquí cuelgan todos los enlaces e imágenes de los correos**, así que cambiar de dominio es tocar solo esta variable |
|
|
| `EMAIL_*` | SMTP (hoy Proton Mail, `smtp.protonmail.ch:587` con STARTTLS). `EMAIL_HOST_USER` es además el remitente, y Proton exige que coincida con la dirección del token |
|
|
| `AC_SOAP_*` | Conexión SOAP a AzerothCore (envío de ítems, etc.) |
|
|
| `STRIPE_*` / `SUMUP_*` | Pasarelas de pago |
|
|
| `NEXT_PUBLIC_TURNSTILE_SITE_KEY` / `TURNSTILE_SECRET_KEY` | Captcha de Cloudflare |
|
|
| `ADMIN_EMAILS` / `ADMIN_GMLEVEL` | Acceso al panel de administración |
|
|
| `CRON_SECRET` | Protege el endpoint de reconciliación de SumUp |
|
|
| `NEXT_PUBLIC_GA_ID` | Google Analytics 4 (p. ej. `G-XXXXXXXXXX`). **Vacío o sin poner = analítica desactivada**, no se carga nada. Además, aunque esté puesta, solo se carga si el visitante acepta la categoría «Analíticas» del banner de cookies. Al ser `NEXT_PUBLIC_*` se incrusta en el build: activar o desactivar exige `npm run build` + reinicio |
|
|
| `MONETAG_SRC` / `MONETAG_ZONE` | Script de anuncios de Monetag (MultiTag). Salen del panel: Sites → canal → Get Tag; el `src` varía por zona. **Cualquiera de las dos vacía = anuncios desactivados**. Aunque estén puestas, solo se cargan si el visitante acepta la categoría «Marketing» del banner y pasa el filtro de `lib/ads.ts`. El push necesita además `public/sw.js` del panel. Se leen en el servidor: activar/desactivar **sin rebuild** |
|
|
| `ADSENSE_CLIENT_ID` | ID de editor de Google AdSense (`ca-pub-...`). Emite `<meta name="google-adsense-account">` en el `<head>` de todas las páginas. **Vacío o sin poner = etiqueta desactivada**. No la ven ni los admins ni las cuentas de rango 2+ o que hayan pagado alguna vez (ver `components/AdSense.tsx`). Se lee en el servidor en cada petición: activar o desactivar es tocar el `.env` + reinicio, **sin rebuild** |
|
|
|
|
## 3. Producción
|
|
|
|
- **Servicio:** `novawow-next.service` → `next start -p 3001`
|
|
- **Proxy:** Caddy. `nightspire.gg` redirige a `www.nightspire.gg`, que va a `127.0.0.1:3001`;
|
|
`next.nightspire.gg` apunta al mismo sitio.
|
|
- **Timer:** `novawow-dpoints-reconcile.timer` llama cada 2 min a `/api/dpoints/reconcile`
|
|
(SumUp no manda webhooks, así que se reconcilia sondeando).
|
|
|
|
```bash
|
|
cd web-next && npm run build && systemctl restart novawow-next
|
|
```
|
|
|
|
## 4. Estructura
|
|
|
|
```
|
|
web-next/
|
|
app/[locale]/ páginas (una carpeta por ruta)
|
|
components/ componentes React
|
|
lib/ acceso a datos y lógica (SQL directo, sin ORM)
|
|
messages/ traducciones ES/EN
|
|
public/ estáticos, incluido el tema nw-ryu
|
|
sql/db2/ utilidades para leer los DB2 del cliente 3.4.3
|
|
docs/ documentación (foro, migración a 3.4.3)
|
|
sql/ esquemas y semillas (foro, precios, etc.)
|
|
```
|
|
|
|
## 5. Notas
|
|
|
|
- En 3.4.3 **no existe `item_template`**: los datos de ítems salen de los `.db2` del cliente
|
|
(ver `web-next/sql/db2/`).
|
|
- La tienda vive en `/store-<realm>` en minúsculas (p. ej. `/store-trinity`); `/store` a secas da 404.
|
|
- Los correos se construyen en `web-next/lib/emails.ts`: una sola maqueta compartida por las 8
|
|
plantillas, con todas las URLs derivadas de `SITE_URL`.
|
|
|
|
## 6. Seguridad
|
|
|
|
- Los secretos que estuvieron hardcodeados en el historial de git deben **rotarse**: contraseña de
|
|
MySQL/SOAP, credenciales SMTP y claves de Stripe/SumUp.
|
|
- Ni `.env.local` ni ningún fichero con secretos se versionan.
|