Sauvegarde automatique sur Yandex.Disk

Yandex.Disk est l'un des rares services Yandex dont il fait partie Logiciel pour le bureau. Et l'un de ses composants les plus importants est l'algorithme de synchronisation fichiers locaux avec leur copie dans le cloud. Nous avons récemment dû le changer complètement. Si l'ancienne version pouvait difficilement digérer même plusieurs dizaines de milliers de fichiers et, de plus, ne réagissait pas assez rapidement à certaines actions "complexes" des utilisateurs, la nouvelle, utilisant les mêmes ressources, fait face à des centaines de milliers de fichiers.

Dans cet article, je vais vous expliquer pourquoi cela s'est produit : ce que nous n'aurions pas pu prévoir lorsque nous avons créé la première version du logiciel Yandex.Disk, et comment nous en avons créé une nouvelle.

Tout d'abord, sur la tâche même de synchronisation. Techniquement parlant, cela consiste à conserver le même ensemble de fichiers dans le dossier Yandex.Disk sur l'ordinateur de l'utilisateur et dans le cloud. C'est-à-dire que les actions de l'utilisateur telles que renommer, supprimer, copier, ajouter et modifier des fichiers doivent être automatiquement synchronisées avec le cloud.

Pourquoi n'est-ce pas aussi facile qu'il y paraît à première vue ?

En théorie, la tâche peut sembler assez simple, mais en réalité, nous sommes confrontés à diverses situations difficiles. Par exemple, une personne a renommé un dossier sur son ordinateur, nous l'avons détecté et avons envoyé une commande au backend. Cependant, aucun des utilisateurs n'attend que le backend confirme que le changement de nom a réussi. Une personne ouvre immédiatement son dossier renommé localement, y crée un sous-dossier et, par exemple, y transfère certains des fichiers. Nous sommes dans une situation où il est impossible d'effectuer immédiatement toutes les opérations de synchronisation nécessaires dans le cloud. Vous devez d'abord attendre la fin de la première opération, puis vous pouvez continuer.

La situation peut devenir encore plus compliquée si plusieurs utilisateurs travaillent avec le même compte en même temps ou s'ils ont un dossier partagé. Et cela se produit assez souvent dans les organisations utilisant Yandex.Disk. Imaginez que dans l'exemple précédent, au moment où nous avons reçu la confirmation du backend pour le premier changement de nom, un autre utilisateur prend et renomme à nouveau ce dossier. Dans ce cas, encore une fois, vous ne pouvez pas effectuer immédiatement les actions que le premier utilisateur a déjà effectuées sur son ordinateur. Le dossier dans lequel il travaillait localement était déjà appelé différemment sur le backend à ce moment-là.

Il arrive parfois qu'un fichier sur l'ordinateur d'un utilisateur ne puisse pas être nommé de la même manière qu'il est appelé dans le cloud. Cela peut arriver s'il y a un caractère dans le nom qui ne peut pas être utilisé par le système de fichiers local, ou si l'utilisateur est invité à dossier partagé, et il a son propre dossier avec ce nom. Dans de tels cas, nous devons utiliser des alias locaux et suivre leur relation avec les objets dans le cloud.

Version précédente de l'algorithme

Dans la version précédente du logiciel de bureau Yandex.Disk, un algorithme de comparaison d'arborescence était utilisé pour rechercher les modifications. Aucune autre solution à l'époque ne permettait de mettre en œuvre la recherche de relocalisations et de renommages, car le backend ne disposait pas d'identifiants d'objets uniques.

Dans cette version de l'algorithme, nous avons utilisé trois arbres principaux : local (Local Index), cloud (Remote Index) et le dernier synchronisé (Stable Index). De plus, pour empêcher la régénération d'opérations de synchronisation déjà en file d'attente, deux autres arborescences auxiliaires ont été utilisées : l'attendu local et le cloud attendu (Index distant attendu et Index local attendu). Ces arbres auxiliaires stockaient l'état attendu du local système de fichiers et le cloud, après avoir terminé toutes les opérations de synchronisation qui sont déjà en file d'attente.



La procédure de comparaison d'arbres dans l'ancien algorithme ressemblait à ceci :
  1. Si l'arbre local en attente et l'arbre cloud en attente sont vides, initialisez-les en copiant le dernier arbre synchronisé ;
  2. Nous comparons l'arborescence locale avec celle du cloud attendue et, sur la base des résultats de la comparaison des nœuds individuels, ajoutons des opérations de synchronisation dans le cloud à la file d'attente (création de collections, transfert de fichiers vers le cloud, déplacement et suppression dans le cloud) ;
  3. Pour toutes les opérations mises en file d'attente à l'étape précédente, nous corrigeons leur effet futur dans l'arborescence cloud attendue ;
  4. Nous comparons l'arborescence du cloud avec celle locale attendue et, sur la base des résultats de la comparaison des nœuds individuels, ajoutons des opérations de synchronisation avec le système de fichiers local à la file d'attente (création de répertoires, téléchargement de fichiers depuis le cloud, déplacement et suppression de fichiers et répertoires locaux) ;
  5. Pour toutes les opérations qui ont été mises en file d'attente à l'étape précédente, nous corrigeons leur effet futur dans l'arborescence locale attendue ;
  6. Si la file d'attente comprend des opérations simultanées avec le même fichier ou répertoire (par exemple, transférer un fichier vers le cloud et télécharger le même fichier depuis le cloud), nous résolvons un conflit - le fichier a changé à deux endroits ;
  7. Une fois l'opération de synchronisation effectuée dans le cloud ou avec le système de fichiers local, nous entrons son résultat dans la dernière arborescence synchronisée ;
  8. Lorsque la file d'attente de synchronisation devient vide, nous supprimons l'arborescence locale en attente et en attente cloud. La synchronisation est terminée, et nous n'en aurons plus besoin.

