Usa Nginx Proxy Manager para gestionar múltiples sitios con Discourse

EDIT: @pfaffman reescribió esto como un tema independiente a partir de lo que @tophee había escrito anteriormente. Aún no lo he probado, y he movido las palabras de Chris, por lo que cualquier error probablemente sea de @pfaffman.

¿Hay alguna razón para no usar NGINX Proxy Manager en lugar de hacerlo manualmente como se describe en Run other websites on the same machine as Discourse?

Ya lo estoy usando. Lo he tenido en mi servidor doméstico durante un tiempo y, cuando migré mi instancia de Discourse a un nuevo servidor en la nube, me di cuenta de que había olvidado la mayor parte de la configuración del proxy inverso de NGINX que hice hace 4 años en el servidor antiguo, así que pensé: ¿por qué no hacerlo con NGINX Proxy Manager? Para mi sorpresa, descubrí que se ha mencionado bastante raramente aquí en meta, por lo que empecé a preguntarme si había algunas desventajas que podría haber pasado por alto…

En efecto, esto requirió un poco de prueba y error, pero logré que funcionara de la siguiente manera (sin garantía de que esta sea la mejor manera de hacerlo; de hecho, sé que debe haber una mejor manera, así que las correcciones y mejoras son muy bienvenidas):

Para empezar, hay dos formas de acceder a tu instancia de Discourse: 1. exponiendo un puerto, 2. a través de un websocket. Creo que aprendí en algún lugar de este foro que el websocket es más rápido/más eficiente, así que es lo que estoy usando, pero exponer un puerto debería ser mucho más fácil, así que si no puedes hacer que el socket funcione, prueba exponiendo un puerto. Entonces, para evitar confusiones: para acceder a Discourse a través de un puerto, sigue los pasos 0, 1, 2, 3, 4 y 8 a continuación. Si quieres usar un websocket, sigue los pasos 0, 1, 5, 6, 7, 8 y 9.

0. Punto de partida

Así que asumamos que has completado la instalación estándar de 30 minutos y asumamos que no dejaste que Discourse obtuviera un certificado de Let’s Encrypt todavía, porque no lo necesitas cuando usas un proxy inverso. NGINX Proxy Manager se encargará de eso. No importa, sin embargo, si ya tienes un certificado. NGINX Proxy Manager simplemente obtendrá uno nuevo.

1. Instalar NGINX Proxy Manager

El siguiente paso es instalar NGINX Proxy Manager para que tengas dos contenedores Docker más en ejecución (NGINX Proxy Manager y su contenedor de base de datos).

A continuación está la parte complicada de la que estás preguntando.

El primer obstáculo es que Discourse se ejecuta en la red bridge predeterminada de Docker, mientras que NGINX Proxy Manager se ejecuta por defecto en una “red creada por el usuario” predeterminada (llamada npm_default en mi caso), lo que significa que NGINX Proxy Manager no puede ver Discourse. :cry:

2. Traer todos los contenedores a la red bridge predeterminada

Así que mientras no sé si y cómo Discourse puede moverse a una red personalizada, tenemos que mover NGINX Proxy Manager a la red bridge predeterminada. Podemos hacer esto agregando network_mode: bridge a ambos contenedores de NGINX Proxy Manager en nuestro archivo docker compose.

3. Usar la dirección IP en lugar del nombre del servicio

El siguiente problema es que el archivo docker compose estándar ya no funcionará si simplemente lo mueves a la red bridge. NGINX Proxy Manager ya no podrá encontrar su contenedor de base de datos. Esto se debe a que la resolución DNS interna para nombres de servicio (en la que se basa el archivo docker-compose) solo está disponible en redes creadas por el usuario, no en las redes predeterminadas de Docker. Así que tenemos que recurrir a direcciones IP codificadas (lo cual es definitivamente no la solución óptima porque se romperá si las direcciones IP de tus contenedores cambian). Entonces necesitas iniciar el contenedor aunque sepas que no funcionará, anota la IP del contenedor de base de datos de NGINX Proxy Manager y reemplaza DB_MYSQL_HOST: "db" en tu archivo docker compose con DB_MYSQL_HOST: "<ip_del_contenedor_db>".

