307 lines
6.2 KiB
Markdown
307 lines
6.2 KiB
Markdown
# Despliegue
|
|
|
|
## Opciones de Despliegue
|
|
|
|
DataTransferV2 puede desplegarse localmente, en contenedores Docker o en la nube.
|
|
|
|
## Despliegue Local
|
|
|
|
### Requisitos
|
|
|
|
- Python 3.8+
|
|
- SQL Server accesible
|
|
- Espacio en disco para reportes (~1GB/día)
|
|
|
|
### Pasos
|
|
|
|
1. **Instalar dependencias**
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
2. **Configurar entorno**
|
|
```bash
|
|
cp .env.example .env
|
|
# Editar .env con credenciales
|
|
```
|
|
|
|
3. **Ejecutar**
|
|
```bash
|
|
python main.py
|
|
```
|
|
|
|
4. **Programar ejecución**
|
|
```bash
|
|
# Usando cron (Linux)
|
|
0 */2 * * * /path/to/env/bin/python /path/to/main.py
|
|
|
|
# Usando Task Scheduler (Windows)
|
|
# Crear tarea programada cada 2 horas
|
|
```
|
|
|
|
## Despliegue con Docker
|
|
|
|
### Construir Imagen
|
|
|
|
```bash
|
|
# Desde directorio raíz
|
|
docker build -t datatransfer:latest .
|
|
```
|
|
|
|
### Ejecutar Contenedor
|
|
|
|
```bash
|
|
docker run -d \
|
|
--name datatransfer \
|
|
-p 5000:5000 \
|
|
-v $(pwd)/Reportes:/app/Reportes \
|
|
-v $(pwd)/Logs:/app/Logs \
|
|
-e DB_USER=$DB_USER \
|
|
-e DB_PASSWORD=$DB_PASSWORD \
|
|
datatransfer:latest
|
|
```
|
|
|
|
### Usando Docker Compose
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
version: '3.8'
|
|
services:
|
|
datatransfer:
|
|
build: .
|
|
ports:
|
|
- "5000:5000"
|
|
environment:
|
|
- FLASK_ENV=production
|
|
- DB_USER=${DB_USER}
|
|
- DB_PASSWORD=${DB_PASSWORD}
|
|
- SHAREPOINT_CLIENT_ID=${SHAREPOINT_CLIENT_ID}
|
|
volumes:
|
|
- ./Reportes:/app/Reportes
|
|
- ./Logs:/app/Logs
|
|
restart: unless-stopped
|
|
```
|
|
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
## Despliegue en la Nube
|
|
|
|
### Azure Container Instances
|
|
|
|
```bash
|
|
# Construir y subir imagen
|
|
az acr build --registry myregistry --image datatransfer:latest .
|
|
|
|
# Crear container instance
|
|
az container create \
|
|
--resource-group myResourceGroup \
|
|
--name datatransfer \
|
|
--image myregistry.azurecr.io/datatransfer:latest \
|
|
--cpu 1 --memory 1.5 \
|
|
--environment-variables \
|
|
DB_USER=$DB_USER \
|
|
DB_PASSWORD=$DB_PASSWORD \
|
|
--ports 5000 \
|
|
--restart-policy OnFailure
|
|
```
|
|
|
|
### Azure App Service
|
|
|
|
1. **Crear App Service**
|
|
```bash
|
|
az appservice plan create --name myPlan --resource-group myRG --sku B1
|
|
az webapp create --name datatransfer --plan myPlan --resource-group myRG
|
|
```
|
|
|
|
2. **Configurar deployment**
|
|
```bash
|
|
az webapp config appsettings set \
|
|
--name datatransfer \
|
|
--resource-group myRG \
|
|
--setting WEBSITES_PORT=5000
|
|
```
|
|
|
|
3. **Deploy con Git**
|
|
```bash
|
|
az webapp deployment source config-local-git \
|
|
--name datatransfer \
|
|
--resource-group myRG
|
|
```
|
|
|
|
### AWS EC2
|
|
|
|
```bash
|
|
# Instalar Docker en EC2
|
|
sudo yum update -y
|
|
sudo amazon-linux-extras install docker
|
|
sudo service docker start
|
|
sudo usermod -a -G docker ec2-user
|
|
|
|
# Ejecutar contenedor
|
|
docker run -d -p 5000:5000 \
|
|
-e DB_USER=$DB_USER \
|
|
-e DB_PASSWORD=$DB_PASSWORD \
|
|
datatransfer:latest
|
|
```
|
|
|
|
### Google Cloud Run
|
|
|
|
```bash
|
|
# Construir imagen
|
|
gcloud builds submit --tag gcr.io/PROJECT-ID/datatransfer
|
|
|
|
# Deploy
|
|
gcloud run deploy datatransfer \
|
|
--image gcr.io/PROJECT-ID/datatransfer \
|
|
--platform managed \
|
|
--port 5000 \
|
|
--set-env-vars DB_USER=$DB_USER,DB_PASSWORD=$DB_PASSWORD \
|
|
--allow-unauthenticated
|
|
```
|
|
|
|
## Configuración de Producción
|
|
|
|
### Variables de Entorno
|
|
|
|
```bash
|
|
# Base de datos
|
|
DB_USER=prod_user
|
|
DB_PASSWORD=prod_password
|
|
DB_SERVER=prod-sql-server.database.windows.net
|
|
|
|
# SharePoint
|
|
SHAREPOINT_CLIENT_ID=prod_client_id
|
|
SHAREPOINT_TENANT_ID=prod_tenant_id
|
|
|
|
# FTP
|
|
FTP_HOST=prod-ftp.example.com
|
|
FTP_USER=prod_ftp_user
|
|
FTP_PASSWORD=prod_ftp_password
|
|
|
|
# Aplicación
|
|
FLASK_ENV=production
|
|
SECRET_KEY=your-secret-key-here
|
|
LOG_LEVEL=INFO
|
|
```
|
|
|
|
### Configuración de Logging
|
|
|
|
```python
|
|
# En GeneralConfig.py
|
|
LOGGING = {
|
|
'version': 1,
|
|
'disable_existing_loggers': False,
|
|
'formatters': {
|
|
'verbose': {
|
|
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
|
|
'style': '{',
|
|
},
|
|
},
|
|
'handlers': {
|
|
'file': {
|
|
'class': 'logging.FileHandler',
|
|
'filename': 'Logs/production.log',
|
|
'formatter': 'verbose',
|
|
},
|
|
'console': {
|
|
'class': 'logging.StreamHandler',
|
|
'formatter': 'verbose',
|
|
},
|
|
},
|
|
'root': {
|
|
'handlers': ['console', 'file'],
|
|
'level': 'INFO',
|
|
},
|
|
}
|
|
```
|
|
|
|
## Monitoreo y Mantenimiento
|
|
|
|
### Health Checks
|
|
|
|
```python
|
|
# Endpoint de health check
|
|
@app.route('/health')
|
|
def health():
|
|
# Verificar conexión DB
|
|
try:
|
|
db = DatabaseManager()
|
|
conn = db.get_connection('pg')
|
|
conn.close()
|
|
return {'status': 'healthy', 'database': 'ok'}
|
|
except Exception as e:
|
|
return {'status': 'unhealthy', 'database': str(e)}, 500
|
|
```
|
|
|
|
### Logs en la Nube
|
|
|
|
#### Azure Application Insights
|
|
|
|
```python
|
|
from applicationinsights import TelemetryClient
|
|
|
|
tc = TelemetryClient('your-instrumentation-key')
|
|
tc.track_event('ETL Started')
|
|
tc.track_metric('Reports Processed', report_count)
|
|
tc.flush()
|
|
```
|
|
|
|
#### AWS CloudWatch
|
|
|
|
```python
|
|
import boto3
|
|
|
|
cloudwatch = boto3.client('cloudwatch')
|
|
cloudwatch.put_metric_data(
|
|
Namespace='DataTransfer',
|
|
MetricData=[
|
|
{
|
|
'MetricName': 'ReportsProcessed',
|
|
'Value': report_count,
|
|
'Unit': 'Count'
|
|
}
|
|
]
|
|
)
|
|
```
|
|
|
|
### Backup y Recuperación
|
|
|
|
- **Reportes:** Los archivos Excel se generan diariamente
|
|
- **Logs:** Rotar logs semanalmente
|
|
- **Base de datos:** Backup automático de SQL Server
|
|
- **Configuración:** Versionar archivos de config en Git
|
|
|
|
## Escalado
|
|
|
|
### Horizontal Scaling
|
|
|
|
- **Múltiples instancias:** Ejecutar múltiples contenedores
|
|
- **Load balancer:** Distribuir requests entre instancias
|
|
- **Queue system:** Usar Redis/RabbitMQ para jobs ETL
|
|
|
|
### Vertical Scaling
|
|
|
|
- **CPU/Memoria:** Aumentar recursos del contenedor
|
|
- **Database:** Usar réplicas de lectura para consultas API
|
|
|
|
## Seguridad en Producción
|
|
|
|
### Red
|
|
|
|
- **Firewall:** Restringir acceso solo a IPs necesarias
|
|
- **VPC:** Aislar en red privada
|
|
- **HTTPS:** Usar certificados SSL
|
|
|
|
### Autenticación
|
|
|
|
- **API Keys:** Para acceso a API
|
|
- **OAuth:** Para UI web
|
|
- **Secrets Management:** Azure Key Vault, AWS Secrets Manager
|
|
|
|
### Actualizaciones
|
|
|
|
- **Zero-downtime:** Usar blue-green deployment
|
|
- **Rollback:** Mantener versiones anteriores
|
|
- **Testing:** Probar en staging antes de producción |