pedroreinarojas.com
flag-en-language
flag-es-language

Integrar Contenedores de Docker en VestaCp o HestiaCP

cms-image-cover

Como integrar contenedores de Docker en VestaCp en menos de 20 minutos y no morir en el intento, con esta sencilla guía. 😀

VestaCp o su nuevo fork HestiaCP tiene como base la exposición pública de cada dominio/site, usando los mismos mecanismos para cada uno de ellos.
Excepto aquellos que usan plantillas distintas del default, y de esto voy a hablar para poder «puentear» el listening con un site que funciona dentro de un Docker.

El mecanismo por defecto es, recibir las visitas desde nginx (si está instalado y activado en el site), y redirigirlo a apache. Y este es quien se encarga de procesar los datos con php o el lenguaje que sea.

La forma rápida, o a bocajarro, es, configurar desde consola el virtual-server de apache, para que haga de proxy reverso (previo paso a activar el proxy en apache), y este dirija el tráfico al puerto público del sitio dockerizado.

Si bien esto puede ser entretenido, ni es la mejor forma de hacerlo en VestaCp, ni tampoco será permanente.
¿Porque?
Pues porque al reiniciar VestaCp perderemos esta configuración personalizada. (Porque VestaCp reescribe los ficheros de configuración)

Solución, integrar Docker en VestaCp, usando las plantillas nginx para que él mismo fabrique las configuraciones acorde a la necesidad de cada site.

Si no sabes lo que es docker pasate por aquí: docker y docker-compose

La documentación oficial de VestaCp está en https://vestacp.com/docs/https://docs.hestiacp.com/, pero no te explican como crear una plantilla, sólamente lo mencionan.

Crear la plantilla de nginx para usar un contenedor de docker como receptor del tráfico web

Muy sencillo.
En /usr/local/vesta/data/templates/web/nginx
(en mi caso como hestiaCp en la ruta no pone vesta, pero es casi lo mismo)

Observa el aspecto de los ficheros.
Por cada plantilla hay 2 ficheros, un fichero con extensión «tpl», y otro fichero con extensión «stpl»
Estos se refieren a la plantilla de conexión http y https.

Plantilla nginx para un contendor de docker
Plantilla nginx para un contendor de docker

Vayamos al contenido de cada uno de ellos.

Fichero tpl:

server {
    listen      %ip%:%proxy_port%;
    server_name %domain_idn% %alias_idn%;
        
    include %home%/%user%/conf/web/%domain%/nginx.forcessl.conf*;

    location / {
        proxy_pass      http://%ip%:[DOCKER-PORT];
        location ~* ^.+\.(%proxy_extentions%)$ {
            root           %docroot%/[FOLDER-SITE];
            access_log     /var/log/%web_system%/domains/%domain%.log combined;
            access_log     /var/log/%web_system%/domains/%domain%.bytes bytes;
            expires        max;
            try_files      $uri @fallback;
        }
    }

    location /error/ {
        alias   %home%/%user%/web/%domain%/document_errors/;
    }

    location @fallback {
        proxy_pass      http://%ip%:[DOCKER-PORT];
    }

    location ~ /\.ht    {return 404;}
    location ~ /\.svn/  {return 404;}
    location ~ /\.git/  {return 404;}
    location ~ /\.hg/   {return 404;}
    location ~ /\.bzr/  {return 404;}

    include %home%/%user%/conf/web/%domain%/nginx.conf_*;
}

Fichero stpl:

server {
    listen      %ip%:%proxy_ssl_port% ssl http2;
    server_name %domain_idn% %alias_idn%;
    ssl_certificate      %ssl_pem%;
    ssl_certificate_key  %ssl_key%;
    ssl_stapling on;
    ssl_stapling_verify on;
    error_log  /var/log/%web_system%/domains/%domain%.error.log error;

    include %home%/%user%/conf/web/%domain%/nginx.hsts.conf*;

    location / {
        proxy_pass      http://%ip%:[DOCKER-PORT];
        location ~* ^.+\.(%proxy_extentions%)$ {
            root           %sdocroot%/[FOLDER-SITE];
            access_log     /var/log/%web_system%/domains/%domain%.log combined;
            access_log     /var/log/%web_system%/domains/%domain%.bytes bytes;
            expires        max;
            try_files      $uri @fallback;
        }
    }

    location /error/ {
        alias   %home%/%user%/web/%domain%/document_errors/;
    }

    location @fallback {
        proxy_pass      http://%ip%:[DOCKER-PORT];
    }

    location ~ /\.ht    {return 404;}
    location ~ /\.svn/  {return 404;}
    location ~ /\.git/  {return 404;}
    location ~ /\.hg/   {return 404;}
    location ~ /\.bzr/  {return 404;}

    include %home%/%user%/conf/web/%domain%/nginx.ssl.conf_*;
}

En ambos ficheros hemos de cambiar:
[DOCKER-PORT]: El puerto de nuestro docker esperando el tráfico
[FOLDER-SITE]: La carpeta web que ha creado VestaCp o HestiaCp

Después de esto reiniciamos el servicio de vestacp y nginx.
Y al volver al panel de control de VestaCP o HestiaCP, al editar el sitio, en Nginx Template deberemos de ver en la lista nuestra nueva plantilla.

Seleccionar la plantilla de contenedor de docker en Vestacp o Hestiacp

Y como una imagen vale más que mil palabras, termino adjuntando la imagen donde seleccionamos la plantilla creada.
Donde pone "Proxy Template".

Selección de plantilla de contenedor de docker en vestacp/hestiacp
Selección de plantilla de contenedor de docker en vestacp/hestiacp

Cuando seleccionamos la plantilla, no necesitamos reiniciar ningún servicio, porque vestacp ya lo hace él solito de forma automática.

Una vez hecho esto, el tráfico del dominio debería ser recibido por docker.
De no ser así tendremos que revisar bien la instancia y puerto de docker, así como sus logs para cotejar el problema.

12 de abril de 2020