Lista de verificación de producción#
Complete la lista de verificación previa a la implementación para garantizar que su instalación de Construbot esté lista para producción.
Peligro
¡NO implemente en producción sin completar esta lista de verificación! Omitir elementos puede provocar vulnerabilidades de seguridad, pérdida de datos o tiempo de inactividad de la aplicación.
Descripción general#
Esta lista de verificación cubre todos los elementos de configuración críticos para la implementación de producción. Trabaje en cada sección de forma sistemática y verifique cada elemento antes de publicarlo.
Tiempo estimado: 2-4 horas para la primera implementación
Configuraciones críticas#
Modo DEPURACIÓN#
✓ Set DEBUG=False in production
Verificar:
# In .env
DJANGO_DEBUG=False
Peligro
¡Nunca ejecute la producción con DEBUG=True! Esto expone:
Rastreos completos con código
Consultas SQL y esquema de base de datos.
Variables de entorno y secretos.
Rutas de archivos internos
Prueba:
# In Django shell
from django.conf import settings
assert settings.DEBUG is False, "DEBUG must be False in production!"
SECRET_KEY#
✓ Generate unique, strong SECRET_KEY
✓ Never use development SECRET_KEY in production
✓ Store SECRET_KEY securely (not in version control)
Generar:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
Establecido en .env:
DJANGO_SECRET_KEY=<generated-key-here>
Verificar:
# Key should be 50+ characters, random
echo $DJANGO_SECRET_KEY | wc -c
ALLOWED_HOSTS#
✓ Configure ALLOWED_HOSTS with production domains
✓ Include all domains (www and root)
✓ Include load balancer hostname if applicable
Colocar:
# Comma-separated list
DJANGO_ALLOWED_HOSTS=example.com,www.example.com,construbot.example.com
Prueba:
# Should work
curl -H "Host: example.com" https://example.com
# Should fail with 400 Bad Request
curl -H "Host: malicious.com" https://example.com
Módulo de configuración#
✓ Set DJANGO_SETTINGS_MODULE=construbot.config.settings.production
Verificar:
echo $DJANGO_SETTINGS_MODULE
# Should show: construbot.config.settings.production
Configuración de seguridad#
HTTPS/SSL#
✓ Obtain SSL certificate (Let's Encrypt recommended)
✓ Configure web server for HTTPS
✓ Redirect HTTP to HTTPS
✓ Enable HSTS
Variables ambientales:
DJANGO_SECURE_SSL_REDIRECT=True
DJANGO_SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,https
HSTS (Seguridad de transporte estricta HTTP):
DJANGO_SECURE_HSTS_SECONDS=31536000 # 1 year
DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS=True
DJANGO_SECURE_HSTS_PRELOAD=True
Advertencia
¡Prueba HSTS cuidadosamente! Una vez habilitado con precarga, los navegadores rechazarán conexiones que no sean HTTPS incluso si lo desactivas.
Seguridad del contenido#
✓ Enable content type sniffing protection
✓ Enable XSS filter
✓ Configure X-Frame-Options
Colocar:
DJANGO_SECURE_CONTENT_TYPE_NOSNIFF=True
DJANGO_SECURE_BROWSER_XSS_FILTER=True
X_FRAME_OPTIONS=DENY
Ejecute la comprobación de seguridad de Django:
python manage.py check --deploy
El resultado esperado debe tener sin advertencias.
Configuración de base de datos#
Configuración de PostgreSQL#
✓ Use PostgreSQL (not SQLite)
✓ Configure production database credentials
✓ Enable SSL connection
✓ Set up connection pooling
✓ Configure automated backups
DATABASE_URL:
# With SSL (recommended)
DATABASE_URL=postgresql://user:pass@host:5432/db?sslmode=require
# AWS RDS example
DATABASE_URL=postgresql://construbot:password@construbot.abc123.us-east-1.rds.amazonaws.com:5432/construbot?sslmode=require
Verificar conexión:
docker-compose run --rm django python manage.py dbshell
# Should connect without errors
Migraciones de bases de datos#
✓ Run migrations on production database
✓ Verify all migrations applied
✓ Test rollback procedure
Aplicar migraciones:
docker-compose run --rm django python manage.py migrate
Verificar estado:
docker-compose run --rm django python manage.py showmigrations
Todas las migraciones deben mostrar [X] (aplicado).
Estrategia de respaldo#
✓ Configure automated database backups
✓ Test backup restoration
✓ Set backup retention policy (7-30 days)
✓ Store backups off-site (different region)
AWS RDS:
Habilitar copias de seguridad automáticas
Establecer ventana de respaldo (tiempo de poco tráfico)
Configurar la retención de copias de seguridad (7-35 días)
Habilite Multi-AZ para alta disponibilidad
Autohospedado:
# Set up daily backup cron job
0 2 * * * /opt/construbot/scripts/backup.sh
Archivos estáticos y multimedia#
Archivos estáticos#
✓ Collect static files
✓ Configure WhiteNoise
✓ Set up CDN (optional but recommended)
✓ Enable compression
Recopilar archivos estáticos:
docker-compose run --rm django python manage.py collectstatic --no-input
Verificar:
ls staticfiles/
# Should contain admin/, css/, js/, etc.
WhiteNoise está configurado de forma predeterminada en construbot.config.settings.production.
Archivos multimedia#
✓ Configure media file storage (S3 recommended)
✓ Set up bucket with proper permissions
✓ Configure CORS if accessing from different domain
✓ Enable CDN for media files (optional)
Usando AWS S3:
USE_S3=True
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_STORAGE_BUCKET_NAME=construbot-media
AWS_S3_REGION_NAME=us-east-1
Configuración del depósito S3:
Crear depósito S3
Bloquear el acceso público (use URL firmadas)
Configure CORS si es necesario
Configurar políticas de ciclo de vida para archivos antiguos
Carga de prueba:
# Upload test file through Django admin
# Verify file appears in S3 bucket
Configuración de correo electrónico#
Servicio de correo electrónico#
✓ Configure production email backend
✓ Set up email service (Mailgun, SendGrid, SES)
✓ Verify sender domain
✓ Configure SPF, DKIM, DMARC records
Usando Mailgun (recomendado):
DJANGO_EMAIL_BACKEND=anymail.backends.mailgun.EmailBackend
MAILGUN_API_KEY=your-api-key
MAILGUN_SENDER_DOMAIN=mg.example.com
DEFAULT_FROM_EMAIL=noreply@example.com
SERVER_EMAIL=errors@example.com
Usando Amazon SES:
DJANGO_EMAIL_BACKEND=anymail.backends.amazon_ses.EmailBackend
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_SES_REGION_NAME=us-east-1
DEFAULT_FROM_EMAIL=noreply@example.com
Prueba de correo electrónico#
✓ Send test email
✓ Verify delivery
✓ Check spam score
✓ Verify sender reputation
Prueba:
docker-compose run --rm django python manage.py shell
from django.core.mail import send_mail
send_mail(
'Test Email',
'This is a test from Construbot.',
'noreply@example.com',
['your-email@example.com'],
)
Revisa tu bandeja de entrada y carpeta de spam.
Almacenamiento en caché y rendimiento#
Configuración de Redis#
✓ Configure production Redis instance
✓ Enable password authentication
✓ Configure persistence (if needed)
✓ Set up Redis backups
Usando AWS ElastiCache:
REDIS_URL=redis://:password@your-redis-endpoint.cache.amazonaws.com:6379/0
Autohospedado:
REDIS_URL=redis://:password@localhost:6379/0
Conexión de prueba:
redis-cli -h your-redis-host -a your-password ping
# Should respond: PONG
Configuración de apio#
✓ Configure Celery broker (Redis)
✓ Configure result backend
✓ Set up Celery worker as systemd service or Docker container
✓ Configure Celery beat for periodic tasks (if needed)
Iniciar trabajador de apio:
# Add to docker-compose.yml or run as separate service
docker-compose up -d celeryworker
Verificar:
docker-compose logs celeryworker
# Should show: "[INFO/MainProcess] Connected to redis://..."
Monitoreo y registro#
Seguimiento de errores#
✓ Configure Sentry for error tracking
✓ Test error reporting
✓ Set up email alerts
✓ Configure error notifications
Configurar centinela:
SENTRY_DSN=https://your-key@sentry.io/project-id
SENTRY_ENVIRONMENT=production
SENTRY_SAMPLE_RATE=1.0
Prueba:
# In Django shell
from sentry_sdk import capture_message
capture_message("Test error from production")
Consulte el panel de Sentry para ver el mensaje.
Registro de aplicaciones#
✓ Configure log level (INFO or WARNING for production)
✓ Set up log rotation
✓ Configure centralized logging (optional)
Establecer nivel de registro:
LOG_LEVEL=INFO
Opciones de agregación de registros:
Registros de CloudWatch (AWS)
rastro de papel
Lograr
Pila de alces
Monitoreo del servidor#
✓ Set up uptime monitoring
✓ Configure performance monitoring
✓ Set up disk space alerts
✓ Monitor database performance
Supervisión del tiempo de actividad:
UptimeRobot (gratis)
pingdom
pastel de estado
Monitoreo de rendimiento:
Nueva reliquia
Perro de datos
Información sobre la aplicación
Monitoreo del servidor:
Vigilancia de la nube (AWS)
Monitoreo Digital del Océano
Prometeo + Grafana
Infraestructura#
Configuración del servidor#
✓ Configure firewall (allow only 22, 80, 443)
✓ Set up SSH key authentication
✓ Disable root login
✓ Configure automatic security updates
✓ Set up fail2ban (brute force protection)
Cortafuegos (UFW):
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
Endurecimiento SSH:
# Edit /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
# Restart SSH
sudo systemctl restart sshd
Configuración de DNS#
✓ Point domain to server IP
✓ Configure A record (root and www)
✓ Set up DNS propagation (may take 24-48 hours)
✓ Configure MX records for email (if needed)
Ejemplos de registros DNS:
Type Name Value TTL
A @ 123.45.67.89 3600
A www 123.45.67.89 3600
CNAME api example.com 3600
Verificar:
dig example.com
dig www.example.com
Balanceador de carga (opcional)#
✓ Configure load balancer (if using multiple servers)
✓ Set up health checks
✓ Configure SSL termination
✓ Enable sticky sessions
Pruebas de aplicaciones#
Pruebas de funcionalidad#
✓ Create test user account
✓ Log in to application
✓ Create test project/contract
✓ Generate PDF report
✓ Upload test image
✓ Send test email
✓ Test API endpoints (if using)
Lista de verificación:
[] Se carga la página de inicio
[] El inicio de sesión del usuario funciona
[] El panel se muestra correctamente
[ ] Crear nuevo cliente (Contraparte)
[ ] Crear nuevo contrato (Contrato)
[ ] Agregar conceptos (Conceptos) al contrato
[ ] Crear presupuesto (Estimación)
[] Generar documento PDF
[] Subir imagen a la biblioteca multimedia
[] Recibir notificación por correo electrónico
Pruebas de rendimiento#
✓ Test page load times (<2 seconds)
✓ Test concurrent users (use load testing tool)
✓ Verify database query performance
✓ Check static file loading speed
Herramientas:
# Apache Bench (simple load test)
ab -n 1000 -c 10 https://example.com/
# Locust (advanced load testing)
pip install locust
# Create locustfile.py and run load tests
Pruebas de seguridad#
✓ Run Django security check
✓ Scan for common vulnerabilities
✓ Test SQL injection protection
✓ Test XSS protection
✓ Verify CSRF protection
Comprobación de seguridad de Django:
python manage.py check --deploy
Escaneo OWASP ZAP:
# Download OWASP ZAP
# Run automated scan against your domain
# Review and fix any critical/high vulnerabilities
Verificación final#
Lista de verificación previa al lanzamiento#
Crítico (debe estar completo):
[] DEPURACIÓN = Falso
[] Único y fuerte SECRET_KEY
[] ALLOWED_HOSTS configurado
[ ] Base de datos de producción configurada
[ ] Certificado SSL instalado
[] Archivos estáticos recopilados
[] Almacenamiento de medios configurado
[ ] Servicio de correo electrónico funcionando
[ ] Copias de seguridad configuradas
[] Seguimiento de errores (Sentry) configurado
Importante (muy recomendable):
[] HSTS habilitado
[] Seguridad de cookies habilitada
[] Redis configurado
[] Trabajador del apio corriendo
[ ] Configuración de monitoreo
[ ] Registros configurados
[ ] DNS configurado
[] Cortafuegos configurado
Opcional (es bueno tenerlo):
[] CDN para archivos estáticos
[] CDN para archivos multimedia
[] Equilibrador de carga
[] Múltiples servidores
[] Leer réplicas
Día de lanzamiento#
✓ Schedule deployment during low-traffic period
✓ Announce maintenance window to users
✓ Have rollback plan ready
✓ Monitor errors closely for first 24 hours
✓ Be available for immediate fixes
Pasos de implementación:
Copia de seguridad de la base de datos actual
Poner la aplicación en modo de mantenimiento
Extraer el código más reciente
Ejecutar migraciones
Recopilar archivos estáticos
Reiniciar servicios
Verificar funcionalidad
Eliminar el modo de mantenimiento
Monitorear registros y Sentry
Monitoreo posterior al lanzamiento#
Primeras 24 horas:
Supervise Sentry en busca de errores cada hora
Verificar los recursos del servidor (CPU, memoria, disco)
Verificar la entrega de correo electrónico
Comprobar el rendimiento de la aplicación
Revisar los comentarios de los usuarios
Primera semana:
Revisiones diarias de errores
Optimización del rendimiento basada en el uso real
Optimización de consultas de base de datos
Ajuste el almacenamiento en caché según sea necesario
En curso:
Actualizaciones de seguridad semanales
Actualizaciones mensuales de dependencia
Simulacros trimestrales de recuperación de desastres
Monitoreo y optimización continuos
Solución de problemas comunes#
La aplicación no se inicia#
Controlar:
Variables de entorno configuradas correctamente
Base de datos accesible
Redis accesible
Migraciones aplicadas
Sin errores de sintaxis en la configuración
Depurar:
docker-compose logs django
# Look for Python tracebacks
502 Puerta de enlace no válida#
Causas:
Gunicorn no corre
Tiempo de espera del servidor ascendente
Nginx mal configurado
Arreglar:
# Restart services
docker-compose restart django
# Check Gunicorn logs
docker-compose logs django
500 Error interno del servidor#
Depurar:
Verifique Sentry para obtener detalles del error
Revisar los registros de Django
Probar la conexión de la base de datos
Verifique que todas las configuraciones sean correctas
# Test in shell
docker-compose run --rm django python manage.py shell
from django.conf import settings
print(settings.DATABASES)
Los archivos estáticos no se cargan#
Arreglar:
# Recollect static files
docker-compose run --rm django python manage.py collectstatic --clear --no-input
# Verify STATIC_ROOT
docker-compose run --rm django python manage.py shell
>>> from django.conf import settings
>>> print(settings.STATIC_ROOT)
Documentación#
Documentación requerida#
✓ Document server credentials (store securely)
✓ Document deployment process
✓ Create runbook for common operations
✓ Document rollback procedure
✓ Create disaster recovery plan
El runbook debe incluir:
Cómo implementar actualizaciones
Cómo reiniciar los servicios
Cómo restaurar desde una copia de seguridad
Pasos comunes para la solución de problemas
Contactos de emergencia
Ver también#
Docker Compose para producción - Docker Compose production setup
Implementación de AWS EC2 - AWS EC2 deployment guide
Variables de entorno - Environment configuration reference
Archivos estáticos y multimedia - Static and media file configuration