Serveur dédié : sauvegarde automatique des fichiers avec Backup Manager sur le serveur de sauvegarde OVH

Aujourd’hui, nous abordons la sauvegarde des fichiers essentiels du serveur.

Backup Manager permet d’effectuer des sauvegardes quotidiennes du système : il crée des archives dans plusieurs formats de compression (tar, gzip, bzip2, lzma, dar, zip) et peut les exporter vers un serveur FTP.

Dans notre cas, nous allons l’installer et le configurer pour envoyer tout ce qui est important sur notre serveur sur le serveur FTP externe de sauvegarde fourni gratuitement par OVH (100 Go).

Etape 1 : installation de Backup Manager

C’est classique :

apt-get install backup-managerCode language: JavaScript (javascript)

A la fin de l’installation, un assistant se lance et vous permet de configurer des options par défaut. Ou vous pouvez configurer à la main, comme indiqué dans l’étape suivante.

Etape 2 : configuration de Backup Manager

nano /etc/backup-manager.conf

Par défaut, les archives sont placées dans /var/archives, le répertoire doit être détenu par l’utilisateur root afin que personne d’autre ne puisse en consulter le contenu :

# Where to store the archives
export BM_REPOSITORY_ROOT="/var/archives"Code language: PHP (php)

Les archives seront conservées 5 jours :

# Number of days we have to keep an archive (Time To Live)
export BM_ARCHIVE_TTL="5"Code language: PHP (php)

Méthode de compression à utiliser :

export BM_ARCHIVE_METHOD="tarball"
export BM_TARBALL_FILETYPE="tar.gz"Code language: JavaScript (javascript)

Les différents répertoires à sauvegarder : /etc contient les fichiers de configuration des services serveur, /home les données des sites et /var/lib/mysql les bases de données :

# Paths without spaces in their name:
export BM_TARBALL_DIRECTORIES="/etc /home /var/lib/mysql"Code language: PHP (php)

Ensuite, on renseigne l’utilisateur MySQL dédié aux sauvegardes :

# The user who is allowed to read every databases filled in BM_MYSQL_DATABASES
export BM_MYSQL_ADMINLOGIN="backupuser"

# its password
export BM_MYSQL_ADMINPASS="backuppwd"Code language: PHP (php)

Enfin, on s’occupe de la manière dont on traite nos fichiers de sauvegarde. Dans notre cas, nous les uploadons sur le serveur FTP de sauvegarde OVH donc :

export BM_UPLOAD_METHOD="ftp"Code language: JavaScript (javascript)

Et plus bas :

# Timeout (in seconds) for FTP transfer
# This setting only has effect when using FTP transfer with
# secure mode disabled (BM_UPLOAD_FTP_SECURE to "false")
export BM_UPLOAD_FTP_TIMEOUT="3600"

# the user to use for the FTP connections/transfers
export BM_UPLOAD_FTP_USER="ksXXXXXXX.kimsufi.com"

# the FTP user's password
export BM_UPLOAD_FTP_PASSWORD="FTP-PASSWORD"

# FTP specific remote hosts
export BM_UPLOAD_FTP_HOSTS="ftpback-XXXX-XXXX.ovh.net"

# purge archives on remote hosts before uploading?
export BM_UPLOAD_FTP_PURGE="true"

# You can specify a time to live for archives uploaded with FTP
# This can let you use different ttl's locally and remotely
# By default, BM_ARCHIVE_TTL will be used.
export BM_UPLOAD_FTP_TTL="5"

# destination for FTP uploads (overrides BM_UPLOAD_DESTINATION)
export BM_UPLOAD_FTP_DESTINATION="/"Code language: PHP (php)

Allez maintenant au bas du fichier. Nous allons exécuter un script PHP à la fin de chaque sauvegarde qui nous avertira par email du bon déroulement de la sauvegarde :

# Enter here some shell script.
# It will be executed after the last action of backup-manager.
export BM_POST_BACKUP_COMMAND="/etc/backup-manager-email"Code language: PHP (php)

Sauvegardez le fichier et retournez dans le shell, la configuration est terminée.

Etape 3 : ouverture du port 21 dans iptables

On commence par activer les deux modules du kernel qui nous sont nécessaires pour le FTP:

modprobe ip_conntrack
modprobe ip_conntrack_ftp

