Automatizar despligue de WordPress con Docker. (parte 3). N WordPress con N dominios en un unico servidor

Introducción

En este tercer y último post se automatiza el despliegue de otro contenedor WordPress y sus certificados con un dominio distinto utilizando Docker y Docker Compose. Se hace solo con 2 WordPress y dos dominios, pero se podría hacer con muchos más, siempre y cuando el servidor tenga capacidad.

  • El primer post consistió en el despliegue de WordPress sin certificado SSL (enlace).
  • El segundo obtendremos el certificado SSL (enlace).
  • El tercero desplegaremos otros WordPress contenerizados que corran en nuestro servidor con otro dominio diferente (el actual).

Explicación

Se debe de tener en cuenta que lo único diferente que se hace aquí es crear un contenedor nuevo de WordPress que se llamará “gyqrebeldewordpress”, con sus correspondientes variables de entorno. Se añade una nueva configuración de nginx para que se redireccionen a nuestro nuevo contenedor todas las peticiones que le lleguen por la url “www.guayaquilrebelde.org”, y por último se crea otro contenedor de certbot llamado “gyqrebeldecertbot” que automatize e instale el certificado SSL, utilizando Let’s Encryp.

Una vez se ha realizado todo esto se crea la base de datos correspondiente, tal como se especifica en la última parte del primer post.

ESTAD MUY ATENTOS A LOS NOMBRES DE LAS BASES DE DATOS, USUARIOS Y CONTRASEÑAS QUE SE CREAN EN NUESTRO ARCHIVO DE VARIABLES DE ENTORNO.

Por último, quería aclarar que estos pasos sirven para añadir un único contenedor, pero se podrían añadir todos los que queramos (la capacidad la marcará los límites de nuestro servidor).

Añadiendo contenedores

Se utiliza el mismo directorio donde ejecutamos el WordPress del post anterior. Se modifican los siguientes archivos:

  • WordPress/docker-compose.yml
version: "2.2"
services:
    myrootdevwordpress:
        container_name: myrootdevwordpress
        image: wordpress:php7.4-apache
        restart: always
        mem_limit: 196m
        stdin_open: true
        tty: true
        env_file: .env
        environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: $WORDPRESS_DB_USER_1
            WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD_1
            WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME_1
        volumes:
            - ./html/myrootdev:/var/www/html
    gyqrebeldewordpress:
        container_name: gyqrebeldewordpress
        image: wordpress:php7.4-apache
        restart: always
        stdin_open: true
        tty: true
        env_file: .env
        environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: $WORDPRESS_DB_USER_2
            WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD_2
            WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME_2
        volumes:
            - ./html/gyqrebelde:/var/www/html
    nginx:
        container_name: nginx
        image: nginx:latest
        restart: unless-stopped
        ports:
            - 80:80
        volumes:
            - ./nginx/conf:/etc/nginx/conf.d
            - ./html:/var/www/html
            - ./certbot/conf:/etc/nginx/ssl

#    myrootdevcertbot:
#        container_name: myrootdevcertbot
#        image: certbot/certbot:latest
#        command: certonly --webroot --webroot-path=/var/www/html --email camilo.cubillos.osses.90@gmail.com --agree-tos --no-eff-email -d myrootdev.com -d www.myrootdev.com
#        volumes:
#            - ./certbot/conf:/etc/letsencrypt
#            - ./certbot/logs:/var/log/letsencrypt
#            - ./html/myrootdev:/var/www/html
    
    gyqrebeldecertbot:
        container_name: gyqrebeldecertbot
        image: certbot/certbot:latest
        command: certonly --webroot --webroot-path=/var/www/html --email camilo.cubillos.osses.90@gmail.com --agree-tos --no-eff-email -d guayaquilrebelde.org -d www.guayaquilrebelde.org
        volumes:
            - ./certbot/conf:/etc/letsencrypt
            - ./certbot/logs:/var/log/letsencrypt
            - ./html/gyqrebelde:/var/www/html

    db:
        image: mysql:8.0
        container_name: mysql8
        restart: always
        ports:
            - '3306:3306'
        env_file: .env
        environment:
            MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
        volumes:
            - ./db_data:/var/lib/mysql
    phpmyadmin:
        depends_on:
            - db
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin
        restart: always
        ports:
            - '7070:80'
        environment:
            PMA_HOST: db

Se añade el contenedor de WordPress de nuestra nueva url y a continuación el contenedor para los certificados SSL del nuevo contenedor. Se modifica el contenedor de nginx para que sólo escuche el puerto 80.

  • WordPress/nginx/conf/default.conf
server {
    listen [::]:80;
    listen 80;

    server_name myrootdev.com www.myrootdev.com;

    return 301 https://myrootdev.com$request_uri;
}

server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name myrootdev.com www.myrootdev.com;

    ssl_certificate /etc/nginx/ssl/live/myrootdev.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/myrootdev.com/privkey.pem;

    root /var/www/html/myrootdev;
    index index.php;

    location ~ /.well-known/acme-challenge {
         allow all;
         root /var/www/html/myrootdev;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/\.user\.ini {
        deny all;
    }

    location ~*  \.(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://myrootdevwordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://myrootdevwordpress:80;
    }

    location ~ \.php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://myrootdevwordpress:80;
    }

    location ~/\. {
       deny all;
       access_log off;
       log_not_found off;
    }
}