Pourquoi nous avons dû proposer un nouvel algorithme

Les principaux problèmes de l'algorithme de comparaison d'arbres étaient la grande consommation de mémoire et la nécessité de comparer les arbres entiers même avec de petits changements, ce qui a entraîné une charge importante sur le processeur. Lors du traitement des modifications, même un fichier utilisant mémoire vive augmenté d'environ 35 %. Disons qu'un utilisateur avait 20 000 fichiers. Ensuite, avec un simple changement de nom d'un fichier de 10 Ko, la consommation de mémoire a augmenté brusquement - de 116 Mo à 167 Mo.

Nous voulions également augmenter quantité maximale fichiers avec lesquels l'utilisateur peut travailler sans problème. Plusieurs dizaines voire centaines de milliers de fichiers peuvent être, par exemple, un photographe qui stocke les résultats de séances photo dans Yandex.Disk. Cette tâche est devenue particulièrement urgente lorsque les utilisateurs ont eu la possibilité d'acheter de l'espace supplémentaire sur Yandex.Disk.

Dans le développement, je voulais aussi changer quelque chose. Débogage ancienne version a causé des difficultés, car les données sur les états d'un élément étaient dans des arbres différents.

À cette époque, l'identification des objets est apparue sur le backend, avec l'aide de laquelle il était possible de résoudre plus efficacement le problème de la détection des mouvements - auparavant, nous utilisions des chemins.

Nouvel algorithme

Nous avons décidé de modifier la structure de stockage des données et de remplacer trois arbres (Index local, Index distant, Index stable) par un seul, ce qui aurait dû entraîner une diminution de la redondance dans la structure de données principale. En raison du fait que la clé dans l'arborescence est le chemin d'accès à un élément du système de fichiers, à la suite de la fusion, la quantité de RAM utilisée a été considérablement réduite.



Nous avons également abandonné l'utilisation d'arbres auxiliaires lors de la synchronisation, car chaque élément de l'arbre de la nouvelle version stocke toutes les données nécessaires. Ce changement de structure a rendu beaucoup plus facile le débogage de votre code.

Ayant compris qu'il s'agissait d'un changement majeur, nous avons créé un prototype qui a confirmé l'efficacité de la nouvelle solution. Regardons un exemple de la façon dont les données de l'arborescence changent lors de la synchronisation d'un nouveau fichier.

  1. Une fois que l'utilisateur a ajouté au dossier Disque nouveau fichier, le programme l'a détecté et a ajouté un nouvel élément à l'arborescence. Cet élément n'a qu'un seul état connu - local. Puisqu'il n'y a pas d'états stables et distants, aucune mémoire ne leur est allouée ;
  2. Le programme télécharge le fichier. Un push vient du cloud, confirmant l'apparition d'un nouveau fichier, et un état distant est ajouté à l'arborescence ;
  3. Les états local et distant sont comparés. Puisqu'ils sont identiques, un état stable est ajouté ;
  4. Les états local et distant sont supprimés. Ils ne sont plus nécessaires, car toutes les informations sont stables.



Cet exemple montre que dans le nouvel algorithme de synchronisation, seuls les éléments et événements sont traités, les données sur les modifications qui ont été reçues du système de fichiers ou du cloud, et non l'ensemble de l'arborescence comme c'était le cas auparavant. Si nécessaire, les nœuds parents ou enfants seront traités (par exemple, en cas de déplacement d'un dossier).

Autres améliorations

Dans la nouvelle version, nous avons travaillé sur d'autres améliorations qui ont un impact sur les performances. L'enregistrement de l'arborescence a été rendu incrémentiel, ce qui permet d'écrire uniquement les dernières modifications dans le fichier.

Yandex.Disk utilise les condensés sha256 et MD5 pour vérifier l'intégrité des fichiers, détecter les fragments modifiés et dédupliquer les fichiers sur le backend. Étant donné que cette tâche charge lourdement le processeur, dans la nouvelle version, la mise en œuvre des calculs de résumé a été considérablement optimisée. La vitesse de réception d'un condensé de fichier a été augmentée d'environ deux fois.

Nombres

Synchronisation de 20 000 fichiers uniques de 10Kb

Calcul des condensés de 20 000 fichiers uniques, 10 Ko chacun (indexation)

Exécuter à partir de 20 000 fichiers synchronisés de 10 Ko

Téléchargez 1 Go. Connexion Wifi 10 Mbits
Temps, secondes

Qu'est-il arrivé

Les exemples montrent que une nouvelle version Le logiciel Yandex.Disk utilise environ 3 fois moins de RAM et environ 2 fois moins de charge CPU. La gestion de petites modifications n'augmente pas la quantité de mémoire utilisée.

À la suite des modifications apportées, le nombre de fichiers que le programme peut gérer sans aucun problème a considérablement augmenté. La version Windows contient 300 000 fichiers et la version Mac OS X 900 000 fichiers.

