
Séparation des scripts de génération et amélioration de l'architecture - Séparé generate_grafana_dashboards.sh en 3 scripts distincts : * generate_grafana_dashboards.sh (dashboards uniquement) * generate_promtail_config.sh (configuration Promtail) * generate_logrotate_configs.sh (configurations Logrotate) - Supprimé generate_docker_compose.sh et generate_docker_variables.sh - Centralisé la génération des variables dans generate_variables.sh - Mis à jour generate.sh pour une architecture en 5 étapes - Corrigé les chemins de sortie et les références de variables - Ajouté la gestion d'erreurs pour les fichiers .env problématiques - Généré toutes les configurations Nginx, Grafana, Promtail et Logrotate - Amélioré la modularité et la maintenabilité du code
430 lines
12 KiB
Bash
Executable File
430 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Script pour générer automatiquement les configurations Nginx
|
||
# basées sur les modules définis dans les variables d'environnement
|
||
|
||
# Fonction pour charger les variables d'environnement
|
||
load_env_files() {
|
||
local env_files=(".env.secrets" ".env" ".env.auto" ".env.post")
|
||
|
||
for env_file in "${env_files[@]}"; do
|
||
if [ -f "$env_file" ]; then
|
||
echo "📄 Chargement de $env_file..."
|
||
source "$env_file" 2>/dev/null || true
|
||
else
|
||
echo "⚠️ Fichier $env_file non trouvé, ignoré."
|
||
fi
|
||
done
|
||
}
|
||
|
||
# Fonction pour générer les upstreams
|
||
generate_upstreams() {
|
||
echo "🔧 Génération du fichier upstreams.conf"
|
||
|
||
# Créer le répertoire si nécessaire
|
||
mkdir -p "nginx"
|
||
|
||
# Générer le fichier upstreams.conf
|
||
cat > "nginx/upstreams.conf" << 'EOF'
|
||
# Upstreams générés automatiquement
|
||
# Généré le $(date)
|
||
|
||
EOF
|
||
|
||
# Ajouter le format de log JSON
|
||
cat >> "nginx/upstreams.conf" << 'EOF'
|
||
log_format app_json escape=json
|
||
'{ "time":"$time_iso8601",'
|
||
' "client":"$remote_addr",'
|
||
' "xff":"$http_x_forwarded_for",'
|
||
' "method":"$request_method",'
|
||
' "host":"$host",'
|
||
' "uri":"$request_uri",'
|
||
' "status":$status,'
|
||
' "bytes":$body_bytes_sent,'
|
||
' "ua":"$http_user_agent",'
|
||
' "upstream":"$upstream_addr",'
|
||
' "rt":$request_time,'
|
||
' "urt":$upstream_response_time }';
|
||
|
||
EOF
|
||
|
||
# Générer les upstreams pour chaque service
|
||
for SERVICE_VAR in "${SERVICES[@]}"; do
|
||
echo " 🔄 Génération upstream pour $SERVICE_VAR"
|
||
|
||
cat >> "nginx/upstreams.conf" << EOF
|
||
|
||
upstream \$${SERVICE_VAR} {
|
||
server \$${SERVICE_VAR}_DOCKER_NAME:\$${SERVICE_VAR}_PORT;
|
||
keepalive 64;
|
||
}
|
||
EOF
|
||
done
|
||
|
||
echo "✅ Fichier upstreams.conf généré"
|
||
}
|
||
|
||
# Fonction pour générer les configurations internes
|
||
generate_internal_configs() {
|
||
echo "🔧 Génération du fichier app-internal-ports.conf"
|
||
|
||
# Créer le répertoire si nécessaire
|
||
mkdir -p "nginx"
|
||
|
||
# Générer le fichier app-internal-ports.conf
|
||
cat > "nginx/app-internal-ports.conf" << 'EOF'
|
||
# Configurations internes générées automatiquement
|
||
# Généré le $(date)
|
||
|
||
EOF
|
||
|
||
# Générer les configurations internes pour chaque service
|
||
for SERVICE_VAR in "${SERVICES[@]}"; do
|
||
echo " 🔄 Génération config interne pour $SERVICE_VAR"
|
||
|
||
cat >> "nginx/app-internal-ports.conf" << EOF
|
||
|
||
server {
|
||
listen \$${SERVICE_VAR}_PORT default_server;
|
||
server_name _; # pas d'host requis
|
||
access_log \$$NGINX_LOGS_DIR/\$${SERVICE_VAR}_int.log app_json;
|
||
|
||
location / {
|
||
proxy_pass http://\$${SERVICE_VAR}_DOCKER_NAME;
|
||
include \$$NGINX_CONFS_DIR/proxy_headers.conf;
|
||
}
|
||
|
||
# websocket (si nécessaire)
|
||
location /ws/ {
|
||
proxy_pass http://\$${SERVICE_VAR}_DOCKER_NAME;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade \$http_upgrade;
|
||
proxy_set_header Connection "upgrade";
|
||
include \$$NGINX_CONFS_DIR/proxy_headers.conf;
|
||
proxy_read_timeout 3600s;
|
||
}
|
||
}
|
||
EOF
|
||
done
|
||
|
||
echo "✅ Fichier app-internal-ports.conf généré"
|
||
}
|
||
|
||
# Fonction pour générer les configurations HTTPS individuelles
|
||
generate_https_configs() {
|
||
echo "🔧 Génération des configurations HTTPS individuelles"
|
||
|
||
# Générer une configuration HTTPS pour chaque service
|
||
for SERVICE_VAR in "${SERVICES[@]}"; do
|
||
echo " 🔄 Génération config HTTPS pour $SERVICE_VAR"
|
||
|
||
local CONFIG_FILE="nginx/${SERVICE_VAR}_https.conf"
|
||
|
||
cat > "$CONFIG_FILE" << EOF
|
||
# Configuration HTTPS pour $SERVICE_VAR
|
||
# Généré automatiquement le $(date)
|
||
|
||
server {
|
||
listen 80;
|
||
server_name \$${SERVICE_VAR}.\$$DOMAIN;
|
||
# redirection HTTP→HTTPS pour l'externe
|
||
return 301 https://\$host\$request_uri;
|
||
}
|
||
|
||
server {
|
||
listen 443 ssl http2;
|
||
server_name \$${SERVICE_VAR}_DOCKER_NAME.\$$DOMAIN;
|
||
|
||
ssl_certificate /etc/letsencrypt/live/$HOST/fullchain.pem;
|
||
ssl_certificate_key /etc/letsencrypt/live/$HOST/privkey.pem;
|
||
|
||
|
||
# réglages TLS minimaux (adapter selon politique)
|
||
ssl_session_timeout 1d;
|
||
ssl_protocols TLSv1.2 TLSv1.3;
|
||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||
ssl_prefer_server_ciphers on;
|
||
|
||
# HSTS (activer seulement si tout le domaine est en HTTPS)
|
||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||
|
||
access_log \$$NGINX_LOGS_DIR/\$${SERVICE_VAR}_https.log app_json;
|
||
|
||
location / {
|
||
proxy_pass http://\$${SERVICE_VAR}_DOCKER_NAME;
|
||
include \$$NGINX_CONFS_DIR/proxy_headers.conf;
|
||
}
|
||
|
||
location /ws/ {
|
||
proxy_pass http://\$${SERVICE_VAR}_DOCKER_NAME;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade \$http_upgrade;
|
||
proxy_set_header Connection "upgrade";
|
||
include \$$NGINX_CONFS_DIR/proxy_headers.conf;
|
||
proxy_read_timeout 3600s;
|
||
}
|
||
}
|
||
EOF
|
||
|
||
echo " ✅ Config HTTPS générée: $CONFIG_FILE"
|
||
done
|
||
|
||
echo "✅ Configurations HTTPS individuelles générées"
|
||
}
|
||
|
||
# Fonction pour générer un fichier de configuration consolidé
|
||
generate_consolidated_https_config() {
|
||
echo "🔧 Génération du fichier nginx_$HOST-https.conf consolidé"
|
||
|
||
# Créer le répertoire si nécessaire
|
||
mkdir -p "nginx"
|
||
|
||
# Générer le fichier consolidé
|
||
cat > "nginx/nginx_$HOST-https.conf" << 'EOF'
|
||
# Configuration Nginx consolidée pour $HOST
|
||
# Générée automatiquement le $(date)
|
||
|
||
# Inclusion du format de log JSON et des upstreams
|
||
include upstreams.conf;
|
||
|
||
EOF
|
||
|
||
# Ajouter la redirection HTTP→HTTPS globale
|
||
cat >> "nginx/nginx_$HOST-https.conf" << 'EOF'
|
||
|
||
# Redirection globale HTTP→HTTPS
|
||
server {
|
||
listen 80;
|
||
server_name $HOST *.$HOST;
|
||
return 301 https://$host$request_uri;
|
||
}
|
||
|
||
EOF
|
||
|
||
# Ajouter les configurations HTTPS pour chaque service
|
||
for SERVICE_VAR in "${SERVICES[@]}"; do
|
||
echo " 🔄 Ajout de la config HTTPS pour $SERVICE_VAR dans le fichier consolidé"
|
||
|
||
cat >> "nginx/nginx_$HOST-https.conf" << EOF
|
||
|
||
# Configuration HTTPS pour $SERVICE_VAR
|
||
server {
|
||
listen 80;
|
||
server_name \$${SERVICE_VAR}.\$$DOMAIN;
|
||
# redirection HTTP→HTTPS pour l'externe
|
||
return 301 https://\$host\$request_uri;
|
||
}
|
||
|
||
server {
|
||
listen 443 ssl http2;
|
||
server_name \$${SERVICE_VAR}_DOCKER_NAME.\$$DOMAIN;
|
||
|
||
ssl_certificate \$$CERT_PATH/certs/fullchain.pem;
|
||
ssl_certificate_key \$$CERT_PATH/private/privkey.pem;
|
||
|
||
# réglages TLS minimaux (adapter selon politique)
|
||
ssl_session_timeout 1d;
|
||
ssl_protocols TLSv1.2 TLSv1.3;
|
||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||
ssl_prefer_server_ciphers on;
|
||
|
||
# HSTS (activer seulement si tout le domaine est en HTTPS)
|
||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||
|
||
access_log \$$NGINX_LOGS_DIR/\$${SERVICE_VAR}_https.log app_json;
|
||
|
||
location / {
|
||
proxy_pass http://\$${SERVICE_VAR}_DOCKER_NAME;
|
||
include \$$NGINX_CONFS_DIR/proxy_headers.conf;
|
||
}
|
||
|
||
location /ws/ {
|
||
proxy_pass http://\$${SERVICE_VAR}_DOCKER_NAME;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade \$http_upgrade;
|
||
proxy_set_header Connection "upgrade";
|
||
include \$$NGINX_CONFS_DIR/proxy_headers.conf;
|
||
proxy_read_timeout 3600s;
|
||
}
|
||
}
|
||
EOF
|
||
done
|
||
|
||
echo "✅ Fichier nginx_$HOST-https.conf consolidé généré"
|
||
}
|
||
|
||
# Fonction pour créer les fichiers de configuration proxy_headers.conf
|
||
generate_proxy_headers() {
|
||
echo "🔧 Génération du fichier proxy_headers.conf"
|
||
|
||
# Créer le répertoire si nécessaire
|
||
mkdir -p "nginx"
|
||
|
||
# Générer le fichier proxy_headers.conf
|
||
cat > "nginx/proxy_headers.conf" << 'EOF'
|
||
# Headers de proxy générés automatiquement
|
||
# Généré le $(date)
|
||
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
proxy_set_header X-Forwarded-Host $host;
|
||
proxy_set_header X-Forwarded-Port $server_port;
|
||
|
||
# Directives de proxy
|
||
proxy_redirect off; # si l'app sait générer ses URLs
|
||
add_header X-Debug-Scheme $scheme always;
|
||
add_header X-Debug-XFP $http_x_forwarded_proto always;
|
||
|
||
# Timeouts
|
||
proxy_connect_timeout 60s;
|
||
proxy_send_timeout 60s;
|
||
proxy_read_timeout 60s;
|
||
|
||
# Buffer settings
|
||
proxy_buffering on;
|
||
proxy_buffer_size 4k;
|
||
proxy_buffers 8 4k;
|
||
proxy_busy_buffers_size 8k;
|
||
|
||
# Cache settings
|
||
proxy_cache_bypass $http_upgrade;
|
||
proxy_no_cache $http_upgrade;
|
||
EOF
|
||
|
||
echo "✅ Fichier proxy_headers.conf généré"
|
||
}
|
||
|
||
# Générer le script de validation des templates
|
||
generate_deploy_script() {
|
||
echo "🔧 Génération du script de validation des templates"
|
||
|
||
cat > "nginx/validate_templates.sh" << 'EOF'
|
||
#!/bin/bash
|
||
|
||
# Script de validation des templates Nginx générés
|
||
# Généré automatiquement le $(date)
|
||
|
||
set -euo pipefail
|
||
|
||
# Couleurs pour les messages
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m'
|
||
|
||
# Fonctions d'affichage
|
||
print_error() { echo -e "${RED}❌ ERREUR${NC}: $1"; }
|
||
print_success() { echo -e "${GREEN}✅ SUCCÈS${NC}: $1"; }
|
||
print_info() { echo -e "${BLUE}ℹ️ INFO${NC}: $1"; }
|
||
print_warning() { echo -e "${YELLOW}⚠️ ATTENTION${NC}: $1"; }
|
||
|
||
# Charger les variables d'environnement
|
||
if [ -f ".env" ]; then
|
||
# Charger .env en mode silencieux pour éviter les erreurs de syntaxe
|
||
source .env 2>/dev/null || true
|
||
fi
|
||
|
||
# Vérifier que HOST est défini
|
||
if [ -z "${HOST:-}" ]; then
|
||
print_warning "Variable HOST non définie, utilisation de la valeur par défaut"
|
||
export HOST="dev4._4NKweb.com"
|
||
fi
|
||
|
||
print_info "Validation des templates Nginx pour $HOST"
|
||
|
||
# Vérifier que les fichiers existent
|
||
missing_files=0
|
||
|
||
if [ ! -f "nginx/upstreams.conf" ]; then
|
||
print_error "Template nginx/upstreams.conf non trouvé"
|
||
missing_files=$((missing_files + 1))
|
||
fi
|
||
|
||
if [ ! -f "nginx/app-internal-ports.conf" ]; then
|
||
print_error "Template nginx/app-internal-ports.conf non trouvé"
|
||
missing_files=$((missing_files + 1))
|
||
fi
|
||
|
||
if [ ! -f "nginx/proxy_headers.conf" ]; then
|
||
print_error "Template nginx/proxy_headers.conf non trouvé"
|
||
missing_files=$((missing_files + 1))
|
||
fi
|
||
|
||
if [ ! -f "nginx/nginx_$HOST-https.conf" ]; then
|
||
print_error "Template nginx/nginx_$HOST-https.conf non trouvé"
|
||
missing_files=$((missing_files + 1))
|
||
fi
|
||
|
||
if [ $missing_files -eq 0 ]; then
|
||
print_success "Tous les templates de configuration sont présents"
|
||
print_info "Templates générés:"
|
||
echo " • nginx/upstreams.conf"
|
||
echo " • nginx/app-internal-ports.conf"
|
||
echo " • nginx/proxy_headers.conf"
|
||
echo " • nginx/*_https.conf (configurations HTTPS individuelles)"
|
||
echo " • nginx/nginx_$HOST-https.conf"
|
||
|
||
print_info "Ces templates sont prêts à être utilisés dans votre infrastructure"
|
||
print_warning "Adaptez les chemins et configurations selon vos besoins spécifiques"
|
||
else
|
||
print_error "$missing_files template(s) manquant(s)"
|
||
exit 1
|
||
fi
|
||
|
||
EOF
|
||
|
||
chmod +x "nginx/validate_templates.sh"
|
||
echo "✅ Script de validation des templates généré"
|
||
}
|
||
|
||
# Fonction principale
|
||
main() {
|
||
echo "🚀 GÉNÉRATION AUTOMATIQUE DES CONFIGURATIONS NGINX"
|
||
echo "=================================================="
|
||
|
||
# Charger les variables d'environnement
|
||
load_env_files
|
||
|
||
# Vérifier que SERVICES est défini
|
||
if [ -z "${SERVICES[*]}" ]; then
|
||
print_error "Variable SERVICES non définie"
|
||
echo " Assurez-vous que SERVICES=(service1 service2 ...) est défini dans .env"
|
||
exit 1
|
||
fi
|
||
|
||
echo "📋 Génération des configurations pour ${#SERVICES[@]} services..."
|
||
echo " Services: ${SERVICES[*]}"
|
||
|
||
# Supprimer les fichiers de sortie existants (remplacer complètement)
|
||
rm -f "nginx/upstreams.conf" 2>/dev/null || true
|
||
rm -f "nginx/app-internal-ports.conf" 2>/dev/null || true
|
||
rm -f "nginx/proxy_headers.conf" 2>/dev/null || true
|
||
rm -f "nginx/nginx_${HOST:-dev4._4NKweb.com}-https.conf" 2>/dev/null || true
|
||
rm -f "nginx/deploy_configs.sh" 2>/dev/null || true
|
||
rm -f "nginx/"*_https.conf 2>/dev/null || true
|
||
|
||
# Créer le répertoire de sortie
|
||
mkdir -p "nginx"
|
||
|
||
# Générer tous les fichiers de configuration
|
||
generate_upstreams
|
||
generate_internal_configs
|
||
generate_proxy_headers
|
||
generate_https_configs
|
||
generate_consolidated_https_config
|
||
generate_deploy_script
|
||
|
||
echo ""
|
||
echo "✅ GÉNÉRATION TERMINÉE !"
|
||
echo "📁 Configurations générées dans: nginx/"
|
||
echo "🔧 Les configurations utilisent les variables d'environnement"
|
||
echo "📊 Services traités: ${#SERVICES[@]}"
|
||
}
|
||
|
||
# Exécuter le script principal
|
||
main "$@"
|