Mon Discourse est en panne. Problème de certificat ?

Salut @WesPenre :slight_smile:

L’erreur devrait se trouver plus haut que ce qu’inclut votre capture d’écran. Pourriez-vous coller votre journal complet ici afin que les gens puissent voir quel pourrait être le problème ?

Quelqu’un peut-il me dire comment créer un journal d’erreurs si je ne peux pas me connecter à Discourse ? Puis-je le trouver dans WinSCP ? Si oui, quel est le répertoire et le nom du journal ?

Est-ce cela ? Il s’agit du fichier lanceur :

#!/usr/bin/env bash

usage () {
  echo "Usage : lanceur COMMANDE CONFIG [--skip-prereqs] [--docker-args STRING]"
  echo "Commandes :"
  echo "    start :       Démarrer/initialiser un conteneur"
  echo "    stop :        Arrêter un conteneur en cours d'exécution"
  echo "    restart :     Redémarrer un conteneur"
  echo "    destroy :     Arrêter et supprimer un conteneur"
  echo "    enter :       Ouvrir un shell pour exécuter des commandes à l'intérieur du conteneur"
  echo "    logs :        Afficher les journaux Docker d'un conteneur"
  echo "    bootstrap :   Initialiser un conteneur pour la configuration basée sur un modèle"
  echo "    run :         Exécuter la commande donnée avec la configuration dans le contexte de la dernière image initialisée"
  echo "    rebuild :     Reconstruire un conteneur (supprimer l'ancien, initialiser, démarrer le nouveau)"
  echo "    cleanup :     Supprimer tous les conteneurs arrêtés depuis plus de 24 heures"
  echo "    start-cmd :   Générer la commande Docker utilisée pour démarrer le conteneur"
  echo
  echo "Options :"
  echo "    --skip-prereqs             Ne pas vérifier les prérequis du lanceur"
  echo "    --docker-args              Arguments supplémentaires à transmettre lors de l'exécution de Docker"
  echo "    --skip-mac-address         Ne pas attribuer d'adresse MAC"
  echo "    --run-image                Remplacer l'image utilisée pour l'exécution du conteneur"
  exit 1
}

# pour une réexécution potentielle ultérieure
SAVED_ARGV=("$@")

command=$1
config=$2

# user_args_argv est assigné une seule fois lors de l'analyse du vecteur d'arguments.
user_args_argv=""
# user_args est mutable : sa valeur peut changer lors de l'analyse des modèles.
# Sur-ensemble de user_args_argv.
user_args=""

user_run_image=""

if [[ $command == "run" ]]; then
  run_command=$3
fi

while [ ${#} -gt 0 ]; do
  case "${1}" in
  --debug)
    DEBUG="1"
    ;;
  --skip-prereqs)
    SKIP_PREREQS="1"
    ;;
  --skip-mac-address)
    SKIP_MAC_ADDRESS="1"
    ;;
  --docker-args)
    user_args_argv="$2"
    user_args="$user_args_argv"
    shift
    ;;
  --run-image)
    user_run_image="$2"
    shift
    ;;
  esac

  shift 1
done

if [ -z "$command" -o -z "$config" -a "$command" != "cleanup" ]; then
  usage
fi

# Docker n'aime pas les caractères majuscules, les espaces ou les caractères spéciaux, détectez-le maintenant avant de tout construire et de le découvrir ensuite
re='[[:upper:]/ !@#$%^&*()+~`=]'
if [[ $config =~ $re ]];
  then
    echo
    echo "ERREUR : Le nom de configuration '$config' ne doit pas contenir de majuscules, d'espaces ou de caractères spéciaux. Corrigez le nom de configuration et relancez $0."
    echo
    exit 1
fi

cd "$(dirname "$0")"

pups_version='v1.0.3'
docker_min_version='17.03.1'
docker_rec_version='17.06.2'
git_min_version='1.8.0'
git_rec_version='1.8.0'
kernel_min_version='4.4.0'

config_file=containers/"$config".yml
cidbootstrap=cids/"$config"_bootstrap.cid
local_discourse=local_discourse
image="discourse/base:2.0.20230217-0055"
image_stable="discourse/base:2.0.20230116-0051"
docker_path=`which docker.io 2> /dev/null || which docker`
git_path=`which git`

