image de mise en avant pour l'article migration Docker d'un blog Wordpress

Migration Docker d’un Blog WordPress

Temps de lecture estimé: 3 minutes

Cet article fait partie d’une série d’articles sur la Dockerisation de toute mon infra, mes services et applications en ligne.

je m’attaque maintenant à la migration Docker de mon blog WordPress.

Pour commencer, un backup sur mon serveur de prod. Je créer une archive gzip et j’exclus les backups de plusieurs gigas que fait un plugin WordPress.

cd /var/www/blog/
tar --exclude=./wp-content/uploads/backwpup-b23d55-backups/ -cvzf blog.tar.gz ./

concernant la base de données, j’ai déjà réalisé la migration de mon serveur MySql

je créer un volume dédié qui accueillera ces données qui doivent persister entre 2 redémarrages de container Docker (et évoluer avec les mises à jour de WordPress, des plugins ou de nouveaux uploads de média) 

docker volume create --driver local --name blog

Je ne vais pas utiliser l’image Docker de wordpress, mais plutôt une Ubuntu sur laquelle je vais construire au fur et à mesure.

globalement,

  • j’installe les dépendances nécessaires
  • je fournis aussi les fichiers de configuration de mon vhost apache pour ce container

Mon fichier Dockerfile final ressemble à

# à partir de l'image d'ubuntu 22.04
FROM ubuntu:22.04

# update et upgrade général de la distrib ubuntu 
# et installation et configuration de la timezone Europe/Paris 
# en mode non interactif de tzdata
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update -yq \
&& apt-get upgrade -yq \
&& apt-get install -yq tzdata --no-install-recommends \
&& ln -fs /usr/share/zoneinfo/Europe/Paris /etc/localtime \
&& dpkg-reconfigure --frontend noninteractive tzdata

# installation du serveur apache, de PHP en mode FPM et des autres outils nécessaires 
RUN apt-get install nano apache2 brotli libapache2-mod-fcgid php-fpm php-dom php-curl php-memcached php-mysql php-tidy memcached wget grunt webp npm git -yq --no-install-recommends

WORKDIR /root
RUN wget https://dlcdn.apache.org/incubator/pagespeed/1.14.36.1/x64/mod-pagespeed-apache-incubating-beta_1.14.36.1-r0_amd64.deb &&  dpkg -i mod-pagespeed-apache* && apt-get install -f


# copie de la configuration générale d'Apache et des fichiers vhost 
COPY conf/apache2/sites-enabled /etc/apache2/sites-enabled
COPY conf/apache2/mods-enabled/fcgid.conf /etc/apache2/mods-enabled/fcgid.conf
COPY conf/apache2/apache2.conf /etc/apache2/apache2.conf

# activation des modules apaches nécessaires
# et désactivation du fichier de configuration du host par défaut
RUN  a2enconf php8.1-fpm \
&& a2enmod proxy \
&& a2enmod proxy_fcgi \
&& a2enmod ssl \
&& a2enmod rewrite \
&& a2enmod http2 \
&& a2enmod ext_filter \
&& a2enmod pagespeed \
&& a2enmod brotli \
&& a2dissite 000-default \
&& phpenmod dom \
&& phpenmod curl \
&& phpenmod memcached \
&& phpenmod tidy \
&& phpenmod mysqli 

# ports nécessaires
EXPOSE 80
EXPOSE 443

# lancement du serveur web et de PHP
CMD /usr/sbin/php-fpm8.1 && memcached -u memcache -d -p 11211 -m 64 && apache2ctl -D FOREGROUND  

je build et je lance une première fois mon image

docker build -t anthonygj/blog . -f ./Dockerfile

docker run -dit \
-p 82:80 -p 444:443 \
-v /etc/letsencrypt/:/etc/certs/ \
-v blog:/var/www/blog \
--network=infra \
-h blog.anthony-jacob.com \
--restart=always \
--name blog \
anthonygj/blog

je copie mon backup dans mon containeur

docker cp /home/anthony/blog.tar.gz blog:/root/blog.tar.gz

(j’aurai aussi pu directement le mettre dans le docker run avec un volume -v /home/anthony/blog.tar.gz:/root/blog.tar.gz )

je vais ensuite me connecter au conteneur pour extraire mon backup

docker exec -it blog bash
cd /var/www/blog/
tar -xvzf /root/blog.tar.gz ./

Je mets à jour le fichier wp-config.php pour pointer sur le container mysql (qui s’appelle simplement mysql et qui est sur le même network Docker infra)

define('DB_HOST', 'mysql');

PS1: lors de mes tests sur d’autres ports que le 80 et 443, j’avais une redirection j’ai dû modifier la base de données wordpress pour modifier l’url de l’option siteurl et l’url de l’option home

donc depuis une connexion mysql sur mon serveur mysql

update wp_options SET option_value = 'https://new-domain:new-port/wordpress' where option_id = 1 and option_name = 'siteurl';

update wp_options SET option_value = 'https://new-domain:new-port/wordpress' where option_id = 2 and option_name = 'home';

PS2: comme je suis passée sur PHP 8, j’ai eu une erreur fatale

Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function create_function()

un de mes plugin n’est pas mis à jour depuis longtemps et n’est pas prêt pour PHP 8.

j’ai dû changer dans le fichier qui posait problème

add_action('widgets_init', create_function('', 'register_widget("Social_Icons_Widget");' ));

par

add_action('widgets_init', function(){register_widget("Social_Icons_Widget"); } );

PS3: Tous les visiteurs sur le blog WordPress (PHP) ont la même adresse IP, l’adresse IP du reverse proxy. Pour prendre en compte l’adresse IP réelle du visiteur, il faut que le reverse proxy la forward et il faut aussi que PHP la prenne en compte.

donc dans le fichier wp-config.php, il faut rajouter

// Use X-Forwarded-For HTTP Header to Get Visitor's Real IP Address
if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
  $http_x_headers = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );
  $_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
}

juste avant le commentaire

/* C'est tout, ne touchez pas ce qui suit ! */

et voilà!! Ce blog WordPress est bien migré dans un container Docker.

Pour avoir les bonnes redirections, je n’oublie pas d’ajouter un nouveau fichier de configuration et de redéployer mon reverse proxy apache pour qu’il prenne en compte ce nouveau site.

Pour suivre les autres étapes de la migration de mon serveur, ça se passe sur l’article récapitulatif

Partagez l'article:
FacebookTwitterEmailLinkedIn

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.