Instala Discourse en CloudPanel

:warning: Este método de instalación no está oficialmente respaldado. Úselo bajo su propio riesgo.

El equipo de Discourse solo recomienda la instalación utilizando la guía de instalación oficial

:information_source: Esta es una instalación no compatible, adecuada para aquellos que tienen experiencia con CloudPanel, son administradores de sistemas experimentados y se sienten cómodos con Docker, proxies inversos, y han completado con éxito una instalación estándar.

¿Por qué CloudPanel?

¿Por qué podría querer instalar un foro de Discourse en un VPS o servidor dedicado que ejecute CloudPanel?

Estas son mis razones:

Prefiero utilizar una interfaz gráfica para la administración del servidor y del sitio. He utilizado la mayoría de los paneles de control de alojamiento web en algún momento.

En comparación con el resto, CloudPanel es muy delgado y minimalista y sin desorden. Tiene todas las funciones que necesito, presentadas de manera muy simple e intuitiva. Y eso es todo. No tiene nada que no necesite.

Desarrollo, alojo y gestiono muchos blogs de Ghost, sitios de Wordpress, sitios de Drupal y otros tipos de sitios, además de foros de Discourse. Realmente solo necesito un servidor donde pueda alojar mis foros de Discourse junto con mis blogs de Ghost y mis sitios de Wordpress y Drupal. (No quiero pagar y mantener un servidor separado para cada instancia de Discourse.)

CloudPanel incluye (directamente desde el inicio) Nginx integrado y una interfaz sencilla para configurar y gestionar Proxies Inversos, que son necesarios para ejecutar una o más instancias de Discourse en el mismo servidor o junto con otros tipos de sitios web.

El equipo de Discourse (y el personal del foro Meta aquí) no proporciona soporte para entornos de servidor alternativos como Cpanel, Plesk o (como en este caso) CloudPanel, u otros que surjan desde la línea de comandos.

Así que pensé en compartir mi configuración y mi proceso por si hay otros que puedan encontrarlo útil.

[Si alguien prueba este método, por favor hágame saber si y cómo le funciona, o si puedo mejorar este tutorial! :heart_eyes:]

Instalar Docker

En Putty (u otra terminal), desde el directorio raíz, ejecute:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io

Crear un sitio de Proxy Inverso en CloudPanel

→ Hacemos clic en el botón + Add Site

Para mi instancia de Discourse estoy usando mi nombre de dominio noobish.me, así que a partir de ahora, donde vea eso en el resto de estas instrucciones, reemplace noobish.me con su nombre de dominio real (por ejemplo, yoursite.com)

→ Creamos un nuevo “sitio de Proxy Inverso” en CloudPanel para el dominio donde queremos alojar nuestro foro de Discourse (por supuesto, el registro A del DNS del dominio debe apuntar a la misma dirección IP que nuestro CloudPanel).

Preparar el dominio y configurar SSL

Para mi sitio estoy usando los servidores de nombres de Cloudflare para apuntar el dominio. En Cloudflare configuré el SSL como Full o Full (estricto).

También creo una regla de página de Cloudflare. Visite este post para saber por qué.

También estoy usando un certificado de origen SSL gratuito de Cloudflare para mi dominio, que “importo” en CloudPanel dentro de la configuración del sitio “SSL/TLS” para ese sitio (simplemente pegando tanto el Certificado como la Clave Privada que había descargado para ese nombre de dominio desde mi cuenta de Cloudflare).

Instalar Discourse

De vuelta en Putty (u otra terminal), desde el directorio raíz (c d Enter para volver a la raíz) → Instale la instalación estándar de Discourse usando estos comandos…

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

Enter

cd /var/discourse

Enter

chmod 700 containers

Copiar la configuración independiente

Ahora copiamos el archivo /var/discourse/standalone.yml a /var/discourse/containers/ como app.yml antes de editarlo según la configuración de nuestro sitio.

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

Editar el archivo app.yml

Además de modificar el archivo app.yml según la configuración específica de nuestro sitio, necesitamos cambiar 3 cosas más en ese archivo antes de guardarlo…

Bajo la sección templates: necesitamos agregar:

  - "templates/web.socketed.template.yml"

Como estoy usando Cloudflare, bajo la sección templates: también agrego:

  - "templates/cloudflare.template.yml"

Bajo la sección expose: necesitamos comentar:

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

Bajo la sección env: necesitamos agregar:

   DISCOURSE_FORCE_HTTPS: true
Para referencia, puede hacer clic aquí para ver el contenido de mi app.yml en funcionamiento en noobish.me donde estoy usando tanto Cloudflare como Mailgun...
## este es la plantilla de contenedor Docker Discourse todo en uno, independiente
##
## Después de realizar cambios en este archivo, DEBE reconstruir
## /var/discourse/launcher rebuild app
##
## TENGA *MUCHO* CUIDADO AL EDITAR!
## LOS ARCHIVOS YAML SON SUPER SUPER SENSIBLES A ERRORES EN ESPACIOS EN BLANCO O ALINEACIÓN!
## visite 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"
  - "templates/cloudflare.template.yml"

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Establezca db_shared_buffers en un máximo del 25% de la memoria total.
  ## se establecerá automáticamente por bootstrap según la RAM detectada, o puede anularlo
  db_shared_buffers: "4096MB"

  ## puede mejorar el rendimiento de clasificación, pero agrega 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

  DISCOURSE_FORCE_HTTPS: true

  ## ¿Cuántas solicitudes web simultáneas se admiten? Depende de la memoria y los núcleos de CPU.
  ## se establecerá automáticamente por bootstrap según los CPUs detectados, o puede anularlo
  UNICORN_WORKERS: 8

  ## 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: 'noobish.me'

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

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

  ## 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: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@noobish.me
  DISCOURSE_SMTP_PASSWORD:  pYdRLyQW
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, por defecto true)
  #DISCOURSE_SMTP_DOMAIN: noobish.me    # (requerido por algunos proveedores)
  DISCOURSE_NOTIFICATION_EMAIL: noreply@noobish.me    # (dirección desde la cual enviar notificaciones)

  ## La dirección CDN http o https para esta instancia de Discourse (configurada para extraer)
  ## consulte 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
  ## consulte https://meta.discourse.org/t/-/137387/23 para detalles
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## El contenedor 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í
## consulte 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 construcción
run:
  - exec: echo "Comienzo de comandos personalizados"
  ## Si desea establecer la dirección de correo electrónico 'De' para su primer registro, descomente y cambie:
  ## Después de obtener el primer correo electrónico de registro, vuelva 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"

Luego guardamos y salimos del archivo app.yml…

CTRL-X

y

Enter

A continuación, establecemos los permisos para el archivo app.yml…

chmod o-rwx containers/app.yml

luego…

Arrancar la aplicación

cd /var/discourse
./launcher bootstrap app

Esto tomará una cantidad considerable de tiempo. Al final del proceso de arranque, se le pedirá que:

./launcher start app

Editar el archivo Vhost

Ahora volvemos a CloudPanel y pegamos el siguiente código en el “Editor Vhost” para nuestro sitio de Discourse (sobrescribiendo lo que ya está allí). Por supuesto, reemplace yoursite.com con su nombre de dominio real.

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  {{ssl_certificate_key}}
  {{ssl_certificate}}
  server_name yoursite.com;
  {{root}}

  {{nginx_access_log}}
  {{nginx_error_log}}

  if ($scheme != "https") {
    rewrite ^ https://$host$uri permanent;
  }

  location ~ /.well-known {
    auth_basic off;
    allow all;
  }

  {{settings}}

  add_header Cache-Control no-transform;

  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 $scheme;
                proxy_set_header X-Real-IP $remote_addr;

  }
}

Reiniciar Nginx

A continuación, necesitamos reiniciar Nginx, lo cual podemos hacer haciendo clic en un botón en el Área de Administración de CloudPanel…

¡Felicidades!

Ahora, en nuestro navegador, podemos ir a la URL de nuestro sitio y ejecutar el Asistente de Configuración de Discourse…

Coexistir pacíficamente

Ahora puedo autoalojar y gestionar mi sitio de Discourse junto con mis sitios de Ghost, Wordpress, Drupal y otros tipos de sitios utilizando un panel de gestión limpio y ligero, con una necesidad mínima de usar la terminal/línea de comandos en el futuro.


Para instalar instancias adicionales de Discourse…

3 Me gusta

Deberías eliminar estos pasos y crear app.yml sin generar este error. Es confuso.

(Si vas a reemplazar todo el archivo, ¿por qué copiar el ejemplo?) Lo mejor sería decir qué se necesita cambiar del ejemplo existente. Parece que es la plantilla del socket y forzar https.

Esto te da dos copias de postgres, lo que usa más RAM que un solo postgres. Funciona, pero no es una buena práctica.

Hay una serie de cosas que hacen que este no sea un buen ejemplo a seguir y será muy difícil de mantener. Me alegra que hayas encontrado una solución para ti, pero no creo que este sea un buen camino para enviar a la gente.

3 Me gusta

Gracias @pfaffman

Tienes razón. Hace el trabajo, pero el procedimiento es demasiado engorroso. Está en el orden equivocado. Agradezco tus sugerencias y las arreglaré.

¿Podrías aclarar por qué piensas eso?

Porque es complicado y solo es una buena idea para las personas que pueden resolverlo por sí mismas. Es bastante ineficiente y, si el objetivo es solo ejecutar dos discursos, dos máquinas virtuales separadas son una solución más barata y fácil en la mayoría de los casos.

2 Me gusta

Gracias de nuevo @pfaffman. Ahora he simplificado el procedimiento y he eliminado la sección sobre cómo añadir un segundo sitio de Discourse en el mismo servidor.

1 me gusta

Recibí este mensaje

sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
uso: gpg [opciones] --dearmor [archivo]
curl: (23) Error al escribir el cuerpo

¿Por qué?

Hola Antonio. Bienvenido.

Esto parece un problema de Docker y no tiene que ver con Discourse. Probablemente te irá mejor buscando con tu sistema operativo y actualizando docker-ce que preguntando aquí.

¿Estás intentando usar Discourse? ¿O CloudPanel?

1 me gusta

Acabo de seguir la guía aquí. Ejecuté el primer comando, para la instalación de docker, y el servidor respondió esto
el comando es:

1 me gusta

No debería haber barras invertidas al final de cada una de esas líneas. La barra invertida escapa el salto de línea, lo que significa que el shell trata la siguiente línea como una continuación de la misma línea.

En este caso, eso resultará en intentar ejecutar esto como un solo comando, que es de donde proviene el error:
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable\"

Simplemente quitar esas barras invertidas al final de las líneas solucionará eso:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
2 Me gusta

Gracias, ahora funciona bien

2 Me gusta

Gracias @Simon_Manning – He eliminado las barras invertidas en el fragmento de código en el tutorial de la publicación principal.

2 Me gusta

Lo siento, ahora tengo este error: FAILED

Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end' failed with return #<Process::Status: pid 112 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'"
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
214c73c4474ed59e7b6fb7f42143ce126d2b453022b08770da3af31ca2fdaaba

No conozco CloudPanel, pero los mensajes de error parecen ser autoexplicativos:

'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end'
'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'\"

Parece que tu correo electrónico no se configuró durante ./discourse-setup o dentro de app.yml (puedes editarlo manualmente en cualquier momento). :thinking:

2 Me gusta

Disculpen todos, soy profesor en la escuela secundaria Fermi y estoy intentando instalar Discourse Community para nuestra escuela. Dado que usamos paneles en la nube, seguí esta guía pero aparentemente falta algo. ¿Es posible obtener ayuda y una guía más detallada para seguir? Mil gracias.

1 me gusta

Creo que usar una instalación avanzada podría no ser lo que buscas si no tienes muchos conocimientos de administración de sistemas. Otro punto importante a considerar es que dicha instalación caería bajo unsupported-install, lo que hace menos probable que obtengas ayuda aquí si encuentras problemas.

Si tienes el presupuesto y dependiendo del tamaño de tu comunidad, podría ser mejor alojar Discourse en otro servidor y seguir la instalación estándar.

1 me gusta

Disculpe, ¿y para qué serviría un servicio como este? En mi opinión, quizás la guía no es muy detallada, está hecha para administradores de sistemas, bastaría con indicar simplemente los diversos pasos. De donde yo vengo se dice: nadie nace ya educado. Gracias por tu ayuda y tu tiempo.

1 me gusta

Exactamente. Por eso se recomendó la instalación estándar.

Y esto, @denvergeeks, es por lo que no pensé que crear una guía como esta fuera una buena idea en primer lugar. Es difícil de escribir, difícil de mantener, y tú eres la única persona que puede revisarla.

4 Me gusta

Lamento no estar de acuerdo. Ya utilizo Cloud Panel con varios dominios, además, la comunidad de Discourse iría en un subdominio y la premisa del autor es demasiado clara (la guía es para quienes usan Cloud Panel con diferentes servicios instalados en VPS). Solo se necesita un poco de esfuerzo para detallar mejor todo. Después de todo, compartir conocimiento es la base de las comunidades, de lo contrario, habría comprado un software que ya estuviera instalado y listo para usar. De todos modos, no quiero molestar a nadie, si es posible obtener ayuda, gracias, de lo contrario, no los molestaré más.

1 me gusta

@denvergeeks Configurar el correo electrónico es fundamental para el funcionamiento normal y, aunque hay un enlace a la instalación estándar, la forma en que está escrita la guía actualmente elude la configuración del correo electrónico, así como otra información diversa que podría ser importante para ciertas configuraciones.

Me pregunto si valdría la pena reemplazar las secciones Instalar Discourse hasta Arrancar la aplicación con algo más parecido a:

Instalar y configurar Discourse

Sigue la instalación estándar a través de los pasos 1-6

<Realiza las cosas que actualmente están en Editar el archivo app.yml>

Reconstruir Discourse:

./launcher rebuild app

Luego, en la sección ¡Felicitaciones!, agrega una línea después de la captura de pantalla que diga algo como “Continúa con el resto de la documentación de instalación estándar”. Esencialmente, rehacer la guía para proporcionar pasos adicionales que complementen la instalación estándar en lugar de proporcionar instrucciones de instalación alternativas.

Creo que la información que has proporcionado sobre CloudPanel es muy útil y las instrucciones son claras, el lado de Discourse podría beneficiarse de tener menos divergencia de la instalación estándar para hacerlo más seguro, así como la etiqueta unsupported-install para dejar claro (más claro) que aquí hay dragones.

2 Me gusta

[quote=“Antonio Cirillo, post:18, topic:266422, username:Antonio_Cirillo”]
Después de todo, compartir conocimientos es la base de las comunidades, de lo contrario habría comprado un software que ya estuviera instalado y listo para usar. De todos modos, no quiero molestar a nadie, si es posible obtener ayuda, gracias, de lo contrario no los molestaré más.
[/quote]La discusión se desvía un poco del tema original, pero ten la seguridad de que estamos encantados de ayudarte. :slight_smile:

En resumen:

Si tienes conocimientos básicos de informática, puedes seguir la instalación estándar. También necesitarás un nombre de dominio y configurar un servicio de envío de correo electrónico como Mailgun (tutorial aquí: Configure Mailgun for email when using Digital Ocean for DNS).

Ten en cuenta que normalmente no ayudamos en asuntos que están fuera del alcance de este foro. Por ejemplo, la pregunta “¿Cómo registro un nombre de dominio?” no encajaría aquí.

Si no tienes conocimientos básicos de informática y dependiendo de tu presupuesto, puedes solicitar soporte de pago en Marketplace.

Finalmente, también puedes echar un vistazo a los planes de pago gestionados por Discourse, donde prácticamente todo será manejado por nosotros y tendrás acceso a nuestro equipo de soporte.

Además, ten en cuenta que ofrecemos descuentos para fines educativos, ya que mencionas que es para tu escuela:

¿Hay descuentos para instituciones educativas o sin fines de lucro?

¡Sí! Si eres reconocido legalmente como una institución educativa, ofrecemos un descuento del 85%. Si eres reconocido legalmente como una organización sin fines de lucro exenta de impuestos federales, ofrecemos un descuento del 50%. Estos descuentos solo se aplican a nuestros planes básico, pro y business, no se pueden combinar con otros descuentos y deben pagarse con tarjeta de débito/crédito mensualmente o anualmente. Contáctanos después de comenzar tu prueba y agregaremos el descuento a tu cuenta.

4 Me gusta