⚠ Le port 443 de cet ordinateur ne semble pas accessible via le nom d'hôte : metabolism.logophilia.eu ----

Merci pour vos retours, j’apprécie vraiment le temps que vous y avez consacré. Pour ne pas passer pour un rabat-joie, mais :

[2/5] Préparation de la configuration
✓ Les ports 80 et 443 sont libres

Cela dit, mon instance est maintenant opérationnelle, avec l’aide de Gemini (surtout pour tout ce qui concerne Docker, lol). Je souhaiterais partager mon « runbook » avec les autres utilisateurs de Virtualmin, car : « libérer le port 443 » n’est pas la solution ici. Le reste de mon message sera consacré à cela. Si je devais plutôt publier cela ailleurs, par exemple dans un nouveau sujet, merci de m’indiquer où aller ; je pense que je ne suis pas le seul avec cette configuration, et cela pourrait être utile à d’autres. Merci encore !

Si vous êtes sur un VPS géré par Webmin/Virtualmin et que vous utilisez un sous-domaine :

Le Runbook Définitif Virtualmin + Discourse *

  • (1) Nettoyage des restes (si vous réessayez, comme moi) :

    rm -rf /var/discourse/shared/standalone/ssl/*

    rm -rf /var/discourse/shared/standalone/letsencrypt

    rm -rf /var/discourse/shared/standalone/state

  • (2) Suppression des modèles :

    Vous devez supprimer complètement les lignes templates/web.ssl.template.yml et templates/web.letsencrypt.ssl.template.yml de app.yml. Le解析eur de lancement personnalisé les évaluera même si elles sont précédées de #.

  • (3) Configuration de l’email et variables :

    Modifiez DISCOURSE_SKIP_EMAIL_SETUP de '1' à '0', car votre Discourse ne pourra pas se connecter et vérifier DiscordID ;

    Ajoutez DISCOURSE_FORCE_HTTPS: true afin que le backend génère des URL sécurisées.

    Rappel amical : Assurez-vous que DISCOURSE_SMTP_USER_NAME est défini avec le nom brut de votre compte de boîte aux lettres (par exemple, 'logophilia'), pas l’adresse email complète (par exemple, 'logophilia@logophilia.eu'), et entourez les identifiants de guillemets simples (') pour contourner d’éventuels bogues d’analyse de caractères YAML.

  • (4) Configuration du bloc expose :

    Assurez-vous que votre bloc expose: dans app.yml contient une mappage HTTP ; mapper 443=>8443 est optionnel / redondant, car Virtualmin termine la logique SSL avant de la transmettre :

    expose:
      - 8080:80
    

    Vous pouvez maintenant reconstruire :

    cd /var/discourse
    ./launcher rebuild app
    
  • (5) Configuration du sous-domaine et du chemin du proxy :

    • Créez votre sous-domaine dans Virtualmin comme d’habitude et sécurisez-le avec un certificat SSL Let’s Encrypt (fait automatiquement, je le précise juste : assurez-vous qu’il ne génère pas d’erreur pour une raison sans rapport).
    • Accédez à Proxy Paths (Virtualmin → votre sous-domaine → Configuration Web → Proxy Paths), créez une nouvelle mappage / vers http://localhost:8080/, laissez « serve locally » décoché, mais activez Proxy WebSocket sur Oui pour permettre les mises à jour en temps réel et les flux de notifications.
  • (6) Directives d’en-tête CSRF :

    • Dans Webmin ➔ Serveurs ➔ Serveur Web Apache ➔ [trouvez la configuration de votre sous-domaine ici et cliquez sur la configuration pour 443] ➔ Éditer les directives, placez les lignes suivantes juste au-dessus du bloc proxy de Virtualmin pour Let’s Encrypt (généralement « ProxyPass /.well-known ! ») pour faciliter la transmission du jeton CSRF :
    ProxyPreserveHost On
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
    

    ProxyPreserveHost On : Indique à Discourse votre nom de domaine réel au lieu de « localhost ».
    RequestHeader set X-Forwarded-Proto "https" : Indique explicitement à Discourse que l’utilisateur utilise une connexion sécurisée, ce qui correspond à votre paramètre DISCOURSE_FORCE_HTTPS: true.
    RequestHeader set X-Forwarded-For : Transmet la véritable adresse IP du visiteur au conteneur afin que les journaux de sécurité fonctionnent.

  • (7) Poignée de main propre du conteneur :

    Pendant que le processus de reconstruction (désolé… c’est vrai pourtant :wink: se termine, assurez-vous que tout modèle de conteneur potentiellement bloqué est effacé avec docker rm -f app afin que l’exécution de ./launcher start app lance une instance complètement nouvelle liée au port 8080. Vérifiez que docker ps affiche quelque chose sous « ports » similaire à :

    # docker ps
    CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                                                                NAMES
    d21772a21e36   local_discourse/app   "/sbin/boot"   45 minutes ago   Up 45 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp, 0.0.0.0:8443->443/tcp, [::]:8443->443/tcp   app
    

    (Comme vous pouvez le voir, j’ai laissé la directive 443=>8443 dans mon app.yml, cela fonctionne dans les deux cas.)

  • (8) Surveillance et lancement :

    Suivez le flux de démarrage avec docker logs -f app jusqu’à ce que les migrations de base de données se terminent et que les workers commencent à traiter les requêtes. Une série de lignes « INFO » en rapide succession, essentiellement.

  • (9) Finalisation :

    Chargez votre sous-domaine dans un navigateur, cliquez sur S’inscrire, et laissez le système envoyer un email de validation à votre boîte aux lettres.

*) Jusqu’à preuve du contraire :wink: