Recientemente, una amiga mía se encontró con el problema de que el proveedor de VPS cerró repentinamente sin previo aviso. Desafortunadamente, por ahorrar dinero, eligió un proveedor de nicho, uno que ni siquiera ofrecía descargas de datos. Lo que es peor, ni siquiera tiene el hábito de descargar copias de seguridad regularmente. De la noche a la mañana, su sitio desapareció, junto con todos los datos que contenía.
Conmocionado por esto, escribí un script de Powershell que descargará automáticamente las copias de seguridad de su servidor a su computadora local de forma regular sin tener que comprar ningún servicio adicional de almacenamiento de objetos ni gastar un centavo en otras cosas. Todo lo que necesita es una computadora con Windows que use regularmente (y tenga mucho espacio en el disco duro) y esté conectada a Internet.
El script limpiará automáticamente las copias de seguridad de hace 5 días. Puede configurar el intervalo de copia de seguridad automática y la antigüedad de la copia de seguridad guardada localmente según sus necesidades.
$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
}
}
Guarde el script anterior como scriptname.ps1 en la ruta donde desea descargar la copia de seguridad. Intente “Ejecutar con Powershell”. Si tiene éxito, puede pasar al siguiente paso.
Para programar una tarea
- Busque “Programador de tareas”.
- Haga doble clic en Agregar tarea programada. Aparece el Asistente para tareas programadas.
- Haga clic en Siguiente y luego en Examinar. Aparece el cuadro de diálogo Seleccionar programa para programar.
- Navegue hasta el script que creó, haga clic en él y luego en Abrir. Vuelve al Asistente para tareas programadas.
- Proporcione un nombre para la tarea, o mantenga el predeterminado, que es el nombre del archivo, especifique con qué frecuencia ejecutar el script y luego haga clic en Siguiente.
- Especifique la hora y la fecha de inicio (si especificó Diaria, Semanal o Mensual, etc.) y la recurrencia, luego haga clic en Siguiente. Este elemento debe coincidir con el ciclo de copia de seguridad automática de su discourse.
- Escriba el nombre de usuario y la contraseña de la cuenta que ejecutará el script, luego haga clic en Siguiente.
- Si desea configurar propiedades avanzadas, seleccione la casilla de verificación y luego haga clic en Finalizar.


