GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo instalar varios contenedores de discursos en el mismo servidor

Instalar Discourse es realmente fácil cuando es solo una instancia de Discourse en el servidor. Las cosas se complican cuando desea instalar varias instancias de Discourse en el mismo servidor para reducir costos.

La instalación oficial de Discourse no sigue las prácticas habituales de Docker. El instalador de Discourse primero hace algo llamado arranque, que aparecerá como un procedimiento de instalación del host. Una vez que finaliza el proceso de arranque, el iniciador inicia un contenedor llamado "aplicación" en función de los comentarios que recibió de usted durante la primera instalación.

Este procedimiento de instalación híbrida es diferente cuando se trata de configurarlo con otros servicios web y aplicaciones como WordPress.

En este tutorial, le mostraré cómo instalar múltiples Discourse junto con otras aplicaciones basadas en Docker en un solo servidor Linux. No es nada difícil si está familiarizado con los conceptos básicos de Docker y la línea de comandos de Linux.

Instalación de varios foros de Discourse en el mismo servidor

En general, una configuración de múltiples discursos se entiende como una configuración de múltiples sitios y el proceso se ha ilustrado aquí.

Oficialmente, Discourse no proporciona documentación para la instalación de múltiples Discourse en un solo servidor. Pero no te preocupes. Le mostraré el proceso de instalación para 3-5 contenedores individuales independientes que se ejecutan bajo Nginx con cada contenedor independiente correspondiente a su propio dominio respectivo.

Estoy usando Ubuntu 18.04 en este tutorial. Asegúrese de tener Docker instalado en Ubuntu o en la distribución de Linux que esté utilizando.

Sugiero usar un proveedor de servidores en la nube como Linode para implementar rápidamente un servidor Linux en la nube.

He usado domain.com como nombre de dominio de ejemplo en el tutorial. Asegúrese de cambiarlo según sus propios dominios o subdominios.

1. Cambia los registros DNS de tu dominio

En el panel de registro DNS de su proveedor de nombre de dominio, asegúrese de que tanto el dominio como los subdominios (incluido www) apunten a la dirección IP de su servidor.

Por ejemplo, para el dominio raíz, mantenga el campo del nombre de host en blanco (o @) y para los subdominios, use un comodín '*' al configurar la IP del servidor.

2. Intercambiar espacio

Para asegurarse de que todas sus aplicaciones de contenedor estén cómodas y nunca se queden sin memoria después de implementarlas, es esencial que tenga el espacio de intercambio necesario en su sistema.

Siempre puede ajustar el intercambio de acuerdo con la RAM disponible en su sistema. Puede decidir el espacio de intercambio en función del paquete de contenedores de aplicaciones en el servidor único y estimar su uso de RAM acumulativo. Discourse también verifica y configura el intercambio por usted.

3. Crear una red Docker

Esta red docker permitirá que los contenedores se comuniquen entre sí según sea necesario. Llamémoslo cadena para facilitar la comprensión.

Usarás esta red cuando configures todos tus contenedores.

docker network create chain

4. Configurar el proxy inverso de Nginx

Ahora proceda con la configuración de Nginx Reverse Proxy. Tenga en cuenta que esto actúa como una interfaz que mapeará todos los diferentes puertos de contenedores en sí mismo para que pueda acceder a ellos a través de URL. También puede referirse a él como el "contenedor madre".

docker run --name nginx-proxy --net chain -p 80:80 -p 443:443 -v ~/certs:/etc/nginx/certs -v /etc/nginx/vhost.d -v /usr/share/nginx/html -v /var/run/docker.sock:/tmp/docker.sock:ro --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy -d --restart always jwilder/nginx-proxy

5. Configurar Let's Encrypt Nginx Proxy Companion

Tenga en cuenta que le decimos a Docker que use volúmenes que ya están declarados en el primer contenedor nginx-proxy. Está utilizando la misma red de "cadena" que creó en el paso 3.

docker run --name letsencrypt-nginx-proxy-companion --net chain -v ~/certs:/etc/nginx/certs:rw -v /var/run/docker.sock:/var/run/docker.sock:ro --volumes-from nginx-proxy -d --restart always jrcs/letsencrypt-nginx-proxy-companion

Este contenedor complementario para nginx-proxy se encarga de configurar los certificados SSL con Let's Encrypt. Verá eso mientras finalmente configura sus contenedores Discourse.

6. Redirección WWW a través de Nginx (no se requiere CNAME, paso opcional para usar subdominios)

Para garantizar la redirección de las solicitudes de dominio.com a www.dominio.com como cualquier otro sitio, debe realizar un paso adicional.

Ingrese el contenedor nginx-proxy:

docker exec -ti nginx-proxy /bin/bash

Ahora verá un indicador de raíz como este:

[email protected]:/app#

¿Recuerda la ubicación /etc/nginx/vhost.d que mencioné en el paso 4? Cree un nuevo archivo aquí que será el mismo que su nombre de dominio raíz. No tienes vim o nano aquí. En lugar de instalar Vim o Nano, use el cat comando.

cat >> /etc/nginx/vhost.d/domain.com

En el siguiente mensaje, todo lo que escriba estará editando el archivo. Así que asegúrese de reemplazar www.dominio.com con su propio dominio en la siguiente línea:

rewrite ^/(.*)$ https://www.domain.com/$1 permanent;

Presiona enter y luego Ctrl+D para guardarlo. Ingrese exit para salir del contenedor.

[email protected]:/app# exit

Detengamos todos los contenedores anteriores (en el orden dado) que ha creado hasta ahora. No usará el reinicio, simplemente inícielos nuevamente ya que no desea que otros contenedores escuchen al reiniciar cada uno de ellos.

docker stop nginx-proxy
docker stop letsencrypt-nginx-proxy-companion
docker start nginx-proxy
docker start letsencrypt-nginx-proxy-companion

7. Clona la imagen oficial de Discourse Docker

Según la guía oficial, clone la imagen de la ventana acoplable del discurso oficial en el directorio /var/discourse. Aquí es donde Discourse puede almacenar todos sus volúmenes de Docker que pertenecen a sus respectivos contenedores después de la instalación.

sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse

8. Copie la configuración independiente

Ahora, el siguiente paso es asegurarse de copiar el archivo /var/discourse/standalone.yml a /var/discourse/containers/ como app.yml antes de editarlo según sus requisitos.

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

Un standalone.yml típico se ve así.

9. Preparar la configuración independiente

Ahora necesita editar este archivo porque su configuración se basará en nginx.

Los puertos 80 y 443 ya están en uso por la misma. También tiene nuestro contenedor letsencrypt y debe mostrarle a Discourse su red Docker existente en la que desea colocarlo.

Mientras configura su dominio aquí, también necesitará un servidor de correo para configurar los correos electrónicos de notificación de su foro (he usado Sendgrid aquí).

Tenga en cuenta que LETSENCRYPT_EMAIL (para notificar actualizaciones de SSL) y DISCOURSE_DEVELOPER_EMAILS (para administrador) pueden ser diferentes si es necesario.

nano /var/discourse/containers/app.yml

10. Personalice la configuración independiente

El siguiente es mi archivo editado renombrado como app.yml con fines de demostración. Se recomienda editar su propio archivo yml para evitar problemas de alineación.

this is the all-in-one, standalone Discourse Docker container template
 #
 After making changes to this file, you MUST rebuild
 /var/discourse/launcher rebuild app
 #
 BE VERY CAREFUL WHEN EDITING!
 YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
 visit http://www.yamllint.com/ to validate this file as needed
 templates:
 "templates/postgres.template.yml"
 "templates/redis.template.yml"
 "templates/web.template.yml"
 "templates/web.ratelimited.template.yml" 
 Uncomment these two lines if you wish to add Lets Encrypt (https)
 #- "templates/web.ssl.template.yml"
 #- "templates/web.letsencrypt.ssl.template.yml"
 which TCP/IP ports should this container expose?
 If you want Discourse to share a port with another webserver like Apache or nginx,
 see https://meta.discourse.org/t/17247 for details
 expose:
   - "80" 
 #- "80:80"   # http
 #- "443:443" # https
 docker_args:
   - "--net chain" 
 params:
   db_default_text_search_config: "pg_catalog.english"
 ## Set db_shared_buffers to a max of 25% of the total memory.
   ## will be set automatically by bootstrap based on detected RAM, or you can override
   #db_shared_buffers: "256MB"
 ## can improve sorting performance, but adds memory usage per-connection
   #db_work_mem: "40MB"
 ## Which Git revision should this container use? (default: tests-passed)
   #version: tests-passed
 env:
   LANG: en_US.UTF-8
   # DISCOURSE_DEFAULT_LOCALE: en
 ## How many concurrent web requests are supported? Depends on memory and CPU cores.
   ## will be set automatically by bootstrap based on detected CPUs, or you can override
   #db_shared_buffers: "256MB"
 ## can improve sorting performance, but adds memory usage per-connection
   #db_work_mem: "40MB"
 ## Which Git revision should this container use? (default: tests-passed)
   #version: tests-passed
 env:
   LANG: en_US.UTF-8
   # DISCOURSE_DEFAULT_LOCALE: en
 ## How many concurrent web requests are supported? Depends on memory and CPU cores.
   ## will be set automatically by bootstrap based on detected CPUs, or you can override
   #UNICORN_WORKERS: 3
 ## TODO: The domain name this Discourse instance will respond to
   ## Required. Discourse will not work with a bare IP number.
   DISCOURSE_HOSTNAME: 'domain.com'
   VIRTUAL_HOST: 'domain.com,www.domain.com'
   LETSENCRYPT_HOST: 'domain.com,www.domain.com'
   LETSENCRYPT_EMAIL: '[email protected]'
 ## Uncomment if you want the container to be started with the same
   ## hostname (-h option) as specified above (default "$hostname-$config")
   #DOCKER_USE_HOSTNAME: true
 ## TODO: List of comma delimited emails that will be made admin and developer
   ## on initial signup example '[email protected],[email protected]'
   DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
 ## TODO: The SMTP mail server used to validate new accounts and send notifications
   # SMTP ADDRESS, username, and password are required
   # WARNING the char '#' in SMTP password can cause problems!
   DISCOURSE_SMTP_ADDRESS: smtp.sendgrid.net
   DISCOURSE_SMTP_PORT: 587
   DISCOURSE_SMTP_USER_NAME: apikey
   DISCOURSE_SMTP_PASSWORD: yourpassword
   DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
 ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
   #LETSENCRYPT_ACCOUNT_EMAIL: [email protected]
 ## The http or https CDN address for this Discourse instance (configured to pull)
   ## see https://meta.discourse.org/t/14857 for details
   #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
 The Docker container is stateless; all data is stored in /shared
 volumes:
 volume:
   host: /var/discourse/shared/standalone
   guest: /shared
 volume:
   host: /var/discourse/shared/standalone/log/var-log
   guest: /var/log 
 Plugins go here
 see https://meta.discourse.org/t/19157 for details
 hooks:
   after_code:
     - exec:
         cd: $home/plugins
         cmd:
           - git clone https://github.com/discourse/docker_manager.git
 Any custom commands to run after building
 run:
 exec: echo "Beginning of custom commands"
 ## If you want to set the 'From' email address for your first registration, uncomment and change:
 ## After getting the first signup email, re-comment the line. It only needs to run once.
 #- exec: rails r "SiteSetting.notification_email='[email protected]'"
 exec: echo "End of custom commands" 

Comprueba dos veces los siguientes detalles:

La configuración del puerto debe ser:

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

Nombre de red existente correctamente configurado en el archivo como se muestra arriba.

docker_args:
  - "--net chain"

De lo contrario, verá una página en blanco cuando verifique su dominio después de la instalación.

12. Bootstrap y lanzamiento

Después de guardar el archivo anterior, ejecute los siguientes comandos:

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

Tenga en cuenta que si hubiera nombrado el archivo como xyz.yml, el comando se habría cambiado en consecuencia (./launcher start xyz).

Es el nombre del contenedor en ejecución que puede verificar con "docker ps “. Ahora, cuando visite el dominio en su navegador, verá la siguiente página:

13. Configuración SSL

A partir de este momento, el proceso de registro es bastante sencillo. Una vez que haya completado el registro, en el tablero de administración de Docker, vaya a configuración>seguridad y habilite "forzar https".

Después de guardarlo, detenga el contenedor y vuelva a iniciarlo:

./launcher stop app
./launcher start app

Después de unos momentos, SSL comenzará a funcionar en su foro. Asegúrate de cuidar también las dependencias de https.

14. Instale más instancias de Discourse en más contenedores independientes

Para obtener más contenedores de Discourse, debe repetir el mismo proceso nuevamente desde el paso 8 .

Inicialmente, usaste app. Ahora deberías usar otros nombres como app2, app3, etc.

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

También sería necesario un paso adicional para que cada uno de ellos especifique una nueva ubicación (por ejemplo, standalone2, standalone3, etc.) en sus respectivos archivos yml para los volúmenes de Docker (consulte el paso 10). Por supuesto, también tendrá que cambiar el nombre de dominio.

## The Docker container is stateless; all data is stored in /shared
 volumes:
 volume:
   host: /var/discourse/shared/standalone2
   guest: /shared
 volume:
   host: /var/discourse/shared/standalone2/log/var-log
   guest: /var/log

Con esto, sigue el resto de los pasos y tendrás más Discourse instalado en el mismo servidor.

Espero que este artículo le resulte útil para configurar más de un foro de Discourse con sus respectivos contenedores Docker.

Si tiene preguntas o sugerencias, no dude en dejar un comentario a continuación.


Linux
  1. Aloja varios sitios web en contenedores Docker

  2. Cómo instalar Discourse en Ubuntu 20.04 LTS

  3. ¿Cómo Instalar R 3.3.1 En El Directorio Propio?

  4. Cómo instalar Docker y ejecutar contenedores Docker en Ubuntu

  5. Cómo instalar Discourse en Ubuntu 20.04

Cómo instalar Docker Portainer para administrar contenedores

Cómo alojar múltiples sitios de WordPress en el mismo servidor con Docker

Cómo instalar OpenLDAP en Ubuntu Server 22.04

Cómo instalar Lighttpd en el servidor Ubuntu

¿Cómo instalar un servidor FTP en Ubuntu?

Cómo instalar Docker en Ubuntu 18.04