server {
    listen [::]:80;
    listen 80;

    server_name guayaquilrebelde.org www.guayaquilrebelde.org;

    root /var/www/html/gyqrebelde;
    index index.php;

    location ~ /.well-known/acme-challenge {
         allow all;
         root /var/www/html/gyqrebelde;
    }

    location / {
        try_files $uri @apache;
    }

    #location ~ ^/\.user\.ini {
    #    deny all;
    #}

    location ~*  \.(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://gyqrebeldewordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://gyqrebeldewordpress:80;
    }

    location ~ \.php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://gyqrebeldewordpress:80;
    }

    #location ~/\. {
    #   deny all;
    #   access_log off;
    #   log_not_found off;
    #}

}

Se añade a la configuración de nginx nuestra nueva url sin añadir por el momento los certificados SSL.

Ahora ejecutamos los contenedores.

docker-compose up -d

Los certificados aparecen en la carpeta de consistencia del contenedor de certbot.

Instalación del certificado

Lo primero que se debe hacer es parar todos los contenedores.

docker-compose stop

Para la instalación de los certificados se deberá modificar un poco el archivo de docker-compose y la configuración de nginx.

  • WordPress/docker-compose.yml
version: "2.2"
services:
    myrootdevwordpress:
        container_name: myrootdevwordpress
        image: wordpress:php7.4-apache
        restart: always
        mem_limit: 196m
        stdin_open: true
        tty: true
        env_file: .env
        environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: $WORDPRESS_DB_USER_1
            WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD_1
            WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME_1
        volumes:
            - ./html/myrootdev:/var/www/html
    gyqrebeldewordpress:
        container_name: gyqrebeldewordpress
        image: wordpress:php7.4-apache
        restart: always
        stdin_open: true
        tty: true
        env_file: .env
        environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: $WORDPRESS_DB_USER_2
            WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD_2
            WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME_2
        volumes:
            - ./html/gyqrebelde:/var/www/html
    nginx:
        container_name: nginx
        image: nginx:latest
        restart: unless-stopped
        ports:
            - 80:80
            - 443:443
        volumes:
            - ./nginx/conf:/etc/nginx/conf.d
            - ./html:/var/www/html
            - ./certbot/conf:/etc/nginx/ssl

#    myrootdevcertbot:
#        container_name: myrootdevcertbot
#        image: certbot/certbot:latest
#        command: certonly --webroot --webroot-path=/var/www/html --email camilo.cubillos.osses.90@gmail.com --agree-tos --no-eff-email -d myrootdev.com -d www.myrootdev.com
#        volumes:
#            - ./certbot/conf:/etc/letsencrypt
#            - ./certbot/logs:/var/log/letsencrypt
#            - ./html/myrootdev:/var/www/html
    
#    gyqrebeldecertbot:
#        container_name: gyqrebeldecertbot
#        image: certbot/certbot:latest
#        command: certonly --webroot --webroot-path=/var/www/html --email camilo.cubillos.osses.90@gmail.com --agree-tos --no-eff-email -d guayaquilrebelde.org -d www.guayaquilrebelde.org
#        volumes:
#            - ./certbot/conf:/etc/letsencrypt
#            - ./certbot/logs:/var/log/letsencrypt
#            - ./html/gyqrebelde:/var/www/html

    db:
        image: mysql:8.0
        container_name: mysql8
        restart: always
        ports:
            - '3306:3306'
        env_file: .env
        environment:
            MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
        volumes:
            - ./db_data:/var/lib/mysql
    phpmyadmin:
        depends_on:
            - db
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin
        restart: always
        ports:
            - '7070:80'
        environment:
            PMA_HOST: db

 La principal diferencia es que se comenta con “#” la sección de “gyqrebeldecertbot”. La otra pequeña diferencia es la exposición de nginx por el puerto 443.

  • WordPress/nginx/conf/default.conf
server {
    listen [::]:80;
    listen 80;

    server_name myrootdev.com www.myrootdev.com;

    return 301 https://myrootdev.com$request_uri;
}

server {
    listen [::]:80;
    listen 80;

    server_name guayaquilrebelde.org www.guayaquilrebelde.org;

    return 301 https://guayaquilrebelde.org$request_uri;
}
 
server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name myrootdev.com www.myrootdev.com;

    ssl_certificate /etc/nginx/ssl/live/myrootdev.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/myrootdev.com/privkey.pem;

    root /var/www/html/myrootdev;
    index index.php;

    location ~ /.well-known/acme-challenge {
         allow all;
         root /var/www/html/myrootdev;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/\.user\.ini {
        deny all;
    }

    location ~*  \.(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://myrootdevwordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://myrootdevwordpress:80;
    }

    location ~ \.php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://myrootdevwordpress:80;
    }

    location ~/\. {
       deny all;
       access_log off;
       log_not_found off;
    }
}

server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name guayaquilrebelde.org www.guayaquilrebelde.org;

    ssl_certificate /etc/nginx/ssl/live/guayaquilrebelde.org/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/guayaquilrebelde.org/privkey.pem;

    root /var/www/html/gyqrebelde;
    index index.php;

    location ~ /.well-known/acme-challenge {
         allow all;
         root /var/www/html/myrootdev;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/\.user\.ini {
        deny all;
    }

    location ~*  \.(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://gyqrebeldewordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://gyqrebeldewordpress:80;
    }

    location ~ \.php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://gyqrebeldewordpress:80;
    }

    location ~/\. {
       deny all;
       access_log off;
       log_not_found off;
    }

}

Conclusiones

Esta es una manera sencilla de tener varias webs alojadas en un único servidor. Conseguimos ahorrarnos dinero sin tener que usar un servidor diferente para cada web que queramos desplegar. Tened en cuenta que el límite de cuantas webs puede alojar nuestro servidor lo marcará la CPU, RAM y el almacenamiento disponible.

Author: caco

Leave a Reply

Your email address will not be published. Required fields are marked *