forked from val-lop20/Pagina-de-Asistencia-MAC
8.7 KiB
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:
- Aplicación: https://132.248.80.77 (o https://tu-dominio.com)
- Admin: https://132.248.80.77/admin
🔒 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! 🚀