Ahora todos los contenedores deberían estar en la red bridge predeterminada para que NGINX Proxy Manager pueda ver tanto Discourse como su base de datos.

4. Hacer Discourse accesible

Pero “ver” Discourse y poder acceder a él no es lo mismo. Así que necesitas asegurarte de que Discourse acepte cualquier tráfico que NGINX Proxy Manager le reenvíe. Si no te importa usar el websocket, supongo que puedes simplemente apuntar NGINX Proxy Manager al puerto 80 (no 443) de la IP de tu contenedor de Discourse, así:

No lo he probado, sin embargo. Como mencioné, estoy usando la configuración de websocket, que requiere algunos pasos adicionales. Ten en cuenta que el nombre de host/IP y el puerto anteriores se ignorarán cuando uses el websocket.

5. Configurar app.yml para usar websocket

Esto está explicado en el OP, así que no entraré en detalles.

6. Montar el websocket en el contenedor de NGINX Proxy Manager

Necesitamos dar a NGINX Proxy Manager acceso al websocket montándolo como un volumen: - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock. Este es el último cambio en el archivo docker compose predeterminado de NGINX Proxy Manager, así que aquí está la versión final que funciona para mí:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. Configurar NGINX Proxy Manager para usar el websocket

Último paso: decirle a NGINX Proxy Manager que use el websocket. Por lo que recuerdo, no fue suficiente solo activar “Soporte de Websockets”, así que copié la ubicación de NGINX del OP a la pestaña “Avanzado”, así:

No logré que esto funcionara bajo la pestaña “Ubicaciones personalizadas”.

8. No olvides activar SSL

No mencioné la configuración SSL en NGINX Proxy Manager porque parece bastante obvio y no creo que importe en qué punto del proceso lo actives. Así que si aún no lo has hecho, así es como se ve el mío:


9. Aviso

tl;dr Cada vez que reinicies el contenedor de Discourse, también necesitarás reiniciar el contenedor principal de NGINX Proxy Manager (no es necesario reiniciar la base de datos).
Si estás accediendo a Discourse a través del websocket, debes ser consciente de que cuando reconstruyas tu contenedor de Discourse (como se requiere cada pocos meses para actualizar la imagen base), el websocket anterior se eliminará y se creará uno nuevo. Como consecuencia, NGINX Proxy Manager perderá el contacto con tu instancia de Discourse y arrojará un error 502. Tal vez una futura actualización de NGINX Proxy Manager podrá encontrar el nuevo websocket automáticamente, pero actualmente (enero de 2022) NGINX Proxy Manager no encontrará tu contenedor de Discourse reconstruido a menos que reinicies NGINX Proxy Manager.

Explicación

Si te preguntas por qué las instrucciones anteriores combinan el websocket con los puertos, la razón simple es que, mientras escribía este post, de repente se me ocurrió que NGINX Proxy Manager y Discourse probablemente ni siquiera necesitan estar en la misma red Docker cuando usamos el websocket. Y cuando esto fue confirmado, nadie sintió ganas de reescribir completamente las instrucciones.

Este es el aspecto más fascinante de los foros de soporte: hacer un buen trabajo describiendo tu problema a menudo te lleva a la solución sin siquiera publicar tu pregunta. Y en este caso, estaba respondiendo a la pregunta de otra persona pero también podría haber encontrado la respuesta a la mía. :smiley:

9 Me gusta

Discutir qué proxy inverso deberías usar está claramente fuera del ámbito de soporte. :wink: Pero después de mirar NGINX Proxy Manager durante 12 segundos o más, creo que funcionará bien. También he visto discutir antes otra herramienta automática de proxy NGINX, pero con mi extenso conocimiento de NGINX Proxy Manager, creo que esta podría ser mejor. Podría echarle un vistazo, ya que estoy perdiendo el interés en Traefik.

