Múltiples aplicaciones en contenedores docker con proxy reverso Nginx y SSL.
Tags: nginx, docker, moodle, wordpress
Published: 2019-12-18 00:58:27

{%- # TOC start -%}
- [Introducción ](#introducción)
- [Ingredientes ](#ingredientes)
- [Explicación](#explicación)
- [Proxy](#proxy)
- [Arrancamos los servicios. ](#arrancamos-los-servicios)
{%- # TOC end -%}

## Introducción 

Primero un poco del porqué armar un esquema como el siguiente: 

- Tengo varias aplicaciones que prefiero mantener aisladas: moodle, wordpress y una web app.
- Tengo un server con suficiente RAM y Linux (ubuntu-server instalado)
- Tengo conocimientos de docker.
- Desarrollo las aplicaciones en local en docker. 
- Tengo pensado migrar una de las aplicaciones a su propio server más adelante.
- Tengo una única IP pública donde puedo apuntar todos los dominios y subdominios que necesite.

El esquema que persigo es el siguiente: 
  ![esquema de un webproxy y varias aplicaciones en docker](https://thepracticaldev.s3.amazonaws.com/i/nu2nr1qnumldqonvfu52.png)

## Ingredientes 

Algunos ingredientes de esta receta: 
- conocimientos básicos de docker y docker-compose.
- un contenedor que permita gestionar los certificados SSL y funcione como proxy reverso.
- un contenedor moodle.
- un contenedor wordpress
- un contenedor php 7.2 para la aplicación web. 
- un contenedor mysql 
- un contenedor postgresql. 

## Explicación
Cada contenedor puede ser definido en su archivo docker-compose o todos juntos en el mismo.
Pensando en que voy a migrar alguna de las aplicaciones fuera del host voy a crear tres archivos docker-composer.yml. 

## Proxy
Primero configurar el NGINX-PROXY-SERVER con el contenedor creado por [Evert Ramos](https://github.com/evertramos) que encontramos en [Github](https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion). 

Creamos un directorio para clonar dentro el repositorio. 
1- Luego de clonarlo solo tenemos que editar el archivo de configuración copiando el [ejemplo](https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion/blob/master/.env.sample)  que trae el repositorio. Lo importante ahí es la IP pública del server y el nombre de la red interna docker que llamaremos "webproxy". Usando esta red los distintos contenedores se conectarán mediante la red interna y le solicitarán a uno de los servicios que se instalan la creación de certificados. Otro de los servicios instalados permiten la publicación externa usando el módulo proxy-reverso de nginx.
2- creamos otro directorio e instalamos el contenedor para wordpress. Para esta sección usé el repositorio del [nezar](https://github.com/nezhar/wordpress-docker-compose)
La instalación es muy simple y lo único que hay que agregar el es código siguiente al final del archivo docker-compose.yml para indicar que use la red creada anteriormente.

{% gist https://gist.github.com/horaciod/ca7b9425f2bc8e47cbe29ab40b7c1c88 %} 

>Importante: la sección de base de datos y otros datos no los he colocado aquí, el repositorio tiene toda la información necesaria.


## Arrancamos los servicios. 
Primero tenemos que arrancar el webproxy con docker-compose up -d 

Una vez iniciado este contenedor y los servicios que corre quedan a la espera de otros contenedores en la misma red que expongan las variables de entorno: LETSENCRYPT_EMAIL ,LETSENCRYPT_HOST y VIRTUAL_HOST. 
Toma estas variables y realiza una petición a [letsencryt](https://letsencrypt.org/es/) para obtener los certificados. 
Si. Parece magia pero con solo estos pasos el contenedor con el wordpress queda publicado con un certificado SSL que se autorenueva.

Cualquier otro contenedor que lleve las mismas variables y se encuentre en la misma red  queda publicado con las mismas condiciones y el "candado cerrado" indicando que es una web segura. 

> si te quedan dudas sobre los pasos o algo técnico puedo ayudar si me contactas por [twitter](https://twitter.com/horaciodegiorgi)