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#

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 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#