Ce n'est un secret pour personne pourquoi vous devez sauvegarder. Par exemple, il sera pratique pour un développeur Web de faire des sauvegardes si, pendant le processus de développement, il fait une erreur inaperçue par lui-même, et après quelques heures, l'erreur "apparaît" à la surface et il ne reste absolument plus de temps. pour trouver et corriger l'erreur. Bien entendu, Vscale dispose d'un système de sauvegarde, mais il ne prévoit que la copie des données de l'ensemble du serveur dans son ensemble. Et la possibilité de restaurer à partir d'une sauvegarde n'est disponible que sur le serveur à partir duquel la copie a été effectuée. Cette capacité ne satisfait pas tout à fait les besoins d'un développeur Web conditionnel. Cependant, le monde a maintenant une tendance "cloud" bien développée: hébergement cloud, cloud VPS, stockage en ligne données et ainsi de suite. Dans ce guide, nous allons vous montrer comment configurer le stockage de sauvegarde dans le cloud. Yandex.Disk nous aidera avec cela.

Les pré-requis techniques

  • Ubuntu 16.04
  • Compte dans Yandex (il est courant pour Ya.Pochta, Ya.Deneg et Ya.Disk)

Étape 1. Installation et configuration du client de la console Yandex

Commençons par installer le composant clé - le client pour Ya.Disk. Puisqu'il n'y a pas de package avec le client Ya.Disk dans la liste standard des référentiels, vous devrez ajouter le référentiel manuellement, puis mettre à jour l'index du package et ensuite seulement installer le package avec le client. Il y a une liste sur le site Web de Ya.Disk les commandes requises en une ligne :

écho "deb http://repo.yandex.ru/yandex-disk/deb/ stable main"| sudo tee -a /etc/apt/sources.list .d/yandex.list>/dev/null && wget http : //repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG -O- | sudo apt-key add - && sudo apt-get update && sudo apt-get install -y yandex-disk

Le client Yandex a été installé avec succès et vous pouvez commencer à le configurer. Yandex s'est assuré que le client travaillait au minimum avec les fichiers de configuration et a ajouté la possibilité de tout configurer avec une seule commande :

Configuration du disque Yandex

