Files
pagasis/docs/POSTGRESQL_MIGRATION.md
T
2025-10-15 23:45:32 -06:00

290 lines
6.3 KiB
Markdown

# Migración a PostgreSQL
## Resumen
El Sistema de Asistencia MAC ha sido migrado de SQLite a PostgreSQL para mejorar el rendimiento, escalabilidad y prepararlo para producción.
## ¿Por qué PostgreSQL?
### Ventajas sobre SQLite
**Escalabilidad**: Maneja millones de registros sin degradación de rendimiento
**Concurrencia**: Múltiples usuarios simultáneos sin bloqueos
**Rendimiento**: Mejor optimización de queries complejos
**Integridad**: Constraints y validaciones más robustas
**Backups**: Herramientas profesionales de respaldo (pg_dump, pg_basebackup)
**Replicación**: Soporte nativo para alta disponibilidad
**Producción**: Estándar en la industria para aplicaciones web
## Cambios Realizados
### 1. Backend - Requirements
**Archivo:** `backend/requirements.txt`
```python
# Database - PostgreSQL
psycopg2-binary==2.9.9
```
### 2. Backend - Settings
**Archivo:** `backend/mac_attendance/settings.py`
```python
# Database Configuration - PostgreSQL
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': config('DB_NAME', default='mac_attendance'),
'USER': config('DB_USER', default='mac_user'),
'PASSWORD': config('DB_PASSWORD', default='mac_password_2024_secure'),
'HOST': config('DB_HOST', default='db'),
'PORT': config('DB_PORT', default='5432'),
'CONN_MAX_AGE': 600, # Conexiones persistentes
'OPTIONS': {
'connect_timeout': 10,
}
}
}
```
### 3. Docker Compose
**Archivo:** `docker-compose.yml`
Se agregó el servicio de PostgreSQL:
```yaml
services:
# PostgreSQL Database
db:
image: postgres:15-alpine
environment:
- POSTGRES_DB=mac_attendance
- POSTGRES_USER=mac_user
- POSTGRES_PASSWORD=mac_password_2024_secure
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U mac_user -d mac_attendance"]
interval: 10s
timeout: 5s
retries: 5
backend:
depends_on:
db:
condition: service_healthy
environment:
- DB_ENGINE=postgresql
- DB_NAME=mac_attendance
- DB_USER=mac_user
- DB_PASSWORD=mac_password_2024_secure
- DB_HOST=db
- DB_PORT=5432
volumes:
postgres_data:
```
### 4. Variables de Entorno
**Archivo:** `.env.example`
```env
# Database - PostgreSQL (Producción)
DB_NAME=mac_attendance
DB_USER=mac_user
DB_PASSWORD=mac_password_2024_secure
DB_HOST=db
DB_PORT=5432
```
## Estado del Sistema
### Contenedores Activos
```bash
$ docker-compose ps
NAME STATUS
pagina-mac-og-backend-1 Up (running)
pagina-mac-og-db-1 Up (healthy)
pagina-mac-og-nginx-1 Up (running)
```
### Migraciones Aplicadas
✅ Todas las migraciones de Django aplicadas correctamente
✅ Base de datos creada: `mac_attendance`
✅ Usuario de base de datos: `mac_user`
✅ Tablas creadas: 16 tablas (auth, authentication, events, attendance, admin, sessions)
## Gestión de PostgreSQL
### Comandos Útiles
**Conectarse a PostgreSQL:**
```bash
docker-compose exec db psql -U mac_user -d mac_attendance
```
**Listar tablas:**
```sql
\dt
```
**Ver tamaño de base de datos:**
```sql
SELECT pg_size_pretty(pg_database_size('mac_attendance'));
```
**Backup de base de datos:**
```bash
docker-compose exec db pg_dump -U mac_user mac_attendance > backup.sql
```
**Restaurar backup:**
```bash
cat backup.sql | docker-compose exec -T db psql -U mac_user mac_attendance
```
**Ver conexiones activas:**
```sql
SELECT * FROM pg_stat_activity;
```
## Configuración de Producción
### 1. Cambiar Credenciales
**IMPORTANTE:** Antes de desplegar en producción, cambiar:
```env
DB_USER=tu_usuario_seguro
DB_PASSWORD=contraseña_muy_segura_y_compleja
SECRET_KEY=tu_secret_key_super_segura
```
### 2. Backups Automáticos
Configurar cron job para backups diarios:
```bash
#!/bin/bash
# /etc/cron.daily/postgres-backup
BACKUP_DIR="/backups/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/mac_attendance_$DATE.sql"
mkdir -p $BACKUP_DIR
docker-compose exec -T db pg_dump -U mac_user mac_attendance > $BACKUP_FILE
gzip $BACKUP_FILE
# Mantener solo los últimos 30 días
find $BACKUP_DIR -type f -mtime +30 -delete
```
### 3. Optimización
**Configurar índices adicionales (si es necesario):**
```python
# En los modelos, agregar:
class Meta:
indexes = [
models.Index(fields=['account_number']),
models.Index(fields=['event', 'student']),
]
```
### 4. Monitoring
**Ver queries lentas:**
```sql
SELECT query, mean_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
```
## Capacidad y Límites
### Capacidad PostgreSQL
- **Tamaño máximo de base de datos**: Ilimitado
- **Tamaño máximo de tabla**: 32 TB
- **Filas por tabla**: Ilimitadas (prácticamente)
- **Usuarios concurrentes**: Miles
### Estimaciones para el Sistema MAC
**Escenario actual:**
- 1,000 estudiantes
- 100 eventos/año
- ~5,000 asistencias/año
- **Tamaño estimado**: < 100 MB/año
**Escenario a 10 años:**
- **Tamaño estimado**: < 1 GB
- **Performance**: Excelente
## Rollback (Volver a SQLite)
Si necesitas volver a SQLite por alguna razón:
### 1. Cambiar settings.py
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
```
### 2. Comentar servicio db en docker-compose.yml
```yaml
# db:
# image: postgres:15-alpine
# ...
```
### 3. Reconstruir
```bash
docker-compose down -v
docker-compose up -d --build
```
## Verificación
### ✅ Checklist Post-Migración
- [✅] PostgreSQL corriendo y saludable
- [✅] Backend conectado a PostgreSQL
- [✅] Todas las migraciones aplicadas
- [✅] Aplicación accesible en http://localhost
- [✅] Variables de entorno configuradas
- [✅] Documentación actualizada
## Soporte
Para más información:
- [Documentación de PostgreSQL](https://www.postgresql.org/docs/)
- [Django con PostgreSQL](https://docs.djangoproject.com/en/stable/ref/databases/#postgresql-notes)
- [psycopg2](https://www.psycopg.org/docs/)
## Fecha de Migración
**Octubre 14, 2025**
---
**Nota:** Este documento describe la migración a PostgreSQL para preparar el sistema para producción. Todas las funcionalidades permanecen idénticas, solo cambió el motor de base de datos.