EDITO: Ahora lo he revisado durante 3 minutos. Prefiero herramientas que faciliten la automatización, por lo que Traefik y jwilder/nginx-proxy - Docker Image (lo encontré), que te permiten agregar algunas etiquetas o variables de entorno al contenedor Docker para que no sea necesario hacer clic en una interfaz web, son más lo que busco. Parece que para hacer funcionar esa herramienta necesitas usar la interfaz web o idear una forma de actualizar la base de datos manualmente con los hosts que quieras agregar. Pero si estás dispuesto a hacer clic y explorar una interfaz web como una persona normal (en lugar de un “persona” administrador de sistemas), entonces parece que esa herramienta podría ser justo lo que estás buscando.

4 Me gusta

He intentado instalar Nginx Proxy Manager, pero no entiendo cómo “enlazar” (¿hacer proxy? lo siento, pero soy bastante nuevo en la administración de sistemas) el contenedor de Discourse para poder ver Discourse al acceder desde la web.
¿Podrías darme algunas pistas? ¿Debería el contenedor de Discourse exponer los puertos 80 y 443 o no, como sugiere este tema del foro?

1 me gusta

Efectivamente, esto requirió un poco de prueba y error, pero logré que funcionara de la siguiente manera (no hay garantía de que esta sea la mejor manera de hacerlo; de hecho, sé que debe haber una mejor, así que las correcciones y mejoras son muy bienvenidas):

Instrucciones que @pfaffman movió a la primera publicación

Para empezar, hay dos formas de acceder a tu instancia de Discourse: 1. exponiendo un puerto, 2. mediante un websocket. Creo haber leído en algún lugar de este foro que el websocket es más rápido/más eficiente, por lo que es lo que estoy usando, pero exponer un puerto debería ser mucho más fácil; así que, si no logras que el socket funcione, intenta exponer un puerto (más sobre esto más abajo).

Supongamos que has completado la instalación estándar de 30 minutos y que aún no has dejado que Discourse obtenga un certificado de Let’s Encrypt, ya que no lo necesitas cuando usas un proxy inverso. NPM se encargará de eso. Sin embargo, no importa si ya tienes un certificado; NPM simplemente obtendrá uno nuevo.

1. Instalar NPM

El siguiente paso es instalar NPM para que tengas dos contenedores Docker más en ejecución (NPM y su contenedor de base de datos).

A continuación viene la parte complicada sobre la que preguntas.

El primer obstáculo es que Discourse se ejecuta en la red bridge predeterminada de Docker, mientras que NPM, por defecto, se ejecuta en una red “creada por el usuario” predeterminada (en mi caso llamada npm_default), lo que significa que NPM no puede ver Discourse. :cry:

2. Mover todos los contenedores a la red bridge predeterminada

Así que, mientras no sepa si y cómo se puede mover Discourse a una red personalizada, tenemos que mover NPM a la red bridge predeterminada. Podemos hacer esto añadiendo network_mode: bridge a ambos contenedores de NPM en nuestro archivo docker compose.

3. Usar la dirección IP en lugar del nombre del servicio

El siguiente problema es que el archivo docker compose estándar ya no funcionará si simplemente lo mueves a la red bridge. NPM ya no podrá encontrar su contenedor de base de datos. Esto se debe a que la resolución interna de DNS para los nombres de servicio (de la que depende el archivo docker-compose) solo está disponible en redes creadas por el usuario, no en las redes predeterminadas de Docker. Así que tenemos que recurrir a direcciones IP codificadas (lo cual es definitivamente la solución no óptima porque fallará si las direcciones IP de tus contenedores cambian). Por lo tanto, necesitas iniciar el contenedor aunque sepas que no funcionará, anotar la IP del contenedor de base de datos de NPM y reemplazar DB_MYSQL_HOST: "db" en tu archivo docker compose con DB_MYSQL_HOST: "<ip_del_contenedor_db>".

Ahora todos los contenedores deberían estar en la red bridge predeterminada para que NPM pueda ver tanto a Discourse como a su base de datos.

4. Hacer que Discourse sea accesible

Pero “ver” Discourse y poder acceder a él no es lo mismo. Así que debes asegurarte de que Discourse acepte todo el tráfico que NPM le reenvíe. Si no te importa usar el websocket, supongo que puedes simplemente apuntar NPM al puerto 80 (no al 443) de la IP de tu contenedor de Discourse, así:

Aunque no he probado esto. Como mencioné, estoy usando la configuración de websocket, lo que requiere algunos pasos adicionales. Ten en cuenta que el nombre de host/IP y el puerto anteriores se ignorarán cuando uses el websocket.

5. Configurar app.yml para usar websocket

Esto se explica en la primera publicación, así que no entraré en detalles.

6. Montar el websocket en el contenedor NPM

Necesitamos dar acceso a NPM al websocket montándolo como un volumen: - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock. Este es el último cambio en el archivo docker compose predeterminado de NPM, así que aquí está la versión final que funciona para mí:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. Configurar NPM para usar el websocket

Último paso: decirle a NPM que use el websocket. Por lo que recuerdo, no fue suficiente simplemente activar “Soporte de Websockets”, así que copié la ubicación de NGINX de la primera publicación a la pestaña “Avanzado”, así:

No logré que esto funcionara en la pestaña “Ubicaciones personalizadas”.

8. No olvides activar SSL

No mencioné la configuración SSL en NPM porque parece bastante obvia y no creo que importe en qué punto del proceso la actives. Así que, si aún no lo has hecho, esto es lo que tiene el mío:


9. Descargo de responsabilidad final

Mientras escribía esta publicación, se me ocurrió de repente que NPM y Discourse probablemente ni siquiera necesitan estar en la misma red de Docker cuando usamos el websocket. No tengo tiempo para verificar esto en este momento, pero si esto es cierto, entonces puedes simplemente olvidar los pasos 2, 3 y 4 anteriores y debería funcionar.

Este es el aspecto más fascinante de los foros de soporte: hacer un buen trabajo describiendo tu problema a menudo te lleva a la solución sin siquiera publicar tu pregunta. Y en este caso, estaba respondiendo a la pregunta de otra persona, pero también podría haber encontrado la respuesta a la mía. :smiley:

4 Me gusta

¡Muchas gracias por la excelente y bien estructurada respuesta! Probaré tus sugerencias lo antes posible. Por cierto, ¿las IPs que debo configurar en NPM son las del servidor (es decir, la IP externa para acceder al servidor) o las internas de Docker (he notado que Docker utiliza direcciones 172… para los contenedores)?
Perdona si mis preguntas parecen triviales, no conozco bien los temas de redes.

1 me gusta

Recomiendo que utilices el websocket. De esa forma, puedes poner cualquier IP porque no se utilizará. En caso contrario, se trata de la IP interna del contenedor, no de la IP pública del host.

Por cierto: parece que tu respuesta por correo electrónico no se representó correctamente. ¿Quizás quieras editar (acortar) tu publicación de arriba?

2 Me gusta

Sí, lo vi. Usé “Responder” desde el correo y trató de incluir todo el mensaje original, pero no encuentro una forma de modificarlo. ¿Es posible? Soy nuevo en Discourse, incluso como usuario… :pensive:

1 me gusta

Puedes editar tus publicaciones usando el icono del lápiz en la parte inferior de tu mensaje. Sin embargo… los niveles de confianza 1 y inferiores solo tienen 24 horas (por defecto), mientras que los niveles de confianza 2 y superiores tienen 30 días (por defecto).

Parece que en este momento estás en el nivel TL1 Básico, pero puedes averiguar más sobre lo que necesitas hacer para “subir de nivel” en Niveles de confianza. :+1:

2 Me gusta

Perdona si ha pasado bastante tiempo desde mi pregunta anterior, pero perdí mucho tiempo intentando hacer lo que sugeriste, sin ningún éxito. Al modificar app.yml y reconstruir la aplicación con tus cambios, empezó a mostrar en los registros: “config/unicorn_launcher: línea 71: kill: (898) - No such process”. Por más que intenté, no hubo forma de detener este comportamiento. También probé reconstruir la aplicación en su estado original (con puertos expuestos, sin websocket), deteniendo npm, pero sin resultado alguno; “unicorn” no se está ejecutando.

