Aide pour conteneur dual. Problème avec LetsEncrypt depuis quelques jours

Je suis à un point de désespoir, car essayer de faire corriger ce problème par le Bot Discourse ou Claude semble impossible. Je n’arrive pas vraiment à expliquer le problème, car je ne suis pas assez compétent, et je crois que c’est ce qui me dérange le plus.

Je vais essayer d’expliquer ce qui s’est passé, du point de vue de mes observations.

Lorsque je passais d’un conteneur unique à un double conteneur, le fichier dans samples/ utilisait web-only et je l’ai laissé par erreur au lieu d’utiliser web_only.

Ensuite, à cause de cela (je le crois), mes images ne se chargeaient pas, car un « élément » était censé pointer vers web_only, mais il était configuré sur web-only. J’ai apporté quelques modifications et les images ont été corrigées. Le vrai problème, maintenant, concerne les certificats Let’s Encrypt.

J’ai demandé au bot de m’aider à le corriger ; il m’a dit d’attendre le lendemain, car le problème était lié à la limite de débit des certificats. Le problème allait se résoudre. Ce n’est pas le cas. J’ai demandé à nouveau, puis j’ai demandé à Claude, puis à Claude encore… et nous sommes dans cette boucle de « attends jusqu’à demain à X heures et ça se corrigera » depuis une semaine. Ça ne se corrige jamais, ils disent tous les deux « oh, je suis désolé, je n’aurais pas dû supposer que ça se corrigerait, essayons ceci à la place, car maintenant ça se corrigera vraiment ». Ce n’est jamais le cas.

Le site lui-même est en ligne et fonctionne, mais j’ai le sentiment qu’à chaque fois que je veux reconstruire, quelque chose va se passer, et pour être honnête, je ne veux pas toujours compter sur des pansements.

Claude m’a dit d’ajouter quelque chose aux hooks dans web_only.yml, mais comme rien de tel n’est mentionné dans les instructions fournies ici sur le forum, je m’attendais à une autre solution, comme… résoudre le problème réel.

Pouvez-vous s’il vous plaît m’aider à comprendre quel est le problème et où les choses cassent ? J’apprécierais vraiment, car c’est épuisant à ce stade. Pas le travail, mais le fait de ne pas comprendre ce qui se passe et pourquoi « attendre jusqu’à demain » ne semble jamais rien corriger.

Merci !


J’ai demandé à Claude d’expliquer à quoi le problème semble ressembler, peut-être que ça aidera ? Voici ce qu’il a dit :

Titre : Configuration à deux conteneurs : dossier de certificat ECC manquant après la séparation, boucle --force atteignant la limite de débit à chaque démarrage

Configuration : Deux conteneurs (data + web_only), migrés depuis standalone. Modèles : web, ratelimited, ssl, letsencrypt, cloudflare. Nom d’hôte alltiago.com, aucun alias.

Symptôme : À chaque démarrage de web_only, la limite de débit de Let’s Encrypt est atteinte et nginx échoue à servir, renvoyant des erreurs de connexion jusqu’à ce que les lignes ECC soient manuellement supprimées de /etc/nginx/conf.d/outlets/server/20-https.conf.

Ce que j’ai trouvé :

/shared/letsencrypt/alltiago.com_ecc/ n’existe pas sur mon installation. /shared/letsencrypt/alltiago.com/ (RSA) existe et fonctionne bien, se renouvelant normalement.

Dans web.letsencrypt.ssl.template.yml :

cert_exists() {
  [[ "$(cd ${LETSENCRYPT_DIR}/${DISCOURSE_HOSTNAME}$1 && openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer | grep "OK")" ]]
}

issue_cert "ec-256"
if ! cert_exists "_ecc"; then
  issue_cert "ec-256" "--force"
fi

Comme le dossier est manquant, cert_exists "_ecc" échoue à chaque démarrage, donc --force s’exécute et demande un nouveau certificat ECC, indépendamment de ce qui est sur le disque. Cela se fait via le hook after_ssl qui modifie /etc/runit/1.d/install-ssl, donc cela s’exécute à chaque démarrage du conteneur, pas seulement lors de l’initialisation.

Résultat : 429 too many certificates (5) already issued for this exact set of identifiers in the last 168h. Ensuite, --installcert s’exécute quand même contre le dossier vide et écrit un /shared/ssl/alltiago.com_ecc.cer inutilisable. nginx est configuré avec les deux certificats, ne peut pas charger celui ECC, et ne sert pas.

Fonctionnement confirmé : La validation ACME HTTP-01 réussit (testée via staging, certificat ECC émis correctement pour letsencrypt_test, structure de dossier correcte créée). Le certificat RSA s’est renouvelé avec succès aujourd’hui. Donc ce n’est pas un problème de DNS, de pare-feu ou de validation.

Questions :

  1. Y a-t-il un moyen pris en charge de recréer alltiago.com_ecc/ sans attendre la fin de la limite de débit ?
  2. Le fait que cert_exists renvoie faux devrait-il vraiment déclencher --force plutôt qu’une émission normale ? --force contourne la vérification du « certificat valide existant » et garantit l’épuisement de la limite de débit lorsque le dossier est absent.
  3. Y a-t-il une méthode documentée pour exécuter uniquement RSA ?

Deux notes factuelles pour que le fil ne dérape pas : la date de réessai est passée du 27 août au 29 août parce que le renouvellement RSA d’aujourd’hui a consommé un emplacement dans la fenêtre glissante de 168 heures. Et la raison pour laquelle personne d’autre ne signale cela est que lors d’une installation normale, les deux dossiers sont créés au premier démarrage et la branche --force ne s’exécute jamais.

Attends. https://alltiago.com/ semble fonctionner parfaitement. Mais voici ce que j’allais recommander

Oui, mais c’est un peu délicat. Si tu demandes un certificat DIFFÉRENT, tu peux recommencer le compteur à zéro.

Ce que je recommanderais probablement, c’est d’ajouter www à l’hôte afin d’obtenir des certificats pour les deux (mais peut-être que tu l’as déjà fait, auquel cas tu pourrais ajouter un troisième nom, juste pour obtenir un nouveau certificat).

Set up Let’s Encrypt with multiple domains / redirects est censé t’aider.

