Script Powershell pour sysadmin pour télécharger régulièrement des sauvegardes du serveur vers l'ordinateur

Récemment, une amie a rencontré le problème du fournisseur de VPS qui a soudainement cessé ses activités sans préavis. Malheureusement, pour des raisons de coût, elle a choisi un fournisseur de niche, qui n’offrait même pas de téléchargement de données. Pire encore, elle n’a pas pris l’habitude de télécharger régulièrement des sauvegardes. Du jour au lendemain, son site a disparu, ainsi que toutes les données qu’il contenait.

Choqué par cela, j’ai écrit un script Powershell qui téléchargera automatiquement les sauvegardes de votre serveur sur votre ordinateur local régulièrement, sans avoir à acheter de services de stockage d’objets supplémentaires ni à dépenser un centime pour d’autres choses. Tout ce dont vous avez besoin est un ordinateur Windows que vous utilisez régulièrement (et qui dispose de beaucoup d’espace disque) et qui est connecté à Internet.

Le script nettoiera automatiquement les sauvegardes datant de plus de 5 jours. Vous pouvez définir l’intervalle de sauvegarde automatique et l’ancienneté de la sauvegarde sauvegardée localement selon vos besoins.


$ssh_port = 22
$ssh_address = "username@your.site"


Write-Output "Starting Discourse backup download task..."
Write-Output '------------------------'
Write-Output "Fetching the latest backup file..."
Write-Output ''

while ($true) {

    $filename = ''

    while ($true) {
        try {
            Write-Output "> ssh -p $ssh_port $ssh_address 'cd /var/discourse/shared/standalone/backups/default/ && ls -t | head -n 1'"
            Write-Output ''
            $filename = ssh -p $ssh_port "$ssh_address" 'cd /var/discourse/shared/standalone/backups/default/ && ls -t | head -n 1'
            break
        }
        catch {
            $filename = ''
    
            Write-Output "Failed to fetch... Here is the log:"
            Write-Output '-------------'
            Write-Output $_
            
            $answer = Read-Host "Do you want to re-fetch? (y/N)"
            if ($answer -ne 'y') {
                break
            }
            Write-Output ''
        }
    }
    
    
    if ([String]::IsNullOrEmpty($filename)) {
        Write-Output "Error: Failed to fetch file name $filename"
        Write-Output ''
        $answer = Read-Host 'Retry?(y/N)'
  
        if ($answer -eq 'y') {
  
        }
        else {
      
            exit 1
        }
  
    }
    else {

        Write-Output "Latest backup: $filename"
        Write-Output ''
        
        $need_download = $true
        if (Test-Path ".\backups\$filename") {
            $answer = Read-Host ".\backups\$filename already exists. Do you want to download it again?(y/N)"
            Write-Output ''
            if ($answer -ne 'y') {
                $need_download = $false
            }
        }
        if ($need_download) {
            Write-Output "Start downloading..."
            Write-Output ''
            
            while ($true) {
                try {
                    Write-Output "scp -p $ssh_port ${ssh_address}:/var/discourse/shared/standalone/backups/default/$filename .\\backups\\"
                    Write-Output ''

                    scp -p $ssh_port "${ssh_address}:/var/discourse/shared/standalone/backups/default/$filename" .\\backups\
                    
                    Write-Output "Download completed"
                    Write-Output ''
                    
                    break
                }
                catch {

                    Write-Output "Download failed >_<... The following is the log:"
                    Write-Output ''

                    Write-Output $_
                    
                    $answer = Read-Host "Download again? (y/N)"
                    Write-Output ''
                    if ($answer -ne 'y') {
                        break
                    }
                }
            }

        }
  
        Write-Output "Start trying to clean old backup files..."
        Write-Output ''

        $count = 0
        $backupfiles = Get-ChildItem -Path .\\backups\
  
        foreach ($file in $backupfiles) {
            if ($file.CreationTime -le (Get-Date).AddDays(-5)) {
                try {
                    Write-Output "Delete old backup file $file ..."
                    Write-Output ''
                    $file.Delete()
                    $count = $count + 1
                } catch {
                    Write-Output "An error occurred while deleting old backup file $file >_<"
                    Write-Output '-------------------'
                    Write-Output $_
                    Write-Output '-------------------'
                }
            }
        }

        if ($count -ge 0) {
            Write-Output "Cleaned $count old backup files"
            Write-Output ''
        }
        else {
            Write-Output 'No old backup files need to clean up'
            Write-Output ''
        }

        Pause
  
        exit 0
  
    }
  
  
}