Pour pouvoir communiquer avec le serveur FTP, il faut que le port 21 soit ouvert dans iptables:

iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED,NEW -j ACCEPTCode language: PHP (php)

Etape 4 : création du script PHP qui envoie un mail après la sauvegarde

On crée le fichier précedemment renseigné :

nano /etc/backup-manager-email

Et on y ajoute :

#!/usr/bin/php
<?php
/*
Plugin Name: Backup-Manager Email
Plugin URI: https://www.skyminds.net/?p=5315
Description: Sends a recap email to sysadmin after Backup-Manager has backed up the files.
Version: 2.0
Author: Matt Biscay
Author URI: https://www.skyminds.net/
*/
/* --- Changelog ---
v2.0 :
- PHP 7.x compatible
- switch from single recipient to recipient array
- better dir recursion
- fixed undefined variables
- new function to format file sizes
v1.0 : initial release
*/
$dest = array('ADMIN@EXAMPLE.COM');
$archives = '/var/archives';
$host = trim(file_get_contents('/etc/hostname'));
clearstatcache();
$pagetext = '';
$totalsize = 0;
// Function: Format Bytes Into TiB/GiB/MiB/KiB/Bytes
function format_filesize($rawSize) {
if($rawSize / 1099511627776 > 1) {
return number_format($rawSize/1099511627776, 1).' TiB';
} elseif($rawSize / 1073741824 > 1) {
return number_format($rawSize/1073741824, 1).' GiB';
} elseif($rawSize / 1048576 > 1) {
return number_format($rawSize/1048576, 1).' MiB';
} elseif($rawSize / 1024 > 1) {
return number_format($rawSize/1024, 1).' KiB';
} elseif($rawSize > 1) {
return number_format($rawSize, 0).' bytes';
} else {
return 'unknown';
}
}
$dir = opendir($archives);
if($dir) {
while(false !== ($filename = readdir($dir))) {
if($filename[0]!='.' && $filename[0]!='..' && preg_match('/'.date('Ymd').'/',$filename)) {
$thefile = $archives.'/'.$filename;
$size = exec("ls -l '".$thefile."' | awk '{print $5}'");
if($size>0) {
$pagetext.= $filename . " (". format_filesize($size) .")\n";
} else {
$pagetext.= $filename . " (". format_filesize($size) .")\n";
}
$totalsize += $size;
}
}
$pagetext.= "\nTotal : " . format_filesize($totalsize) ."\n";
}
foreach($dest as $d) {
  mail($d,'['.$host.'] Backup OK',$pagetext);
}Code language: PHP (php)
N’oubliez pas de modifier l’adresse email au début du script PHP !

Il ne vous reste plus qu’à rendre le script exécutable avec :

chmod +x /etc/backup-manager-email

Etape 5 : création d’une tâche cron pour automatiser les sauvegardes

Il ne nous reste plus qu’à automatiser tout cela, en utilisant CRON bien sûr. Lancez la commande suivante, qui crée le fichier /etc/backup-manager.sh :

cat << EOF > /etc/backup-manager.sh && chmod 700 /etc/backup-manager.sh
#!/bin/sh
test -x /usr/sbin/backup-manager || exit 0
/usr/sbin/backup-manager
EOFCode language: JavaScript (javascript)

Ensuite, éditez le crontab pour y ajouter votre ficher backup-manager.sh :

crontab -e

puis insérez la ligne :

0 5 * * * /etc/backup-manager.shCode language: JavaScript (javascript)

Vos données seront alors sauvegardées chaque matin à 5h.

Erreurs courantes et solutions

Si vous obtenez l’erreur Error reported by backup-manager-upload for method "ftp", check "/tmp/bmu-log.xxxxxx" qui renvoie vers Timeout at /usr/share/perl/5.20/Net/FTP.pm line 771, il faut impérativement augmenter la valeur de BM_UPLOAD_FTP_TIMEOUT.

Par défaut, BM_UPLOAD_FTP_TIMEOUT est de 120 secondes, ce qui est sous-dimensionné : si votre fichier de sauvegarde fait plus d’1 Go, cela risque de déclencher un timeout. Augmentez donc la valeur, j’ai mis 3600 secondes (1h) chez moi :

export BM_UPLOAD_FTP_TIMEOUT="3600"Code language: JavaScript (javascript)

Conclusion

Voilà, vous êtes parés : toutes les données vitales du serveur sont maintenant sauvegardées automatiquement sur le serveur de sauvegarde OVH.

Il ne vous reste plus qu’à vous connecter sur le serveur de sauvegarde via le serveur et vérifier que les fichiers sont effectivement uploadés. Un pas de plus vers la redondance/intégrité des données.

Des obstacles techniques ? Je trouve des solutions sur-mesure pour que votre site WordPress/WooCommerce fonctionne sans accroc.

Contactez-moi pour un diagnostic gratuit »

Gravatar for Matt Biscay

Développeur certifié WordPress & WooCommerce chez Codeable, administrateur système et enseignant-chercheur, je mets mon expertise au service de vos projets web.

Ma priorité : des sites performants, fiables et sécurisés, pensés pour offrir la meilleure expérience utilisateur. J’accompagne chaque client avec écoute et pédagogie, pour transformer vos idées en solutions concrètes et durables.

Profitez de solutions WordPress et WooCommerce sur-mesure, pensées pour optimiser durablement votre site.
Explorez les leviers pour booster l’impact de votre site web.

36 pensées sur “Serveur dédié : sauvegarde automatique des fichiers avec Backup Manager sur le serveur de sauvegarde OVH”

  1. Bonjour,

    bravo pour tous ces tutos, c’est vraiment très instructif.

    J’ai un souci avec la sauvegarde sur ftp via backup manager. Les archives sont bien créées dans /var/archives, la connexion au ftp est bonne mais j’ai le message suivant si je lance le backup en mode verbose :

    root@sd-XXXXX:/home/user# backup-manager --verbose
    Fichier /var/archives/sd-XXXXX.dedibox.fr-etc.20120520.master.tar.gz existe déjà ; ignoré.
    Fichier /var/archives/sd-XXXXX.dedibox.fr-home.20120520.master.tar.gz existe déjà ; ignoré.
    Fichier /var/archives/sd-XXXXX.dedibox.fr-var-lib-mysql.20120520.master.tar.gz existe déjà ; ignoré.
    Trying to upload files with ftp
    Logged on dedibackup-bzn.online.net, in / (FTP binary mode)
    Cleaning remote directory through FTP
    Erreur rapportée par backup-manager-upload pour la méthode « ftp », voir « /tmp/bmu-log.6slJGp ».
    

    Pourtant je peux uploader mes fichiers de sauvegarde manuellement via ftp en utilisant la commande put.

    Si j’ouvre le log d’erreur qui vient d’être créé :

    Can't use an undefined value as a symbol reference at /usr/share/perl/5.10/Net/FTP/dataconn.pm line 54.

    voici le contenu de mon fichier dataconn.pm :

    ## Generic data connection package
    ##
    
    package Net::FTP::dataconn;
    
    use Carp;
    use vars qw(@ISA $timeout $VERSION);
    use Net::Cmd;
    use Errno;
    
    $VERSION = '0.11';
    @ISA     = qw(IO::Socket::INET);
    
    
    sub reading {
      my $data = shift;
      ${*$data}{'net_ftp_bytesread'} = 0;
    }
    
    
    sub abort {
      my $data = shift;
      my $ftp  = ${*$data}{'net_ftp_cmd'};
    
      # no need to abort if we have finished the xfer
      return $data->close
        if ${*$data}{'net_ftp_eof'};
    
      # for some reason if we continously open RETR connections and not
      # read a single byte, then abort them after a while the server will
      # close our connection, this prevents the unexpected EOF on the
      # command channel -- GMB
      if (exists ${*$data}{'net_ftp_bytesread'}
        && (${*$data}{'net_ftp_bytesread'} == 0))
      {
        my $buf     = "";
        my $timeout = $data->timeout;
        $data->can_read($timeout) && sysread($data, $buf, 1);
      }
    
      ${*$data}{'net_ftp_eof'} = 1;    # fake
    
      $ftp->abort;                     # this will close me
    }
    
    
    sub _close {
      my $data = shift;
      my $ftp  = ${*$data}{'net_ftp_cmd'};
    
      $data->SUPER::close();
    
      delete ${*$ftp}{'net_ftp_dataconn'}
        if exists ${*$ftp}{'net_ftp_dataconn'}
    

    Une idée de ce qui coince ?

    Reply
    • Salut astiritsa,

      Vérifie dans backup-manager.conf que tu as bien le paramètre suivant :

      export BM_UPLOAD_FTP_PASSIVE="true"

      Apparemment, ce serait l’activation du mode passif qui permettrait de résoudre l’erreur.

      Reply
      • Merci Matt, ça marche parfaitement grâce à toi !
        Tu l’as vu grâce à ce que j’ai posté ou c’est un problème que tu avais déjà rencontré ?

        Encore merci !

      • Je t’en prie astiritsa :)

        Non, je n’avais jamais eu cette erreur avant. J’ai fait quelques recherches pour voir si c’était une erreur connue et la plupart du temps, le problème est dû au mode passif du FTP.

        A bientôt!

      • Salut à vous,

        Et si export BM_UPLOAD_FTP_PASSIVE=”true”
        est déjà à true ?

        Backup-manager crée bien les fichiers, les identifiants ftp sont corrects, j’arrive à m’y connecter à partir de la commande ftp sous debian, mais j’ai toujours cette erreur ?

  2. Bonjour,
    Je me renseigne sur la sauvegarde de mon site actuellement et j’aime ce tutoriel sur backup-manager. Mais avant d’essayer d’installer quoique ce soit, il me viens une question car Sauvegardez c’est bien, mais comment restaure-t-on ?

    Je suis Nouveau sur Linux, excusez les questions con :) Mais imaginez que demain je plante mon serveur kimsufi. Je vais sur le manager, je réinstalle debian. La il me faut faire un apt-get install de tout ce qu’il y avais précédemment sur le serveur. Une fois effectuer le dossier /etc/ devrait reconfigurer tout ca très vite. Le dossier /home remettra les fichiers du site et /var/lib/mysql réinstallera la BDD.

    Mais comment réimporter les fichiers de la zone de backup vers le kimsufi ?
    Aucun tutoriel lu n’explique cette manœuvre :)

    Reply
    • Salut furtifias,

      Personnellement, je rapatrie régulièrement les fichiers créés par backup-manager chez moi. Lors de mon changement de serveur, j’ai tout simplement réuploadé les répertoires /home /etc /var/lib/mysql depuis mon client FTP.

      C’est rapide et je n’ai copié que les fichiers dont j’avais vraiment besoin.

      Reply
  3. Bonsoir, tuto très intéressant :)
    mais j’ai une question est il d’application pour un centos 5 avec cpanel ?
    Je demande sa pour le port 21 et surtout l’installation via yum :)
    Merci

    Reply
    • Bonsoir gtraxx,

      Je n’utilise pas CentOS mais normalement, la configuration devrait être très similaire. Pour le port 21, c’est standard.

      Pour yum, il faut remplacer aptitude par yum.

      Reply
  4. Je ne comprends pas bien pourquoi “backup-manager-email” m’envoie toujours la taille des archives SQL égale à 0, alors que j’ai bien vérifié que les fichiers sont parfaitement et complètement envoyés dans les archives, puis sur le serveur de backup. Pour ce faire, j’ai effectué l’opération inverse, à savoir le transfert des fichiers SQL du backup dans un répertoire temporaire sur le serveur, puis j’en ai décompressé un ou deux pour m’apercevoir qu’ils étaient bien complets.
    En effet, les fichiers les plus importants d’un site sont ceux de la base de données. C’est pourquoi je me suis beaucoup inquiété de leur absence présumée sur le serveur de backup. Pour rien ?

    Reply
    • Bonjour,

      Dans l’email envoyé, la taille des fichiers est exprimée en giga-octets (Go) donc suivant la taille de la base de données, c’est normal d’avoir un nombre proche de zéro.

      A titre d’exemple, mes bases compressées font 20 Mo mais dans l’email j’obtiens :

      skyminds.net-var-lib-mysql.20120704.tar.gz (0.02 Go)

      Voilà, en espérant avoir répondu à vote inquiétude.

      Reply
  5. Bien ce tuto sur Backup manager, mais j’ai un probleme, j’arrive pas à sauvegarder les bases mysql, pourtant pourtant mon fichier de conf est bien remplit.

    Reply
  6. Bonjour,

    Je rencontre un problème avec ce tuto. Mon backup se créer bien dans le dossier de mon choix mais il ne s’upload pas sur le serveur FTP ovh…

    Pourtant je suis bien en mode passif, etc, je recois bien un email…mais quand je vais sur mon interface ovh, je vois que mon espace ftp est toujours vide.
    De plus je constate que les archives que je créer ne s’efface pas elle reste dans le dossier de backup sur mon disque dur…

    Une précision, je créer les archives dans le chemin
    export BM_REPOSITORY_ROOT=”/home/archives”

    Autre problème, elle ne s’efface pas donc a chaque fois les archives sont plus grosse et donc finisse par saturé mon HD..

    Ou est ce que je peux voir les log de cette manip ?

    Merci

    Reply
  7. Bonjour,
    Merci pour ce tuto !
    Je l’ai mis en place sur un serveur kimsufi, cela fonctionne.. un peu trop !
    Je reçois environ 160 mails à chaque sauvegarde !! :/
    On dirait que le script s’exécute pour chaque fichier ou chaque tâche…

    Une idée d’où cela peut venir ?

    Merci d’avance !

    Reply
    • Salut Sigmax,

      Je reçois le mail en double les deux premiers jours aussi sur ma kimsufi mais cela s’auto-corrige ensuite : un seul mail.

      Reply
      • Malheureusement cela ne s’est pas auto-corrigé… Je reçois toujours environ 160 mails au moment de la sauvegarde… Et même si sur gmail je peux les supprimer rapidement tous les jours à l’heure de la sauvegarde j’ai le téléphone qui s’affole ^^

        Je vais être obliger de désactiver ce script… Si quelqu’un à une idée d’ou peut venir le problème je suis preneur !!

      • Salut Sigmax,

        Je ne comprends pas d’où peuvent venir ces 160 mails, je n’ai que 4 fichiers créés chaque jour donc au pire ce serait 4 mails.

        J’ai enlevé l’array de l’adresse email et l’ai remplacé par une simple variable. Dis-moi si cela corrige le problème.

      • Bonjour à tous,

        Finalement le lendemain de la modification j’ai recommencé à recevoir mes 160 mails quotidiens… Je me suis rendu compte que si je lancais manuellement /usr/sbin/backup-manager je ne recevais qu’un mail par contre mon cron 0 11 * * * /usr/sbin/backup-manager lui générait cette multitude de mails… J’ai donc relu l’article et je me suis rendu compte que pour le cron il fallait utiliser un script “/etc/backup-manager.sh”. Je l’ai créé, j’ai modifier le cron pour qu’il l’execute, je viens de fiare un test et ça à l’air bon !

        Je n’ai pas vraiment comprit ce que faisait ce script… mais ça à l’air de marcher !

      • Le script récupère la taille de chacun des fichiers de backup. Une fois la sauvegarde réalisée, il envoie un mail à l’admin avec ces infos.

  8. Bonjour,

    J’ai toujours un soucis avec le script de backup. Celui ci n’efface pas les backups contenu dans le repertoire home, du coup mon disque fini par saturé. J’ai volontairement fait les archive dans le repetoire home car j’avais besoin de garder de l’espace sur la partition principale.

    Autre point: mon espace backup sur ovh est déja saturé. Est ce que ca te semble normal avec ce genre de script.

    Dernieres question pour acceder a mon espace ftp, je dois passer par mon serveur, mais je cherche une méthode sans le shell. Comment faire ?

    Merci d’avance Matt pour ton aide.

    Reply
    • Salut Majeri,

      Je viens de vérifier et Backup Manager ne me laisse que :
      – 5 jeux de sauvegarde en local,
      – 10 jeux de sauvegarde sur le FTP de backup OVH.

      Les options du fichier /etc/backup-manager.conf sont bien respectées. Vérifie que tu as bien :

      pour le local :

      # Number of days we have to keep an archive (Time To Live)
      export BM_ARCHIVE_TTL="5"
      
      # Do you want to replace duplicates by symlinks?
      # (archive-DAY is a duplicate of archive-(DAY - 1) if they
      # are both the same according to MD5 hashes).
      export BM_ARCHIVE_PURGEDUPS="true"
      
      # Prefix of every archive on that box (default is HOSTNAME)
      export BM_ARCHIVE_PREFIX="$HOSTNAME"
      
      # Should we purge only archives built with $BM_ARCHIVE_PREFIX
      export BM_ARCHIVE_STRICTPURGE="true"
      

      pour le distant :

      # purge archives on remote hosts before uploading?
      export BM_UPLOAD_FTP_PURGE="true"
      
      # You can specify a time to live for archives uploaded with FTP
      # This can let you use different ttl's locally and remotely
      # By default, BM_ARCHIVE_TTL will be used.
      export BM_UPLOAD_FTP_TTL="10"

      Je laisse les sauvegardes sous /var/, je pense que ce n’est pas une bonne idée de placer les fichiers de sauvegarde sous /home/, sachant que c’est ce répertoire que l’on sauvegarde.

      Reply
  9. Bonjour,

    Merci pour le tuto très utile !
    Cependant ‘ai le même problème que dotMastaz ci-dessus, à savoir :
    mon hébergeur (Online) bloque depuis peu l’accès au FTP de backup en mode actif.
    Lorsque je configure backup manager en mode actif, j’obtiens l’erreur : “FTP active mode is forbidden, passive mode is mandatory. The upload transfer “ftp” failed.”

    Lorsque je le configure en mode passif, j’obtiens une erreur différente : “Can’t use an undefined value as a symbol reference at /usr/share/perl/5.10/Net/FTP/dataconn.pm line 54.”

    J’ai déjà exploré quelques pistes, ouvert les ports nécessaires au mode passif dans mon firewall et les ai déclaré dans la conf de Pure-ftpd, activé modprobe ip_conntrack_ftp et modprobe ip_nat_ftp comme conseillé dans la doc de pure-ftpd, mais rien à faire, backup-manager renvoie toujours une erreur.

    les fichiers de sauvegarde sont par contre bien créés sur le serveur principal, c’est juste l’upload sur le FTP de backup qui ne passe pas.

    Si quelqu’un a une solution, je le remercie d’avance !

    Reply
    • Bonjour,

      Je me réponds à moi-même après avoir testé une solution qui fonctionne, ça peut servir aux autres :
      il fallait en fait ouvrir une plage de port plus large dans Iptables.
      ça fonctionne avec les lignes
      modprobe ip_conntrack
      modprobe ip_conntrack_ftp
      iptables -t filter -A OUTPUT -p tcp –dport 21 -j ACCEPT
      iptables -A OUTPUT -o eth0 -p tcp –sport 1024:65535 –dport 1024:65535 -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT

      Reply
  10. Bonjour,

    Merci pour ce tuto. Tout fonctionne à merveille sauf l’envoi de mails, je ne reçois aucun mail après sauvegarde. Pouvez-vous m’aider un peu ?

    Reply
  11. Bonjour,

    j’utilise ce script depuis un an, mais j’aimerais savoir s’il est possible de limiter la bande passante via FTP ?

    Reply
    • Bonjour Cyril,

      Je n’ai vu aucune option permettant de limiter la bande passante. Si cela sature ta connexion réseau, essaie de lancer la sauvegarde la nuit.

      Reply
  12. Salut Matt, tout d’abord merci pour tous tes tutos qui sont vraiment très bien fait !

    J’ai mis en place Backup Manager, et je voudrais en savoir plus sur comment exploiter les sauvegardes SQL.
    Je m’explique: lorsque j’ouvre mon tar.gz j’accède à var/lib/mysql et un dossier par BDD. Dans ce dossier je trouve que des fichiers *.frm. J’ai cru comprendre qu’il s’agissait que de la structure des tables sans les données ! Ne peux t-on pas faire des sauvegardes en format sql directement ? peut-on et comment reconstituer ma bdd à partir de frm ? merci d’avance :)

    Reply
  13. (Après la guerre :)

    Ne pas oublier le –no-burn si vous souhaitez tester le script avant laisser le cron faire son truc. Backup-Manager va automatiquement chercher à graver un CD si vous l’appelez par le prompt. Je n’ai pas essayé de comprendre pourquoi mais c’est un problème connu. C’est peut-être même volontaire!

    Reply
  14. Mise à jour de l’article :
    – nouvelle version du script PHP (compatible PHP 7.1),
    – ajout de la rubrique “Erreurs courantes et solutions”.

    Reply

Opinions