#!/bin/bash # Script pour générer les variables Docker pour toutes les composantes # Fonction pour charger les fichiers d'environnement dans l'ordre load_env_files() { local env_files=(".env.secrets" ".env" ".env.post") for env_file in "${env_files[@]}"; do if [ -f "$env_file" ]; then echo "Chargement de $env_file..." # Charger en ignorant les erreurs de syntaxe set -e source "$env_file" 2>/dev/null || true set +e else echo "Fichier $env_file non trouvé, ignoré." fi done } # Charger les variables d'environnement dans l'ordre load_env_files # Générer la variable HOST si elle n'est pas définie if [ -z "$HOST" ]; then HOST="dev4.${DOMAIN}" fi # Supprimer les fichiers de sortie existants (remplacer complètement) rm -f .env.auto # Générer les variables de base echo "# ====== BASE VARIABLES ======" >> .env.auto echo "HOST=$HOST" >> .env.auto echo "" >> .env.auto echo " services: " >> docker-compose.yml.auto # Liste des variables/composantes # Fonction pour générer les variables pour une composante generate_variables() { local VARIABLE="$1" echo "# ====== INTERNAL $VARIABLE ======" echo "" printf '%s_DOCKER_NAME=%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_CONFS_DIR=$DOCKER_GLOBAL/confs/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_LOGS_DIR=$DOCKER_GLOBAL/logs/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_RUNS_DIR=$DOCKER_GLOBAL/runs/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_DATAS_DIR=$DOCKER_GLOBAL/datas/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_BACKUPS_DIR=$DOCKER_GLOBAL/backups/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_SCRIPTS_DIR=$DOCKER_GLOBAL/scripts/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_DOCKER_WORKING_DIR=/home/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" echo "" printf '%s_DOCKER_CONFS_DIR=$DOCKER_GLOBAL/confs/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_DOCKER_LOGS_DIR=$DOCKER_GLOBAL/logs/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_DOCKER_RUNS_DIR=$DOCKER_GLOBAL/runs/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_DOCKER_DATAS_DIR=$DOCKER_GLOBAL/datas/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_DOCKER_BACKUPS_DIR=$DOCKER_GLOBAL/backups/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_DOCKER_SCRIPTS_DIR=$DOCKER_GLOBAL/scripts/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" echo "${VARIABLE}_DOCKER_WORKING_DIR_CREATE=\"id -u \$${VARIABLE} >/dev/null 2>&1 || adduser --disabled-password --gecos '' \$${VARIABLE}; chown -R \$${VARIABLE}:\$${VARIABLE} /home/root/.\$${VARIABLE} || echo 'warn: chown partiel (fichiers bind-mount Windows)'; exec \\\"\$@\\\"\"" printf '%s_DOCKER_PORT=$%s_PORT\n' "$VARIABLE" "$VARIABLE" printf '%s_URL_ROUTE=/%s\n' "$VARIABLE" "$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')" printf '%s_URL=http://$%s_DOCKER_NAME:$%s_DOCKER_PORT\n' "$VARIABLE" "$VARIABLE" "$VARIABLE" printf '%s_URL_EXTERNAL=https://$HOST$%s_URL_ROUTE\n' "$VARIABLE" "$VARIABLE" printf '%s_URL_WS=ws://$%s_DOCKER_PORT\n' "$VARIABLE" "$VARIABLE" printf '%s_URL_WS_EXTERNAL=wss://$HOST/ws\n' "$VARIABLE" # Générer les ports spécifiques pour Bitcoin if [ "$VARIABLE" = "BITCOIN" ]; then echo "BITCOIN_ZMQPBUBHASHBLOCK_PORT=28332" echo "BITCOIN_ZMQPUBRAWTX_PORT=28333" echo "BITCOIN_SIGNET_P2P_PORT=38332" echo "BITCOIN_SIGNET_RPC_PORT=38333" fi echo "" # Construire la section ports dynamiquement local ports_section="" # Si c'est Nginx, ajouter tous les ports de tous les services if [ "$VARIABLE" = "NGINX" ]; then # Ports propres à Nginx ports_section=" - \"\$${VARIABLE}_EXTERNAL_PORT:\$${VARIABLE}_EXTERNAL_PORT\"" ports_section="$ports_section\n - \"\$${VARIABLE}_PORT:\$${VARIABLE}_PORT\"" ports_section="$ports_section\n - \"\$${VARIABLE}_PORT2:\$${VARIABLE}_PORT2\"" ports_section="$ports_section\n - \"\$${VARIABLE}_PORT3:\$${VARIABLE}_PORT3\"" # Ajouter tous les ports de tous les autres services for SERVICE_VAR in "${SERVICES[@]}"; do if [ "$SERVICE_VAR" != "NGINX" ]; then ports_section="$ports_section\n - \"\$${SERVICE_VAR}_EXTERNAL_PORT:\$${SERVICE_VAR}_EXTERNAL_PORT\"" ports_section="$ports_section\n - \"\$${SERVICE_VAR}_PORT:\$${SERVICE_VAR}_PORT\"" ports_section="$ports_section\n - \"\$${SERVICE_VAR}_PORT2:\$${SERVICE_VAR}_PORT2\"" ports_section="$ports_section\n - \"\$${SERVICE_VAR}_PORT3:\$${SERVICE_VAR}_PORT3\"" # Ports spécifiques pour Bitcoin if [ "$SERVICE_VAR" = "BITCOIN" ]; then ports_section="$ports_section\n - \"\$${SERVICE_VAR}_SIGNET_P2P_PORT:\$${SERVICE_VAR}_SIGNET_P2P_PORT\"" ports_section="$ports_section\n - \"\$${SERVICE_VAR}_SIGNET_RPC_PORT:\$${SERVICE_VAR}_SIGNET_RPC_PORT\"" fi fi done else # Pour les autres services, ports normaux ports_section=" - \"\$${VARIABLE}_EXTERNAL_PORT:\$${VARIABLE}_EXTERNAL_PORT\"" ports_section="$ports_section\n - \"\$${VARIABLE}_PORT:\$${VARIABLE}_PORT\"" ports_section="$ports_section\n - \"\$${VARIABLE}_PORT2:\$${VARIABLE}_PORT2\"" ports_section="$ports_section\n - \"\$${VARIABLE}_PORT3:\$${VARIABLE}_PORT3\"" # Ajouter les ports spécifiques pour Bitcoin if [ "$VARIABLE" = "BITCOIN" ]; then ports_section="$ports_section\n - \"\$${VARIABLE}_SIGNET_P2P_PORT:\$${VARIABLE}_SIGNET_P2P_PORT\"" ports_section="$ports_section\n - \"\$${VARIABLE}_SIGNET_RPC_PORT:\$${VARIABLE}_SIGNET_RPC_PORT\"" fi fi # Générer la section complète du service cat << EOF >> docker-compose.yml.auto \$${VARIABLE}_DOCKER_NAME: image: \$${VARIABLE}_DOCKER_IMAGE container_name: \$${VARIABLE}_DOCKER_NAME working_dir: /\$${VARIABLE}_DOCKER_NAME ports: $(printf "$ports_section") volumes: - \$${VARIABLE}_CONFS_DIR:\$${VARIABLE}_DOCKER_CONFS_DIR - \$${VARIABLE}_LOGS_DIR:\$${VARIABLE}_DOCKER_LOGS_DIR - \$${VARIABLE}_RUNS_DIR:\$${VARIABLE}_DOCKER_RUNS_DIR - \$${VARIABLE}_DATAS_DIR:\$${VARIABLE}_DOCKER_DATAS_DIR - \$${VARIABLE}_BACKUPS_DIR:\$${VARIABLE}_DOCKER_BACKUPS_DIR - \$${VARIABLE}_SCRIPTS_DIR:\$${VARIABLE}_DOCKER_SCRIPTS_DIR networks: btcnet: aliases: - \$${VARIABLE}_DOCKER_NAME user: root entrypoint: > /bin/sh -c \"\$${VARIABLE}_DOCKER_WORKING_DIR_CREATE\" healthcheck: test: [\"CMD\", \"sh\", \"\$LECONFFRE-FRONT_CONFS_DIR/healthcheck_\$${VARIABLE}.sh\"] interval: 30s timeout: 10s retries: 50 restart: unless-stopped EOF echo "" } function generate_variables_external() { local VARIABLE="$1" echo "# ====== EXTERNAL $VARIABLE ======" echo "" echo "${VARIABLE}_URL_EXTERNAL=https://\$${VARIABLE}_HOST:\$${VARIABLE}_EXTERNAL_PORT\$${VARIABLE}_URL_ROUTE" echo "${VARIABLE}_URL_WS_EXTERNAL=wss://\$${VARIABLE}_HOST:\$${VARIABLE}_EXTERNAL_PORT/ws" echo "" } # Générer les variables pour toutes les composants for VARIABLE in "${SERVICES[@]}"; do generate_variables "$VARIABLE" >> .env.auto done # Générer les variables pour toutes les composants externes for VARIABLE in "${SERVICES_EXTERNAL[@]}"; do generate_variables_external "$VARIABLE" >> .env.auto done # Générer les variables pour BOOTSTRAP (correction de l'incohérence BOOSTRAP/BOOTSTRAP) echo "# ====== EXTERNAL BOOTSTRAP (correction) ======" >> .env.auto echo "BOOTSTRAP_URL_ROUTE=/\$BOOTSTRAP" >> .env.auto echo "BOOTSTRAP_URL_EXTERNAL=https://\$BOOTSTRAP_HOST:\$BOOTSTRAP_EXTERNAL_PORT\$BOOTSTRAP_URL_ROUTE" >> .env.auto echo "BOOTSTRAP_URL_WS_EXTERNAL=wss://\$BOOTSTRAP_HOST:\$BOOTSTRAP_EXTERNAL_PORT/ws" >> .env.auto echo "" >> .env.auto echo " watchtower: image: containrrr/watchtower container_name: watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock command: --interval 30 --label-enable networks: - btcnet restart: unless-stopped networks: btcnet: name: _4NK_node_btcnet driver: bridge ipam: config: - subnet: 172.20.0.0/16 " >> docker-compose.yml.auto