Tutoriel Vidéo Rsync SSH WordPress Déployer WordPress avec SSH

Télécharger la vidéo

De plus en plus d'hébergeurs mutualisés supportent aujourd'hui les accès via le protocole SSH. Le support de ce protocole permet de mettre en place un système de déploiement plus facilement gràce à l'utilisation de rsync notamment. Dans cette vidéo je vous propose de découvrir ma méthodologie pour envoyer et déployer rapidement un site fait avec le CMS WordPress.

Les spécificités de WordPress

Le problème avec WordPress est souvent la migration de la base de données. Le CMS a une fâcheuse tendance à sauvegarder le nom de domaine du site dans la base. Il faudra donc mettre en place un processus permettant de remplacer les noms de domaine automatiquement au moment du déploiement ou de l'import des données.
Heureusement il est possible de faire cela de manière automatique grâce à l'outil WP-CLI.

.PHONY: dev deploy dbdeploy import dbimport help update

path=~/domain.fr/
ssh=site@domain.fr
domain=domain.fr

deploy: ## Déploie une nouvelle version de l'application
    rsync -av ./ $(ssh):$(path) \
        --exclude Makefile \
        --exclude wp-config.php \
        --exclude .git \
        --exclude .idea \
        --exclude wp-content/uploads

dbdeploy: ## Evoie les données sur le serveur
    php wp-cli.phar db export --add-drop-table dump.sql
    rsync -av ./dump.sql $(ssh):$(path)
    ssh $(ssh) "cd $(path); /opt/php/bin/php wp-cli.phar db import dump.sql; /opt/php/bin/php wp-cli.phar search-replace 'localhost:8000' '$(domain)';rm dump.sql"
    rm dump.sql

Afin de synchroniser la base de données, le principe va être d'exporter dans un premier temps notre base de données locale pour l'importer ensuite sur le serveur. Enfin, on peut ensuite utiliser la commande WP-CLI search-replace afin de remplacer toutes les occurrences du nom de domaine. J'utilise ici Make pour regrouper l'ensemble des opérations que je souhaite effectuer pour le déploiement de mon site WordPress.

De la même manière, lors du développement on a parfois besoin d'importer les informations qui proviennent du site distant (si le client a entré des contenus par exemple). Dans ce cas là il suffit de faire les mêmes opérations dans le sens inverse.

import: ## Importe les fichiers distants
    rsync -av $(ssh):$(path) ./ \
        --exclude wp-config.php

dbimport: ## Récupère les données depuis le serveur
    ssh $(ssh) "cd $(path); /opt/php/bin/php wp-cli.phar db export --add-drop-table dump.sql"
    rsync -av $(ssh):$(path)dump.sql ./
    ssh $(ssh) "rm $(path)dump.sql"
    php wp-cli.phar db import dump.sql
    php wp-cli.phar search-replace '$(domain)' 'localhost:8000'
    rm dump.sql

Vous pouvez ajouter le drapeau --delete afin de vous assurer de supprimer les données locales qui ne seraient pas présentes sur le serveur (surtout dans le dossier uploads de WordPress). L'effet de ce drapeau étant potentiellement destructif, je préfère ne pas l'utiliser (n'hésitez pas à vous approprier les commandes présentées).

Les permissions

Enfin, le dernier problème que l'on peut rencontrer est un problème de permissions. Souvent, l'utilisateur SSH utilisé pour envoyer l'application est différent de l'utilisateur utilisé par PHP. Cela bloque alors les mises à jour automatiques de WordPress car le système n'aura pas les permissions suffisantes pour réécrire ses propres fichiers. Même si cela peut paraître contraignant, ces permission permettent une meilleure sécurité pour l'application car les fichiers PHP ne pourront être modifiés (une faille aura potentiellement moins d'impact).
On peut alors avoir recours à WP-CLI afin de lancer la mise à jour en ligne de commande :

update:
    php wp-cli.phar core update
    php wp-cli.phar plugin update --all

Si vous n'avez pas peur que votre site devienne indisponible suite à une incompatibilité des plug-ins, vous pouvez lancer cette commande de manière automatique grâce a une tâche CRON.

Le fichier Makefile

.PHONY: dev deploy dbdeploy import dbimport help update

path=~/domain.fr/
ssh=jl31u_droapp@domain.fr
domain=domain.fr

help: ## Affiche cette aide
    @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

dev: ## Lance le serveur de développement
    php -S localhost:8000 -d display_errors=1

import: ## Importe les fichiers distants
    rsync -av $(ssh):$(path) ./ \
        --exclude wp-config.php

deploy: ## Déploie une nouvelle version de l'application
    rsync -av ./ $(ssh):$(path) \
        --exclude Makefile \
        --exclude wp-config.php \
        --exclude .git \
        --exclude .idea \
        --exclude wp-content/uploads

dbdeploy: ## Evoie les données sur le serveur
    php wp-cli.phar db export --add-drop-table dump.sql
    rsync -av ./dump.sql $(ssh):$(path)
    ssh $(ssh) "cd $(path); /opt/php/bin/php wp-cli.phar db import dump.sql; /opt/php/bin/php wp-cli.phar search-replace 'localhost:8000' '$(domain)';rm dump.sql"
    rm dump.sql

dbimport: ## Récupère les données depuis le serveur
    ssh $(ssh) "cd $(path); /opt/php/bin/php wp-cli.phar db export --add-drop-table dump.sql"
    rsync -av $(ssh):$(path)dump.sql ./
    ssh $(ssh) "rm $(path)dump.sql"
    php wp-cli.phar db import dump.sql
    php wp-cli.phar search-replace '$(domain)' 'localhost:8000'
    rm dump.sql

update:
    php wp-cli.phar core update
    php wp-cli.phar plugin update --all