Guía de despliegue¶
Esta guía cubre estrategias de despliegue para AMRnet, incluyendo desarrollo local, entornos de puesta en escena y despliegue de producción en varias plataformas.
Configuración de entorno¶
AMRnet soporta múltiples entornos de despliegue con diferentes configuraciones:
Entorno de Desarrollo¶
Para desarrollo local con recarga caliente y depuración:
# Clone and setup
git clone https://github.com/amrnet/amrnet.git
cd amrnet
# Install dependencies
npm install
cd client && npm install && cd ..
# Environment configuration
cp .env.example .env
Variables de entorno (.env):
NODE_ENV=development
PORT=8080
# Database
MONGODB_URI=mongodb://localhost:27017/amrnet
# Development settings
REACT_APP_API_URL=http://localhost:8080/api/
ENABLE_DEBUG_LOGS=true
Iniciar Servidores de Desarrollo:
# Start both backend and frontend
npm run start:dev
# Or individually:
npm run start:backend # Backend only (port 8080)
npm run client # Frontend only (port 3000)
Entorno de Staging¶
Para pruebas de construcción de producción localmente:
# Build production bundle
npm run build
# Start production server
NODE_ENV=production npm start
Despliegue de producción¶
Despliegue de Heroku¶
AMRnet está optimizado para la implementación de Heroku con procesos de construcción automáticos:
1. Heroku App Setup:
# Install Heroku CLI and login
heroku login
# Create new app
heroku create your-app-name
# Add MongoDB Atlas add-on (or use existing Atlas cluster)
heroku addons:create mongolab:sandbox
2. Configuración del entorno:
# Set environment variables
heroku config:set NODE_ENV=production
heroku config:set MONGODB_URI="your-mongodb-atlas-uri"
heroku config:set REACT_APP_API_URL="https://your-app-name.herokuapp.com/api/"
3. Desplegamiento:
# Deploy to Heroku
git add .
git commit -m "Deploy to Heroku"
git push heroku main
# Monitor deployment
heroku logs --tail
Archivos de configuración de Heroku:
Perfil:
web: node server.js
package.json (heroku-postbuild script):
{
"scripts": {
"heroku-postbuild": "cd client && npm install && npm run build"
}
}
Configuración del Atlas de MongoDB¶
Para despliegue de base de datos de producción:
1. Atlas Cluster Setup:
Crear cuenta de MongoDB Atlas
Crear un nuevo clúster (nivel gratuito M0 para la prueba)
Configurar acceso a la red (lista blanca de sus IPs)
Crear usuario de base de datos con permisos de lectura/escritura
2. Configuración de la conexión:
# Atlas connection string format
MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/amrnet?retryWrites=true&w=majority
3. Optimizaciones de producción:
// config/db.js - Production MongoDB settings
const mongoOptions = {
useNewUrlParser: true,
useUnifiedTopology: true,
maxPoolSize: 10,
minPoolSize: 5,
maxIdleTimeMS: 30000,
serverSelectionTimeoutMS: 5000,
socketTimeoutMS: 45000,
bufferMaxEntries: 0,
bufferCommands: false,
};
Despliegue de Docker¶
Para el despliegue contenedor:
Archivo Docker:
# Multi-stage build for optimized production image
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# Build client
COPY client/package*.json ./client/
WORKDIR /app/client
RUN npm ci --only=production
COPY client/ .
RUN npm run build
# Production stage
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/client/build ./client/build
COPY . .
EXPOSE 8080
CMD ["node", "server.js"]
docker-compose.yml:
version: '3.8'
services:
amrnet:
build: .
ports:
- "8080:8080"
environment:
- NODE_ENV=production
- MONGODB_URI=mongodb://mongo:27017/amrnet
depends_on:
- mongo
mongo:
image: mongo:6
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
volumes:
mongo_data:
Comandos de despliegue:
# Build and start containers
docker-compose up -d
# View logs
docker-compose logs -f amrnet
Despliegue AWS¶
Para el despliegue de AWS usando Elastic Beanstalk:
1. Configuración de EB CLI:
# Install EB CLI
pip install awsebcli
# Initialize EB application
eb init amrnet
# Create environment
eb create amrnet-production
2. Archivos de configuración:
.ebextensions/01_node_command.config:
option_settings:
aws:elasticbeanstalk:container:nodejs:
NodeCommand: "node server.js"
aws:elasticbeanstalk:application:environment:
NODE_ENV: production
3. Desplegar:
# Deploy to AWS
eb deploy
# Monitor health
eb health
Optimización de rendimiento¶
Optimizaciones de despliegue de producción para un mejor rendimiento:
Crear Optimizaciones¶
Configuración de la compilación del cliente:
// client/.env.production
GENERATE_SOURCEMAP=false
REACT_APP_NODE_ENV=production
// Build optimizations in package.json
{
"scripts": {
"build": "react-scripts build && npm run compress",
"compress": "gzip -k build/static/js/*.js && gzip -k build/static/css/*.css"
}
}
Optimizaciones de servidor¶
Configuración de Producción de Express.js:
// server.js production settings
const express = require('express');
const compression = require('compression');
const helmet = require('helmet');
const app = express();
// Security middleware
app.use(helmet());
// Compression middleware
app.use(compression({
level: 6,
threshold: 1024,
}));
// Static file caching
app.use(express.static('client/build', {
maxAge: '1y',
etag: false
}));
Optimizaciones de base de datos¶
Índice de Producción de MongoDB:
// Database indexes for production
db.ecoli_data.createIndex({ COUNTRY_ONLY: 1, YEAR: 1 });
db.kpneumo_data.createIndex({ GENOTYPE: 1, COUNTRY_ONLY: 1 });
db.styphi_data.createIndex({ GENOTYPE: 1, YEAR: 1, COUNTRY_ONLY: 1 });
Monitoreo y Registro¶
Configuración de monitorización de producción para el rendimiento y seguimiento de errores:
Monitoreo de aplicaciones¶
Configuración de registro de Winston:
// config/logger.js
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
winston.format.json()
),
defaultMeta: { service: 'amrnet' },
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' }),
],
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple()
}));
}
Middleware de Monitoreo de Rendimiento:
// middleware/performance.js
const performanceMiddleware = (req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
logger.info(`${req.method} ${req.path}`, {
duration,
statusCode: res.statusCode,
ip: req.ip
});
// Alert on slow requests
if (duration > 2000) {
logger.warn(`Slow request detected: ${req.path} took ${duration}ms`);
}
});
next();
};
Seguimiento de errores¶
**Integración centinela **
// Error tracking with Sentry
const Sentry = require('@sentry/node');
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.NODE_ENV,
});
// Error handler middleware
app.use(Sentry.Handlers.errorHandler());
Comprobaciones de salud¶
Terminal de Salud de la aplicación:
// Health check endpoint
app.get('/health', async (req, res) => {
try {
// Check database connection
await mongoose.connection.db.admin().ping();
res.status(200).json({
status: 'healthy',
timestamp: new Date().toISOString(),
uptime: process.uptime(),
memory: process.memoryUsage(),
database: 'connected'
});
} catch (error) {
res.status(503).json({
status: 'unhealthy',
error: error.message
});
}
});
Copia de seguridad y recuperación¶
Estrategias de respaldo de datos para entornos de producción:
Copias de seguridad de base de datos¶
Respaldas automatizadas de Atlas de MongoDB:
Atlas proporciona copias de seguridad automatizadas con recuperación punto-en-tiempo
Configurar la agenda de copias de seguridad y políticas de retención
Pruebe regularmente los procedimientos de restauración de copias de seguridad
Copia de seguridad manual:
#!/bin/bash
# backup-script.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups/amrnet_$DATE"
# Create backup directory
mkdir -p $BACKUP_DIR
# Backup each collection
mongodump --uri="$MONGODB_URI" --out=$BACKUP_DIR
# Compress backup
tar -czf "$BACKUP_DIR.tar.gz" -C /backups "amrnet_$DATE"
# Clean up uncompressed backup
rm -rf $BACKUP_DIR
# Upload to cloud storage (optional)
aws s3 cp "$BACKUP_DIR.tar.gz" s3://amrnet-backups/
Copias de seguridad de aplicaciones¶
Copia de seguridad de código y configuración:
# Git-based backup strategy
git tag -a "production-$(date +%Y%m%d)" -m "Production backup $(date)"
git push origin --tags
Consideraciones de seguridad¶
Mejores prácticas de seguridad para el despliegue de la producción:
Seguridad del entorno¶
Variables de entorno seguros:
# Use secure credential management
heroku config:set MONGODB_URI="$(cat mongodb_uri.txt)"
# Rotate credentials regularly
heroku config:set SESSION_SECRET="$(openssl rand -base64 32)"
Seguridad de red:
// CORS configuration
const cors = require('cors');
app.use(cors({
origin: process.env.ALLOWED_ORIGINS?.split(',') || 'https://amrnet.org',
credentials: true,
optionsSuccessStatus: 200
}));
Seguridad de la base de datos¶
Seguridad MongoDB:
Habilitar autenticación y autorización
Usar SSL/TLS para conexiones
Implementar lista blanca de IP
Actualizaciones de seguridad regulares
Registro de auditoría para acceso a base de datos
Solución de problemas¶
Problemas y soluciones comunes de despliegue:
Fallos de compilación:
# Clear build cache
rm -rf node_modules package-lock.json
npm install
# Frontend build issues
cd client
rm -rf node_modules package-lock.json build
npm install
npm run build
Problemas de conexión de base de datos:
# Test MongoDB connection
mongosh "your-mongodb-uri"
# Check network connectivity
ping cluster.mongodb.net
Problemas de rendimiento:
# Monitor resource usage
heroku ps:exec
top
# Check logs for errors
heroku logs --tail
Problemas de memoria:
# Increase Heroku dyno size
heroku ps:scale web=1:standard-2x
# Check memory usage patterns
heroku logs --source=heroku.router