first commit
This commit is contained in:
@@ -0,0 +1,307 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user