Files
pagasis/GUIA_PRODUCCION.md
T

8.7 KiB

Guía para Poner en Producción

Esta guía te ayudará a desplegar el sistema en un servidor de producción cuando tengas acceso.

📋 Checklist Pre-Producción

Antes de desplegar en producción, asegúrate de tener:

  • Acceso al servidor de producción (IP: 132.248.80.77 según configuración)
  • Docker y Docker Compose instalados en el servidor
  • Certificados SSL válidos (o configurar Let's Encrypt)
  • Dominio configurado (opcional, puedes usar solo IP)
  • Credenciales de producción seguras preparadas
  • Backup de los datos actuales (si hay)

🚀 Pasos para Desplegar en Producción

1. Preparar el Servidor

# Conectarse al servidor (SSH)
ssh usuario@132.248.80.77

# Actualizar el sistema
sudo apt update && sudo apt upgrade -y

# Instalar Docker (si no está instalado)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Instalar Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# Verificar instalación
docker --version
docker-compose --version

2. Clonar el Repositorio

# Clonar en el servidor
cd /opt  # o el directorio que prefieras
sudo git clone https://github.com/val20-11/Pagina-de-Asistencia-MAC.git
cd Pagina-de-Asistencia-MAC

3. Configurar Variables de Entorno de Producción

# Copiar el template
cp .env.production.example .env.production

# Editar con tus credenciales SEGURAS
nano .env.production

IMPORTANTE: Configura estas variables en .env.production:

# Django
DEBUG=False
SECRET_KEY=<GENERAR_CLAVE_NUEVA_SEGURA>
ALLOWED_HOSTS=132.248.80.77,tu-dominio.com

# Base de Datos
DB_NAME=mac_attendance
DB_USER=mac_user
DB_PASSWORD=<CONTRASEÑA_SEGURA_AQUÍ>
DB_HOST=db
DB_PORT=5432

# CORS (solo HTTPS en producción)
CORS_ALLOWED_ORIGINS=https://132.248.80.77,https://tu-dominio.com

# Security
CSRF_TRUSTED_ORIGINS=https://132.248.80.77,https://tu-dominio.com
SECURE_SSL_REDIRECT=True

Generar SECRET_KEY segura:

docker run --rm python:3.11-slim python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"

Generar contraseña segura de BD:

openssl rand -base64 32

4. Configurar Certificados SSL

Opción A: Certificados Autofirmados (para pruebas)

Los certificados autofirmados ya están configurados en docker/ssl/README.md.

Opción B: Let's Encrypt (Recomendado para producción)

# Instalar certbot
sudo apt install certbot

# Generar certificados (necesitas un dominio)
sudo certbot certonly --standalone -d tu-dominio.com

# Los certificados estarán en:
# /etc/letsencrypt/live/tu-dominio.com/fullchain.pem
# /etc/letsencrypt/live/tu-dominio.com/privkey.pem

# Copiar a la ubicación de Docker
sudo cp /etc/letsencrypt/live/tu-dominio.com/fullchain.pem docker/ssl/server.crt
sudo cp /etc/letsencrypt/live/tu-dominio.com/privkey.pem docker/ssl/server.key
sudo chmod 644 docker/ssl/server.crt
sudo chmod 600 docker/ssl/server.key

Renovación automática:

# Crear script de renovación
sudo crontab -e

# Agregar (renueva cada 2 meses, los certificados duran 3 meses):
0 0 1 */2 * certbot renew --quiet && cp /etc/letsencrypt/live/tu-dominio.com/fullchain.pem /opt/Pagina-de-Asistencia-MAC/docker/ssl/server.crt && cp /etc/letsencrypt/live/tu-dominio.com/privkey.pem /opt/Pagina-de-Asistencia-MAC/docker/ssl/server.key && docker-compose -f /opt/Pagina-de-Asistencia-MAC/docker-compose.yml restart nginx

5. Construir e Iniciar Contenedores

# Construir imágenes
docker-compose build

# Iniciar en segundo plano
docker-compose up -d

# Ver logs
docker-compose logs -f

6. Verificar que Todo Funciona

# Ver estado de contenedores
docker-compose ps

# Verificar logs del backend
docker-compose logs backend | tail -50

# Verificar que la base de datos esté saludable
docker-compose exec db pg_isready -U mac_user -d mac_attendance

7. Verificar Usuarios Creados

# Listar usuarios creados
docker-compose exec backend python manage.py shell -c "from django.contrib.auth.models import User; [print(f'{u.username} - Superuser: {u.is_superuser}') for u in User.objects.all()]"

Si los fixtures se cargaron correctamente, verás tu superusuario "Admin" y otros usuarios.

8. Acceder al Sistema

Abre tu navegador y ve a:

🔒 Seguridad Post-Despliegue

Cambiar Contraseñas

IMPORTANTE: Si estás usando los fixtures con contraseñas de desarrollo, cámbialas:

# Cambiar contraseña del superusuario
docker-compose exec backend python manage.py changepassword Admin

# O crear un nuevo superusuario
docker-compose exec backend python manage.py createsuperuser

Configurar Firewall

# Permitir solo puertos necesarios
sudo ufw allow 22/tcp   # SSH
sudo ufw allow 443/tcp  # HTTPS
sudo ufw enable

# Verificar
sudo ufw status

Configurar Fail2Ban (Protección contra fuerza bruta)

# Instalar fail2ban
sudo apt install fail2ban

# Configurar (opcional, para proteger SSH y Django)
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

📊 Backups en Producción

Backup Manual

# Crear backup de la base de datos
docker-compose exec db pg_dump -U mac_user mac_attendance > backup_$(date +%Y%m%d_%H%M%S).sql

# Guardar en un lugar seguro (S3, Google Drive, etc.)

Backup Automático Diario

# Crear script de backup
sudo nano /opt/backup_mac.sh

Contenido del script:

#!/bin/bash
BACKUP_DIR="/opt/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR

docker-compose -f /opt/Pagina-de-Asistencia-MAC/docker-compose.yml exec -T db pg_dump -U mac_user mac_attendance > $BACKUP_DIR/backup_$DATE.sql

# Mantener solo los últimos 30 días
find $BACKUP_DIR -name "backup_*.sql" -mtime +30 -delete

echo "Backup completado: backup_$DATE.sql"
# Hacer ejecutable
sudo chmod +x /opt/backup_mac.sh

# Agregar a crontab (diario a las 2 AM)
sudo crontab -e
# Agregar:
0 2 * * * /opt/backup_mac.sh

🔄 Actualizar el Sistema en Producción

Cuando hay cambios en el código:

# 1. Hacer backup
docker-compose exec db pg_dump -U mac_user mac_attendance > backup_pre_update.sql

# 2. Detener servicios
docker-compose down

# 3. Actualizar código
git pull origin main

# 4. Reconstruir imágenes
docker-compose build

# 5. Iniciar servicios
docker-compose up -d

# 6. Verificar logs
docker-compose logs -f

📈 Monitoreo

Ver Logs en Tiempo Real

# Todos los servicios
docker-compose logs -f

# Solo backend
docker-compose logs -f backend

# Solo nginx
docker-compose logs -f nginx

# Solo BD
docker-compose logs -f db

Estadísticas de Uso

# Uso de recursos
docker stats

# Espacio en disco
df -h
docker system df

🚨 Problemas Comunes

"502 Bad Gateway"

# Verificar que el backend esté corriendo
docker-compose ps backend

# Ver logs del backend
docker-compose logs backend

# Reiniciar backend
docker-compose restart backend

"Base de datos no conecta"

# Verificar salud de la BD
docker-compose exec db pg_isready

# Ver logs
docker-compose logs db

# Verificar credenciales en .env.production

"Certificado SSL inválido"

# Verificar que los archivos existen
ls -la docker/ssl/

# Verificar permisos
chmod 644 docker/ssl/server.crt
chmod 600 docker/ssl/server.key

# Reiniciar nginx
docker-compose restart nginx

📞 Mantenimiento

Limpieza Regular

# Limpiar imágenes no usadas (mensual)
docker system prune -a

# Limpiar volúmenes huérfanos
docker volume prune

Actualizar Dependencias

# Actualizar imágenes base
docker-compose pull
docker-compose build --no-cache
docker-compose up -d

📝 Checklist Post-Despliegue

  • Sistema accesible via HTTPS
  • Certificados SSL válidos
  • Usuarios pueden iniciar sesión
  • Contraseñas de desarrollo cambiadas
  • Firewall configurado
  • Backups automáticos configurados
  • Monitoreo funcionando
  • Logs revisados (sin errores críticos)
  • Documentación actualizada
  • Equipo notificado de la URL de producción

🎯 Resumen: Comandos Rápidos para Producción

# Iniciar
docker-compose up -d

# Detener
docker-compose down

# Reiniciar
docker-compose restart

# Ver logs
docker-compose logs -f

# Backup
docker-compose exec db pg_dump -U mac_user mac_attendance > backup.sql

# Actualizar
git pull && docker-compose build && docker-compose up -d

# Estado del sistema
docker-compose ps
docker stats

¡El sistema está listo para producción cuando tengas acceso al servidor! 🚀