También intenté seguir todo lo que Google encuentra sobre esto (parece ser un problema bastante extendido), pero de ninguna manera pude averiguar cómo reconstruir un contenedor de Discourse que funcione. El problema ahora es (uno de los más graves, estoy cerca de rendirme con Discourse) que, por alguna razón oscura y confusa, el PostgreSQL interno siempre está “reiniciándose”.

No sé por qué. Simplemente apliqué tus cambios, reconstruí la aplicación y desde entonces “unicorn” :roll_eyes: está muerto.

¿Hay alguna forma de solucionar este problema de PostgreSQL? ¿Por qué ocurrió esto? ¿Existe alguna posibilidad (me temo que no) de no perder todos los cambios que hice en Discourse cuando funcionaba?

Por cierto, ¿es normal que cada pequeño cambio o intento de arreglar algo termine provocando que algo más deje de funcionar? :rage:

No estoy enfadado; todo esto es culpa de Discourse, no de tus sugerencias. He pasado mucho tiempo intentando hacer que este foro “aparentemente” agradable funcione, pero cada vez hay algo más que sale mal. Mis sentimientos de que Discourse es algo muy poco fiable se están fortaleciendo.

1 me gusta

Si tenías una instalación estándar que funcionaba, deberías poder volver a dejar las cosas así y que todo siga funcionando.

El problema con PostgreSQL podría estar relacionado con la actualización de PostgreSQL 13?

Si hiciste una copia de seguridad antes de comenzar, puedes instalar en un servidor nuevo y restaurar esa copia de seguridad. Eso debería ser el peor de los casos.

2 Me gusta

¿Cómo puedo saber si el problema de PostgreSQL está relacionado con la actualización a la versión 13? No elegí actualizarlo; simplemente escribí ./launcher rebuild app y ocurrieron todos los… problemas.

Sí, es la versión 13. Después de horas leyendo en internet sobre otras personas con el mismo problema, descubrí que esto podría ser la causa, pero no encontré una forma de revivir Discourse.

1 me gusta

Entonces ese no es el problema. Lo siento.

1 me gusta

Siento mucho que estés teniendo estos problemas. Conozco la sensación frustrante de pasar horas intentando solucionar algo. Pero también aprendes algo cada vez, incluso si el camino hacia la solución rara vez es una línea recta…

Lo siento, pero no soy la persona adecuada para ayudarte con esto. No tengo experiencia con Postgres ni con Unicorn. Hay tres formas en las que suelo superar estos escenarios de “nada funciona”: 1. hacer copias de seguridad para poder volver siempre al estado original. 2. intentar o cambiar solo una cosa a la vez y probarla primero en una máquina que no sea de producción (o en un foro menos importante). 3. invertir aún más horas en tratar de entender qué está pasando.

Por cierto: escribir descripciones detalladas del problema o tickets de soporte más de una vez me ha ayudado a resolverlo. A veces ni siquiera tuve que enviar el ticket. El simple hecho de escribirlo me hizo ver la solución.

Así que, en tu caso, lo que intentaría entender es: ¿bajo qué circunstancias cambiar el app.yml y luego volver a cambiarlo a su estado original puede llevar a un resultado diferente al original? Al investigar esto, o te darás cuenta de que no restauraste exactamente el original, o entenderás qué más necesitas “restablecer” para que funcione.

5 Me gusta

Lo siento mucho, pero no entiendo: primero me preguntaste si el problema de PostgreSQL podría estar relacionado con la actualización a PostgreSQL 13, y cuando respondí “sí, es la versión 13” (juro que no sabía cuál era la anterior, hace mucho tiempo que no reconstruyo la aplicación), me respondes que no es el problema… Entonces, ¿por qué PostgreSQL siempre está “iniciando” y Discourse no avanza?

1 me gusta

