⚠ El puerto 443 de este equipo no parece ser accesible usando el nombre de host: metabolism.logophilia.eu ----

Gracias por la retroalimentación, realmente aprecio el tiempo dedicado. No quiero ser ese sabihondo, pero:

[2/5] Preparando configuración 
✓ Los puertos 80 y 443 están libres para su uso 

En realidad, al principio dice “libres para su uso”. Dicho esto, ahora tengo mi instancia en funcionamiento, con la ayuda de Gemini (principalmente sobre el uso de Docker, por todas esas cosas, lol). Me gustaría ofrecer mi “manual de procedimientos” para cualquier otro usuario de Virtualmin, porque: “liberar el puerto 443” no es la solución aquí. El resto de mi publicación será eso; si debería publicarlo en otro lugar, como un nuevo hilo, por favor díganme a dónde ir; creo que no soy el único con esta configuración y podría ser útil para otros. ¡Gracias de nuevo!

Si estás en un VPS gestionado por Webmin/Virtualmin y usando un subdominio:

El manual definitivo de Virtualmin + Discourse *

  • (1) Limpieza de restos (si estás reintentando, como yo):

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

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

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

  • (2) Eliminación de plantillas:

    Debes eliminar completamente las líneas templates/web.ssl.template.yml y templates/web.letsencrypt.ssl.template.yml de app.yml. El analizador personalizado del lanzador las evaluará incluso si están precedidas por #.

  • (3) Configuración de correo y variables:

    Cambia DISCOURSE_SKIP_EMAIL_SETUP de '1' a '0', porque tu Discourse no podrá conectarse y verificar DiscordID;

    Agrega DISCOURSE_FORCE_HTTPS: true para que el backend genere URLs seguras.

    Recordatorio amigable: Asegúrate de que DISCOURSE_SMTP_USER_NAME esté configurado con el nombre de tu cuenta de buzón tal cual (por ejemplo, 'logophilia'), no la dirección de correo completa (por ejemplo, 'logophilia@logophilia.eu'), y envuelve las credenciales entre comillas simples (') para evitar posibles errores de análisis de caracteres YAML.

  • (4) Configuración del bloque expose:

    Asegúrate de que tu bloque expose: en app.yml contenga una asignación HTTP; asignar 443=>8443 es opcional/redundante, ya que Virtualmin finaliza la lógica SSL antes de pasarla:

    expose:
      - 8080:80
    

    Ahora puedes comenzar a reconstruir:

    cd /var/discourse
    ./launcher rebuild app
    
  • (5) Configuración de subdominio y ruta de proxy:

    • Crea tu subdominio en Virtualmin como de costumbre y asegúralo con un certificado SSL de Let’s Encrypt (se hace automáticamente, solo digo: asegúrate de que no falle por alguna razón no relacionada).
    • Navega a Rutas de proxy (Virtualmin → tu subdominio → Configuración web → Rutas de proxy), crea una nueva asignación / a http://localhost:8080/, deja “servir localmente” desmarcado, pero activa Proxy WebSocket a para permitir actualizaciones en tiempo real y flujos de notificaciones.
  • (6) Directivas de encabezado CSRF:

    • En Webmin ➔ Servidores ➔ Servidor web Apache ➔ [encuentra tu configuración de subdominio aquí y haz clic en la configuración para 443] ➔ Editar directivas, coloca las siguientes líneas justo encima del bloque de proxy propio de Virtualmin para Let’s Encrypt (usualmente “ProxyPass /.well-known !”) para facilitar el reenvío del token CSRF:
    ProxyPreserveHost On
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
    

    ProxyPreserveHost On: Le dice a Discourse tu nombre de dominio real en lugar de “localhost”.
    RequestHeader set X-Forwarded-Proto "https": Le indica explícitamente a Discourse que el usuario está usando una conexión segura, coincidiendo con tu configuración DISCOURSE_FORCE_HTTPS: true.
    RequestHeader set X-Forwarded-For: Pasa la dirección IP real del visitante al contenedor para que funcionen los registros de seguridad.

  • (7) Handshake limpio del contenedor:

    Mientras termina el proceso de reconstrucción (lo siento… pero es cierto;-), asegúrate de borrar cualquier plano de contenedor potencialmente atascado con docker rm -f app para que ejecutar ./launcher start app inicie una instancia completamente nueva vinculada al puerto 8080. Verifica que docker ps muestre algo bajo “puertos” similar a:

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

    (Como puedes ver, dejé la directiva 443=>8443 en mi app.yml, funciona de cualquier manera.)

  • (8) Monitoreo e inicio:

    Sigue el flujo de arranque con docker logs -f app hasta que terminen las migraciones de la base de datos y los workers comiencen a procesar solicitudes. Básicamente, un montón de líneas “INFO” en rápida sucesión.

  • (9) Finalización:

    Carga tu subdominio en un navegador, haz clic en Registrarse y deja que el sistema envíe un correo de validación a tu buzón.

*) hasta que se demuestre lo contrario :wink: