Configurar Discourse - Entorno AWS Linux 2 AMI y Apache2 (httpd)

Hola a todos,

He revisado la documentación, leído las configuraciones y recomendaciones publicadas, e intentado adaptarlas a mi situación particular.

Para algo que parece bastante sencillo, es increíblemente frustrante que ninguna de las soluciones propuestas haya funcionado.

Nuestro entorno:

  • Ejecutamos una instancia AWS EC2, más concretamente una imagen AMI de AWS Linux 2;
  • Tenemos Apache2 instalado y configurado;
  • La instancia forma parte de un grupo de destino (target group) de AWS al que hace referencia nuestro equilibrador de carga (load balancer) de AWS;
  • Nuestro certificado SSL/TLS es proporcionado por AWS y está asociado al equilibrador de carga;
  • Nuestro proveedor de dominio es name.com;
  • Como parte de nuestra configuración, tenemos varios subdominios enrutados mediante registros CNAME que apuntan todos al equilibrador de carga de AWS, el cual gestiona el tráfico hacia la instancia EC2;
  • Todo el tráfico enrutado al equilibrador de carga y servido al usuario web es seguro;
  • En nuestro servidor ejecutamos tres aplicaciones Node Express separadas;
  • Los puertos están definidos en Express como parte de la configuración del servidor, actualmente los puertos 3000, 4000 y 5000;
  • El tráfico es enrutado por Apache utilizando el subdominio hacia la aplicación web correspondiente, por ejemplo:
<VirtualHost *:80>
    ServerName subdomain.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • Aunque no es particularmente relevante, utilizamos PM2 para gestionar nuestras aplicaciones Express para que se inicien automáticamente al reiniciar el servidor.

  • En el mismo servidor tenemos instalado Docker;

  • Luego también hemos instalado Discourse copiando el archivo app.yaml (utilizando Run other websites on the same machine as Discourse - #182 by angus como guía).

Estado actual:

  • Docker está en ejecución
  • La aplicación de Discourse (contenedor) está en ejecución
  • Las aplicaciones Express están todas en ejecución y son enrutadas correctamente por Apache

Notas:

  • Intenté compilar la aplicación inicialmente sin exponer los puertos según la documentación; cuando eso no funcionó, expuse el puerto 8000 sobre el puerto HTTP 80;
  • En mi comprensión básica, Docker es como una casa y los diversos contenedores son las habitaciones. Docker determina cómo se accede a la aplicación, es decir, a qué habitación acceder. Mi idea al exponer el puerto 8000 era poder referenciarlo como hago con mis otras aplicaciones Express, ahora que el 8000 estaba expuesto. Pero esto no funciona; a continuación un ejemplo de lo que intenté hacer en Apache:
# FAQ (RUTAS DE DISCOURSE)

<VirtualHost *:80>
    ServerName discourse.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8000/"
    ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>
  • La prueba sencilla fue intentar poner localhost:8000 en el navegador del servidor y probar. El servidor es la instancia de AWS con Chromium instalado. El hecho de que esto no se resuelva inmediatamente me indica que hay un problema y que mi comprensión carece de algo fundamental. Mis aplicaciones web se ejecutan y están disponibles en los puertos que especifico en la configuración de Express; mi expectativa era que fuera lo mismo para el contenedor de Docker.

Notas adicionales:

  • Soy consciente de que existe una solución potencial colocando NGINX “delante de” Apache y Docker para enrutar el tráfico desde discourse.domain.io hacia, digamos, el puerto 8000 en el servidor local, es decir, el puerto expuesto para el contenedor de Docker, y también enrutar todo el resto del tráfico desde *.domain.io hacia Apache, digamos en el puerto 9000, y luego cambiar mi configuración de VirtualHost para enrutar el tráfico desde el puerto 9000 en consecuencia, es decir:
# ENRUTAMIENTO DE APPS EXPRESS EN APACHE

<VirtualHost *:9000>
    ServerName other_sub_domains.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • Para mí, esto parece completamente innecesario. Si el dominio discourse.domain.io es enrutado a Apache y Apache recibe la solicitud y luego intenta enrutarla, debería ser tan sencillo como apuntarla al puerto expuesto del contenedor de Docker.
  • Además, si localhost:8000 en el propio servidor no se resuelve, entonces esto tampoco funcionaría de todos modos.

Actualmente obtengo un error 502 en Chrome cuando intento navegar a mi contenedor de Docker de Discourse. (Ver captura de pantalla anterior).

Extracto de app.yml

## esta es la plantilla del contenedor Docker de Discourse todo-en-uno, autónomo
##
## Después de realizar cambios en este archivo, DEBES reconstruir
## /var/discourse/launcher rebuild app
##
## TEN *MUCHO* CUIDADO AL EDITAR!
## ¡LOS ARCHIVOS YAML SON SUPER SUPER SENSIBLES A ERRORES EN LOS ESPACIOS EN BLANCO O LA ALINEACIÓN!
## visita http://www.yamllint.com/ para validar este archivo según sea necesario

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

## ¿Qué puertos TCP/IP debe exponer este contenedor?
## Si deseas que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulta https://meta.discourse.org/t/17247 para detalles
expose:
  - "8000:80"   # http
  #- "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Establece db_shared_buffers a un máximo del 25% de la memoria total.
  ## se establecerá automáticamente durante el arranque según la RAM detectada, o puedes sobrescribirlo
  #db_shared_buffers: "256MB"

  ## puede mejorar el rendimiento de ordenación, pero añade uso de memoria por conexión
  #db_work_mem: "40MB"

  ## ¿Qué revisión de Git debe usar este contenedor? (por defecto: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## ¿Cuántas solicitudes web concurrentes se admiten? Depende de la memoria y los núcleos de CPU.
  ## se establecerá automáticamente durante el arranque según los CPUs detectados, o puedes sobrescribirlo
  #UNICORN_WORKERS: 3

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
  ## Obligatorio. Discourse no funcionará con una dirección IP desnuda.
  DISCOURSE_HOSTNAME: 'discourse.domain.io'

  ## Descomenta si quieres que el contenedor se inicie con el mismo
  ## nombre de host (-h option) que se especificó arriba (por defecto "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos separados por comas que serán administradores y desarrolladores
  ## en el registro inicial, ejemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'user@domain.io'

  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  ## Se requieren dirección SMTP, nombre de usuario y contraseña
  # ADVERTENCIA: el carácter '#' en la contraseña de SMTP puede causar problemas!
  DISCOURSE_SMTP_ADDRESS: email-smtp.us-east-1.amazonaws.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: ******
  DISCOURSE_SMTP_PASSWORD: ******
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, por defecto true)
  #DISCOURSE_SMTP_DOMAIN: ******    # (requerido por algunos proveedores)
  #DISCOURSE_NOTIFICATION_EMAIL: ******  # (dirección desde la que enviar notificaciones)

  ## Si agregaste la plantilla de Lets Encrypt, descomenta abajo para obtener un certificado SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## La dirección CDN http o https para esta instancia de Discourse (configurada para extraer)
  ## consulta https://meta.discourse.org/t/14857 para detalles
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## La clave de dirección IP de geolocalización de Maxmind para la búsqueda de direcciones IP
  ## consulta https://meta.discourse.org/t/-/137387/23 para detalles
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## El contenedor de Docker no tiene estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Los plugins van aquí
## consulta https://meta.discourse.org/t/19157 para detalles
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Cualquier comando personalizado para ejecutar después de la compilación
run:
  - exec: echo "Inicio de comandos personalizados"
  ## Si deseas establecer la dirección de correo electrónico 'From' para tu primer registro, descomenta y cambia:
  ## Después de recibir el primer correo de registro, vuelve a comentar la línea. Solo necesita ejecutarse una vez.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fin de comandos personalizados"

Mi dominio, dirección de correo electrónico y configuración de correo son correctos. Como mencioné, no requiero configuración SSL/TLS.

Solicitud:

  • ¿Es la solución de NGINX la única forma de hacer que esta configuración funcione y, de ser así, ¿hay una explicación más clara disponible con respecto a los pasos de configuración? No estoy en condiciones de comenzar desde cero con el servidor solo para que Discourse funcione y sin garantías.
  • En Discourse behind reverse proxy and https - #2 by itsbhanusharma @Dark Matter proporcionó la siguiente solución para apache2, pero no creo que esta solución tenga en cuenta un entorno de Node Express y, dado que mi localhost:8000 no se resuelve, no estoy seguro de que esto funcione:
<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName  discourse.example.com
  DocumentRoot /website/discourse

  RewriteEngine On
  ProxyPreserveHost On
  ProxyRequests Off
  ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ErrorLog /var/log/apache2/discourse.error.log
  LogLevel warn
  CustomLog /var/log/apache2/discourse.access.log combined

  RewriteCond %{SERVER_NAME} =discourse.example.com
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
  • ¿Es el problema aquí con mi configuración de Discourse? ¿Es quizás el problema mi enrutamiento de Apache (lo sospecho)? ¿O me estoy perdiendo algo más fundamental aquí?
  • Creo que resolver esto ayudará a muchos usuarios en el futuro.
  • La mejor opción sería enrutarse a Discourse localmente en el servidor.
  • Luego, el enrutamiento a través de la URL sería la segunda mejor opción.

Saludos cordiales,
Matthew Lucas

Esto es demasiado complicado para que lo entienda por completo, así que considéralo más una suposición que una solución. Si el problema es que no estás obteniendo algo para conectarte a tu contenedor de Docker en ejecución a través de localhost, podrías intentar usar la IP de Docker. También podría ser posible usar la plantilla de WebSocket y usar el socket en lugar del puerto. Algunos argumentan que esto es preferible por una serie de razones.

Configuración de despliegue de Discourse con opinión de MKJ podría ser útil leerlo.

@pfaffman@Matthew_Lucas ya está usando la plantilla con sockets, sin embargo…

Definitivamente estoy usando localhost para mi proxy externo, y eso debería funcionar con la configuración expose. No esperaría que necesitara usar la IP de Docker. Y no esperaría que esto fallara solo con Apache delante del contenedor de Docker por esa razón.

Es posible que necesites configuración de encabezados — consulta Add an offline page to display when Discourse is rebuilding or starting up - #2 by codinghorror

He estado haciendo mi mejor esfuerzo para olvidar la configuración de Apache, pero creo que esta sección de la configuración de nginx es algo que querrías averiguar cómo replicar con Apache.

    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;

En particular, creo que no funciona correctamente sin el encabezado Host.

Dado que no estás usando HTTPS, deberías poder usar tcpdump para capturar rastreos de paquetes y ver exactamente qué está saliendo mal.

SIN EMBARGO, ¿por qué poner Apache ahí en absoluto? Es solo un obstáculo adicional. Si estuviera intentando algo como esto, configuraría el balanceador de carga de Amazon para que se comunique directamente con el puerto 8000 en la instancia EC2. Supongo que de todos modos estás terminando HTTPS en el ELB. Sospecho que su balanceador de carga conoce los encabezados normales que debe agregar sin que tú necesites especificarlos, pero si no, obviamente hazlo. Solo asegúrate de que el puerto sea accesible a través del firewall.

Dudo que tenga mucho más de valor que aportar aquí, pero espero que algo de esto te ayude con tu configuración. Buena suerte.

INSTALACIÓN DE DOCKER Y DISCOURSE EN AWS EC2 LINUX CON UN PROXY INVERSO HTTPD EXISTENTE

Hola a todos,

Lo he logrado. Volví a la mesa de dibujo y comencé de nuevo con una instalación limpia de Docker y Discourse. Mi proceso se detalla a continuación:

Supuestos

• Ya tienes una instancia Linux de AWS EC2
• Puedes acceder a tu instancia EC2 mediante SSH
• Apache 2 ya está configurado y en ejecución en tu servidor

ACCEDER A TU INSTANCIA EC2 MEDIANTE SSH

  1. Abre CMD / Terminal

  2. Conéctate mediante SSH a la instancia de AWS EC2

Ejemplo de pantalla una vez conectado a la instancia EC2

REALIZAR ACTUALIZACIONES DEL SISTEMA

  1. Realiza las actualizaciones del sistema ejecutando el siguiente comando en la consola / terminal

$ sudo yum update

INSTALAR DOCKER

  1. Busca el paquete de Docker de AWS ejecutando el siguiente comando en la consola / terminal

$ sudo yum search docker

  1. Obtén información de la versión ejecutando el siguiente comando en la consola / terminal

$ sudo yum info docker

  1. Instala Docker ejecutando el siguiente comando en la consola / terminal

$ sudo yum install docker

  1. Agrega membresía al grupo para el usuario ec2-user predeterminado para que puedas ejecutar todos los comandos de Docker sin usar el comando sudo, ejecutando el siguiente comando en la consola / terminal
$ sudo usermod -a -G docker ec2-user
$ id ec2-user

# Recarga las asignaciones de grupo de un usuario de Linux a docker sin cerrar sesión

$ newgrp docker
  1. Instala docker-compose ejecutando el siguiente comando en la consola / terminal
# 1. Obtén pip3 (paquete instalador de Python)
$ sudo yum install python3-pip
 
# 2. Luego ejecuta cualquiera de los siguientes
$ sudo pip3 install docker-compose # con acceso root
 
# O
 
$ pip3 install --user docker-compose # sin acceso root por razones de seguridad