L'ordre de travail de la commande ci-dessus :

  1. Dois-je utiliser un serveur proxy ? (o/n)
  2. Connectez-vous à votre compte (identifiant et mot de passe)
  3. Quel dossier dois-je utiliser pour stocker mes fichiers localement ? (Laissez le champ vide et le programme créera un dossier Yandex.Disk dans le répertoire personnel (pour Ubuntu c'est / racine /). Veuillez noter qu'après avoir confirmé l'action, il faudra un certain temps au client pour synchroniser les fichiers dans le cloud ou sur le serveur)
  4. Voulez-vous démarrer Ya.Disk au démarrage du système ? (o/n)

Assurez-vous de démarrer automatiquement Ya.Disk et vous pouvez personnaliser le reste des éléments à votre discrétion. À ce stade, le réglage peut être considéré comme terminé.

Étape 2. Créer et configurer une sauvegarde

Pour créer sauvegarde, il existe de nombreuses commandes à utiliser. Python ou perl peuvent vous aider, mais il est plus pratique de le faire en utilisant bash. Il est simple et facile à utiliser et interagit directement avec la console. Créez un script bash :

Nano /var/backup.sh

Collez-y le code suivant :

CHEMIN_SERVEUR = "/var/www/html"
cur_date = `date +% Y-% m-% d`
nom de fichier = "sauvegarde -" $ cur_date ".tar.bz2"

tar -cjf $ nom de fichier $ CHEMIN_SERVEUR

if [-f $ nom de fichier] ; ensuite
mv $ nom de fichier /root/Yandex.Disk/backup/
synchronisation de disque Yandex
Fi

Enregistrez le fichier avec le raccourci clavier Ctrl + O, confirmez l'action avec la touche Entrer et fermez le fichier avec le raccourci clavier Ctrl + X... Assurez-vous d'attribuer des autorisations au fichier afin qu'il ait accès aux commandes système (créer et déplacer des dossiers, accéder aux répertoires) :

Cd/var
chmod -R 755 * backup.sh

En bref sur ce que fait le script :

  1. Crée une archive avec le contenu du dossier / var / www / html / dans le dossier où se trouve le script lui-même ;
  2. Donne à l'archive de sauvegarde un nom comme sauvegarde-2015-11-25.tar.bz2;
  3. Télécharge une sauvegarde sur Ya.Disk dans un dossier / sauvegarde /.

Vous pouvez vérifier si le script fonctionne avec la commande suivante :

Cd / var && ./backup.sh

À la suite de l'exécution de la commande, l'archive sera chargée dans stockage en ligne.

Étape 3. Automatisez la création de sauvegarde

L'étape suivante et finale consiste à ajouter le script au planificateur de tâches. Nous aidera avec ce crontab. Ouvrez la liste des tâches planifiées :

Crontab -e

À la toute fin, ajoutez la ligne :

0 0 * * * /var/backup.sh

Désormais, Crontab exécutera le script tous les jours à minuit. Ceci termine la configuration de la sauvegarde automatique.

Conclusion

Vous avez configuré avec succès création automatique une sauvegarde pour le répertoire de votre site Web. C'est un algorithme très utile pour éviter de perdre une sauvegarde si elle était stockée sur le serveur lui-même. Par le même principe, vous pouvez faire des copies de sauvegarde des fichiers de configuration. Généralement technologies cloud bon car ils offrent une haute disponibilité et une sécurité de stockage des données personnelles. Choisir le cloud est un bon choix.

Vous devrez peut-être télécharger des sauvegardes de projets (sites) sur Yandex.Disk pour plusieurs raisons, par exemple, en raison d'un manque d'espace sur le serveur (hébergement, VDS, VPS) ou pour augmenter la sécurité du stockage des sauvegardes (au cas où le serveur est sans raid et il quitte le bâtiment).

À cet égard, j'ai écrit pour moi-même et j'ai décidé de publier pour les autres un petit script bash pour la sauvegarde sur Yandex.Disk. Fonctions de script :
- Création de projets de sauvegarde sur le serveur (fichiers + bases de données MySQL) ;
- Autorisation sur Yandex.Disk en tant qu'application (à l'aide d'un jeton, un moyen plus sûr que d'utiliser un nom d'utilisateur et un mot de passe);
- Envoi de sauvegardes du serveur à Yandex.Disk ;
- Suppression des anciennes sauvegardes de Yandex.Disk pour économiser de l'espace (nombre maximal configurable de sauvegardes stockées);
- Enregistrement et envoi d'un journal par e-mail (paramétrable).

Pour utiliser le script, vous devez d'abord obtenir un jeton de Yandex.Disk. Commençons.

1. Connectez-vous à Yandex sous le compte sur lequel nous effectuerons la sauvegarde, accédez à oauth.yandex.ru et cliquez sur « Enregistrer une nouvelle application ».

2. Renseignez le nom de l'application (par exemple, "sauvegarde") et émettez les droits nécessaires dans la section "Yandex.Disk REST API", à savoir : "Accès aux informations sur le Disque" et "Accès au dossier de l'application sur le Disque".


Ci-dessous, sur la même page, sous le champ "URL de rappel", cliquez sur "Soumettre l'URL pour le développement" et cliquez sur "Enregistrer":


3. Après avoir enregistré les paramètres de l'application, nous serons redirigés vers la page contenant les données de l'application :


4. Maintenant, nous obtenons le jeton lui-même (si vous le souhaitez, vous pouvez en savoir plus à ce sujet dans le manuel Yandex), pour cela, nous copions l'ID, le substituons à la fin de l'URL https://oauth.yandex.ru/ autorise?response_type=token&client_id=, accédez à l'adresse résultante et confirmez la délivrance des autorisations à l'application :


En conséquence, un jeton sera affiché sur la page, qui est émis pour au moins 1 an, donc si le script de sauvegarde cesse soudainement de fonctionner, nous pouvons obtenir un nouveau jeton et le remplacer dans le script. Vous pouvez tester les capacités de travail avec Yandex.Disk en utilisant le jeton reçu sur un terrain d'essai spécial.

Et maintenant, le script bash lui-même pour une sauvegarde sur Yandex.Disk :

#! / bin / bash # # Script de sauvegarde Yandex.Disk v1.0 par Sergey Lukonin (neblog.info) # # # # # # # # # # # PARAMÈTRES DE SAUVEGARDE MYSQL # # # # # # # # # # # # Serveur DB MYSQL_SERVER = mysql.some-server.ru # L'utilisateur sous lequel nous allons sauvegarder les bases de données disponibles, la racine mysql est généralement accessible à toutes les bases de données, l'utilisateur individuel a généralement accès à la base de données d'un projet spécifique MYSQL_USER = some-user # Mot de passe de l'utilisateur de la base de données (Mot de passe de la racine du serveur et ne pas confondre les différents de la racine de mysql) MYSQL_PASSWORD = un mot de passe # # # # # # # # # # REGLAGES GENERALES # # # # # # # # # # # # pour le stockage temporaire des sauvegardes, qui sont supprimées après l'envoi à Yandex .. Sauvegarde de disque (0 - conserver toutes les sauvegardes): MAX_BACKUPS = "14" # Date utilisée dans les noms d'archive DATE = `date" +% Y-% m-% d "` # Répertoires d'archivage (séparés par un espace), qui seront placés dans une seule archive et envoyés à Yandex.Disk DIRS = "/ home / www / projects / neblog" # Jeton Yandex.Disk (voir neblog.info pour comment l'obtenir) TOKEN = "" # Le nom du fichier journal, stocké dans deer le répertoire spécifié dans $ BACKUP_DIR LOGFILE = "backup.log" # E-mail pour envoyer le résultat de l'exécution du script. Laissez vide si vous ne souhaitez pas soumettre de résultats. sendLog = " [email protégé] "# Envoyer uniquement les erreurs (true). Spécifiez false si vous souhaitez envoyer des journaux pour tout résultat de l'exécution du script. SendLogErrorsOnly =" false "# # # # # # # # # # FIN DES PARAMÈTRES # # # # # # # # # # # # # # # # # # # # # # NE CHANGER RIEN RIEN ! # # # # # # # # # # # Fonction mailing () (if [! $ SendLog = ""]; then if ["$ sendLogErrorsOnly " == true ]; then if echo "$ 1" | grep -q "error" then echo "$ 2" | mail -s "$ 1" $ sendLog> / dev / null fi else echo "$ 2" | mail -s "$ 1" $ sendLog> / dev / null fi fi) fonction logger () (echo "[" `date" +% Y-% m-% d% H:% M:% S "` "] Fichier $ BACKUP_DIR: $ 1" >> $ BACKUP_DIR / $ LOGFILE) fonction parseJson () (local output regex = "(\" $ 1 \ ": [\"]?) ([^ \ ", \)] +) ( [\"]?) "[[$ 2 = ~ $ regex]] && output = $ (BASH_REMATCH) echo $ output) fonction checkError () (echo $ (parseJson "error" "$ 1")) fonction getUploadUrl () (json_out = `curl -s -H" Autorisation: OAuth $ TOKEN "https: //cloud-api.yandex.net: 443 / v1 / disk / resources / upload /? Path = app: / $ backupName & overwrite = true ` json _error = $ (checkError "$ json_out") if [[$ json_error! = ""]]; puis logger "$ PROJECT - Yandex.Disk error: $ json_error" mailing "$ PROJECT - Yandex.Disk backup error" "ERROR copy file $ FILENAME. Yandex.Disk error: $ json_error" echo "" else output = $ (parseJson " href "$ json_out) echo $ output fi) fonction uploadFile (local json_out local uploadUrl local json_error uploadUrl = $ (getUploadUrl) if [[$ uploadUrl! =" "]]; then echo $ UploadUrl json_out =` curl -s -T $ 1 -H "Authorization: OAuth $ TOKEN" $ uploadUrl` json_error = $ (checkError "$ json_out") if [[$ json_error! = ""]]; Then logger "$ PROJECT - Yandex.Disk error: $ json_error" mailing " $ PROJECT - Yandex.Disk backup error "" ERREUR copier le fichier $ FILENAME. Yandex.Disk error: $ json_error "else logger" $ PROJECT - Copier le fichier sur Yandex.Disk avec succès "mailing" $ PROJECT - Yandex.Disk backup success " " SUCCESS copy file $ FILENAME "fi else echo" Des erreurs se sont produites. Vérifiez le fichier journal pour plus de détails "fi) function backups_list () (# Recherchez tous les fichiers de sauvegarde dans le répertoire de l'application et affichez leurs noms : curl -s -H "Autorisation : OAuth $ TOKEN" "https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/&sort=created&limit=100" | tr "()," "\ n" | grep "nom [[: graphe:]] *. tar.gz" | couper -d: -f 2 | tr -d "" ") function backups_count () (local bkps = $ (backups_list | wc -l) # Si nous sauvegardons à la fois les fichiers et la base de données, alors nous avons 2 fichiers pour 1 sauvegarde. Par conséquent, le nombre de sauvegardes = le nombre de fichiers / 2: expr $ bkps / 2) fonction remove_old_backups () (bkps = $ (backups_count) old_bkps = $ ((bkps - MAX_BACKUPS)) if ["$ old_bkps" -gt "0"]; then logger " Supprimer les anciennes sauvegardes de Yandex ... Disque "# Cycle de suppression des anciennes sauvegardes : # Suppression du premier fichier de la liste 2 * old_bkps fois pour i in` eval echo (1 .. $ ((old_bkps * 2))) `; do curl -X DELETE -s - H" Autorisation : OAuth $ TOKEN "" https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/$(backups_list | awk "(NR == 1)") & en permanence = true " done fi) logger " --- $ PROJECT START BACKUP $ DATE --- " logger " Dumping database dumps " mkdir $ BACKUP_DIR / $ DATE for i in `mysql -h $ MYSQL_SERVER -u $ MYSQL_USER -p $ MYSQL_PASSWORD -e" show databases; "| grep -v information_schema | grep -v Database`; do mysqldump -h $ MYSQL_SERVER -u $ MYSQL_USER -p $ MYSQL_PASSWORD $ i> $ BACKUP_DIR / $ DATE / $ i.sql; done logger" Créez une archive mysql $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz "tar -czf $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz $ BACKUP_DIR / $ DATE rm -rf $ BACKUP_DIR / $ DATE logger " Créer une archive de répertoire $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz " tar -czf $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz $ DIRS FILENAME = $ DATE-mysql- $ PROJECT.tar enregistreur .gz" cliquez sur Yandex.Disk archive mysql $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz "backupName = $ DATE-mysql- $ PROJECT.tar.gz uploadFile $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz FILENAME = $ DATE-files- $ PROJECT.tar.gz logger "Télécharger sur Yandex.Disk l'archive avec $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz" backupName = $ DATE-files- $ PROJECT.tar. gz uploadFile $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz logger "Supprimer les archives du disque" find $ BACKUP_DIR -type f -name "* .gz" -exec rm "()" \; # Supprimez les anciennes sauvegardes de Yandex.Disk (si MAX_BACKUPS> 0) si [$ MAX_BACKUPS -gt 0] ; then remove_old_backups ; fi logger "Fin du script de sauvegarde"

Vous pouvez également en télécharger un prêt à l'emploi. Le script doit être situé sur le serveur, remplacez les paramètres qu'il contient par les vôtres, donnez le droit de s'exécuter (chmod + x) et configurez-le pour qu'il soit exécuté quotidiennement dans cron. Si vous prévoyez d'effectuer plusieurs de ces tâches, définissez le délai entre leur démarrage (5 à 10 minutes).

DANS monde moderne l'information prend de plus en plus de valeur, dont la perte peut entraîner des coûts financiers importants. Le site est une information précieuse, dont nous allons faire une sauvegarde, ou simplement une sauvegarde, dans cet article en utilisant wordpress comme exemple et la placer sur un disque Yandex. J'envisagerai la possibilité d'automatiser le processus, que j'ai imaginé pour mes besoins et que je l'utilise depuis longtemps et avec succès.

Nous avancerons par étapes. Tout d'abord, considérons simplement la possibilité de sauvegarder directement les fichiers du site et de la base de données. Et puis nous répondrons pleinement à la question de savoir comment faire une sauvegarde régulière de votre site sur wordpress.

Script pour les fichiers du site d'archives

Ici, je n'ai pas réinventé la roue, mais j'ai profité de d'une manière standard archivage de fichiers - archiveur le goudron... J'écrirai tous les commentaires et explications tout de suite dans le script :

#! / bin / sh # Définir les variables # Date actuelle au format 2015-09-29_04-10 date_time = `date +"% Y-% m-% d_% H-% M "` # Où nous plaçons la sauvegarde bk_dir = "/ mnt / backup / site1.ru "# Répertoire un niveau supérieur à celui où se trouvent les fichiers inf_dir =" / web / sites / site1.ru / "# Le nom du répertoire direct avec les fichiers dir_to_bk = " www " # Créer une archive / usr / bin / tar -czvf $ bk_dir / www_ $ date_time.tar.gz -C $ inf_dir $ dir_to_bk

A la sortie, après l'exécution du script, nous avons un dossier nommé www_2015-09-29_04-10.tar.gz, à l'intérieur duquel il y aura un dossier www avec tout le contenu. Initialement, ce dossier se trouvait à /web/sites/site1.ru/www. Ici, j'ai appliqué tar avec le paramètre -AVEC afin que l'archive n'ait pas le chemin exact /web/sites/site1.ru, mais uniquement le dossier www. C'est juste plus pratique pour moi.

Vous pouvez utiliser ce script séparément pour créer des archives de fichiers, pas nécessairement le site. Nous l'avons mis cron et nous obtenons un archivage régulier.

Script de sauvegarde de la base de données

Créons maintenant un script pour une sauvegarde de la base de données. Rien de spécial ici non plus, j'utilise un outil standard mysqldamp:

#! / bin / sh # Définir les variables # Date actuelle au format 2015-09-29_04-10 date_time = `date +"% Y-% m-% d_% H-% M "` # Où nous plaçons la sauvegarde bk_dir = "/ mnt / backup / site1.ru "# Database user user =" user1 " # User password password =" pass1 " # Database name for backup bd_name =" bd1 " # Décharger la base de données / usr / bin / mysqldump -- opt -v - -databases $ nom_bd -u $ utilisateur -p $ mot de passe | / usr / bin / gzip -c> $ bk_dir / mysql_ $ date_time.sql.gz

En sortie, nous avons un fichier avec un dump de la base de données mysql_2015-09-29_04-10.sql.gz. La décharge est stockée dans format de texte, peut être ouvert et modifié par n'importe quel éditeur.

Connexion d'un disque Yandex dans CentOS 7 via webdav

Il y a un assez pratique et service gratuit Je suis un index, un disque que tout le monde peut utiliser. Peu d'espace est donné gratuitement, mais il y en a assez pour sauvegarder un site sur wordpress. Au fait, j'ai 368 Go disponibles gratuitement avec l'aide de toutes sortes de promotions :

Je suis ndex.Disk peut être connecté à l'aide de webdav. Mon serveur est CentOS 7, je vais vous dire comment le monter dedans. Tout d'abord, nous nous connectons. Ensuite, installez le paquet davfs2:

# miam -y installer davfs2

Essayons maintenant de monter le disque :

# mkdir / mnt / yadisk # mount -t davfs https://webdav.yandex.ru / mnt / yadisk / Veuillez saisir le nom d'utilisateur pour vous authentifier auprès du serveur https://webdav.yandex.ru ou appuyez sur Entrée pour aucun. Nom d'utilisateur : veuillez saisir le mot de passe pour authentifier l'utilisateur [email protégé] avec le serveur https://webdav.yandex.ru ou appuyez sur Entrée pour aucun. Mot de passe : /sbin/mount.davfs : Avertissement : "ne peut pas écrire l'entrée dans mtab, mais montera quand même le système de fichiers

J'ai ndex.Le disque est monté dans le dossier /mnt/yadisk.

Pour automatiser le processus d'archivage et ne pas saisir le nom d'utilisateur et le mot de passe à chaque fois, modifiez le fichier /etc/davfs2/secrets en ajoutant une nouvelle ligne avec le nom d'utilisateur et le mot de passe à la fin :

# mcedit / etc / davfs2 / secrets / mnt / yadisk / [email protégé] le mot de passe

Désormais, aucune question ne sera posée lors du montage du disque. Vous pouvez ajouter une connexion disque Yandex à fstab pour qu'il se monte automatiquement au démarrage, mais je trouve cela redondant. Je connecte et déconnecte le lecteur dans le script de sauvegarde. Si vous souhaitez le monter automatiquement, ajoutez à fstab :

Https://webdav.yandex.ru / mnt / yadisk davfs rw, utilisateur, _netdev 0 0

Automatisation de l'archivage des sites Web

Nous avons démonté tous les éléments de création d'une copie de sauvegarde du site, il est maintenant temps de rassembler tout cela en un seul endroit. J'utilise le schéma de sauvegarde de site suivant :

  • Dossier journée, qui stocke 7 archives de site pour les 7 derniers jours.
  • Dossier la semaine où 4 sauvegardes sont stockées pour les 4 dernières semaines.
  • Dossier mois, où toutes les sauvegardes du site sont stockées pendant tout le temps, je n'efface pas automatiquement ce dossier.

Avec un tel schéma, nous avons toujours à portée de main les 7 dernières archives, les archives hebdomadaires du mois en cours et les archives de chaque mois, au cas où. À quelques reprises, ce schéma m'a aidé lorsque j'avais besoin d'obtenir quelque chose à partir d'une sauvegarde il y a une semaine, par exemple.

Voici 3 scripts complets pour créer une copie de sauvegarde d'un site wordpress, c'est le moteur que j'utilise le plus souvent, mais en réalité vous pouvez sauvegarder n'importe quel site - joomla, drupal, modx, etc. Un cms ou un framework n'est pas d'une importance fondamentale .

Script de sauvegarde quotidienne du site Web jour-sauvegarde.sh:

journée"# Répertoire de l'archive inf_dir =" / web / sites / site1.ru / "# Le nom du répertoire direct avec les fichiers dir_to_bk =" www "# Database user user =" user1 " # User password password =" pass1 " # Nom de la base de données pour la sauvegarde bd_name = "bd1" # Mount Yandex.disk mount -t davfs https://webdav.yandex.ru / mnt / yadisk / # Créer une archive source / usr / bin / tar -czvf $ bk_dir / www_ $ date_heure.tar. gz -C $ inf_dir $ dir_to_bk # Dump la base de données / usr / bin / mysqldump --opt -v --databases $ bd_name -u $ user -p $ mot de passe | / usr / bin / gzip -c> $ bk_dir / mysql_ $ date_time.sql.gz # Supprimer les archives de plus de 7 jours / usr / bin / find $ bk_dir -type f - mtemps +7

Script de sauvegarde hebdomadaire du site sauvegarde-semaine.sh:

#! / bin / sh # Définir les variables # Date actuelle au format 2015-09-29_04-10 date_time = `date +"% Y-% m-% d_% H-% M "` # Où nous plaçons la sauvegarde bk_dir = "/ mnt / yadisk / site1.ru / semaine"# Répertoire de l'archive inf_dir =" / web / sites / site1.ru / "# Le nom du répertoire direct avec les fichiers dir_to_bk =" www "# Database user user =" user1 " # User password password =" pass1 " # Nom de la base de données pour la sauvegarde bd_name = "bd1" # Mount Yandex.disk mount -t davfs https://webdav.yandex.ru / mnt / yadisk / # Créer une archive source / usr / bin / tar -czvf $ bk_dir / www_ $ date_heure.tar. gz -C $ inf_dir $ dir_to_bk # Dump la base de données / usr / bin / mysqldump --opt -v --databases $ bd_name -u $ user -p $ mot de passe | / usr / bin / gzip -c> $ bk_dir / mysql_ $ date_time.sql.gz # Supprimer les archives de plus de 30 jours / usr / bin / find $ bk_dir -type f -mtime +30-exec rm() \; # Désactiver Yandex.Disk umount / mnt / yadisk

Script de sauvegarde de site Web mensuel backup-mois.sh:

#! / bin / sh # Définir les variables # Date actuelle au format 2015-09-29_04-10 date_time = `date +"% Y-% m-% d_% H-% M "` # Où nous plaçons la sauvegarde bk_dir = "/ mnt / yadisk / site1.ru / mois"# Répertoire de l'archive inf_dir =" / web / sites / site1.ru / "# Le nom du répertoire direct avec les fichiers dir_to_bk =" www "# Database user user =" user1 " # User password password =" pass1 " # Nom de la base de données pour la sauvegarde bd_name = "bd1" # Mount Yandex.disk mount -t davfs https://webdav.yandex.ru / mnt / yadisk / # Créer une archive source / usr / bin / tar -czvf $ bk_dir / www_ $ date_heure.tar. gz -C $ inf_dir $ dir_to_bk # Dump la base de données / usr / bin / mysqldump --opt -v --databases $ bd_name -u $ user -p $ mot de passe | / usr / bin / gzip -c> $ bk_dir / mysql_ $ date_time.sql.gz # Désactiver Yandex.disk umount / mnt / yadisk

N'oubliez pas de créer un répertoire /mnt/yadisk/site1.ru sur un disque Yandex, et il y a 3 autres dossiers : jour, semaine, mois :# cd /mnt/yadisk/site1.ru && mkdir jour semaine mois

Maintenant, pour l'automatisation, ajoutez ces 3 fichiers à cron:

# mcedit / etc / crontab # sauvegarde du site sur yandex.disk # quotidiennement à 4h10 10 4 * * * root /root/bin/backup-day.sh> / dev/null 2> & 1 # hebdomadaire à 4 : 20h dimanche 20 4 * * 0 root /root/bin/backup-week.sh> / dev / null 2> & 1 # mensuel à 4h30 le 1er du mois 30 4 1 * * root / root / bin / backup-month .sh> / dev / null 2> & 1

Ça y est, notre wordpress est sauvegardé de manière fiable. En théorie, ici, vous devez joindre une alerte au courrier, mais mes mains ne peuvent pas le faire. Et depuis plusieurs mois d'utilisation, je n'ai pas eu une seule panne.

Restaurer un site wordpress à partir d'une sauvegarde

Considérons maintenant l'option lorsque vous devez restaurer un site à partir d'une sauvegarde. Pour cela, nous avons besoin des deux archives : des sources et une base de données. En principe, vous pouvez le décompresser n'importe où. Sous Windows, les archives sont ouvertes avec l'archiveur gratuit 7zip. Dump de base de données au format texte brut, peut être ouvert avec le bloc-notes, copié et collé dans phpmyadmin.


Il peut donc y avoir de nombreuses options de récupération, c'est ce que j'aime cette approche. Tous les fichiers sont sous forme ouverte, vous pouvez travailler avec eux par tous les moyens à portée de main.

Voici un exemple de la façon d'extraire des fichiers d'une archive dans la console du serveur. Décompressez le répertoire www de la sauvegarde :

# tar -xzvf www_2015-10-01_04-10.tar.gz

Les fichiers sont extraits dans le dossier www. Maintenant, ils peuvent être copiés dans le dossier du site.

Pour restaurer la base de données, nous procédons comme suit. Tout d'abord, décompressez l'archive :

# gunzip mysql_2015-10-01_04-10.sql.gz

Maintenant, remplissons le dump dans la base de données :

# mysql --host = localhost --user = user1 --password = pass1 bd1; MariaDB [(aucun)]> source mysql_2015-10-01_04-10.sql;

Ça y est, la base de données a été restaurée.

Veuillez noter que la base de données sera restaurée dans la base de données avec le nom d'origine et remplacera son contenu, s'il y en a un sur le serveur. Pour restaurer une base de données vers une autre, vous devez modifier le début du vidage et remplacer le nom de la base de données par un nouveau. Si la récupération a lieu sur un serveur différent, cela n'a pas d'importance.

Conclusion

Nous avons donc examiné les options de création de sauvegardes de sites et de bases de données en utilisant le moteur wordpress comme exemple. Dans ce cas, seulement moyens standards serveur. A titre d'exemple, nous avons utilisé un récepteur pour stocker des copies de Index.Disk, mais rien ne nous empêche de l'adapter à un autre. Il peut s'agir d'un disque dur ou disque externe, un autre stockage cloud qui peut être monté sur un serveur.

Le schéma de création d'une sauvegarde vous permet de revenir en arrière presque indéfiniment. Vous pouvez définir vous-même la profondeur des archives en modifiant le paramètre mtime dans le scénario. Vous pouvez stocker, par exemple, une archive quotidienne non pas 7 jours, comme je le fais, mais 30, si vous en avez besoin. Alors essayez, adaptez-vous. Si vous avez des commentaires sur le travail, des erreurs ou des suggestions pour améliorer la fonctionnalité, partagez vos réflexions dans les commentaires, je serai ravi de les entendre.

Salutations, chers lecteurs de mon blog. Vous avez probablement entendu parler d'un programme qui vous permet de stocker des fichiers sur le serveur Yandex. Sinon, bienvenue sur soft.yandex.ru - c'est là.

Alors c'est tout. Il y a quelques jours, alors que je parcourais les sites, je me suis promené dans un blog où un script a été publié qui vous permet d'enregistrer une copie de sauvegarde du site sur le disque Yandex. Dans cet article, je vais en parler en détail.

De quoi avons nous besoin

  • 1. Serveur, login, mot de passe et nom de la base de données mysql, si, bien entendu, votre site fonctionne avec cette base de données ;
  • 2. Le chemin depuis la racine du disque jusqu'à votre site (demandez au service d'assistance hébergement) ;
  • 3. e-mail et mot de passe que vous utilisez pour vous connecter à Yandex (il s'agit également des données du disque Yandex).

Travailler avec un fichier de sauvegarde de site sur le disque Yandex

Vous devez d'abord modifier l'adresse du serveur mysql. Dans la plupart des cas, c'est localhost, donc je l'ai laissé là, s'il est différent, nous le remplaçons par le nôtre dans la ligne

$ dbhost = "localhost" ; // Adresse du serveur MySQL.

Dans la ligne ci-dessous, remplacez "database_user" par votre valeur pour le nom d'utilisateur de la base de données mysql.

"nom_base de données" est le nom de la base de données mysql.

Au lieu de "site_dear_hear", nous insérons notre chemin vers le site à partir de la racine du disque.

Après cela, nous procédons à la configuration du disque Yandex :

  • 1. "[email protégé]"nous remplaçons par notre adresse E-mail dans Yandex;
  • 2. "yandex_password" pour le mot de passe du courrier Yandex ;
  • 3. Créez un répertoire "sauvegarde" dans le dossier racine du disque Yandex (vos sauvegardes y seront enregistrées).

Tout. Nous sauvegardons le fichier et le téléchargeons sur le serveur.

Je ne recommande pas de le télécharger dans le répertoire racine du site, car toutes sortes de robots le contacteront constamment, ce qui entraînera le remplissage du disque Yandex avec des copies inutiles de sauvegardes. Il est préférable de créer un dossier, par exemple "a3hd7siq8a7s9xeeewwwerw-0-032-_2" afin que personne d'autre que vous et cran ne sache où vous l'avez.

Cran est un planificateur de tâches : programme spécial, avec lequel vous pouvez définir le lancement de scripts sur un calendrier, mais je ne sais pas comment l'utiliser, donc je ne peux pas aider ici.

Que faire si plusieurs sites

Vous savez probablement déjà que j'ai cinq sites. Naturellement, on en a marre de les exécuter séparément, mais c'est bien qu'un deuxième script ait été posté dans le même article, ce qui lance à tour de rôle tous les autres scripts.

  • 1. ;
  • 2. Remplacez site1.ru, site2.ru, etc. par les adresses de vos sites. De plus, n'oubliez pas d'ajouter le dossier après celui-ci où se trouve ce script ;
  • 3. Enregistrez les modifications et téléchargez-les sur le serveur, en le plaçant aussi loin que possible du dossier racine du site.

Si vous avez moins de cinq sites, supprimez simplement les lignes qui ressemblent à :

Écho ""; $ réponse = file_get_contents ("http://site5.ru/beckup.php"); echo iconv ("Windows-1251", "utf-8", réponse $);

Si vous avez un site dans la zone .рф, vous devrez traduire en Panycode avant d'enregistrer l'adresse.

J'espère que cet article vous a été utile.

J'attends tes commentaires avec impatience.

gastroguru 2017