Hola @Wanderer. No puedo determinar cuál podría ser tu problema, así que la actualización de PostgreSQL fue solo una suposición. Estoy bastante seguro de que, si estás ejecutando PostgreSQL 13, el problema no es que te hayas quedado atascado intentando actualizar desde la versión 10 o 12. Por lo tanto, aunque podría haber algún problema con PostgreSQL, probablemente no esté relacionado con la actualización a PostgreSQL 13.

Mi mejor recomendación para alguien que no es experto en estos asuntos es realizar una instalación limpia y restaurar tu copia de seguridad más reciente.

Si deseas obtener ayuda más específica para tu problema y tienes un presupuesto, puedes contactarme o publicar en Marketplace.

Voy a trabajar en mejorar las instrucciones del Nginx Proxy Manager, pero mi suposición es que tu problema, aunque se haya puesto de manifiesto al intentar migrar a estas configuraciones complejas, probablemente no se deba a que las instrucciones sean incorrectas. (No lo sé con certeza, pero es mi mejor suposición.)

2 Me gusta

Aquí está mi versión de esto. Casi me rendí, pero @tophee enlazó a una publicación que yo (!?) escribí y que proporcionó la magia necesaria. Ahora esta es una forma directa de configurar Nginx Proxy Manager para Discourse. Creo que esto lo hace similar a Run other websites on the same machine as Discourse - #396.

Instalar Nginx Proxy Manager siguiendo sus instrucciones en

Eliminar las plantillas de SSL y Let’s Encrypt:

Asegúrate de que estas líneas en tu archivo yml estén comentadas o eliminadas:

## Descomenta estas dos líneas si deseas agregar Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"

Hacer que Discourse use la red npm-default.

Si sigues ciegamente las instrucciones de instalación de Nginx Proxy Manager, se creará una red Docker llamada npm_default.

Agrega este bloque a tu archivo(s) yml. Si tienes contenedores web_only y data separados, necesitarás agregar esto a cada uno de ellos (no probé el contenedor mail-receiver). docker_args no está indentado.

docker_args: |
  --network npm_default

No es necesario exponer ningún puerto

Comenta o elimina estas líneas de tu archivo yml:

# expose:
#  - "80:80"   # http
#  - "443:443" # https

Luego puedes reconstruir tu(s) contenedor(es) y configurar Nginx Proxy Manager de la siguiente manera:

image

Una forma sencilla (pero no necesariamente recomendada) de levantar un segundo sitio de Discourse sería esta:

cd /var/discourse/containers
cp app.yml othersite.yml
# de alguna manera edita, como mínimo, el nombre de host en othersite.yml
./launcher rebuild othersite

Luego agrégalo a NPM como se indicó anteriormente, usando othersite en lugar de app.

Probé esto con un app.yml más dos contenedores estilo web_only y un único contenedor data más un contenedor othersite-redis separado que es una copia del contenedor data que contiene solo las plantillas de redis. (Pero una solución más sencilla sería colocar el redis adicional en el contenedor web_only).

2 Me gusta

Así que, tras algunas dificultades, logré que todo funcione.

Debo aclarar: aunque soy un desarrollador de “generación antigua” (nacido en los años 80), siempre he buscado las mejores y más nuevas formas de desarrollar o gestionar, por lo que en 2021 detesto escribir comandos extraños llenos de opciones crípticas como en los antiguos CP/M o DOS. Siempre busco alguna interfaz que me facilite y aclare la vida.

Por ejemplo, utilizo Portainer para gestionar contenedores; permite iniciar, detener, editar y duplicar todos los contenedores sobre la marcha, sin “revolver” el sistema de archivos en busca de un archivo de uno en un millón; por ejemplo, para cambiar la red del contenedor solo hay que elegir una de una lista y hacer clic, lo mismo para añadir parámetros o un volumen como en el ejemplo que escribió @tophee; por esta razón probé NPM, porque prefiero “contener” mi proxy Nginx y porque aparentemente con solo unos pocos clics, entendiendo bien lo que hago pero sin tener que recordar un nuevo conjunto de comandos y opciones extraños.