# Verifica los permisos
$ sudo chmod -v +x /usr/local/bin/docker-compose
  1. Habilita el servicio de Docker para que se inicie automáticamente al arrancar ejecutando el siguiente comando en la consola / terminal

$ sudo systemctl enable docker.service

  1. Inicia el servicio de Docker ejecutando el siguiente comando en la consola / terminal

$ sudo systemctl start docker.service

  1. Verifica que el servicio de Docker esté en ejecución ejecutando el siguiente comando en la consola / terminal; la salida se verá similar a esto

Comandos básicos de Docker que es bueno conocer:

# Versión de Docker
$ docker version

# Versión de Docker Compose
$ docker-compose version

# Iniciar servicio de Docker
$ sudo systemctl start docker.service

# Detener servicio de Docker
$ sudo systemctl stop docker.service

# Reiniciar servicio de Docker
$ sudo systemctl restart docker.service

# Estado del servicio de Docker
$ sudo systemctl status docker.service

INSTALAR DISCOURSE

  1. Crea la carpeta de Discourse

$ sudo mkdir /var/discourse

  1. Clona la imagen de Docker de Discourse al directorio recién creado

$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse

  1. Copia el archivo standalone.yml a la carpeta de contenedores

$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml

  1. Edita el nuevo archivo discourse.yml de la siguiente manera (las partes importantes son los puertos expuestos para HTTP y los detalles de correo electrónico para SMTP; modifícalos en el archivo, no los copies y pegues)

Opciones de edición:

1. Puedes usar nano y editar desde la línea de comandos / terminal
2. En AWS, si estás usando MATE con PLUMA, puedes usar PLUMA para editar el archivo
3. Puedes usar WINSCP para conectarte mediante SSH a la máquina y editar el archivo desde la interfaz gráfica de Windows

## Este es la plantilla de contenedor Docker todo en uno, independiente de Discourse
##
## Después de realizar cambios en este archivo, DEBES reconstruir
## /var/discourse/launcher rebuild app
##
## ¡TEN MUCHO CUIDADO AL EDITAR!
## ¡LOS ARCHIVOS YAML SON EXTREMADAMENTE SENSIBLES A ERRORES EN ESPACIOS EN BLANCO O ALINEACIÓN!
## visita http://www.yamllint.com/ para validar este archivo según sea necesario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Descomenta la siguiente línea para habilitar el oyente IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Descomenta estas dos líneas si deseas agregar Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## ¿Qué puertos TCP/IP debe exponer este contenedor?
## Si deseas que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulta https://meta.discourse.org/t/17247 para obtener detalles
expose:
  - "8080:80"   # http (ejecutar en puerto local 8080, puerto de Docker 80)
  #- "443:443" # https (asegúrate de que esto esté comentado)

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Establece db_shared_buffers en un máximo del 25% de la memoria total.
  ## se establecerá automáticamente durante el arranque según la RAM detectada, o puedes sobrescribirlo
  #db_shared_buffers: "256MB"

  ## puede mejorar el rendimiento de ordenamiento, pero aumenta el uso de memoria por conexión
  #db_work_mem: "40MB"

  ## ¿Qué revisión de Git debe usar este contenedor? (predeterminado: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## ¿Cuántas solicitudes web simultáneas se admiten? Depende de la memoria y los núcleos de CPU.
  ## se establecerá automáticamente durante el arranque según los CPUs detectados, o puedes sobrescribirlo
  #UNICORN_WORKERS: 3

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
  ## Requerido. Discourse no funcionará con un número de IP desnudo.
  DISCOURSE_HOSTNAME: 'faq.mobiloan.io'

  ## Descomenta si deseas que el contenedor se inicie con el mismo
  ## nombre de host (opción -h) que se especificó anteriormente (predeterminado "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos separados por comas que serán administradores y desarrolladores
  ## al registrarse inicialmente, ejemplo 'usuario1@ejemplo.com,usuario2@ejemplo.com'
  DISCOURSE_DEVELOPER_EMAILS: 'ingresa el correo electrónico aquí'

  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  # DIRECCIÓN SMTP, nombre de usuario y contraseña son obligatorios
  # ADVERTENCIA: el carácter '#' en la contraseña SMTP puede causar problemas!
  DISCOURSE_SMTP_ADDRESS: INGRESA SMTP AQUÍ
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: INGRESA EL NOMBRE DE USUARIO AQUÍ
  DISCOURSE_SMTP_PASSWORD: INGRESA LA CONTRASEÑA AQUÍ
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, predeterminado true, usamos Amazon SES)

 

  #DISCOURSE_SMTP_DOMAIN: discourse.ejemplo.com    # (requerido por algunos proveedores)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.ejemplo.com    # (dirección desde la cual enviar notificaciones)

  ## Si agregaste la plantilla de Lets Encrypt, descomenta abajo para obtener un certificado SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@ejemplo.com

  ## La dirección CDN http o https para esta instancia de Discourse (configurada para extraer)
  ## consulta https://meta.discourse.org/t/14857 para obtener detalles
  #DISCOURSE_CDN_URL: https://discourse-cdn.ejemplo.com
  
  ## La clave de dirección IP de geolocalización de Maxmind para la búsqueda de direcciones IP
  ## consulta https://meta.discourse.org/t/-/137387/23 para obtener detalles
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## El contenedor Docker es sin estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Los plugins van aquí
## consulta https://meta.discourse.org/t/19157 para obtener detalles
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Cualquier comando personalizado para ejecutar después de la construcción
run:
  - exec: echo "Inicio de comandos personalizados"
  ## Si deseas establecer la dirección de correo electrónico 'De' para tu primer registro, descomenta y cambia:
  ## Después de recibir el primer correo electrónico de registro, vuelve a comentar la línea. Solo necesita ejecutarse una vez.
  #- exec: rails r "SiteSetting.notification_email='info@sinconfigurar.discourse.org'"
  - exec: echo "Fin de comandos personalizados"
  1. Una vez que el archivo esté editado y guardado, reconstruye la aplicación de Discourse usando el siguiente comando en la terminal

$ /var/discourse/launcher rebuild discourse

Nota: si tu archivo YAML tiene otro nombre, reemplaza discourse con el nombre de tu archivo YAML.

Ten en cuenta que la reconstrucción toma tiempo.

  1. Una vez que tu aplicación haya sido reconstruida, debería estar en ejecución en el puerto 8080. Para verificarlo, ejecuta el siguiente comando en la terminal

$ sudo lsof -i -P -n | grep LISTEN

Ejemplo de salida de puertos

Observa que Docker está escuchando en el puerto 8080, y httpd (Apache) está escuchando en el puerto 80.

En términos de enrutamiento de tráfico, Apache recibirá la solicitud web y, cuando corresponda, la redirigirá al contenedor de Discourse en el puerto 8080.

Para asegurar que el enrutamiento funcione, debes configurar el host virtual en el archivo de configuración de Apache.

CONFIGURACIÓN DE HOST VIRTUAL DE APACHE

  1. El archivo de configuración de Apache se encuentra en /etc/httpd/conf.d/00-virtualhosts.conf. httpd / apache / apache2 son diferentes versiones de Apache. Tus archivos podrían estar en ubicaciones diferentes si no estás usando el servicio httpd, pero la configuración del host virtual en este caso será la misma.

Opciones de edición:

1. Puedes usar nano y editar desde la línea de comandos / terminal
2. En AWS, si estás usando MATE con PLUMA, puedes usar PLUMA para editar el archivo
3. Puedes usar WINSCP para conectarte mediante SSH a la máquina y editar el archivo desde la interfaz gráfica de Windows

Edita el archivo /etc/httpd/conf.d/00-virtualhosts.conf agregando lo siguiente:

# FAQ (RUTAS DE DISCOURSE)

<VirtualHost *:80>
  	ServerName  sub.dominio.com
  	ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8080/"
    ProxyPassReverse "/" "http://localhost:8080/"
</VirtualHost>
  1. Debes crear el registro DNS CNAME correspondiente haciendo que el subdominio apunte a tu servidor AWS / balanceador de carga.

Nuestra configuración es un poco complicada ya que tenemos nuestro proveedor de dominio que redirige todo el tráfico a un balanceador de carga de AWS.

El balanceador de carga maneja nuestro SSL/TLS mediante un certificado proporcionado por AWS.

El balanceador de carga también redirige el tráfico a la instancia de AWS.

Apache está instalado en la instancia de AWS y redirige el tráfico a nuestras:

  • Aplicaciones Node Express
  • Aplicación Docker / Discourse.

CONCLUSIÓN

Esta es solo una solución, pero es la que funcionó con nuestra configuración existente.

Un gran agradecimiento a:

@Kane York por su artículo sobre Discourse,
@Axel Fernandes por su artículo en Medium, sus notas sobre la descarga de los archivos necesarios de Discourse y
@Vivek Gite de nixCraft y su artículo en Cyberciti sobre la instalación de Docker en AWS Linux 2.