Quiero ejecutar Discourse junto con Apache

He visto varios tutoriales que explican cómo hacer esto, pero de diferentes maneras, lo cual no me ayuda. ¿Existe alguna forma de crear una configuración de host virtual de Apache para Discourse, de modo que un dominio específico redirija al software, tal como se hace al agregar otros sitios web y sus respectivos dominios?

Gracias.

Sí. Esos tutoriales explican cómo hacerlo.

O, si te refieres a si puedes ejecutar Discourse sin Docker y con Apache como proxy inverso, la respuesta es no.

Por 5 dólares al mes puedes evitar ese dolor de cabeza.

Gracias por la respuesta.

Lo estoy ejecutando en un VPS. Tengo Apache instalado y no tengo mucha experiencia con sitios web. Estoy consultando esto: Run other websites on the same machine as Discourse

Pero con eso parece que tengo que usar Nginx debido a los archivos de configuración, pero mi pregunta es: ¿puedo hacer lo mismo con Apache?

Echa un vistazo a Set up Discourse on a server with existing Apache sites

Sí, yo también estaba mirando eso. Lo cubrió para CentOS y no para Ubuntu, algunas partes no me quedan claras.

Si no estás familiarizado con esto (y no quieres familiarizarte), te recomiendo encarecidamente abandonar Apache y ejecutar solo Discourse en el VPS. Si necesitas ejecutar más cosas, consigue un VPS para lo de Apache y otro para Discourse.

Así que cambié a Nginx y todo está funcionando. Creo que SSL está configurado correctamente, pero en Chrome me muestra el mensaje “Tu conexión a este sitio no es totalmente segura”. La opción Forzar HTTPS está activada.

El SSL está configurado con el servicio nginx dentro del contenedor. Si el contenedor está expuesto a Internet y lo accedes directamente desde el navegador (instalación predeterminada de Discourse), tendrás SSL.

Sin embargo, si colocas un proxy inverso delante de él (ya sea Apache, Nginx o algún servicio de terceros, como Cloudflare), deberás asegurarte de que la conexión entre el navegador y el proxy inverso sea segura.

Por lo tanto, en tu caso, tendrás que generar certificados para el proxy inverso de nginx (no creo que necesites agregar las plantillas SSL de Discourse, ya que el contenedor no está expuesto directamente a Internet; puedes hacerlo, pero no es necesario).

Puedes consultar cómo hacerlo usando Let’s Encrypt (gratuito, el mismo que se usa en la instalación predeterminada de Discourse, pero en este caso para el nginx fuera del contenedor).

TL;DR: El nginx que actúa como proxy inverso necesita SSL. El nginx que está dentro del contenedor no necesita SSL (asumiendo que accedes desde la misma máquina).

Entonces, para tener seguridad entre el navegador y el proxy inverso, ¿necesito configurar SSL en el archivo de configuración de nginx?

Gracias

Esta es mi configuración aquí, ¿qué más necesito agregar?

server {
listen 80; listen [::]:80;
server_name a1rp.xyz; # ← cámbialo

return 301 https://$host$request_uri;

}

server {
listen 443 ssl http2; listen [::]:443 ssl http2;
server_name a1rp.xyz; # ← cámbialo

ssl on;
ssl_certificate      /var/discourse/shared/standalone/ssl/a1rp.xyz.cer;
ssl_certificate_key  /var/discourse/shared/standalone/ssl/a1rp.xyz.key;
ssl_dhparam          /var/discourse/shared/standalone/ssl/dhparams.pem;
ssl_session_tickets off;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;

http2_idle_timeout 5m; # aumentado desde el valor predeterminado de 3m

location / {
    proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock;
    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;
}

}

Asegúrate de:

  1. Comentar todas las plantillas SSL en templates (en app.yml). Si estás usando Let’s Encrypt, tendrás dos:
# - "templates/web.ssl.template.yml"
# - "templates/web.letsencrypt.ssl.template.yml"
  1. Agregar una plantilla de socket:
- "templates/web.socketed.template.yml"
  1. Comentar todos los puertos expuestos:
# - "80:80"   # http
# - "443:443" # https

(o puedes exponer otros puertos como 8080:80 y 8443:443, y en lugar de usar un socket en el siguiente paso, puedes redirigir a un upstream que apunte a localhost:80 y/o localhost:443)

  1. Tienes:
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock;

Creo que necesitas agregar : al final del socket:

proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
  1. Debes tener los archivos del certificado SSL en /var/discourse/shared/standalone/ssl/. ¿Los tienes? Asumo que ya eres propietario del dominio a1rp.xyz y que has leído cómo generar certificados SSL en el sitio de Let’s Encrypt. Ten en cuenta también que Discourse se encarga de renovar los certificados automáticamente en la instalación predeterminada, pero en tu caso deberás hacerlo tú mismo (por ejemplo, con un cronjob), de lo contrario tus certificados expirarán después de 3 meses.

Consulta:

Sí, tengo todo lo que mencionaste para hacer en la configuración de la aplicación (incluida la publicación sobre corregir algunas cosas). En cuanto a los dos puntos (:), no creo que marquen diferencia. Hubo una publicación que decía que tampoco debería haber dos puntos allí. Los archivos SSL también los tengo ya.

Así que solucioné el problema. Alguien mencionó que el favicon aparecía en HTTP, y por eso se producía el error. Subí otra cosa y la eliminé; ahora el sitio funciona completamente con HTTPS :slight_smile: