Inna 9390eefa93 Correos: portar el diseño del tema y unificarlos en lib/emails.ts
Los correos usaban un shell inline distinto en cada remitente. Ahora salen
todos de una sola maqueta, la de security_token, portada de las plantillas de
Django. De las 7 de Django solo security_token y activation traían el diseño;
las otras 5 eran HTML soso.

Las plantillas de Django eran un volcado del DOM de Gmail. Al portarlas se
quitó lo que no era diseño: los enlaces iban envueltos en el rastreador de
Mailjet (079xk.mjt.lu), que además redirigía a ultimowow.com en vez de a
nosotros; había un píxel de apertura, un "Click on me" oculto y atributos que
mete Gmail al mostrar el correo. Las imágenes apuntaban al proxy de Gmail
(ci3.googleusercontent.com), no a nuestro /static/, así que el diseño se
rompía el día que Google dejara de servirlas.

Ninguna URL va a fuego: todas cuelgan de SITE_URL, así que cambiar de dominio
es tocar el .env. En un correo han de ser absolutas (se abre desde Gmail), así
que se construyen a partir de esa variable.

El logo nw-mail-logo.png daba 404: solo existía el .webp del tema, que es el de
UltimoWoW (león negro + letras "UW"). El auténtico de NovaWoW, un león de acero
sin letras, sobrevivía únicamente en la caché de Gmail y se recuperó de ahí
(600x320 RGBA, íntegro).

Verificado renderizando el original y el nuestro en un navegador y comparando:
cuadran pixel a pixel. Eso destapó dos fallos que se corrigen aquí: faltaba la
etiqueta <h1> de apertura, y el estilo de los párrafos de datos era el de la
letra pequeña del pie (11px/17px) en vez del real (14px/21px).

El activation de Django mandaba la contraseña en texto plano; aquí no se manda.

mail.ts: leía EMAIL_USE_SSL pero ignoraba EMAIL_USE_TLS, así que en el puerto
587 el STARTTLS era oportunista y, si el servidor no lo ofrecía, nodemailer
enviaba en claro. Ahora requireTLS lo hace obligatorio.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 14:33:32 +00:00
2024-11-12 09:16:30 +01:00
2024-11-12 09:17:08 +01:00
2024-11-12 09:17:08 +01:00

Nova WoW

Portal web (Django) para un servidor de World of Warcraft 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)

1. Requisitos

  • Python 3.14 y venv
  • MySQL/MariaDB accesible
  • Librerías de sistema para compilar algunas dependencias:
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)

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

La app queda en http://127.0.0.1:8000


3. Configuración (.env)

Toda la configuración sensible se lee de variables de entorno mediante python-dotenv. Copia .env.example a .env y rellena los valores. El .env no se versiona.

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).

Generar una SECRET_KEY nueva:

python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"

4. Producción

# 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

Recomendaciones:

  • 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.

5. Docker

Alternativamente, se puede levantar todo con Docker (web + MySQL):

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.
S
Description
Importado desde GitHub adevopg/NovaWoW
Readme 264 MiB
Languages
Macaulay2 97.3%
TypeScript 2.3%
CSS 0.3%