Despliegue#
Guías de implementación de producción para Construbot en diversas plataformas e infraestructuras.
Descripción general#
Esta sección cubre la implementación de Construbot en entornos de producción. Ya sea que esté implementando en una infraestructura de nube, servidores locales o proveedores de plataforma como servicio (PaaS), estas guías lo ayudarán a lograr que Construbot funcione de manera segura y eficiente.
Advertencia
La implementación en producción requiere una configuración cuidadosa. Nunca utilice la configuración de desarrollo en producción. Siga siempre la lista de verificación de seguridad antes de comenzar a funcionar.
Opciones de implementación#
Construbot se puede implementar utilizando varios enfoques:
Implementación basada en Docker (recomendada)
Utilice Docker Compose para la orquestación de producción
Implemente en AWS EC2, DigitalOcean o cualquier VPS
Entorno consistente en desarrollo y producción
Fácil escalamiento y actualizaciones
Plataforma como servicio (PaaS)
Heroku, Ferrocarril, Hacer
Base de datos e infraestructura administradas.
Configuración más sencilla, menos configuración
Mayor costo para recursos equivalentes
Implementación de servidor tradicional
Instalar directamente en el servidor Linux
Más control sobre el medio ambiente
Requiere experiencia en administración de sistemas.
Gestión manual de dependencias.
Inicio rápido (Docker + AWS EC2)#
Para los impacientes, estos son los pasos mínimos a seguir:
# 1. Launch EC2 instance (Ubuntu 22.04, t2.small or larger)
# 2. SSH into instance
# 3. Install Docker and Docker Compose
# 4. Clone repository
git clone https://github.com/javier-llamas/construbot.git
cd construbot
# 5. Configure environment
cp .env.example .env
nano .env # Set production variables
# 6. Build and start
make buildprod
# 7. Create superuser
docker-compose -f docker-compose.yml run --rm django python manage.py createsuperuser
# 8. Assign Elastic IP and configure domain
Para obtener instrucciones detalladas, consulte: Implementación de AWS EC2
Requisitos previos#
Antes de la implementación#
Requerido:
Nombre de dominio (para HTTPS y uso de producción)
Certificado SSL (se recomienda Let’s Encrypt)
Base de datos de producción (PostgreSQL 12+)
Servicio de correo electrónico (Mailgun, SendGrid o SES)
Conocimientos básicos de administración de servidores Linux.
Recomendado:
Instancia de Redis para almacenamiento en caché
Depósito S3 para archivos multimedia
Servicio de vigilancia (Sentry)
CDN para archivos estáticos
Estrategia de respaldo
Seguridad:
Configuración del cortafuegos
Autenticación basada en claves SSH
Usuario de implementación no root
Actualizaciones de seguridad periódicas
Opciones de infraestructura#
Calcular:
AWS EC2 (t2.small mínimo, t2.medium recomendado)
Gotitas de DigitalOcean ($12-24/mes)
Linode, Vultr, Hetzner
Motor de computación en la nube de Google
Máquinas virtuales de Microsoft Azure
Base de datos:
AWS RDS para PostgreSQL (recomendado para producción)
PostgreSQL administrado (DigitalOcean, Heroku Postgres)
PostgreSQL autohospedado en VPS
Mínimo: db.t3.micro (AWS RDS)
Almacenamiento:
AWS S3 para archivos multimedia (recomendado)
Espacios DigitalOceánicos
Almacenamiento en la nube de Google
Almacenamiento de blobs de Azure
Almacenamiento local (solo para implementaciones pequeñas)
Guías de implementación#
- Lista de verificación de producción
- Descripción general
- Configuraciones críticas
- Configuración de seguridad
- Configuración de base de datos
- Archivos estáticos y multimedia
- Configuración de correo electrónico
- Almacenamiento en caché y rendimiento
- Monitoreo y registro
- Infraestructura
- Pruebas de aplicaciones
- Verificación final
- Solución de problemas comunes
- Documentación
- Ver también
- Docker Compose para producción
- Implementación de AWS EC2
- Descripción general
- Requisitos previos
- Paso 1: iniciar la instancia EC2
- Paso 2: conectarse a la instancia
- Paso 3: configuración del servidor
- Paso 4: implementar la aplicación
- Paso 5: configurar el dominio y SSL
- Paso 6: configurar los servicios de AWS
- Paso 7: automatizar el inicio
- Paso 8: Monitoreo y Mantenimiento
- Paso 9: Escalar
- Solución de problemas
- Optimización de costos
- Ver también
- Archivos estáticos y multimedia
- Variables de entorno
Proceso paso a paso#
1. Pre-implementación#
Revisar lista de verificación:
# See comprehensive checklist
See: :doc:`production-checklist`
Elementos clave:
[] Establecer
DEBUG=Falso[] Configurar
SECRET_KEY(único, fuerte)[] Establecer
ALLOWED_HOSTS[] Configurar la base de datos de producción
[] Configurar el servicio de correo electrónico
[] Configurar el almacenamiento de archivos estáticos/media
[] Habilitar HTTPS/SSL
[] Configurar monitoreo (Sentry)
2. Configuración de la infraestructura#
Crear instancia de servidor:
Elija el proveedor de la nube (AWS, DigitalOcean, etc.)
Seleccione Ubuntu 22.04 LTS
Mínimo: 2 CPU, 4 GB de RAM
Adjunte un volumen de almacenamiento para la base de datos (si es autohospedado)
Configurar dominio:
Apunte un registro a la IP del servidor
Configurar DNS (www y dominio raíz)
Configurar el certificado SSL (Let’s Encrypt)
3. Preparación del servidor#
Instalar dependencias:
# Update system
sudo apt update && sudo apt upgrade -y
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Install Docker Compose
sudo apt install docker-compose-plugin
# Configure firewall
sudo ufw allow 22 # SSH
sudo ufw allow 80 # HTTP
sudo ufw allow 443 # HTTPS
sudo ufw enable
Crear usuario de implementación:
# Create user
sudo adduser construbot
sudo usermod -aG docker construbot
sudo usermod -aG sudo construbot
# Switch to deployment user
su - construbot
4. Implementación de aplicaciones#
Clonar y configurar:
# Clone repository
git clone https://github.com/javier-llamas/construbot.git
cd construbot
# Configure environment
cp .env.example .env
nano .env # Set all production variables
# See: environment-variables for complete reference
Construir y ejecutar:
# Build production images
make buildprod
# Run migrations
docker-compose run --rm django python manage.py migrate
# Create superuser
docker-compose run --rm django python manage.py createsuperuser
# Collect static files
docker-compose run --rm django python manage.py collectstatic --no-input
Iniciar servicios:
# Start in background
docker-compose up -d
# Check status
docker-compose ps
# View logs
docker-compose logs -f
5. Post-implementación#
Verificar funcionalidad:
[] Acceder a la aplicación a través del dominio
[] Probar el inicio de sesión del usuario
[ ] Crear proyecto/contrato de prueba
[] Generar informe en PDF
[] Enviar correo electrónico de prueba
[] Verificar la carga de archivos estáticos
[] Cargar imagen de prueba (archivos multimedia)
Configurar monitoreo:
# Configure Sentry (in .env)
SENTRY_DSN=your-dsn
# Set up application monitoring
# - Uptime monitoring (UptimeRobot, Pingdom)
# - Log aggregation (CloudWatch, Papertrail)
# - Performance monitoring (New Relic, DataDog)
Configurar copias de seguridad:
# Database backup script
# See: backup-and-restore section below
Arquitectura de producción#
Configuración recomendada#
┌─────────────────────────────────────────────┐
│ Internet │
└─────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ CDN (CloudFront / CloudFlare) │
│ (Static Files) │
└─────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ Load Balancer (ALB / Nginx) │
│ (HTTPS Termination) │
└─────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ Web Servers (EC2 / Droplets) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Django 1 │ │ Django 2 │ │ Django N │ │
│ │ + Nginx │ │ + Nginx │ │ + Nginx │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└────┬────────────────┬───────────────────────┘
│ │
▼ ▼
┌─────────┐ ┌──────────────┐
│ RDS │ │ Redis │
│(PostgreSQL) │ (ElastiCache)│
└─────────┘ └──────────────┘
│
▼
┌─────────────────┐
│ S3 │
│ (Media Files) │
└─────────────────┘
Componentes:
CDN: Sirve archivos estáticos globalmente con baja latencia
Load Balancer: Distribuir tráfico, terminación HTTPS, comprobaciones de estado
Servidores Web: Aplicación Django + Gunicorn + Nginx
Base de datos: PostgreSQL (RDS) administrado con copias de seguridad automatizadas
Caché: Redis para almacenamiento en caché y agente de apio
Almacenamiento: S3 para archivos multimedia subidos por el usuario
Configuración de servidor único#
Para implementaciones más pequeñas:
┌─────────────────────────────────────────────┐
│ Single EC2 Instance │
│ ┌──────────────────────────────────────┐ │
│ │ Docker Compose Services: │ │
│ │ ┌────────┐ ┌──────────┐ │ │
│ │ │ Nginx │ │ Django │ │ │
│ │ │ (proxy)│ │(Gunicorn)│ │ │
│ │ └────────┘ └──────────┘ │ │
│ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │Postgres │ │ Redis │ │ │
│ │ │(database)│ │ (cache) │ │ │
│ │ └──────────┘ └──────────┘ │ │
│ │ ┌──────────┐ │ │
│ │ │ Celery │ │ │
│ │ │ (worker) │ │ │
│ │ └──────────┘ │ │
│ └──────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
│
▼
┌────────────┐
│ S3 │
│(Media Files)│
└────────────┘
Adecuado para:
<1000 usuarios activos diarios
Entornos de desarrollo/puesta en escena
Pequeñas empresas constructoras
Implementaciones con presupuesto limitado
Copia de seguridad y restauración#
Copias de seguridad de bases de datos#
Copias de seguridad automatizadas (AWS RDS):
RDS crea automáticamente instantáneas diarias. Configurar:
Período de retención (7-35 días)
Ventana de respaldo (horas de poco tráfico)
Multi-AZ para alta disponibilidad
Copias de seguridad manuales (autohospedadas):
# Backup script
#!/bin/bash
BACKUP_DIR="/backups/construbot"
DATE=$(date +%Y%m%d_%H%M%S)
# Dump database
docker-compose exec -T postgres pg_dump -U construbot construbot > \
"$BACKUP_DIR/db_backup_$DATE.sql"
# Compress
gzip "$BACKUP_DIR/db_backup_$DATE.sql"
# Upload to S3
aws s3 cp "$BACKUP_DIR/db_backup_$DATE.sql.gz" \
s3://construbot-backups/database/
Automatizar con cron:
# Add to crontab: crontab -e
0 2 * * * /opt/construbot/scripts/backup.sh
Copias de seguridad de archivos multimedia#
Si usa S3:
Habilitar el control de versiones de S3
Configurar políticas de ciclo de vida
Replicación entre regiones (opcional)
Si usa almacenamiento local:
# Sync media files to S3
aws s3 sync /path/to/media/ s3://construbot-backups/media/
Proceso de restauración#
Restauración de base de datos:
# Stop application
docker-compose down
# Restore from backup
gunzip -c db_backup_20240101_020000.sql.gz | \
docker-compose exec -T postgres psql -U construbot construbot
# Start application
docker-compose up -d
Restauración de medios:
# From S3
aws s3 sync s3://construbot-backups/media/ /path/to/media/
Consideraciones de escala#
Escalado vertical#
Cuándo ampliar:
Alto uso de CPU (>70% sostenido)
Presión de la memoria
Consultas lentas a la base de datos.
Cuello de botella de un solo servidor
Cómo escalar:
Aumentar el tamaño de la instancia (t2.small → t2.medium → t2.large)
Añadir más CPU/RAM
Actualizar instancia de base de datos
Utilice un almacenamiento más rápido (SSD)
Escala horizontal#
Cuándo escalar horizontalmente:
>1000 usuarios simultáneos
Distribución geográfica necesaria
Requisitos de alta disponibilidad
Beneficios del equilibrio de carga
Cómo escalar:
Agregar más servidores de aplicaciones
Configurar el equilibrador de carga
Usar base de datos administrada (RDS)
Redis externo (ElastiCache)
CDN para archivos estáticos
Optimización del rendimiento#
Base de datos:
Agrupación de conexiones
Optimización de consultas
Leer réplicas
Índices de bases de datos
Almacenamiento en caché:
Redis para almacenamiento de sesiones
Almacenamiento en caché de fragmentos de plantilla
Almacenamiento en caché de consultas de bases de datos
Almacenamiento en caché de página completa (barniz)
Archivos estáticos:
Distribución CDN
compresión gzip
Encabezados de almacenamiento en caché del navegador
Optimización de imagen
Refuerzo de seguridad#
Medidas de seguridad esenciales#
Seguridad de la aplicación:
# Run Django security checks
python manage.py check --deploy
Seguridad del servidor:
# Automatic security updates
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
# Fail2ban (brute force protection)
sudo apt install fail2ban
# SSH hardening
# Edit /etc/ssh/sshd_config:
# - Disable root login
# - Disable password authentication
# - Change default port
SSL/TLS:
Utilice Let’s Encrypt para obtener certificados gratuitos
Habilitar HSTS
Configurar cifrados seguros
Configurar la renovación automática del certificado
Secretos del medio ambiente:
Nunca compartas secretos con git
Usar variables de entorno
Rotar las credenciales periódicamente
Utilice la gestión de secretos (AWS Secrets Manager)
Monitoreo y registro#
Monitoreo de aplicaciones#
Sentry (seguimiento de errores):
# In .env
SENTRY_DSN=https://...@sentry.io/...
SENTRY_ENVIRONMENT=production
Supervisión del rendimiento de la aplicación:
Nueva reliquia
Perro de datos
Información sobre la aplicación
Monitoreo del servidor#
Métricas a monitorear:
uso de CPU
Uso de memoria
Espacio en disco
Tráfico de red
Conexiones de bases de datos
Tiempos de respuesta
Herramientas:
Vigilancia de la nube (AWS)
Prometeo + Grafana
Monitoreo Digital del Océano
datos de red
Agregación de registros#
Registro centralizado:
Registros de CloudWatch (AWS)
rastro de papel
Lograr
Pila ELK (Elasticsearch, Logstash, Kibana)
Rotación de registros:
# Configure logrotate for application logs
# /etc/logrotate.d/construbot
Solución de problemas#
Problemas comunes#
La aplicación no se inicia:
# Check logs
docker-compose logs django
# Common causes:
# - Missing environment variables
# - Database connection failed
# - Migration errors
502 Puerta de enlace no válida:
Django no se ejecuta
Gunicorn se estrelló
Nginx mal configurado
Error interno del servidor 500:
Verificar centinela
Revisar los registros de Django
Verificar la conexión de la base de datos
Los archivos estáticos no se cargan:
Ejecute Collectstatic
Verifique STATIC_ROOT/STATIC_URL
Verificar la configuración de WhiteNoise
Verifique la configuración de CDN
Errores de conexión a la base de datos:
Verificar DATABASE_URL
Verifique las reglas del grupo de seguridad
Confirmar que la base de datos se está ejecutando
Probar la conexión manualmente
Ver también#
Instalación - Development installation
Descripción general - Understanding the architecture
/reference/settings-reference - Settings documentation