Usando Docker para gestionar Varios Blogs de WordPress

Esta entrada tenía muchísimas ganas de hacerla. Más que nada, para salvaguardar lo que he hecho en algún lugar, ya que hacer que funcione es un dolor de cabeza bastante curioso. Toda la información que encuentras por ahí está o bien obsoleta, o bien funciona con algún fallo.

La idea era la siguiente: Yo tengo varios Blogs alojados en un Hosting compartido, al cual migré porque tenía el servidor dedicado hecho una porquería y quería hacer limpieza. Y aquello funcionó. durante un par de años me fue bien. De hecho, funciona. La velocidad de carga es brutal, pero… Es caro.

Así que decidí volver a pelearme con configuraciones. Pero ya que me ponía, quería hacerlo bien. Y para eso decidí usar docker. Así, si me llevo algo a otro servidor, tendré la seguridad de que funcionará sin complicarme la existencia. Copiar, pegar, ejecutar. sin complicaciones ni movidas raras, con sus certificados para https. Y más rápido incluso.

voy a dejar por escrito cómo lo he hecho para que no se me olvide y para que si os apetece, me podáis replicar el invento.

Consiguiendo lo necesario

Lo primero que necesitamos es un VPS con Linux o servidor dedicado. Aquí no me voy a meter. Contrata el que más ilusión te haga. En mi caso, he tirado de OVH, que son baratos y tienen características aceptables.

Una vez hemos accedido al sistema, seguimos estas instrucciones paso a paso.

Lo primero, instalar Docker y Docker compose

Tan fácil como teclear estos comandos:

sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
sudo add-apt-repository \
«deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable»
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Consiguiendo Easy Multi-domain Docker Server

Easy Multi-domain Docker Server es una recopilación de scripts que genera lo necesario para ejecutar múltiples sitios webs con certificados ssl utilizando docker tras un nginx server como proxy inverso. No es difícil de usar, pero tenemos que tener cuidado de no cometer ningún error.

Lo primero que tenemos que hacer es crear una red de contenedores Docker. Esta red nos permitirá que los contenedores que añadamos a ella se comuniquen entre ellos. para ello usaremos el siguiente comando:

docker network create nginx-proxy

y ya está. Esto no tendremos que volverlo a hacer nunca más, al menos que nos llevemos las webs a otro sitio o que borremos la red.

Lo segundo que tenemos que hacer es clonar el repositorio del script. Recomiendo hacerlo en un usuario específico para esto, así no nos complicamos la existencia.

mkdir webs

cd webs

git clone https://github.com/jpavonabian/easy-multidomain-docker-server .

A continuación, ejecutaremos el proxy.

cd nginx-proxy

docker-compose up -d

Nuestro servidor ya está listo para servir webs mediante https. Pero claro, actualmente no hay nada que servir. Vamos a instalar WordPress.

En el repositorio tenemos una configuración de ejemplo que podemos modificar. Se encuentra en websites/example.com. Vamos a ello.

Instalando WordPress

Lo primero que tenemos que hacer es renombrar el directorio example.com a nuestrodominio.xxx. En mi caso:

cd websites

mv example.com jesuspavonabian.es

cd jesuspavonabian.es

Lo siguiente que haremos será editar nuestro archivo docker-compose.yml. El que viene por defecto es casi perfecto, pero necesitamos añadirle un par de cosas que no vienen en el ejemplo y que ocasionan que WordPress no pueda conectarse con la base de datos. Debe quedarte algo parecido a esto, no olvides de cambiar lo que corresponda con los datos de tu web:

nano docker-compose.yml

version: '3'

services:
  jesuspavonabianwordpress:
    image: wordpress
    restart: unless-stopped # makes it restart if fails and on boot
    links:
    - jesuspavonabiandatabase:mysql # link our "database" service to the mysql service in wordpress so it can use our database
    environment:
      WORDPRESS_DB_NAME: wordpressnombrebasedatos # name of db must batch database config
      WORDPRESS_DB_PASSWORD: contrasenyayadelabasededatos
      WORDPRESS_DB_USER: root # same password as database user password

      # This section is needed to setup nginx and issue your Let's Encrypt cert
      VIRTUAL_HOST: jesuspavonabian.es # the incomming domain name
      VIRTUAL_PORT: 80 # this is the port exposed below
      LETSENCRYPT_HOST: jesuspavonabian.es # the domain name to issue cert to
      LETSENCRYPT_EMAIL: tucorreo@dominio.loquesea # this email can be any of your emails
    expose:
    - 80 # must be same as virtual port above. Is the port your application runs on
    volumes:
    - ./html:/var/www/html # persistently store your files
    - ./php.conf.uploads.ini:/usr/local/etc/php/conf.d/uploads.ini # this allows larger upload limits for wordpress

  jesuspavonabiandatabase:
    image: mariadb
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: contrasenyayadelabasededatos
      MYSQL_DATABASE: wordpressnombrebasedatos # name of db must batch wordpress config
    volumes:
    - ./database:/var/lib/mysql # store the database folder so it will persist on rebuilds
    - ./db-import:/docker-entrypoint-initdb.d # put .sql or .sql.gz here to import on start

# this part is important. Set the default network to our nginx-proxy network. This is required for all sites
networks:
  default:
    external:
      name: nginx-proxy

Levantando nuestro sitio.

Si todo ha ido bien, podremos levantar nuestro WordPress, que se guardará en los volúmenes especificados. Para ello solo tenemos que ejecutar lo siguiente:

docker-compose up -d

Tardará unos segundos, pero si lo hemos hecho todo bien, al entrar a nuestrodominio.loquesea podremos ver la instalación de WordPress. Es cuestión de continuarla y una vez instalado, utilizar algún plugin para migrar nuestro sitio antiguo si lo necesitamos.

si tuviéramos que ejecutar otro WordPress, sería tan fácil como crear el directorio del nuevo sitio dentro de websites y copiarnos los archivos y directorios db-import, docker-compose.yml y php.conf.uploads.ini. Después solo nos quedaría editar el archivo docker-compose.yml con los nuevos valores y levantarlo con docker-compose up -d como hicimos con el primero.

Moviendo las webs a otro servidor

Esta es una de las maravillosas ventajas de este sistema: ¿Cambiamos de servidor? No hay problema. Nos llevamos el directorio webs al nuevo, instalamos docker y docker compose, entramos al directorio webs en el servidor nuevo, cambiamos las dns de los dominios, levantamos los contenedores y… ¡magia! Migración hecha, sin dolores de cabeza. ¿A que mola?

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.