En toda plataforma que se precie, debe haber un entorno de desarrollo además del de producción. La intención de esta entrada es explicar como crear un entorno de desarrollo para WordPress, utilizando Docker, Nginx como proxy inverso y Let’s Encrypt para el certificado SSL.

Si no sabes muy bien en que consiste la tecnología de microservicios con contenedores Docker, te recomiendo que le eches un vistazo a las entradas que escribí en el proyecto Colaboratorio.net, al respecto.

Al igual que en otras ocasiones, me he servido del servidor privado virtual (VPS) que tengo en mi proveedor de confianza Clouding.io, utilizando una distribución Ubuntu 18.04

Si eres un usuario asiduo a la web, ya sabrás que pasé las tardes del pasado agosto instalando Icecast 2 para la emisión de una radio en directo, Jenkins para la integración continua (para mis incursiones en el mundo de DevOps), además del producto de monitoreo Cacti, de un contenedor con Webdav (que utilizo para sincronizar la herramienta Joplin) y del completo servicio Nextcloud; todo ello funcionando a través de un proxy inverso con Nginx. Además, un servidor java con Minecraft, que hace ya unos meses tengo montado para el divertimento de mis hijos, sus amigos de clase y algún que otro padre 😊

Despliegue de WordPress utilizando Docker

WordPress es sin duda el gestor de contenido (CMS) más popular, con permisos de Drupal o Joomla. Para esta ocasión he creado un fichero de Docker Compose con la siguiente configuración, para el propio WordPress y la base de datos con MariaDB.

wordpress : image : wordpress links : - mariadb:mysql environment : - WORDPRESS_DB_PASSWORD= "contrasea_wp" ports : - 8093:80 volumes : - datawp:/var/www/html mariadb : image : mariadb environment : - MYSQL_ROOT_PASSWORD= "contrasea_wp" - MYSQL_DATABASE= "wordpress_dev" volumes : - databasewp_dev:/var/lib/mysql wordpress: image: wordpress links: - mariadb:mysql environment: - WORDPRESS_DB_PASSWORD="contrasea_wp" ports: - 8093:80 volumes: - datawp:/var/www/html mariadb: image: mariadb environment: - MYSQL_ROOT_PASSWORD="contrasea_wp" - MYSQL_DATABASE="wordpress_dev" volumes: - databasewp_dev:/var/lib/mysql

Una vez guardado el fichero, podemos montar el entorno, con los dos contenedores:

docker-compose up -d docker-compose up -d

Si todo ha ido bien, podemos ver los contenedores en funcionamiento, utilizando docker ps | grep -i wordpress , como sigue:

60ef8d59b844 wordpress "docker-entrypoint.s…" 2 hours ago \ Up 23 minutes 0.0.0.0: 8093 - > 80 / tcp wordpress_wordpress_1 8195a5d92fe1 mariadb "docker-entrypoint.s…" 2 hours ago \ Up 23 minutes 3306 / tcp wordpress_mariadb_1 60ef8d59b844 wordpress "docker-entrypoint.s…" 2 hours ago \ Up 23 minutes 0.0.0.0:8093->80/tcp wordpress_wordpress_1 8195a5d92fe1 mariadb "docker-entrypoint.s…" 2 hours ago \ Up 23 minutes 3306/tcp wordpress_mariadb_1

Podéis ver la misma información en la imagen:



Configurar el proxy inverso con Nginx

Para no tener que escribir el puerto correspondiente en el navegador web, a continuación del nombre del dominio o IP, vamos a utilizar el proxy inverso que nos ofrece Nginx. Para ello, primero de todo, configurar el host virtual, ubicado en: /etc/nginx/sites-available/ , llamado en mi caso dev.bitsandlinux.com , con el contenido:

server { listen 80 ; listen [ :: ] : 80 ; server_name dev . bitsandlinux . com ; location / { proxy_pass http : //localhost:8093; proxy_http_version 1.1 ; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection 'upgrade' ; proxy_set_header Host $host ; proxy_cache_bypass $http_upgrade ; } } server { listen 80; listen [::]:80; server_name dev.bitsandlinux.com; location / { proxy_pass http://localhost:8093; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }

Guardamos y salimos del editor.

Si os fijáis estamos diciendo que cualquier petición que llegue con el subdominio dev.bitsandlinux.com, que llega por el puerto 80, esto es, por HTTP, se debe enviar al puerto 8093 en el mismo host. En mi caso utilizo el puerto 8093, pero para gustos colores. Podéis escoger el puerto que queráis. Eso sí, recodar que ciertos servicios de red tienen ya puertos predefinidos y es importante no utilizarlos, los podéis ver aquí. Además, podéis comprobar si un puerto esta utilizado, mediante la herramienta lsof.

Debemos crear el siguiente enlace simbólico:

sudo ln -s / etc / nginx / sites-available / dev.bitsandlinux.com / etc / nginx / sites-enabled sudo ln -s /etc/nginx/sites-available/dev.bitsandlinux.com /etc/nginx/sites-enabled

Y reiniciamos el servidor web:

sudo systemctl restart nginx sudo systemctl restart nginx

Habilitar HTTPS con Lets Encrypt

Bien, ahora solo nos queda añadir el certificado SSL, utilizando los que nos ofrece la iniciativa Let’s Encrypt.

Para poder habilitar la conexión HTTPS, debemos instalar la herramienta Certbot:

sudo apt-get install python-certbot-nginx sudo apt-get install python-certbot-nginx

De esta manera ya podemos utilizar la herramienta:

sudo certbot --nginx sudo certbot --nginx

Nos hará una serie de preguntas y al final listará los proyectos web que ha detectado y debemos seleccionar cuál de ellos será al que se le añadirán los certificados. Todo bastante fácil la verdad.

Los paquetes de Certbot vienen con un trabajo cron o un temporizador systemd que renovará los certificados automáticamente antes de que caduquen. No necesitaremos ejecutar Certbot nuevamente, a menos que cambiemos su configuración. Puede probar la renovación automática de los certificados ejecutando este comando:

sudo certbot renew --dry-run sudo certbot renew --dry-run

La herramienta añadirá la tarea programada en algún de los siguientes lugares:

/ etc / crontab / / etc / cron. */* systemctl list-timers /etc/crontab/ /etc/cron.*/* systemctl list-timers

Podemos comprobar el certificado desde la siguiente URL: https://www.ssllabs.com/ssltest/

Editar el fichero del host

Una vez realizados estos pasos, antes de pasar a la parte de la interfaz web de WordPress, tenemos que hacer un paso más. Debemos modificar el virtual host, para que la web cargue bien, añadiendo:

proxy_set_header X-Forwarded-Host $host ; proxy_set_header X-Forwarded-Server $host ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr;

Justo en la parte de “server”. Una vez hecho esto salimos y reiniciamos Nginx

sudo systemctl restart nginx sudo systemctl restart nginx

Instalación de WordPress

Aquí viene la parte fácil, solo debemos rellenar los campos necesarios, esto es, el nombre de la web y del usuario administrador, su contraseña y su dirección de correo electrónico.



Una vez hecho esto, tras escoger un tema y modificar cuatro cosas, ya tenemos nuestro proyecto listo para empezar a trabajar con él:



La dirección de esta web de pruebas es la siguiente: dev.bitsandlinux.com

Y esto es todo, espero que la entrada os haya parecido interesante. Nos vamos leyendo.

Fuentes consultadas

Nan-labs.com – Dockerize and Secure WordPress behind a Proxy