# Deploy — Video Editor backend

Guía mínima para llevar el backend Django a un servidor real (probado para
shared/VPS estilo Hawkhost).

> Estado: setup base de **Fase 0.5**. El frontend, companion app y CDN
> entran en Fases 1+ del [`SAAS_WORKPLAN.md`](SAAS_WORKPLAN.md).

## 1. Requisitos del servidor

- Python 3.12 (mismo runtime que en dev, si hay diferencias documentar aquí).
- Postgres 14+ (recomendado; SQLite también funciona pero solo apto para 1 usuario).
- ffmpeg accesible en `PATH` (sin esto, las transcripciones y exports fallan).
- (Opcional) Nginx / Apache delante de gunicorn para terminación TLS si no
  vas a usar el reverse-proxy del proveedor.

## 2. Instalación de dependencias

```bash
git clone <repo> /srv/video-editor
cd /srv/video-editor
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r backend/requirements.txt
pip install -r backend/requirements-prod.txt   # añade postgres + gunicorn
```

## 3. Variables de entorno

Copia `.env.example` → `.env` (en raíz del repo o en `backend/`) y rellena:

| Variable | Obligatoria en prod | Notas |
|---|---|---|
| `DJANGO_ENV=production` | ✅ | Activa hardening + fail-fast |
| `SECRET_KEY` | ✅ | ≥50 chars random; **diferente** al de dev |
| `ALLOWED_HOSTS` | ✅ | Tu dominio público (`api.tuapp.com,tuapp.com`) |
| `BYOK_FERNET_KEY` | ✅ | Generar con `python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"` |
| `DATABASE_URL` | recomendada | `postgres://user:pass@host:5432/dbname` |
| `CORS_ALLOWED_ORIGINS` | ✅ si frontend en otro dominio | Con esquema `https://` |
| `DJANGO_USE_HTTPS=True` | ✅ si servís HTTPS | Activa SECURE_*, HSTS, cookies seguras |
| `OPENAI_API_KEY` | opcional | Fallback compartido cuando el usuario no trae BYOK |
| `LOG_DIR` | opcional | Directorio para `django.log` rotado |

> Si arranca y faltan `SECRET_KEY`, `ALLOWED_HOSTS` o `BYOK_FERNET_KEY`,
> el proceso aborta con un mensaje claro (intencional, no es un bug).

## 4. Migraciones y bootstrap

```bash
cd backend
python manage.py migrate --noinput
python manage.py collectstatic --noinput
python manage.py createsuperuser   # crea el primer admin
```

## 5. Servir con gunicorn

```bash
gunicorn config.wsgi:application \
  --bind 0.0.0.0:8000 \
  --workers 3 \
  --timeout 120 \
  --access-logfile - \
  --error-logfile -
```

Ajustes:
- `--workers`: regla de oro = `2 * núcleos + 1`.
- `--timeout 120` (default 30) porque algunos endpoints (transcribe,
  análisis IA, export prep) son largos.
- Para WebSockets / streaming SSE evaluar `uvicorn config.asgi:application`.

### systemd (ejemplo)

```ini
[Unit]
Description=Video Editor backend
After=network.target

[Service]
User=videoeditor
WorkingDirectory=/srv/video-editor/backend
EnvironmentFile=/srv/video-editor/.env
ExecStart=/srv/video-editor/.venv/bin/gunicorn config.wsgi:application \
  --bind unix:/run/videoeditor.sock --workers 3 --timeout 120
Restart=always

[Install]
WantedBy=multi-user.target
```

## 6. Static / Media

- **Static**: WhiteNoise sirve `/static/` directo desde el proceso Django
  (compresión + manifest hashing automático). No necesitas alias en nginx.
- **Media**: por defecto `MEDIA_ROOT=backend/media`. Para escala,
  considerar mover a S3 / Backblaze (Fase 6).

## 7. Smoke checks post-deploy

```bash
# Verifica que la config pasa el deploy check oficial de Django
DJANGO_ENV=production python manage.py check --deploy

# Health check público (sin auth)
curl -f https://api.tuapp.com/api/core/health/

# Login del admin → debe devolver tokens
curl -X POST https://api.tuapp.com/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@…","password":"…"}'
```

## 8. Rotar BYOK_FERNET_KEY

Si necesitas rotar la llave de cifrado:

1. Descifrar todas las keys con la llave vieja → guardar plaintext temporal.
2. Cambiar `BYOK_FERNET_KEY`.
3. Re-cifrar y persistir.

Hoy no hay comando management dedicado; se hace ad-hoc en `manage.py shell`.
TODO: añadir `python manage.py rotate_byok_key --old <key>` cuando haya >5 usuarios.

## 9. Backups

- **BD**: `pg_dump` diario.
- **media/**: snapshot semanal del directorio (mucho menos crítico que la BD —
  los videos originales se pueden re-subir).
- `BYOK_FERNET_KEY` se guarda **fuera** del repo y **fuera** de los backups
  de BD (sino el cifrado pierde el sentido).
