Recentemente, un mio amico si è trovato nella situazione in cui il provider del VPS è improvvisamente fallito senza preavviso. Purtroppo, per risparmiare, ha scelto un provider di nicchia, uno che non offriva nemmeno il download dei dati. Peggio ancora, non ha nemmeno l’abitudine di scaricare regolarmente i backup. Da un giorno all’altro, il suo sito è scomparso, insieme a tutti i dati contenuti.
Scioccato da questo, ho scritto uno script Powershell che scaricherà automaticamente i backup dal tuo server al tuo computer locale regolarmente, senza dover acquistare alcun servizio aggiuntivo di object storage o spendere un centesimo per altre cose. Tutto ciò di cui hai bisogno è un computer Windows che usi regolarmente (e che abbia molto spazio su disco) e che sia connesso a Internet.
Lo script eliminerà automaticamente i backup più vecchi di 5 giorni. Puoi impostare l’intervallo di backup automatico e l’età massima dei backup salvati localmente in base alle tue esigenze.
$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
}
}
Salva lo script sopra come scriptname.ps1 nel percorso in cui desideri scaricare il backup. Prova “Esegui con Powershell”. Se ha successo, puoi procedere al passaggio successivo.
Per pianificare un’attività
- Cerca “Utilità di pianificazione”.
- Fai doppio clic su Aggiungi attività pianificata. Viene visualizzata la procedura guidata Utilità di pianificazione.
- Fai clic su Avanti, quindi fai clic su Sfoglia. Viene visualizzata la finestra di dialogo Seleziona programma da pianificare.
- Naviga fino allo script che hai creato, fai clic su di esso, quindi su Apri. Viene visualizzata la procedura guidata Utilità di pianificazione.
- Fornisci un nome per l’attività, o mantieni quello predefinito, che è il nome del file, specifica la frequenza di esecuzione dello script, quindi fai clic su Avanti.
- Specifica l’ora e la data di inizio (se hai specificato Giornaliero, Settimanale o Mensile, ecc.) e la ricorrenza, quindi fai clic su Avanti. Questa voce dovrebbe corrispondere al ciclo di backup automatico del tuo discourse
- Digita il nome utente e la password per l’account che eseguirà lo script, quindi fai clic su Avanti.
- Se desideri configurare proprietà avanzate, seleziona la casella di controllo, quindi fai clic su Fine.


