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
Grafikart