4NK_vault/storage/dev/generate_nginx_configs.sh
4NK Dev 4834c40503 ci: docker_tag=dev-test
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
2025-10-03 17:13:19 +00:00

430 lines
12 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "$@"