La sauvegarde de données est une composante essentielle dans le process de développement d'un site internet vous le savez bien. En effet, que cela soit pendant vos tests en préproduction ou lors de la mise en production de votre projet, vous avez constamment besoin d'effectuer des sauvegardes de votre base de données.

A plus forte raison après la mise en ligne de votre projet, puisque il serait préjudiciable en cas de crash, de n'avoir qu'une sauvegarde à J+10. Cela signifierait que vous auriez perdu toutes les modifications effectuées sur votre site sur 10 jours ! Impensable.

Si vous n'êtes pas encore familiarisé à l'utilisation des lignes de commandes sauvegarder une base de donnée est (certainement) pour vous une opération complexe, chronophage, et nécessite peut-être l'utilisation d'un logiciel tiers dont vous n'avez réellement pas besoin ! (si, si, croyez-moi ...).

Lors de mon précédent tutoriel je suis revenu sur les commandes SSH fondamentales qui vous permettent d'utiliser de façon productive le terminal, vous familiariser avec les lignes de commandes et remplir une multitude de tâches que vous faisiez peut-être manuellement auparavant. Si vous n'avez pas encore eu l'occasion de découvrir ce tutoriel je vous invite à le lire, il vous sera certainement utile.

Maintenant que nous avons vu comment travailler avec notre terminal ou que c'est quelque chose qui vous parle déjà, vous savez désormais comment effectuer les opérations principales que vous faisiez avec votre logiciel FTP très limité avouons-le. Et si il n'était pas encore K.O. patiente, ce qui suit ne laissera plus aucune place au doute.

Voilà une vérité universelle : Votre logiciel FTP est limité et ne travaillera certainement pas aussi vite que vous !

Voyons tout de suite comment effectuer des opérations simples en lignes de commandes pour travailler avec un serveur de base de données MySQL et effectuer des sauvegardes en un claquement de doigts (Clin d'œil Thanos!).

Comme il faut bien commencer quelque part, je vous propose de commencer par le plus simple, se connecter à un serveur de base de données, et effectuer des requête SQL simples. Nous verrons ensuite (en bas de page) comment effectuer une sauvegarde en quelques secondes. En bonus je vous explique même comment avoir une jolie petite barre de progression !

Se connecter à la base de données

Voyons les arguments de cette commande ensemble :

  • mysql : indique que l'on travaille sur un serveur de base de données
  • -h ou --host : indique que l'on fait passer un host à notre commande
  • dbhost : C'est l'adresse IP de votre serveur (localhost si votre base de donnée est sur le même serveur que celui auquel vous êtes connecté)
  • -u : indique que l'on précise un utilisateur
  • dbuser : correspond à votre identifiant pour accéder à la base de données
  • dbpassword : (optionnel) correspond au mot de passe de votre identifiant pour accéder à la base de données. Lisez le paragraphe suivant sur ce point, c'est vraiment important !
  • dbname : indique la table sur laquelle vous souhaitez vous connecter

Avec la commande ci-dessus vous êtes prêt à interagir avec votre base de données et effectuer des requêtes (ex. Select, Update, etc...).

Petite note de sécurité : Si vous ne le saviez pas déjà, sachez que chaque commande que vous tapez en SSH est stockée dans un fichier d'historique de commandes. Il est donc assez simple pour un administrateur réseau un peu qualifié d'arriver à retrouver les commandes que vous auriez pu saisir.

Dans cette optique je vous recommande de remplacer le « --password=dbpassword » par « -p » pour indiquer que votre commande nécessite un mot de passe. Votre mot de passe ne sera donc pas renseigné dans l'historique de commandes cependant vous serez invité à le saisir lorsque vous appuierez sur Entrée pour executer votre commande.

Disons qu'en terme de sécurité il est beaucoup plus propre de masquer ce type d'éléments critiques. Je souhaitait tout de même vous montrer la commande pour que l'on fasse ce petit point sécurité car pour les commandes suivantes j'utiliserais le « -p » sur les commandes nécessitant ce type d'informations critiques, ne soyez donc pas étonnés.

Lister toutes les tables de votre base de données

Maintenant que vous êtes connecté, vous disposez dans votre terminal de l'accès aux requêtes SQL.

Vous n'avez pas d'interface mais il s'agit de la même chose que l'onglet « SQL » d'un phpMyAdmin de base.

Pour lister toutes les tables de votre base de données vous taperez donc la commande qui suit, attention, chaque requête devra se terminer par un point-virgules « ; » sans quoi vous verrez une erreur de syntaxe apparaitre.

Effectuer une requete simple sur une table

Pour effectuer une requête SQL en SSH cela se passera exactement de la même manière que sur phpMyAdmin dans votre onglet « SQL ».

Disons par exemple que je veux sélectionner toutes les informations d'une table « users » je taperais donc la commande suivante dans mon terminal :

Un tableau apparait avec toutes les informations, disons maintenant que je ne veux que les utilisateurs de ma table « users » qui ont pour adresse email une adresse en « @gmail » je taperais donc exactement la même commande en rajoutant un WHERE avec les arguments dont j'ai besoin, par exemple :

Si vous n'êtes de base pas très à l'aise avec MySQL je vous recommande de vous renseigner sur cette partie car c'est vraiment primordial de pouvoir effectuer des requêtes de base. J'aurais peut-être l'occasion de faire un petit tutoriel sur cette partie plus tard !

Exporter une base de donnée en « .sql »

Bon, nous allons attaquer la partie la plus importante de ce tutoriel ! Un peu plus haut je vous expliquais que l'on pouvait effectuer des backups (fr: sauvegardes) de la base de données en quelques secondes.

Dans mon cas, j'aime bien avoir une information sur la progression de ma commande. Bah oui ! Admettons qu'on sauvegarde une base de données de 2GB (Gigas)... si vous n'avez pas de barre de progression ou un indicateur visuel qui vous permet d'indiquer l'état de votre commande, comment savoir si vous avez le temps de passer un coup de fil, ou boire un café ?!

Plus sérieusement, dans notre métiers le temps c'est de l'argent. Pardon d'être pragmatique mais la rentabilité est une notion fondamentale dans la recherche d'optimisation.

Imaginez que vous deviez produire un planning précis à votre client en lui indiquant un temps de migration pour la mise en production de son site. Si vous n'avez même pas cette information... bref vous m'avez compris.

Nous allons donc commencer par ajouter une petite fonctionnalité qui nous permettra visuellement d'obtenir une barre de progression indiquant l'état d'avancement de notre commande d'export. Pour cela ouvrez votre terminal et tentez de taper la commande suivante :

Dans la plupart des cas vous devriez obtenir par défaut le message d'erreur suivant : « pv: command not found ». Pas de panique, c'est normal. Cette commande ne fait pas partie des paquets installés par défaut alors installons-là ensemble. Toujours dans votre terminal tapez :

Une fois l'installation terminée (cela ne prend que quelques secondes), re-tentez de taper la commande « pv » et là vous devriez voir apparaitre une barre de progression vide. Normal puisqu'elle n'indique la progression d'aucune tâche... pour le moment !

Maintenant que notre petit bonus est en place, nous pouvons effectuer une requête d'export SQL, je vous laisse découvrir la commande d'export ci-dessous :

Alors, revenons un instant dessus. Comme pour nous connecter à notre base de données, nous devons ici envoyer quelques arguments à notre commande pour lui indiquer sur quel serveur travailler, avec quels identifiants, etc etc. Vous devriez avoir compris la majorité des arguments présents dans la commande je ne vais donc me concentrer que sur les arguments que nous n'avions pas encore vu jusque là :

  • mysqldump : l'export se fait avec mysqldump, l'import avec mysql.
  • -e : (optionnel) permet d'indiquer que l'export s'effectue avec de multiples INSERT
  • | : le séparateur pipe (ou la barre droite pour les néophytes) à ne pas confondre avec un L minuscule (séparateur pipe : | vs la lettre minuscule L : l ), il permet dans des commandes SSH de filtrer ou effectuer plusieurs opérations sur une même commande
  • pv : c'est du coup notre petit bonus « Barre de progression »
  • > : le chevron vers la droite indique que nous envoyons le résultat de notre commande vers un fichier
  • nomDuFichier.sql : c'est le nom du fichier en sortie que nous obtiendrons. Précédé du chevron vers la droite il indique à notre commande « Envoi le résultat de ma commande dans le fichier nomDuFichier.sql ».

Petite précision : Pour votre fichier en sortie vous pouvez préciser un chemin relatif vers un dossier précis. Par exemple si vous vouliez envoyer votre backup dans un dossier précis, en partant de l'exemple ci-dessus l'argument « nomDuFichier.sql » pourrait être « /var/www/vhost/backups/nomDuFichier.sql ».

Importer une base de donnée depuis un fichier en « .sql »

OK ! Maintenant que vous savez effectuer un backup en quelques secondes vous allez voir que le restaurer, ou tout simplement l'installer est tout aussi simple. La commande est quasiment similaire à la précédente seul l'ordre change donc vous devriez arriver à la comprendre assez facilement.

Cette syntaxe d'import est vraiment propre à l'utilisation de la commande « pv » je vais donc tout de même vous donner la commande d'import SQL sans le pipe, sait-on jamais, vous n'aimez peut-être pas les barres de progression :

Comme je le disais plus haut, la commande est identique à celle de l'export. Rappelez-vous que « mysqldump » correspond à un export, et « mysql » est utilisé pour se connecter (et effectuer des requêtes SQL) où importer un fichier « .sql ».

Le sens du chevron (chevon vers la gauche) indique ici que nous importons le contenu de notre fichier dans notre base de données. La ligne de commande fait sa tambouille et hop, cela devient un import SQL !

La Conclusion de tout ça ?

Vous êtes maintenant un pro de l'export/import de fichier MySQL, mais allons un peu plus loin et mettons définitivement K.O votre logiciel FTP. Disons que vous avez un site de Préproduction, vous avez travaillé dessus de longs mois, maintenant il est prêt ! Vous devez effectuer la migration, mais voici quelques problématiques :

  • Vous avez travaillé votre version de Préprod sur un serveur A
  • Vous devez migrer votre travail sur le site de production, mais il se trouve sur un serveur B
  • Vous devez migrer vos bases de données, et les réinstaller !

Alors en temps normal vous auriez procédé de la manière suivante :

  • Vous transférez avec un logiciel FTP tous vos fichiers
  • Vous les importez sur le serveur B
  • Vous faites un backup SQL du serveur A
  • Vous le téléchargez puis le renvoyez sur le serveur B ou arrivez à l'installer sans trop de difficulté avec un logiciel de base de données type Navicat

OK. Génial, mais. Parce que Oui il y à un mais. Toutes ces étapes sont chronophages, il vous aura fallu au moins deux heures si les fichiers sont un peu lourds !

Si vous n'aviez pas d'autres méthodologie, voici ce que vous devriez faire, et aucune de ces étapes ne nécessite d'utiliser autre chose que votre terminal :

  • Exporter votre base de données avec la commande « mysqldump » que vous venez d'apprendre
  • Créer une archive « .tar.gz » de vos fichiers
  • Transférer votre archive et votre backup SQL directement vers votre serveur de Prod avec la commande « scp »
  • Importer votre base de données en ligne de commandes

Ce process en plus d'être beaucoup plus rapide, vous permet de faire un échange de données direct entre vos deux serveur.

Ô magie, Ô stupéfaction ! Vous venez d'importer en quelques secondes vos fichiers de Préprod et votre base de données et n'avez même pas eu à ouvrir une seule fois votre logiciel FTP ! Il en dit quoi FileZila ? xD

Bon. Nous allons aborder l'une des meilleures astuces qu'il m'ai été donnée depuis le début de ma carrière. Si vous avez suivi mes précédents tutoriels sur les commandes SSH ou encore l'installation de Magento 2 avec composer, vous avez du découvrir une multitude de commandes qui vous ont déjà facilité la vie. 

Eh bien aujourd'hui nous allons aller encore plus loin sur notre apprentissage du terminal et je vais vous introduire une nouvelle notion qui est l'alias de commande. Alors oui, dit comme ça ça ne parle pas forcément, pourtant vous allez voir que c'est un gain de temps énorme dans votre méthodologie.

Personnellement c'est un indispensable pour moi pour tout bon développeur. Par définition, un développeur doit être fainéant. Alors je vous vois déjà avec un petit sourire en coin, mais Non ! Je ne parle pas de l'envie (ou non) de travailler. Je parle ici de productivité. Un bon développeur doit avoir a sa disposition une suite d'outils qui lui permettent d'être pragmatique tant dans sa réflexion que dans sa méthodologie de travail.

Je reprends notre exemple Magento 2. Partons du principe que nous devons effectuer plusieurs opérations dans la même (demie) journée.

  • Accéder à un dossier
  • Installer une extension Magento 2
  • Vider les caches de Magento 2

Pour cet exemple je pars du principe que je travaille sur un serveur VPS hébergé chez OVH disposant de Plesk, disons que j'ai des dossiers de travail qui s'appelleraient Preprod & Prod. Mon dossier Preprod contiendra deux dossiers « preprod01 » et « preprod02 », mon dossier Prod quant à lui ne contiendra qu'un seul dossier qui sera « prod01 ». 

Petite précision, c'est un cas d'exemple, donc ne paniquez pas, inutile de reproduire mon arborescence de dossiers, vous pouvez adapter cet exemple à votre cas de figure sans aucun soucis !
Dernière précision, cet exemple est également valable en local. Donc si vous travaillez vos projets en local vous pourrez également (même si vous n'en n'aurez probablement pas autant besoin) adapter cette méthodologie à vos besoins.

Entrons maintenant dans notre exemple. Pour accéder à notre dossier « preprod01 » qui se trouve dans « Preprod » voilà la commande que l'on taperait habituellement :

Nous ferions la même chose pour nous rendre dans un autre dossier, et ainsi de suite. Génial... Mais sur notre machine nous disposons d'un fichier de configurations « .bashrc » qui est appelé à chaque fois qu'une ouverture de terminal s'effectue. L'utilité de ce fichier ? C'est simple, il peut contenir des tonnes de petites configurations (des alias) qui vont travailler pour vous.

Qu'est-ce qu'un alias ?

Un alias c'est un raccourci vers un élément ou une fonction donnée ! En clair, si vous indiquiez à un alias nommé d'effectuer une tâche, eh bien vous taperiez dans votre terminal le nom de votre alias et il effectuerait cette tâche pour vous ! Vous voyez où je veux en venir maintenant ?

Rappelez-vous notre exemple précédent, nous souhaitions nous rendre facilement dans différents dossiers, sans avoir à taper à chaque fois la totalité du chemin, puisque pour rappel lorsque vous travaillez avec votre terminal, vous devez entrer la totalité de votre chemin pour accéder à votre dossier. Pour le coup, vous n'allez taper que votre alias.

Alors voyons comment créer un alias. Tout d'abord vous devez créer un fichier « .bashrc » à la racine de votre installation s'il n'existe pas déjà. Pour cela, vous taperez la commande suivante :

Notez que j'utilise « nano », dans l'édition il existe également « vi » en remplacement de « nano » mais personnellement je trouve l'utilisation de « nano » beaucoup plus simple et facile à prendre en main. Vous trouverez chez OpenClassroom un très bon article traitant le sujet, mais ce n'est pas à l'ordre du jour !

Pour l'exemple, je vais créer des alias vers chacun des dossiers que j'ai listé dans mon exemple afin de bien comprendre le fonctionnement, vous pouvez le copier/coller et l'adapter à votre cas :

C omme nous travaillons avec « nano » pour enregistrer notre fichier faites « CTRL + X » puis taper sur « Y » (Y pour Yes, N pour No) puis sur Entrée pour valider. 

Votre fichier est maintenant sauvegardé, en revanche votre session n'utilise pas ce fichier de configuration pour l'instant ! pour cela vous devez le « synchroniser », pas de panique il y à également une commande pour cela, je vous laisse la chercher sur internet et je vais me faire un café en attendant ?!
Bon allez, tapez ceci :

Alors, revenons sur ce que nous avons fait ! La commande « nano » est comme un éditeur de texte. Elle permet de créer / modifier un fichier (texte, php, csv, etc...). Dans ce fichier « bashrc », vous avez rentré des alias de commande. Leur fonction sera d'effectuer un « cd » puis le nom de votre dossier. La commande « cd » pour rappel sert à se déplacer dans l'arborescence de notre serveur.

En clair cela signifie que, dans mon terminal, peu importe où je me trouve, je pourrais taper le nom de mon alias, et ce dernier me conduira directement dans le dossier souhaité ! Si je veux aller dans mon dossier « preprod01 » une fois que je serais connecté à mon serveur je pourrais donc taper « preprod01 » et pouf, je me retrouverais dans le bon dossier ! Magique non ? 

Application de Bashrc pour magento

Maintenant que vous avez appris à créer vos premiers alias, imaginez les possibilités d'applications dans le cas d'un projet Magento 2 par exemple. Comme je le disais, lorsque vous travaillez sur Magento, certaines commandes sont un peu redondantes, je pense notamment à celles qui ont pour objectif de vider les caches, effectuer des compilations ou encore générer des flux !

Pourquoi ne pas en faire des alias de commande alors ?!

Dans l'exemple ci-dessous je vais créer un alias sous forme d'inclusion de plusieurs commandes. Rappelez-vous que les commandes SSH ont la possibilité d'être chainées, c'est-à-dire mises les unes à la suites des autres sur un seul appel. Ce qui signifie qu'en une seule commande tapée, vous en effectuerez plusieurs.

Créons donc notre alias « générique »

Dans l'exemple ci-dessus, je n'ai pas modifié les alias de Preprod ni ceux de Prod, j'ai seulement rajouté mes alias génériques pour Magento 2. Grâce à eux, si je veux désormais utiliser une des commandes habituelles de Magento pour laquelle j'aurais habituellement tapé 

Désormais dans mon terminal je ne taperais plus que :

Continuons sur notre lancée pour exploiter pleinement le fameux système de « chain » (chainage) de nos commandes en rajoutant un niveau de complexité :

Dans l'exemple ci-dessus je vous ai rajouté trois alias :

  • cc : cet alias me sert à lancer la commande de cache clean de magento
  • emptyCache : permet de supprimer les dossiers contenant des fichiers statiques de magento (ils sont regénérés automatiquement si vous avez activé le mode développeur, ne les supprimez pas directement en production !)
  • emptyCacheAndClean : C'est là que la magie opère. Vous voyez que cet alias ne contient que quelques « mots » qui sont en fait des alias avec des opérateurs.

Dans notre alias « emptyCacheAndClean » vous pouvez voir que le premier élément est « pwd » qui nous retourne le chemin dans lequel nous nous trouvons afin d'être sur que nous travaillons dans le bon dossier, dans le cas présent voyez ça comme une commande informelle.
Cette commande est suivie de l'opérateur « && » qui nous permet de dire « Effectue telle action, et quand tu as finis passe à la suivante ». Ensuite vient notre alias « cc » qui vide le cache de magento.
En clair, vous pouvez voir qu'avec une seule commande vous effectuez plusieurs opérations d'un coup. Vous voyez qu'on est passé de commandes relativement longues et redondantes à des mots clé très simple à retenir que vous pouvez réutiliser sur n'importe quel projet d'une nature similaire. Pour cela vous n'aurez qu'à copier/coller le contenu de votre fichier « .bashrc » d'un serveur à l'autre.

Mon fichier bashrc Pour Magento 2

Comme Magento 2 est l'un des frameworks sur lequel je travaille le plus en ce moment, je vous propose de découvrir mon fichier « .bashrc » qui contient les commandes que j'utilise le plus souvent. C'est un fichier que je mets à jour régulièrement selon mes besoins, mais vous pouvez vous en inspirer pour vos projets Magento 2 et l'agrémenter selon vos propres besoins !

En conclusion

Ce tutoriel touche à sa fin, j'espère avoir été clair dans mes explications car je suis loin d'être un expert en ce qui concerne bash, cependant j'ai pu apprendre quelques petites choses que j'ai plaisir à partager avec vous. Si vous rencontrez des difficultés n'hésitez pas à me contacter.

Quoi qu'il en soit, même si de prime abord ces notions peuvent paraitre relativement complexes, c'est un réel gain de temps et une optimisation nette de votre productivité une fois pris en main.

Grâce à l'utilisation de votre terminal pouvez simplement effectuer des backups de vos bases de données sans avoir besoin d'acheter des licences pour des softwares tel que Navicat, ou encore perdre du temps à transférer vos fichiers en local pour conserver des backups de fichiers.

Que vous soyez développeur junior, sénior, ou confirmé, et comme il faut bien commencer quelque part... vous avez sûrement comme moi d'abord appris à utiliser des logiciels FTP (acronyme pour : File Transfert Protocol).

Pour ceux qui se poseraient encore la question, un logiciel FTP a pour principale fonction d'effectuer des téléchargements de fichiers d'une machine locale, potentiellement votre ordinateur, vers un serveur en ligne.

Alors Oui, les logiciels FTP sont pour la plupart relativement fonctionnels, mais aujourd'hui, je vais vous parler d'une autre méthode qui vous fera sûrement gagner énormément de temps sur le long terme. Je vous présente alors... Le terminal !

Si vous êtes junior, le Terminal (mac) ou la console (Windows) peut en effet vous paraître un peu archaïque, moche, voir totalement inutile... pourtant, en apprenant à utiliser votre Terminal vous verrez très rapidement que vous pouvez effectuer quasiment toutes les manipulations dont vous aurez besoin au sein d'un seul et même environnement. Vous ne me croyez pas ? Pourtant, je vais aujourd'hui vous apprendre à effectuer les manipulations suivantes : Vous connecter à votre serveur en ligne, créer un fichier « .tar.gz », naviguer au sein de votre serveur, créer / modifier / dupliquer / renommer / déplacer / transférer / supprimer un dossier, vous connecter à votre base de donnée, interagir avec votre base de données, effectuer des sauvegardes en « .sql ». 

Commençons !

Quelques commandes de base
à connaitre à tout prix !

Se connecter à un serveur SQL

Pour vous connecter c'est très simple, ouvrez votre terminal et tapez la commande ci-dessus. Remplacez « root » par l'identifiant de votre serveur, et « adresse-ip » par l'adresse IP de votre serveur, cela donnera quelque chose de similaire à « ssh laurent@12.34.567.89. Appuyez sur la touche Entrée, vous serez alors invité à saisir le mot de passe du serveur, tapez votre mot de passe (ou copiez/collez-le) puis appuyez une nouvelle fois sur Entrée. Vous êtes maintenant connecté à votre serveur !

Affiche la position actuelle sur le serveur

Affiche le dossier courant dans lequel vous vous trouvez. Cette commande est indispensable car lorsque l'on navigue dans des dossiers / fichiers sur un serveur on peut rapidement se perdre et oublier où l'on se trouve. Cette commande vous retourne le chemin relatif de votre dossier sur le serveur.

Lister les dossiers & fichiers

Liste les fichiers & dossiers en affichant ses permissions, le nombre de fichiers, l'utilisateur (et son groupe), le poids, la date de modification, ainsi que le nom des fichiers. Cette commande a la particularité d'afficher les fichiers masqués (ex. les fichiers « htaccess ». Si vous ne souhaitez lister que les fichiers sans informations en particulier, vous pouvez simplement taper « ls ».

Naviguer entre les dossiers

Se déplacer dans les dossiers. Par exemple pour rentrer en profondeur dans : dossier1 > dossier2 > dossier3 vous taperiez alors :

Une fois dans votre dossier « dossier3 » qui serait dans cet exemple votre dernier niveau de profondeur, pour revenir à votre dossier « dossier1 » vous n'aurez qu'à taper :

Petite astuce, en tapant les premières lettres de votre dossier et en appuyant sur Tab, votre terminal devrait vous proposer un auto remplissage.

Créer un dossier

Pour créer un dossier, entrez la commande ci-dessus suivie du nom de votre dossier. Si vous aviez par exemple l'arborescence suivante : dossier1 > dossier2 > dossier3, que vous êtes dans votre dossier1, et que vous voulez créer un dossier4 dans votre dossier3 vous pourriez taper la commande suivante :

Déplacer / renommer un dossier

Déplacer votre dossier ne prend que quelques secondes avec la commande ci-dessus. Pour renommer votre dossier, la commande est identique cependant au lieu de taper la destination de votre dossier vous taperez le nouveau nom du dossier.

Pour l'exemple reprenons notre arborescence de base : dossier1 > dossier2 > dossier3.
Maintenant disons que vous voulez déplacer votre dossier3 dans dossier1, vous taperez la commande suivante :

Toujours sur la même arborescence, disons maintenant que vous souhaitez renommer le dossier3 en nouveauDossier3. Pour cela tentez de saisir la commande suivante : 

Voilà ! Vous savez maintenant naviguer dans votre arborescence de dossier comme un chef !

supprimer un dossier

Attention, manipulez cette commande avec la plus grande des précautions ! En effet, si vous pouvez en un claquement de doigts (clin d'œil à Thanos!) supprimer un dossier, il est tout aussi simple de supprimer la totalité des dossiers & fichiers de votre serveur ! Soyez donc relativement prudent avec cette commande.
Pour supprimer la totalité des fichiers & dossiers contenus dans notre dossier3 (pour reprendre l'exemple d'une arborescence type : dossier1 > dossier2 > dossier3). Vous feriez :

Sur la commande ci-dessus si je devais traduire en Français cela donnerait : Retourne au dossier racine, và dans dossier1, trouve le dossier3 s'il existe, et supprime-le. Gardez en tête que si vous précédez le nom de votre dossier par un slash « / » vous indiquez à votre commande « ton point de départ c'est la racine du serveur ».

Je vous disais plus haut de faire attention car vous pouviez supprimer la totalité de vos fichiers et dossiers, une commande relativement dangereuse ressemblerait à ceci :

Dans la commande ci-dessus on indique au serveur : Retourne à la racine du dossier, et supprime tout ce que tu y trouveras. Une telle commande sur un serveur de production serait vraiment critique... Soyez donc relativement prudent avant d'appuyez sur Entrée, et prenez l'habitude de relire vos commandes et vous renseigner si vous n'êtes pas sûr de ce que vous faites.

Copier un fichier ou un dossier

La commande « cp » vous permet de copier simplement un fichier dans le même répertoire, ou dans un répertoire secondaire ! 

Par exemple, disons que vous avez un fichier de log nommé error.log dans votre dossier /var/log/ et que vous souhaitiez le copier pour en faire un backup avant de le vider.

Pour cela nous allons copier ce fichier et le nommer « backup_error.log » en effectuant la commande ci-dessous :

En gros, la commande ci-dessus dit au serveur : Và à la racine du serveur, puis rends-toi dans le dossier « var » puis le sous-dossier « log », dans ce dossier « log » trouve-nous le fichier error.log puis copie-le (avec la commande cp du coup) et tu l'appelles « backup_error.log ». Voilà, maintenant vous avez faire une copie de fichier relativement simplement !

Notez que pour copier un dossier la manipulation est identique, vous rajouterez simplement l'argument « -r » en minuscules pour indiquer qu'il s'agit d'un dossier.

Créer une archive .tar.gz

Zipper un dossier au format « .tar.gz ». Voici le détail des arguments de cette commande :

  • tar : indique que l'on compresse un fichier de type tar
  • c : indique que l'on crée une archive
  • z : permet d'activer la compression "gzip" pour un taux de compression plus important (donc optimisé)
  • v : mode verbeux, permet d'afficher dans le détail les fichiers compressés
  • f : indique la donnée à compresser

Pour l'exemple ci-dessous, je compresse le dossier « backup » et je lui nomme mon fichier compressé « monBackupServeur.tar.gz ». Dans la pratique, voici le résultat :

Décompresser UNE ARCHIVE .TAR.GZ

La commande pour extraire un fichier « .tar.gz » est un peu similaire à celle que nous utilisons pour compresser, les arguments changent légèrement :

  • x : indique que l'on extrait une archive
  • v : mode verbeux qui affiche le détail des fichiers décompressés
  • z : permet de décompresser le "gzip"
  • f : indique la donnée à compresser

transferer des dossiers entre deux serveurs

C'est une problématique connue de tous les développeurs... le transfert de fichiers/dossiers entre les serveurs ! Vous travailliez sur une version de préproduction sur un serveur A et vous devez la transférer sur un serveur B ? Figurez-vous qu'avec la commande SCP cette problématique est totalement résolue ! Voyons ça ensemble.

transférer un dossier d'un serveur 1 vers un serveur 2

Dans l'exemple ci-dessus les arguments sont rangés de la manière suivante :

  • scp : indique que l'on và effectuer un transfert d'une machine à l'autre
  • -r : indique que l'on copie un dossier (si il ne s'agit que d'un fichier vous pouvez retirer cet argument)
  • cheminDuDossier1 : correspond au chemin absolu de votre dossier sur le serveur
  • utilisateur : correspond à l'identifiant SSH du serveur sur lequel vous allez transférer le dossier
  • serveur : adresse IP du serveur sur lequel vous allez transférer le dossier
  • cheminDeDestination : correspond au chemin absolu du serveur sur lequel vous allez transférer le dossier. En gros, le chemin dans lequel vous placez votre dossier copié.

En appuyant sur Entrée vous serez alors invité à saisir le mot de passe utilisateur du serveur sur lequel vous effectuez la copie. Dans un cas concret voici un exemple de la copie complète.

Dans mon exemple je vais copier un dossier « medias » qui se trouve dans « /httpdocs/ » sur mon Serveur n°1 à l'intérieur d'un dossier qui se nommera « assets » et qui se trouvera dans « /httpdocs/ » sur mon Serveur n°2 :

En validant cette commande, mon dossier « assets » sur le Serveur n°2 qui était vide jusque là, se remplira avec un sous-dossier nommé « medias » provenant de mon Serveur n°1. 

Vous me direz alors : « Super, je sais copier un dossier d'un serveur à l'autre, mais à quoi ça peut me servir de savoir faire ça ? ».

Eh bien c'est simple. Disons que vous aviez une version de Préprod sur votre Serveur n°1, et que vous avez besoin de mettre cette version en ligne sur le serveur de votre client ? Vous avez compris la suite... Vous allez pouvoir le faire de façon relativement simple, en gagnant un temps fou parce que la copie s'effectue de serveur à serveur, le temps de transfert est donc relativement court ! Et le pire, c'est que c'est valable pour des fichiers comme des dossiers !

On peut donc imaginer que vous avez fait un export de votre base de donnée de Préprod, que vous la copiez ainsi que votre dossier de travail sur le serveur de Prod de votre client et que maintenant vous n'avez plus qu'à tout dézipper....

Par expérience, je peux vous affirmer que c'est une optimisation de votre productivité qui n'a clairement pas d'égal ! Adieu les transferts lourds en FTP sur votre ordinateur pour les renvoyer 3 heures plus tard sur le serveur de votre client. Maintenant vous lancez votre commande et attendez que le serveur travaille pour vous. Ça mérite bien un café tout ça !

Consulter les fichiers log de votre serveur pour débugger

Lorsque vous rencontrez des erreurs sur votre serveur, ces erreurs sont automatiquement (pour la plupart) stockées dans des fichiers de type « .log » contenant la liste des erreurs que votre serveur a rencontré. 

Les fichiers logs sont plus ou moins spécifiques à l'environnement sur lequel vous travaillez et effectuez des requêtes. En fonction de votre serveur vous pourez donc trouver des fichiers logs relatifs à MySQL, PHP-FPM, Nginx, Varnish, etc.

Conventionnellement, dans la plupart des cas vous trouverez vos fichiers de logs en tapant la commande suivante :

De manière conventionnelle, ces fichiers logs sont habituellement stockés à la racine de votre serveur dans « /var/log » mais cela peut varier selon votre environnement. Dans le cas de certains frameworks comme Magento 2 par exemple, vous aurez également un dossier de logs directement dans votre application. Ces logs seront alors liés à l'utilisation de Magento 2 et son fonctionnement et vous seront très pratique pour comprendre les erreurs que vous rencontrez en front-office comme en backoffice ou simplement pour mieux comprendre les appels qui peuvent être faits par votre framework.

consulter un fichier de log

Cette commande sera forcément incontournable pour débugger puisqu'elle vous permettra de lister le contenu de votre fichier log. Dans la commande ci-dessus voici le détail des arguments :

  • tail : indique que l'on affiche le contenu du fichier
  • -n200 : permet de préciser le nombre de lignes que l'on souhaite afficher (changez le 200 par le nombre de lignes que vous souhaitez avoir)
  • En cas concret, si vous souhaitiez afficher par exemple les 50 dernières lignes d'un fichier log qui s'appelle error et se trouve dans le dossier de log général de votre serveur vous taperiez la commande suivante :

Astuce : Si vous faites du debug en temps réel et que vous avez besoin de visualiser en temps réel si un élément est retourné dans votre fichier de log, vous pouvez rajouter l'argument « -f » qui affichera le contenu de votre fichier en temps réel dans votre terminal. Votre commande serait donc : 

Pour sortir de ce mode « watch » faites simplement CTRL + C

Vider les fichiers de log

Dans certains cas, vous aurez peut-être besoin de vider vos fichiers de logs pour mieux comprendre les erreurs qui remontent, il existe la commande suivante pour cela :

Attention cependant ! Même si cela peut être très tentant de vider vos fichiers logs, gardez en tête qu'ils sont une source d'informations pour remonter vos erreurs. À ce titre si vous les videz vous n'aurez alors plus connaissance des erreurs qui ont pu remonter dans vos fichiers logs. Vous agissez donc en connaissance de cause. Comme ma maman dit toujours, un homme averti en vaut deux !

Vider tous les fichiers de log simultanément

Par le biais de la commande précédente nous avons vu comment vider un fichier log spécifique en lui passant comme argument le nom du fichier de log que l'on souhaite vider. Sachez cependant qu'il est possible de vider tous vos fichiers logs de façon simultanée ! Pour cela nous utilisons le fameux slash-étoile « /* » qui s'avérait dangereux pour la suppression. Dans la commande ci-dessous, nous allons tous les vider d'un seul coup !

Cette commande donne l'information suivante au serveur : « Và à la racine de mon serveur, dans le dossier var/log puis effectue la commande truncate -s0 sur tous les fichiers qui ont l'extension en .log. ». 

De cette manière on cible tous les fichiers qui ont une extension en « .log » donc pas de risque de vider un fichier autre qu'un fichier avec l'extension « .log ».

Je le rappelle une dernière fois, cette commande sert pour la connaissance, mais vider intégralement vos fichiers logs peut s'avérer problématique si vous avez besoin de visualiser une erreur serveur antérieure.

Sachez cependant qu'une fois vidé, votre fichier log se remplira de nouveau tout seul si de nouvelles erreurs ou de nouveaux évènements sont inscrits dans les logs. D'une manière plus générale, en les vidant cela servira à ne remonter que les erreurs réelles. Je vous invite tout de même à effectuer une copie de votre fichier log avec la commande « cp » que vous trouverez plus haut dans cette page.

Trouver quels fichiers comportent une chaine de caractère précise dans tous vos dossiers

Dans ce point, je vous propose de découvrir une commande qui est INDISPENSABLE et relativement simple à utiliser. Il s'agit de la commande « grep ». Cette commande permet d'effectuer une recherche dans des fichiers. Voyons tout de suite comment l'utiliser !

Sur la commande ci-dessous je pars du principe que vous avez lu le chapitre précédent concernant les logs ou que vous êtes déjà familier à l'utilisation des logs.

Cette commande en français donnerait l'indication suivante à notre serveur : « Trouve dans quels fichiers il y à la chaine de caractères « texte » dans le dossier « /var/log/ ». Comme vous le voyez cette commande s'accompagne de trois arguments dont voici le détail :

  • -r : indique que notre opération s'effectue de façon récursive
  • -i : on précise que notre commande est insensible à la casse
  • -l : affiche les résultats sous forme de liste

J'ai pris volontairement l'exemple des fichiers de logs mais gardez en tête que la commande « grep » peut s'utiliser dans n'importe quel type de fichiers.

Effectuer une recherche avancée avec grep

La commande « grep » s'accompagne de plusieurs fonctionnalités qui peuvent s'avérer réellement utiles ! Il est par exemple possible de faire un comptage du nombre de fois ou une chaine de caractères apparait dans une liste de fichiers, et sortir des résultats plus précis en fonction de certains critères.

Comme je suis quelqu'un de très pragmatique, commençons !
Dans l'exemple ci-dessous, nous allons prendre un cas concret. Disons que je travaille sur wordpress et que j'ai besoin de connaître tous les fichiers qui contiennent un lien dans lequel se trouve « /images ». Pour cela j'utiliserais la commande ci-dessous :

Bon, parlons-en parce que si vous êtes débutant, vous allez vite comprendre que cette commande bien qu'utile, n'est pas suffisante. En tapant cette commande, mon terminal me retourne la liste des fichiers (oui oui, tous les fichiers...) dans lequel il a trouvé la chaine de caractères que je lui ai demandé de chercher. C'est bien mais regardons le résultat de plus près :

Si on regarde de plus près les résultats de ma commande qu'est-ce que l'on peu y voir ? Non ? Toujours pas ? Allez je vous aide, ça ne vous dit rien ce petit numéro en fin de ligne ? Eh bien ce numéro correspond au nombre de fois où la chaine de caractère à été trouvée dans chaque fichier... « Super ! Mais ça change quoi ? ». 

Si vous êtes un peu curieux comme moi vous avez probablement dû tenter de taper cette commande dans votre terminal, dans le contexte qui vous intéresse, et vous avez dû avoir une liste interminable de réponses qui ressemblent vaguement à du Chinois ! Eh bien c'est normal ! Pourquoi ? (pourquoi pas ?!) Parce que on a dit en Français « Trouve "/images" dans tous les fichiers » donc logiquement, il affiche la réponse pour tous les fichiers...

La problématique c'est que cette liste à rallonge comporte les fichiers qui contiennent notre chaine de caractère, et les fichiers qui ont été testés, mais qui ne contiennent pas cette même chaîne, d'où le « :0 » à la fin de nos lignes. Cela signifie que le fichier à été testé, mais qu'il ne contient pas notre chaine de caractère.

Soyons alors un peu plus précis dans notre requête et filtrons nos résultats :

Voilà ! D'un coup notre liste est beaucoup plus utile puisque nous n'avons dans nos résultats que les fichiers qui contiennent notre chaine de caractères au minimum une fois. 

Voilà le résultat que j'obtiens grâce à cette commande :

Alors une dernière fois un peu plus loins ! Je veux que ma liste de résultats ne m'affiche que les fichiers contenus dans « /post » et dans « /header » ... 

Avec cette commande je retourne donc le résultat suivant :

Voilà ! Vous venez d'apprendre à effectuer des recherches plus où moins précises en fonction de vos besoins, mais parlons un peu de tout ça car au fil de mes exemples je ne suis volontairement pas revenu sur le détail de mes arguments :

  • --color=always : permet de coloriser un peu vos résultats
  • -r : indique que notre opération s'effectue de façon récursive
  • -i : on précise que notre commande est insensible à la casse
  • -c : retourne le nombre de fois où la chaîne est trouvée
  • -v : exclu la chaîne de caractère passée avec cet argument
  • -E : fait passer un regex contenant plusieurs résultats sous la forme « "(chaine1|chaine2|chaine3)" » et ainsi de suite avec autant de chaînes que vous le souhaitez. De cette façon on dit à la requête que l'on veut tous les résultats qui contiennent « chaine1 », « chaine2 » et « chaine3 ». Le caractère pipe « | » sert de séparateur dans ce contexte. Vous écrirez donc « "(chaine1|chaine2|chaine3)" ».

Si vous avez lu la totalité de ce tutoriel, alors bravo, vous avez fait un énorme pas en avant. Pour ma part j'utilise tous les jours le terminal pour effectuer divers opérations de maintenance ou pour m'aider dans mes phases d'intégration & développement.

Ce tutoriel est un condensé de tout ce que j'ai eu l'occasion d'apprendre au cours de ces dernières années et dites-vous que je n'ai saisi que très récemment l'intérêt de maîtriser ces commandes pour gagner en productivité et en efficacité.

Pour aller plus loin,
et gagner en productivité

Comme vous l'avez vu, certaines opérations sont un peu redondantes. Maintenant que vous vous êtes familiarisé avec votre terminal et que nous avons démystifié cette grosse boîte noire que sont les lignes de commande (CLI) vous êtes maintenant prêts pour une des meilleures astuces que j'ai pu découvrir.

Rendez-vous sur l'article Gagner en productivité avec Bashrc  pour découvrir les alias de commande ! Vous y gagnerez à coup sûr en productivité.