if [ "${SUPERVISED}" = "true" ]; then
  restart_policy="--restart=no"
  attach_on_start="-a"
  attach_on_run="-a stdout -a stderr"
else
  attach_on_run="-d"
fi

if [ -n "$DOCKER_HOST" ]; then
  docker_ip=`sed -e 's/^tcp:\/\/\(.*\):.*$/\1/' <<< "$DOCKER_HOST"`
elif [ -x "$(which ip 2>/dev/null)" ]; then
  docker_ip=`ip addr show docker0 | \
                  grep 'inet ' | \
                  awk '{ split($2,a,"/"); print a[1] }';`
else
  docker_ip=`ifconfig | \
                  grep -B1 "inet addr" | \
                  awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' | \
                  grep docker0 | \
                  awk -F: '{ print $3 }';`
fi

# Depuis https://stackoverflow.com/a/44660519/702738
compare_version() {
    if [[ $1 == $2 ]]; then
        return 1
    fi
    local IFS=.
    local i a=(${1%%[^0-9.]*}) b=(${2%%[^0-9.]*})
    local arem=${1#${1%%[^0-9.]*}} brem=${2#${2%%[^0-9.]*}}
    for ((i=0; i<${#a[@]} || i<${#b[@]}; i++)); do
        if ((10#${a[i]:-0} < 10#${b[i]:-0})); then
            return 1
        elif ((10#${a[i]:-0} > 10#${b[i]:-0})); then
            return 0
        fi
    done
    if [ "$arem" '<' "$brem" ]; then
        return 1
    elif [ "$arem" '>' "$brem" ]; then
        return 0
    fi
    return 1
}

fatal () {
  echo -e "\n$1\n"
  exit "${2:-1}"
}

install_docker() {
  echo "Docker n'est pas installé, vous devrez installer Docker pour exécuter le lanceur"
  echo "Voir https://docs.docker.com/installation/"
  exit 1
}

pull_image() {
  # Ajouter une seule nouvelle tentative pour contourner les erreurs TLS de Docker Hub
  $docker_path pull $image || $docker_path pull $image
}

check_prereqs() {

  if [ -z $docker_path ]; then
    install_docker
  fi

  # 1. le démon Docker est-il en cours d'exécution ?
  # nous envoyons stderr vers /dev/null car nous ne nous soucions pas des avertissements,
  # il se plaint généralement de la mémoire swap, ce qui n'a pas d'importance
  test=`$docker_path info 2> /dev/null`
  if [[ $? -ne 0 ]] ; then
    echo "Impossible de se connecter au démon Docker - vérifiez qu'il est en cours d'exécution et que vous y avez accès"
    exit 1
  fi

  # 2. exécute-t-on un pilote de stockage approuvé ?
  if ! $docker_path info 2> /dev/null | egrep -q 'Storage Driver: (btrfs|aufs|zfs|overlay2)$'; then
    echo "Votre installation Docker n'utilise pas un pilote de stockage pris en charge. Si nous continuions, votre installation pourrait être corrompue."
    echo "overlay2 est le pilote de stockage recommandé, bien que zfs et aufs puissent également fonctionner."
    echo "D'autres pilotes de stockage sont connus pour poser problème."
    echo "Vous pouvez déterminer quel système de fichiers vous utilisez en exécutant \"docker info\" et en regardant la ligne 'Storage Driver'."
    echo
    echo "Si vous souhaitez continuer malgré tout en utilisant votre pilote de stockage non pris en charge existant,"
    echo "lisez le code source du lanceur et trouvez comment contourner cette vérification."
    exit 1
  fi

  # 3. exécute-t-on la version recommandée de Docker ?
  test=($($docker_path --version))  # Obtenir la chaîne de version de Docker
  test=${test[2]//,/}  # Obtenir uniquement la version et supprimer la virgule si elle existe

  # Au moins la version minimale de Docker
  if compare_version "${docker_min_version}" "${test}"; then
    echo "ERREUR : La version Docker ${test} n'est pas prise en charge, veuillez mettre à niveau vers au moins ${docker_min_version}, ou recommandé ${docker_rec_version}"
    exit 1
  fi

  # Recommander une version plus récente de Docker
  if compare_version "${docker_rec_version}" "${test}"; then
    echo "AVERTISSEMENT : La version Docker ${test} est obsolète, recommandez une mise à niveau vers ${docker_rec_version} ou une version ultérieure."
  fi

  arm=false
  case $(uname -m) in
    armv7l)
      echo "ERREUR : L'architecture ARM 32 bits n'est pas prise en charge. Vérifiez si votre matériel prend en charge ARM64, qui est pris en charge à titre expérimental."
      exit 1
      ;;
    aarch64 | arm64)
      echo "AVERTISSEMENT : Le support pour aarch64 est expérimental pour le moment. Veuillez signaler tout problème sur https://meta.discourse.org/tag/arm"
      image="discourse/base:aarch64"
      arm=true
      ;;
    x86_64)
      echo "Architecture x86_64 détectée."
      ;;
    *)
      echo "ERREUR : architecture inconnue détectée."
      exit 1
      ;;
  esac


  # 4. l'image Docker Discourse est-elle téléchargée ?
  test=`$docker_path images | awk '{print $1 ":" $2 }' | grep "$image"`

  # Le support expérimental ARM est sur un tag fixe, toujours tirer
  if [ -z "$test" ] || [ $arm = true ]; then
    echo
    echo "AVERTISSEMENT : Nous allons commencer à télécharger l'image de base Discourse"
    echo "Ce processus peut prendre de quelques minutes à une heure, selon la vitesse de votre réseau"
    echo
    echo "Veuillez être patient"
    echo

    pull_image
  fi

  # utiliser une image plus ancienne pour stable
  version=$(cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
      "require 'yaml'; puts YAML.load(STDIN.readlines.join)['params']['version']")
  if [ "$version" = "stable" ]; then
    image=$image_stable
    pull_image
  fi

  # 5. exécute-t-on la version recommandée de Git ?
  test=($($git_path --version))  # Obtenir la chaîne de version de Git
  test=${test[2]//,/}  # Obtenir uniquement la version et supprimer la virgule si elle existe

  # Au moins la version minimale
  if compare_version "${git_min_version}" "${test}"; then
    echo "ERREUR : La version Git ${test} n'est pas prise en charge, veuillez mettre à niveau vers au moins ${git_min_version}, ou recommandé ${git_rec_version}"
    exit 1
  fi

  # Recommander la meilleure version
  if compare_version "${git_rec_version}" "${test}"; then
    echo "AVERTISSEMENT : La version Git ${test} est obsolète, recommandez une mise à niveau vers ${git_rec_version} ou une version ultérieure."
  fi

  # Vérifier la version minimale du noyau en raison de https://bugs.ruby-lang.org/issues/13885
  test=($(uname -r))

  # Au moins la version minimale
  if compare_version "${kernel_min_version}" "${test}"; then
    echo "ERREUR : La version du noyau ${test} n'est pas prise en charge, veuillez mettre à niveau vers au moins ${kernel_min_version}"
    exit 1
  fi

  # 6. peut-on attacher stderr / stdout / tty ?
  test=`$docker_path run $user_args -i --rm -a stdout -a stderr $image echo working`
  if [[ "$test" =~ "working" ]] ; then : ; else
    echo "Votre installation Docker ne fonctionne pas correctement"
    echo
    echo "Voir : https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam"
    exit 1
  fi

  # 7. assez d'espace pour l'initialisation dans le dossier Docker
  folder=`$docker_path info --format '{{.DockerRootDir}}'`
  safe_folder=${folder:-/var/lib/docker}
  if [[ -d $safe_folder && $(stat -f --format="%a*%S" $safe_folder)/1024**3 -lt 5 ]] ; then
    echo "Vous avez moins de 5 Go d'espace libre sur le disque où se trouve $safe_folder. Vous aurez besoin de plus d'espace pour continuer"
    df -h $safe_folder
    echo
    if tty >/dev/null; then
      read -p "Souhaitez-vous tenter de libérer de l'espace en nettoyant les images et les conteneurs Docker du système ? (o/N)" -n 1 -r
      echo
      if [[ $REPLY =~ ^[Yy]$ ]]
      then
        $docker_path container prune --force --filter until=24h >/dev/null
        $docker_path image prune --all --force --filter until=24h >/dev/null
        echo "Si le nettoyage a réussi, vous pouvez réessayer maintenant"
      fi
    fi
    exit 1
  fi

  # 8. le fichier de définition du conteneur est-il accessible et n'est-il pas non sécurisé (lisible par tous) ?
  if [[ ! -e "$config_file" || ! -r "$config_file" ]]; then
    echo "ERREUR : $config_file n'existe pas ou n'est pas lisible."
    echo
    echo "Configurations disponibles ( `cd containers && ls -dm *.yml | tr -s '\n' ' ' | awk '{ gsub(/\.yml/, ""); print }'`)"
    exit 1
  elif [[ "$(find $config_file -perm -004)" ]]; then
    echo "AVERTISSEMENT : Le fichier $config_file est lisible par tous. Vous pouvez sécuriser ce fichier en exécutant : chmod o-rwx $config_file"
  fi
}


if [ -z "$SKIP_PREREQS" ] && [ "$command" != "cleanup" ]; then
  check_prereqs
fi

set_volumes() {
  volumes=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
        "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
}

set_links() {
    links=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
        "require 'yaml'; puts YAML.load(STDIN.readlines.join)['links'].map{|l| '--link ' << l['link']['name'] << ':' << l['link']['alias'] << ' '}.join"`
}

find_templates() {
    local templates=`cat $1 | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
      "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`

    local arrTemplates=${templates// / }

    if [ ! -z "$templates" ]; then
      echo $templates
    else
      echo ""
    fi
}

set_template_info() {
    templates=$(find_templates $config_file)

    arrTemplates=(${templates// / })
    config_data=$(cat $config_file)

    input="hack: true"

    for template in "${arrTemplates[@]}"
    do
      [ ! -z $template ] && {
        input="$input _FILE_SEPERATOR_ $(cat $template)"
      }
    done

    # nous voulons toujours que notre fichier de configuration soit en dernier pour qu'il prenne la priorité
    input="$input _FILE_SEPERATOR_ $config_data"

    read -r -d '' env_ruby << 'RUBY'
    require 'yaml'

    input=STDIN.readlines.join
    # par défaut en UTF-8 pour la base de données
    env = {'LANG' => 'en_US.UTF-8'}
    input.split('_FILE_SEPERATOR_').each do |yml|
       yml.strip!
       begin
         env.merge!(YAML.load(yml)['env'] || {})
       rescue Psych::SyntaxError => e
        puts e
        puts "*ERREUR."
       rescue => e
        puts yml
        p e
       end
    end
    env.each{|k,v| puts "*ERREUR." if v.is_a?(Hash)}
    puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n")
RUBY

    tmp_input_file=$(mktemp)

    echo "$input" > "$tmp_input_file"
    raw=`exec cat "$tmp_input_file" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`

    rm -f "$tmp_input_file"

    env=()
    ok=1
    while read i; do
      if [ "$i" == "*ERREUR." ]; then
        ok=0
      elif [ -n "$i" ]; then
        env[${#env[@]}]="${i//\{\{config\}\}/${config}}"
      fi
    done <<< "$raw"

    if [ "$ok" -ne 1 ]; then
      echo "${env[@]}"
      echo "Erreur de syntaxe YAML. Veuillez vérifier vos fichiers de configuration containers/*.yml."
      exit 1
    fi

    # étiquettes
    read -r -d '' labels_ruby << 'RUBY'
    require 'yaml'

    input=STDIN.readlines.join
    labels = {}
    input.split('_FILE_SEPERATOR_').each do |yml|
       yml.strip!
       begin
         labels.merge!(YAML.load(yml)['labels'] || {})
       rescue Psych::SyntaxError => e
        puts e
        puts "*ERREUR."
       rescue => e
        puts yml
        p e
       end
    end
    puts labels.map{|k,v| "-l\n#{k}=#{v}" }.join("\n")
RUBY

    tmp_input_file=$(mktemp)

    echo "$input" > "$tmp_input_file"
    raw=`exec cat "$tmp_input_file" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$labels_ruby"`

    rm -f "$tmp_input_file"

    labels=()
    ok=1
    while read i; do
      if [ "$i" == "*ERREUR." ]; then
        ok=0
      elif [ -n "$i" ]; then
        labels[${#labels[@]}]=$(echo $i | sed s/{{config}}/${config}/g)
      fi
    done <<< "$raw"

    if [ "$ok" -ne 1 ]; then
      echo "${labels[@]}"
      echo "Erreur de syntaxe YAML. Veuillez vérifier vos fichiers de configuration containers/*.yml."
      exit 1
    fi

    # exposer
    read -r -d '' ports_ruby << 'RUBY'
    require 'yaml'

    input=STDIN.readlines.join
    ports = []
    input.split('_FILE_SEPERATOR_').each do |yml|
       yml.strip!
       begin
         ports += (YAML.load(yml)['expose'] || [])
       rescue Psych::SyntaxError => e
        puts e
        puts "*ERREUR."
       rescue => e
        puts yml
        p e
       end
    end
    puts ports.map { |p| p.to_s.include?(':') ? "-p\n#{p}" : "--expose\n#{p}" }.join("\n")
RUBY

    tmp_input_file=$(mktemp)

    echo "$input" > "$tmp_input_file"
    raw=`exec cat "$tmp_input_file" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$ports_ruby"`

    rm -f "$tmp_input_file"

    ports=()
    ok=1
    while read i; do
      if [ "$i" == "*ERREUR." ]; then
        ok=0
      elif [ -n "$i" ]; then
        ports[${#ports[@]}]=$i
      fi
    done <<< "$raw"

    if [ "$ok" -ne 1 ]; then
      echo "${ports[@]}"
      echo "Erreur de syntaxe YAML. Veuillez vérifier vos fichiers de configuration containers/*.yml."
      exit 1
    fi

   merge_user_args
}

if [ -z $docker_path ]; then
  install_docker
fi

[ "$command" == "cleanup" ] && {
  $docker_path container prune --filter until=1h
  $docker_path image prune --all --filter until=1h

  if [ -d /var/discourse/shared/standalone/postgres_data_old ]; then
    echo
    echo "Ancien cluster de données de sauvegarde PostgreSQL détecté occupant $(du -hs /var/discourse/shared/standalone/postgres_data_old | awk '{print $1}') détecté"
    read -p "Souhaitez-vous le supprimer ? (o/N): " -n 1 -r && echo

    if [[ $REPLY =~ ^[Yy]$ ]]; then
      echo "suppression de l'ancien cluster de données PostgreSQL à /var/discourse/shared/standalone/postgres_data_old..."
      rm -rf /var/discourse/shared/standalone/postgres_data_old*
    else
      exit 1
    fi
  fi

  exit 0
}

docker_version=($($docker_path --version))
docker_version=${test[2]//,/}
restart_policy=${restart_policy:---restart=always}

set_existing_container(){
  existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
}

run_stop() {

  set_existing_container

  if [ ! -z $existing ]
     then
       (
        set -x
        $docker_path stop -t 30 $config
       )
     else
       echo "$config n'a pas été démarré !"
       echo "./discourse-doctor peut aider à diagnostiquer le problème."
       exit 1
  fi
}

set_run_image() {
  run_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
    "require 'yaml'; puts YAML.load(STDIN.readlines.join)['run_image']"`

  if [ -n "$user_run_image" ]; then
    run_image=$user_run_image
  elif [ -z "$run_image" ]; then
    run_image="$local_discourse/$config"
  fi
}

set_boot_command() {
  boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
    "require 'yaml'; puts YAML.load(STDIN.readlines.join)['boot_command']"`

  if [ -z "$boot_command" ]; then

    no_boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
      "require 'yaml'; puts YAML.load(STDIN.readlines.join)['no_boot_command']"`

    if [ -z "$no_boot_command" ]; then
      boot_command="/sbin/boot"
    fi
  fi
}

merge_user_args() {
  local docker_args

  docker_args=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
          "require 'yaml'; puts YAML.load(STDIN.readlines.join)['docker_args']"`

  if [[ -n "$docker_args" ]]; then
    user_args="$user_args_argv $docker_args"
  fi
}

run_start() {

   if [ -z "$START_CMD_ONLY" ]
   then
     existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
     echo $existing
     if [ ! -z $existing ]
     then
       echo "Rien à faire, votre conteneur a déjà été démarré !"
       exit 0
     fi

     existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
     if [ ! -z $existing ]
     then
       echo "démarrage du conteneur existant"
       (
         set -x
         $docker_path start $config
       )
       exit 0
     fi
   fi

   set_template_info
   set_volumes
   set_links
   set_run_image
   set_boot_command

   # obtenir le nom d'hôte et les paramètres depuis la configuration du conteneur
   for envar in "${env[@]}"
   do
     if [[ $envar == DOCKER_USE_HOSTNAME* ]] || [[ $envar == DISCOURSE_HOSTNAME* ]]
     then
       # utiliser comme variable d'environnement
       eval $envar
     fi
   done

   (
     hostname=`hostname -s`
     # écraser le nom d'hôte
     if [ "$DOCKER_USE_HOSTNAME" = "true" ]
     then
       hostname=$DISCOURSE_HOSTNAME
     else
       hostname=$hostname-$config
     fi

     # nous devons normaliser pour n'avoir que des chaînes autorisées, c'est plus complet mais voyons comment bash fait d'abord
     # hostname=`$docker_path run $user_args --rm $image ruby -e 'print ARGV[0].gsub(/[^a-zA-Z-]/, "-")' $hostname`
     # docker a ajouté plus de règles de nom d'hôte
     hostname=${hostname//_/-}


     if [ -z "$SKIP_MAC_ADDRESS" ] ; then
      mac_address="--mac-address $($docker_path run $user_args -i --rm -a stdout -a stderr $image /bin/sh -c "echo $hostname | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/'")"
     fi

     if [ ! -z "$START_CMD_ONLY" ] ; then
       docker_path="true"
     fi

     set -x

     $docker_path run --shm-size=512m $links $attach_on_run $restart_policy "${env[@]}" "${labels[@]}" -h "$hostname" \
        -e DOCKER_HOST_IP="$docker_ip" --name $config -t "${ports[@]}" $volumes $mac_address $user_args \
        $run_image $boot_command

   )
   exit 0

}

run_run() {
  set_template_info
  set_volumes
  set_links
  set_run_image

  unset ERR
  (exec $docker_path run --rm --shm-size=512m $user_args $links "${env[@]}" -e DOCKER_HOST_IP="$docker_ip" -i -a stdin -a stdout -a stderr $volumes $run_image \
    /bin/bash -c "$run_command") || ERR=$?

  if [[ $ERR > 0 ]]; then
    exit 1
  fi
}

run_bootstrap() {
  set_template_info

  base_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
    "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`

  update_pups=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
    "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`

  if [[ ! X"" = X"$base_image" ]]; then
    image=$base_image
  fi

  # l'image de base n'est peut-être pas toujours discourse/base,
  # assurons-nous de toujours construire à partir de la dernière version
  pull_image

  set_volumes
  set_links

  if $docker_path run $user_args --rm -i $image gem which pups; then
    pups_command="/usr/local/bin/pups --stdin"
  else
    # Retour à la méthode git pull ici si `pups` n'a pas été installé par gem dans l'image de base
    pups_command="cd /pups &&"
    if [[ ! "false" =  $update_pups ]]; then
      pups_command="$pups_command git pull && git checkout $pups_version &&"
    fi
    pups_command="$pups_command /pups/bin/pups --stdin"
  fi

  echo $pups_command

  declare -i BOOTSTRAP_EXITCODE
  rm -f $cidbootstrap

  echo "$input" | $docker_path run --shm-size=512m $user_args $links "${env[@]}" -e DOCKER_HOST_IP="$docker_ip" --cidfile "$cidbootstrap" -i -a stdin -a stdout -a stderr $volumes $image \
    /bin/bash -c "$pups_command"
  BOOTSTRAP_EXITCODE=$?

  CONTAINER_ID=$(cat "$cidbootstrap")
  rm -f "$cidbootstrap"

  # code de sortie magique indiquant une nouvelle tentative
  if [[ $BOOTSTRAP_EXITCODE -eq 77 ]]; then
    $docker_path rm "$CONTAINER_ID"
    exit 77
  elif [[ $BOOTSTRAP_EXITCODE -gt 0 ]]; then
    echo "l'initialisation a échoué avec le code de sortie $BOOTSTRAP_EXITCODE"
    echo "** ÉCHEC DE L'INITIALISATION ** veuillez faire défiler vers le haut et rechercher les messages d'erreur antérieurs, il peut y en avoir plus d'un."
    echo "./discourse-doctor peut aider à diagnostiquer le problème."

    if [[ -n "$DEBUG" ]]; then
      if $docker_path commit "$CONTAINER_ID" $local_discourse/$config-debug; then
        echo "** DEBUG ** Maintien de l'image pour le diagnostic $local_discourse/$config-debug"
      else
        echo "** DEBUG ** Échec de l'engagement du conteneur $CONTAINER_ID pour le diagnostic"
      fi
    fi

    $docker_path rm "$CONTAINER_ID"
    exit 1
  fi

  sleep 5

  $docker_path commit \
    -c "LABEL org.opencontainers.image.created=\"$(TZ=UTC date -Iseconds)\"" \
    "$CONTAINER_ID" \
    $local_discourse/$config || fatal "ÉCHEC DE L'ENGAGEMENT $CONTAINER_ID"
  $docker_path rm "$CONTAINER_ID"
}

case "$command" in
  bootstrap)
      run_bootstrap
      echo "Initialisation réussie, pour démarrer utilisez ./launcher start $config"
      exit 0
      ;;

  run)
      run_run
      exit 0
      ;;

  enter)
      exec $docker_path exec -it $config /bin/bash --login
      ;;

  stop)
      run_stop
      exit 0
      ;;

  logs)

      $docker_path logs $config
      exit 0
      ;;

  restart)
      run_stop
      run_start
      exit 0
      ;;

  start-cmd)
    START_CMD_ONLY="1"
    run_start
    exit 0;
    ;;

  start)
      run_start
      exit 0
      ;;

  rebuild)
      if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
        git branch -m master main
        git fetch origin
        git branch -u origin/main main
        git remote set-head origin -a
      fi

      if [ "$(git symbolic-ref --short HEAD)" == "main" ]; then
        echo "Assurance que le lanceur est à jour"

        git remote update

        LOCAL=$(git rev-parse HEAD)
        REMOTE=$(git rev-parse @{u})
        BASE=$(git merge-base HEAD @{u})

        if [ $LOCAL = $REMOTE ]; then
          echo "Le lanceur est à jour"

        elif [ $LOCAL = $BASE ]; then
          echo "Mise à jour du lanceur..."
          git pull || (echo 'échec de la mise à jour' && exit 1)

          echo "Lanceur mis à jour, redémarrage..."
          exec "$0" "${SAVED_ARGV[@]}"

        elif [ $REMOTE = $BASE ]; then
          echo "Votre version du lanceur est en avance sur origin"

        else
          echo "Le lanceur a divergé de la source, cela n'est attendu qu'en mode Dev"
        fi

      fi

      set_existing_container

      if [ ! -z $existing ]
        then
          echo "Arrêt de l'ancien conteneur"
          (
            set -x
            $docker_path stop -t 60 $config
          )
      fi

      run_bootstrap

      if [ ! -z $existing ]
        then
          echo "Suppression de l'ancien conteneur"
          (
            set -x
            $docker_path rm $config
          )
      fi

      run_start
      exit 0
      ;;


  destroy)
      (set -x; $docker_path stop -t 10 $config && $docker_path rm $config) || (echo "$config n'a pas été trouvé" && exit 0)
      exit 0
      ;;
esac

usage

Pour conclure, une petite aide de PM a révélé qu’il s’agissait d’un problème maxmind et que le commenter a permis au bootstrap de se terminer avec succès. :+1: