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.