Enregistrez le script ci-dessus sous le nom scriptname.ps1 dans le chemin où vous souhaitez télécharger la sauvegarde. Essayez “Exécuter avec Powershell”. Si cela réussit, vous pouvez passer à l’étape suivante.

Pour planifier une tâche

  1. Recherchez “Planificateur de tâches”.
  2. Double-cliquez sur Ajouter une tâche planifiée. L’Assistant Planificateur de tâches apparaît.
  3. Cliquez sur Suivant, puis sur Parcourir. La boîte de dialogue Sélectionner un programme à planifier apparaît.
  4. Accédez au script que vous avez créé, cliquez dessus, puis sur Ouvrir. Vous revenez à l’Assistant Planificateur de tâches.
  5. Donnez un nom à la tâche, ou conservez le nom par défaut qui est le nom du fichier, spécifiez la fréquence d’exécution du script, puis cliquez sur Suivant.
  6. Spécifiez l’heure et la date de début (si vous avez spécifié Quotidien, Hebdomadaire ou Mensuel, etc.) et la récurrence, puis cliquez sur Suivant. Cet élément doit correspondre au cycle de sauvegarde automatique de votre discourse.
  7. Tapez le nom d’utilisateur et le mot de passe du compte qui exécutera le script, puis cliquez sur Suivant.
  8. Si vous souhaitez configurer des propriétés avancées, cochez la case, puis cliquez sur Terminer.
15 « J'aime »

Un bon rappel de l’importance d’avoir des sauvegardes à distance. Un autre utilisateur de meta a subi le même problème il y a quelques mois.

Une de mes instances utilise la fonction de sauvegarde S3 intégrée, les autres utilisent Rclone et une tâche CRON pour envoyer des sauvegardes sur Google Drive. Il existe un guide pour cela : Use rclone to sync backups to Dropbox or Google Drive

Merci d’avoir partagé votre script Linca :+1:

3 « J'aime »

En effet, un très bon rappel. J’ai suggéré (ici) que la fonction de mise à jour puisse vérifier et avertir si les fichiers de sauvegarde ont des horodatages de dernier accès trop anciens. Nous mettons à jour tous les deux ou trois mois, donc cette vérification ne s’exécuterait pas trop souvent, et le moment d’une mise à jour est un bon moment pour s’assurer qu’il existe une sauvegarde sûre. Tout moyen de copier un fichier de sauvegarde ailleurs devrait mettre à jour l’horodatage du dernier accès.

3 « J'aime »

Bon point, merci pour le script. Laissez-moi partager la version de rsync :slight_smile: .

Dans l’exemple ci-dessous, sql et les pièces jointes sont synchronisés séparément. Il n’est pas nécessaire d’inclure les pièces jointes dans le fichier de sauvegarde. Il n’est pas non plus nécessaire de supprimer les anciennes sauvegardes.

J’utilise Chocolatey pour installer cwrsync. Après l’installation, il suffit d’ajouter quelques lignes à la fin du fichier cmd + de créer une planification :

C:\ProgramData\chocolatey\lib\rsync\tools\cwrsync.cmd

Par exemple :

rsync -rvm --delete --ignore-errors --ignore-existing --size-only --chmod=ugo=rwX -e "ssh -i /cygdrive/c/Users/user1/.ssh/id_rsa" login@host:/var/discourse/shared/standalone/backups/default/ /cygdrive/d/backup/forum/db/

rsync -rvm --delete --ignore-errors --ignore-existing --size-only --chmod=ugo=rwX -e "ssh -i /cygdrive/c/Users/user1/.ssh/id_rsa" login@host:/var/discourse/shared/standalone/uploads/ /cygdrive/d/backup/forum/uploads/

Note 1 : Utilisez /cygdrive/c/ au lieu de C:, lisez le fichier cmd pour référence et syntaxe.

Note 2 : Vous pouvez modifier la commande pour utiliser un mot de passe au lieu d’une clé ssh (format PEM).

Note 3 : Si vous n’ajoutez pas de barre oblique après le dossier dump/, rsync copiera le dossier, mais si vous le faites, il ne copiera que le contenu du dossier.

Note 4 : Si chocolatey met à jour cwrsync, il crée une sauvegarde de la commande précédente dans le même dossier. Vous devez copier manuellement vos commandes dans la nouvelle commande pour continuer les sauvegardes.

Important : Définissez la même règle dans le Planificateur que celle écrite par l’OP. La ligne du planificateur est :

