Jubilar Django: borrar el portal antiguo, la web ya la sirve Next
El cutover se hizo hoy: Caddy manda www.nightspire.gg a :3001 (Next), así que Django se quedó sin dominio y sin uso. Se comprobó antes de borrar que nada dependía de él: ninguna referencia a :8001 en Caddy, el timer de reconciliación llama a Next, DJANGO_API_BASE no lo leía ni una línea del código (se quita también de la unidad de systemd), web-next/public es autónomo (736 ficheros reales, 0 symlinks) y no hay ni una referencia a /static/. Con Django parado la web siguió dando 200 en todas las rutas. Se va: home/, novawow/, forum/, wotlk_db/, frontend/ (las islas React que Next sustituyó), static/, staticfiles/, manage.py, requirements.txt, db.sqlite3 y el Docker de Django. Se quedan docs/ y sql/: no son código Django sino documentación y esquemas, y sql/forum_schema.sql describe la BD acore_web que Next usa hoy. La BASE DE DATOS no se toca. django_wow y sus 41 tablas home_* son ahora de Next, que las consulta con SQL directo. El nombre se queda por historia. README reescrito: describía cómo montar un Django que ya no existe (venv, manage.py migrate, gunicorn, Docker). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,115 +1,82 @@
|
||||
# Nova WoW
|
||||
|
||||
Portal web (Django) para un servidor de World of Warcraft basado en AzerothCore.
|
||||
Portal web para un servidor de World of Warcraft 3.4.3 basado en AzerothCore.
|
||||
|
||||
- **Python:** 3.14
|
||||
- **Framework:** Django 6.0
|
||||
- **Base de datos:** MySQL (4 bases: la del portal `django_wow` + las de AzerothCore `acore_auth`, `acore_characters`, `acore_world`)
|
||||
- **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` y sus tablas `home_*` por motivos históricos: el
|
||||
> portal era una app Django, jubilada el 2026-07-15. El código se borró (está en el historial de git),
|
||||
> pero **las tablas son las mismas y siguen en uso**: Next las consulta con SQL directo, sin ORM.
|
||||
|
||||
---
|
||||
|
||||
## 1. Requisitos
|
||||
|
||||
- Python 3.14 y `venv`
|
||||
- MySQL/MariaDB accesible
|
||||
- Librerías de sistema para compilar algunas dependencias:
|
||||
|
||||
```bash
|
||||
sudo apt install python3.14-venv python3.14-dev build-essential pkg-config \
|
||||
default-libmysqlclient-dev libgmp-dev libmpfr-dev libmpc-dev libjpeg-dev zlib1g-dev
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Puesta en marcha (desarrollo)
|
||||
## 1. Puesta en marcha (desarrollo)
|
||||
|
||||
```bash
|
||||
git clone https://git.nightspire.gg/Inna/NovaWoW.git
|
||||
cd NovaWoW
|
||||
|
||||
# Entorno virtual
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
|
||||
# Variables de entorno
|
||||
cp .env.example .env
|
||||
# edita .env con tus credenciales reales (ver sección 3)
|
||||
|
||||
# Migraciones y arranque
|
||||
python manage.py migrate
|
||||
python manage.py createsuperuser # opcional
|
||||
python manage.py runserver
|
||||
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
|
||||
```
|
||||
|
||||
La app queda en http://127.0.0.1:8000
|
||||
## 2. Configuración (`web-next/.env.local`)
|
||||
|
||||
---
|
||||
|
||||
## 3. Configuración (`.env`)
|
||||
|
||||
Toda la configuración sensible se lee de variables de entorno mediante
|
||||
[python-dotenv](https://pypi.org/project/python-dotenv/). Copia `.env.example`
|
||||
a `.env` y rellena los valores. **El `.env` no se versiona.**
|
||||
**No se versiona** (contiene secretos).
|
||||
|
||||
| Variable | Descripción |
|
||||
|---|---|
|
||||
| `DJANGO_SECRET_KEY` | Clave secreta de Django. Genera una nueva (ver abajo). |
|
||||
| `DJANGO_DEBUG` | `True` en desarrollo, `False` en producción. |
|
||||
| `DB_USER` / `DB_PASSWORD` | Credenciales MySQL (compartidas por las 4 BBDD). |
|
||||
| `DB_HOST` / `DB_PORT` | Host y puerto de MySQL. |
|
||||
| `DB_NAME_DEFAULT` | BD del portal (por defecto `django_wow`). |
|
||||
| `DB_NAME_AUTH` / `DB_NAME_CHARACTERS` / `DB_NAME_WORLD` | BBDD de AzerothCore. |
|
||||
| `AC_SOAP_*` | Conexión SOAP a AzerothCore (crear cuentas, etc.). |
|
||||
| `SUMUP_*` / `STRIPE_*` | Pasarelas de pago. |
|
||||
| `EMAIL_HOST_USER` / `EMAIL_HOST_PASSWORD` | SMTP de Gmail (App Password). |
|
||||
| `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 |
|
||||
|
||||
Generar una `SECRET_KEY` nueva:
|
||||
## 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
|
||||
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
|
||||
cd web-next && npm run build && systemctl restart novawow-next
|
||||
```
|
||||
|
||||
---
|
||||
## 4. Estructura
|
||||
|
||||
## 4. Producción
|
||||
|
||||
```bash
|
||||
# Recopilar estáticos
|
||||
python manage.py collectstatic --noinput
|
||||
|
||||
# Servir con gunicorn (4 workers)
|
||||
gunicorn novawow.wsgi:application --bind 0.0.0.0:8000 --workers 4
|
||||
```
|
||||
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.)
|
||||
```
|
||||
|
||||
Recomendaciones:
|
||||
## 5. Notas
|
||||
|
||||
- `DJANGO_DEBUG=False` y una `DJANGO_SECRET_KEY` propia y secreta.
|
||||
- Poner **Nginx** delante como proxy inverso y para servir `staticfiles/`.
|
||||
- Revisar `ALLOWED_HOSTS` y `CSRF_TRUSTED_ORIGINS` en `novawow/settings.py`.
|
||||
- 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
|
||||
|
||||
## 5. Docker
|
||||
|
||||
Alternativamente, se puede levantar todo con Docker (web + MySQL):
|
||||
|
||||
```bash
|
||||
cp .env.example .env # ajusta los secretos (no las variables DB_*, las fija compose)
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
- La web queda en http://127.0.0.1:8000
|
||||
- El servicio `db` crea automáticamente las 4 bases de datos.
|
||||
- El `entrypoint` espera a MySQL, aplica migraciones y recopila estáticos antes de arrancar gunicorn.
|
||||
|
||||
Ver `docker-compose.yml` y `Dockerfile` para los detalles.
|
||||
|
||||
---
|
||||
|
||||
## 6. Notas de seguridad
|
||||
|
||||
- Los secretos que estuvieron hardcodeados en el historial de git deben **rotarse**
|
||||
(contraseña MySQL/SOAP, App Password de Gmail, claves de Stripe/SumUp).
|
||||
- Nunca subas el archivo `.env` al repositorio.
|
||||
- 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.
|
||||
|
||||
Reference in New Issue
Block a user