Volviendo a mi contenedor de Discourse, tuve que ejecutar “discourse-setup” de nuevo; todo salió bien, el “maligno” Postgres se instaló en la versión 13, sin “unicornio borracho” (¡lo siento, pero pensar en un “unicornio” corriendo en mi servidor me hace reír! :laughing:), en resumen, todo salió bien. Luego, hice la modificación para que Discourse funcione con websockets: todo bien también esta vez. Afortunadamente, la configuración anterior de Discourse realizó copias de seguridad automáticas, así que con solo unos pocos clics restauré todo (¡cuanto más uso Discourse, más me encanta!).

Tuve que probar varias veces la configuración de NPM; al principio tuve algunos problemas con los certificados, pero al final también funcionó correctamente.

Añadí un segundo proxy apuntando a mi contenedor de WordPress (sí, lo estoy “conteniendo” todo; me gusta la idea de un servidor más limpio con todos los paquetes principales contenidos en un lugar gestionado), e incluso eso funcionó bien.

Así que, al final, tengo mi servidor (un VPS) con su servidor de correo (también intenté “contenerlo”, pero tras semanas de dura lucha, lo abandoné), Discourse apuntando a él, WordPress ejecutándose en otro contenedor y NPM gestionando ambos: todo en mi servidor, sin depender de otros servicios (y mucho, mucho más caros) para el despliegue, el envío de correos, etc.

Próximo paso: importar algunas cientos de miles de publicaciones del “antiguo y bueno Phpbb”: ¡prepárate para más publicaciones mías! :grinning_face_with_smiling_eyes:

Un gran agradecimiento a @tophee y @pfaffman por la ayuda; puedo entender lo difícil que puede ser ayudar a personas que trabajan de manera no estándar como yo.

3 Me gusta

Me alegra que hayas logrado que funcione con Websocket. Para cualquier otra persona que esté teniendo problemas con eso, sigue las instrucciones de @pfaffman para hacerlo sin websocket anteriores.

No sé qué causó tu problema, pero me parece que esto podría ser un punto a aclarar para cualquiera que sea relativamente nuevo en la administración de Discourse: necesitas entender cómo funciona el certificado de Let’s Encrypt en la instalación predeterminada (sin ningún proxy externo) en comparación con cómo funciona con NPM (y si te preguntas por qué se llama proxy externo, también tendrás que averiguarlo).

Como configuré manualmente mi proxy externo y también configuré Let’s Encrypt manualmente, tenía una comprensión de toda la magia que Discourse, así como NPM, hacen por ti para que HTTPS simplemente funcione, y por lo tanto pude evitar varios obstáculos al cambiar de certificados gestionados por Discourse a certificados gestionados por NPM.

Realmente no veo por qué querrías poner el servidor de correo detrás de NPM…

1 me gusta

No, Christoph, no detrás de NPM, simplemente en un contenedor. Probé Zimbra, pero fue un gran desastre. Luego intenté un Postfix simple “contenerizado”, pero tampoco tuve éxito. Estaba al principio de mi experiencia con Linux (todavía soy principiante, aunque estoy ganando cada vez más confianza, al menos en lo que respecta a algunos conceptos de administración), así que lo dejé y lo probé directamente en el servidor. Arranca sin grandes problemas, así que procedí de esa manera, aunque fue bastante difícil configurar Discourse para que usara mi servidor de correo. Pero ahora, todo parece funcionar.

2 Me gusta

Suena bien con la instalación hasta que me atasco con npm para comunicarme con el host de Discourse; mencionas poner la IP del contenedor de datos dentro del host de mySQL del archivo compose de npm

 environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"

pero cuando cambio el (DB_MYSQL_HOST) al contenedor de datos, me muestra conexión rechazada.

connect ECONNREFUSED 172.17.0.2:3306 <-- error cuando npm en la red de Discourse (network_mode: bridge).
getaddrinfo ENOTFOUND db <-- error cuando el mySQL en el archivo compose de npm se define como "db".

¿Alguna sugerencia para que el paso 3 funcione conmigo?

1 me gusta