Guide de déploiement¶
Ce guide couvre les stratégies de déploiement pour AMRnet, y compris le développement local, les environnements de mise en scène et le déploiement de production sur diverses plateformes.
Configuration de l’environnement¶
AMRnet prend en charge plusieurs environnements de déploiement avec différentes configurations :
Environnement de développement¶
Pour le développement local avec rechargement chaud et débogage:
# 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 d’environnement (.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
Lancer les serveurs de développement :
# 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)
Environnement de pré-production¶
Pour tester les versions de production localement :
# Build production bundle
npm run build
# Start production server
NODE_ENV=production npm start
Déploiement de production¶
Déploiement de Heroku¶
AMRnet est optimisé pour le déploiement de Heroku avec des processus de compilation automatiques:
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. Configuration de l’environnement:
# 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. Déploiement :
# Deploy to Heroku
git add .
git commit -m "Deploy to Heroku"
git push heroku main
# Monitor deployment
heroku logs --tail
Fichiers de configuration Heroku :
Profil:
web: node server.js
package.json (heroku-postbuild script):
{
"scripts": {
"heroku-postbuild": "cd client && npm install && npm run build"
}
}
Configuration de l’Atlas MongoDB¶
Pour le déploiement de la base de données de production :
1. Atlas Cluster Setup:
Créer un compte MongoDB Atlas
Créer une nouvelle grappe de serveurs (M0 niveau gratuit pour les tests)
Configurer l’accès au réseau (liste blanche de vos IPs)
Créer un utilisateur de la base de données avec les permissions en lecture/écriture
2. Configuration de la connexion :
# Atlas connection string format
MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/amrnet?retryWrites=true&w=majority
3. Optimisations de production :
// 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,
};
Déploiement Docker¶
Pour le déploiement conteneurisé :
Fichier 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:
Commandes de déploiement :
# Build and start containers
docker-compose up -d
# View logs
docker-compose logs -f amrnet
Déploiement AWS¶
Pour le déploiement AWS en utilisant Elastic Beanstalk :
1. Configuration CLI EB :
# Install EB CLI
pip install awsebcli
# Initialize EB application
eb init amrnet
# Create environment
eb create amrnet-production
2. Fichiers de configuration:
.ebextensions/01_node_command.config:
option_settings:
aws:elasticbeanstalk:container:nodejs:
NodeCommand: "node server.js"
aws:elasticbeanstalk:application:environment:
NODE_ENV: production
3. Déploiement :
# Deploy to AWS
eb deploy
# Monitor health
eb health
Optimisation des performances¶
Optimisations de déploiement de production pour de meilleures performances:
Construire des optimisations¶
Configuration de la compilation du client :
// 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"
}
}
Optimisations du serveur¶
Configuration de production 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
}));
Optimisations de la base de données¶
Index de production 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 });
Surveillance et journalisation¶
Configuration de la surveillance de production pour les performances et le suivi des erreurs :
Surveillance de l’application¶
Winston Logging Configuration :
// 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 surveillance des performances :
// 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();
};
Suivi des erreurs¶
Intégration du Guetteur :
// 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());
Tests de santé¶
Point de terminaison de la santé de l’application :
// 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
});
}
});
Sauvegarde et restauration¶
Stratégies de sauvegarde des données pour les environnements de production :
Sauvegardes de la base de données¶
Sauvegardes automatisées de l’Atlas MongoDB :
Atlas fournit des sauvegardes automatisées avec la restauration ponctuelle
Configurer le calendrier de sauvegarde et les politiques de rétention
Tester régulièrement les procédures de restauration de sauvegarde
Scripts de sauvegarde manuels :
#!/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/
Sauvegardes de l’application¶
Sauvegarde du code et de la configuration :
# Git-based backup strategy
git tag -a "production-$(date +%Y%m%d)" -m "Production backup $(date)"
git push origin --tags
Considérations de sécurité¶
Meilleures pratiques de sécurité pour le déploiement de production :
Sécurité de l’environnement¶
Variables d’environnement sécurisées :
# 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)"
Sécurité du réseau :
// CORS configuration
const cors = require('cors');
app.use(cors({
origin: process.env.ALLOWED_ORIGINS?.split(',') || 'https://amrnet.org',
credentials: true,
optionsSuccessStatus: 200
}));
Sécurité de la base de données¶
Sécurité MongoDB :
Activer l’authentification et l’autorisation
Utiliser SSL/TLS pour les connexions
Implémenter la whitelisting IP
Mises à jour de sécurité régulières
Journalisation de l’audit pour l’accès à la base de données
Dépannage¶
Problèmes de déploiement et solutions courantes :
Échecs de construction :
# 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
Problèmes de connexion à la base de données :
# Test MongoDB connection
mongosh "your-mongodb-uri"
# Check network connectivity
ping cluster.mongodb.net
Problèmes de performance :
# Monitor resource usage
heroku ps:exec
top
# Check logs for errors
heroku logs --tail
Problèmes de mémoire :
# Increase Heroku dyno size
heroku ps:scale web=1:standard-2x
# Check memory usage patterns
heroku logs --source=heroku.router