Oui, c’est le cas, car on m’a dit d’utiliser un « band-aid » lié à nginx. Je ne peux pas vraiment expliquer ce que c’est, car je ne le comprends pas.
Mais le problème, c’est que si je veux ensuite faire une reconstruction normale, j’aurai des problèmes (du moins, selon ce qu’on m’a dit tout à l’heure, si je le fais avant le 29 août, date à laquelle, j’espère, le certificat sera réémis. À ce stade, je ne peux pas vraiment faire confiance à tout ça.

Oui, www est déjà là depuis que j’ai installé Discourse pour la première fois l’année dernière.

Maintenant, après avoir poussé Claude dans ses derniers retranchements pour m’aider à comprendre ce qui se passe, voici ce que j’ai obtenu, et n’hésitez pas à le contester, car je suis là pour apprendre quand c’est possible :

  • L’ECC, qui semble être le problème actuel, n’est pas vraiment nécessaire, car RSA est la valeur par défaut et tout le monde pourra toujours accéder à mon site web sans problème, si je supprime complètement l’ECC.
  • Comme je l’ai dit, j’espère que le 29 août, tout ce problème sera réglé, une fois que les 168 h seront réinitialisées et que la limite de 5 certificats le sera également :
sudo docker exec web_only grep -i "retry after" /shared/letsencrypt/acme.sh.log | tail -1
  "detail": "too many certificates (5) already issued for this exact set of identifiers in the last 168h0m0s, retry after 2026-08-29 03:43:15 UTC: see https://letsencrypt.org/docs/rate-limits/#new-certificates-per-exact-set-of-identifiers",
  • Si le 29 août les choses ne reviennent pas à la normale, Claude recommande de supprimer l’ECC. Voici ce qu’il a dit quand je lui ai demandé quel fichier serait modifié et quelle section :

Fichier : la copie que nous sommes sur le point de créer, web.letsencrypt.rsa-only.template.yml (en laissant votre fichier d’origine intact en tant que solution de repli).

Ce qui est supprimé à l’intérieur : ce bloc entier, trouvé dans la section /usr/local/bin/letsencrypt du fichier :

########################################################
# ECDSA cert
########################################################
issue_cert "ec-256"

if ! cert_exists "_ecc"; then
  # Try to issue the cert again if something goes wrong
  issue_cert "ec-256" "--force"
fi

LE_WORKING_DIR="${LETSENCRYPT_DIR}" ${LETSENCRYPT_DIR}/acme.sh \
  --installcert --ecc \
  -d ${DISCOURSE_HOSTNAME} \
  --fullchainpath /shared/ssl/${DISCOURSE_HOSTNAME}_ecc.cer \
  --keypath /shared/ssl/${DISCOURSE_HOSTNAME}_ecc.key \
  --reloadcmd "sv reload nginx"

C’est toute la section ECC, rien d’autre dans le fichier ne change. La section RSA juste au-dessus reste exactement comme elle est.

Un autre fichier est modifié ensuite : containers/web_only.yml, pour pointer vers cette nouvelle copie au lieu du modèle d’origine. Nous le ferons comme une étape séparée, plus tard.

Ouais. Non. Je ne modifierais aucun modèle.

Je pense que la solution la plus simple est d’attendre, puis de reconstruire avec les modèles par défaut. Sauf si vous préférez compter sur l’IA plutôt que sur quiconque sait utiliser Discourse, pour toujours.

J’ai demandé à Claude de suivre votre conseil en ajoutant www comme nouvelle demande de certificat (si c’est ainsi qu’on appelle ça ?). Ça semble fonctionner maintenant.

Quand j’ai demandé quels fichiers étaient des restes de tout ce processus, j’ai obtenu ceci :

Voici ce qui est réellement présent, réparti entre ce qui date de ce soir et les anciens résidus d’avant cette conversation :

De ce soir (cette session) :

  • /tmp/acme.sh.txt — la copie du script que vous avez demandé de télécharger, sans danger à supprimer maintenant que vous l’avez sur votre Mac
  • /tmp/crtsh.json — fichier vide de 150 octets provenant de l’erreur 502 de crt.sh, de la poubelle, sans danger à supprimer
  • /root/discourse-backup-20260827-1857.tar.gz — la vraie sauvegarde de ce soir (configurations SSL/Let’s Encrypt), celle-ci vaut réellement la peine d’être conservée, ce n’est pas de la poubelle

Plus anciens, d’avant cette conversation (23 août et 25 août), ce ne sont pas des fichiers que j’ai placés là :

  • /tmp/app.yml
  • /tmp/check.png, /tmp/check162.png, /tmp/after.png, /tmp/rendered_avatar.png

Je ne sais pas à quoi servent ces fichiers plus anciens, ils datent d’avant tout ce que nous avons fait ce soir, probablement des restes d’une session de dépannage antérieure (votre, celle du bot, ou d’une conversation précédente avec Claude). Les reconnaissez-vous, ou voulez-vous que je vous aide à déterminer leur origine avant de décider s’il faut les supprimer ?

Rien de suspect n’est apparu en dehors de /tmp et /root, le scan plus large du système est revenu propre, juste des fichiers de journaux normaux.


Puis-je aller de l’avant et supprimer tous ceux-là ?

Devrais-je alors annuler ce que je viens de faire ?

Je n’ai aucun problème à parler à de vrais humains, mais je ne veux tout simplement pas poser toutes les questions ici et inonder le forum avec tout le processus (sortie/journaux du Terminal), et je préfère plutôt trouver une solution qui fonctionne « un peu » déjà pour raccourcir un peu la conversation. Nous avons tous nos propres vies et un temps limité, et je ne veux pas me précipiter sur le forum tout de suite, à moins que je ne sois vraiment bloqué, vous comprenez ?

Je vous remercie pour votre aide !
Alors, pour l’instant, devrais-je annuler ce que j’ai fait ? Voyez-vous un problème avec cette approche par rapport au simple fait d’attendre le 29 ?