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
-
Abre CMD / Terminal
-
Conéctate mediante SSH a la instancia de AWS EC2
Ejemplo de pantalla una vez conectado a la instancia EC2
REALIZAR ACTUALIZACIONES DEL SISTEMA
- Realiza las actualizaciones del sistema ejecutando el siguiente comando en la consola / terminal
$ sudo yum update
INSTALAR DOCKER
- Busca el paquete de Docker de AWS ejecutando el siguiente comando en la consola / terminal
$ sudo yum search docker
- Obtén información de la versión ejecutando el siguiente comando en la consola / terminal
$ sudo yum info docker
- Instala Docker ejecutando el siguiente comando en la consola / terminal
$ sudo yum install docker
- 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
- 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
- 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
- Inicia el servicio de Docker ejecutando el siguiente comando en la consola / terminal
$ sudo systemctl start docker.service
- 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
- Crea la carpeta de Discourse
$ sudo mkdir /var/discourse
- Clona la imagen de Docker de Discourse al directorio recién creado
$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse
- Copia el archivo standalone.yml a la carpeta de contenedores
$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml
- 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"
- 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.
- 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
- 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>
- 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.


