Heliosurge
(Dan DeMontmorency)
27 Diciembre, 2025 22:58
3
Hola Ed, puntos muy válidos. Recuerdo que un miembro creó un script para hacer copias de seguridad en otro sistema. Tendré que buscar y comprobar.
Aquí hay un extracto de la publicación original. Canapin tiene una buena respuesta con un enlace para hacer copias de seguridad en Google Drive/Dropbox también.
Lhc_fl:
Recientemente, un amigo mío 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 es que ni siquiera tiene la costumbre 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 servicios adicionales de almacenamiento de objetos ni gastar un centavo en otras cosas. Todo lo que necesita es una computadora con Windows que use regularmente (y que tenga mucho espacio en el disco duro) y que 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 el tiempo de la copia de seguridad más antigua guardada localmente según sus necesidades.
$ssh_port = 22
$ssh_address = "username@your.site"
Write-Output "Iniciando la tarea de descarga de copia de seguridad de Discourse..."
Write-Output '------------------------'
Write-Output "Obteniendo el último archivo de copia de seguridad..."
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 "Fallo al obtener... Aquí está el registro:"
Write-Output '-------------'
Write-Output $_
$answer = Read-Host "¿Desea volver a obtener? (s/N)"
if ($answer -ne 's') {
break
}
Write-Output ''
}
}
if ([String]::IsNullOrEmpty($filename)) {
Write-Output "Error: Falló al obtener el nombre del archivo $filename"
Write-Output ''
$answer = Read-Host '¿Reintentar?(s/N)'
if ($answer -eq 's') {
}
else {
exit 1
}
}
else {
Write-Output "Copia de seguridad más reciente: $filename"
Write-Output ''
$need_download = $true
if (Test-Path ".\backups\$filename") {
$answer = Read-Host ".\backups\$filename ya existe. ¿Desea descargarlo de nuevo?(s/N)"
Write-Output ''
if ($answer -ne 's') {
$need_download = $false
}
}
if ($need_download) {
Write-Output "Iniciando descarga..."
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 "Descarga completada"
Write-Output ''
break
}
catch {
Write-Output "La descarga falló >_<... El siguiente es el registro:"
Write-Output ''
Write-Output $_
$answer = Read-Host "¿Volver a descargar? (s/N)"
Write-Output ''
if ($answer -ne 's') {
break
}
}
}
}
Write-Output "Comenzando a intentar limpiar archivos de copia de seguridad antiguos..."
Write-Output ''
$count = 0
$backupfiles = Get-ChildItem -Path .\\backups\\
foreach ($file in $backupfiles) {
if ($file.CreationTime -le (Get-Date).AddDays(-5)) {
try {
Write-Output "Eliminando archivo de copia de seguridad antiguo $file ..."
Write-Output ''
$file.Delete()
$count = $count + 1
} catch {
Write-Output "Ocurrió un error al eliminar el archivo de copia de seguridad antiguo $file >_<"
Write-Output '-------------------'
Write-Output $_
Write-Output '-------------------'
}
}
}
if ($count -ge 0) {
Write-Output "Se limpiaron $count archivos de copia de seguridad antiguos"
Write-Output ''
}
else {
Write-Output 'No hay archivos de copia de seguridad antiguos que limpiar'
Write-Output ''
}
Pause
exit 0
}
}
Guarde el script anterior como nombre_del_script.ps1 en la ruta donde desea descargar la copia de seguridad. Pruebe “Ejecutar con Powershell”. Si tiene éxito, puede continuar con el siguiente paso.
Para programar una tarea
Busque “Tareas programadas”.
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 conserve 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 fecha de inicio (si especificó Diario, Semanal o Mensual, etc.) y 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 y luego haga clic en Siguiente.
Si desea configurar propiedades avanzadas, seleccione la casilla de verificación y luego haga clic en Finalizar.
@Canapin con la aplicación de reconstrucción del lanzador, ¿no necesita ejecutarse como
./launcher r build app
Así es como he estado acostumbrado a ejecutarlo a partir de otros documentos aquí en el sitio. Como he aprendido, a menudo hay muchas maneras de hacer las cosas. Jaja
Buena redacción, útil.
1 me gusta