C:\ProgramData\chocolatey\lib\rsync\tools\cwrsync.cmd >> d:\backup\cwrsync.txt 2>&1

Cela ajoutera la sortie au fichier cwrsync.txt. C’est tout.

3 « J'aime »

J’ai l’habitude de configurer rclone pour copier automatiquement les sauvegardes vers un emplacement distant (un NAS auto-hébergé à la maison) en raison de la paranoïa face à ce genre de choses qui arrivent sans crier gare. Ce post sert très bien de rappel que nous ne devrions pas mettre tous nos œufs dans le même panier.

5 « J'aime »

Pendant que vous y êtes, vous devriez également obtenir une copie de tout ce qui se trouve dans /var/discourse/containers.

4 « J'aime »

Bonne idée ! Déploiera une mise à jour

3 « J'aime »

Où rechercher « Tâches planifiées » ? (Nouveau venu demande des conseils, merci)

« Tâches planifiées » est le Planificateur de tâches. Sur win10 et les versions ultérieures, vous pouvez le rechercher directement en appuyant sur la touche win et en tapant.

2 « J'aime »

Salut. Comment se fait-il que j’obtienne cette erreur ?

Pour ceux qui lisent ceci, voici des instructions meilleures/plus à jour car j’ai légèrement eu du mal avec les instructions de l’OP :

  1. Créez/utilisez un dossier où ce script sera stocké. Ensuite, créez un dossier appelé backup à l’intérieur de ce dossier.

  2. Copiez/collez le script dans le Bloc-notes. REMARQUE : Si vous utilisez un VPS, utilisez le nom d’utilisateur de votre VPS et l’adresse IP publique pour la ligne $ssh_address = \"username@your.site\". Enregistrez sous anyname.ps1 et n’oubliez pas de régler la boîte déroulante sur « Tous les fichiers », comme indiqué ci-dessous.
    hhhh

  3. Appuyez sur la touche Windows ⊞ et tapez « Tâches », puis cliquez sur « Planificateur de tâches ».

  4. Sur le côté droit, cliquez sur « Créer une tâche de base ».

  5. Donnez un nom/une description.

  6. Choisissez si vous voulez quotidiennement/hebdomadairement/annuellement/etc. Je recommande quotidiennement.

  7. Définissez la date et l’heure auxquelles vous souhaitez le faire. Gardez la récurrence à 1. Assurez-vous d’aller dans les paramètres d’administration de votre site Discourse > Sauvegardes. Cochez la case à côté de sauvegardes automatiques activées.
    Ensuite, définissez la fréquence de sauvegarde comme vous le souhaitez. Je recommande 1 mais la clé ici est de la faire correspondre à vos paramètres du Planificateur de tâches. Faites correspondre les dates de sauvegarde. Exemple : si vous avez configuré le Planificateur de tâches pour sauvegarder quotidiennement, définissez vos paramètres de sauvegarde d’administration fréquence de sauvegarde sur 1.

  8. Laissez les paramètres par défaut sur « démarrer un programme » et cliquez sur Suivant.

  9. Cliquez sur Parcourir et trouvez le script que vous avez enregistré. Cliquez sur Suivant.

  10. Cliquez sur Terminer.
    Si vous souhaitez le tester, faites un clic droit sur le script et choisissez « Exécuter avec Powershell ».

Remarque : Si vous obtenez « le système ne trouve pas le fichier spécifié », entrez votre mot de passe comme indiqué sur PowerShell et il le trouvera quand même.

1 « J'aime »

Lorsque j’ai enregistré le script PS (j’ai juste édité mon nom d’utilisateur et mon adresse IP dans la 2e ligne), et que j’ai fait un clic droit > Exécuter avec PowerShell, rien ne se passe.
Un flash se produit. Et si j’ai un terminal déjà ouvert dans mon win11, alors ce terminal est amené au premier plan. Rien d’autre. Juste un flash.

Je me demandais, bien que j’aie donné mon nom d’utilisateur et mon adresse IP au script, comment utiliserait-il ma clé SSH pour se connecter et récupérer la sauvegarde ?

Merci !

J’ai essayé la solution de OP et celle de 45thj5ej et aucune ne fonctionne pour moi. En exécutant le script avec Powershell, il ne trouve pas “/backups/” ni les éléments enfants. De plus, je n’arrive pas à trouver où OP indique qu’il faut entrer votre nom d’utilisateur et votre mot de passe. J’exécute Discourse sur un VPS.