Архивация файловой базы в scloud в windows

Scloud, с определенного времени перестали давать возможность самому восстанавливать автоматические системные бэкапы 1С, 1Ску можно восстановить только через заявку в тех. поддержу, время реакции по умолчанию 4ре часа. Файловую базу можно забирать самостоятельно по ftp, например скриптом, что делать с теми базами которые scloud, без предупреждения переносит на Postgree — ума не приложу.

И все бы хорошо, но 20.06.2023 scloud, как всегда без объявления войны, что то подкрутил на своих серверах и любые скрипты автоматически забирающие базы основанные на powershell, python, да и вообще на какой угодно стандартной системной библиотеке стали падать с ошибкой — «Базовое соединение закрыто: Сервер нарушил протокол». При этом копировать через ftp клиента, типа total comander или filezilla проходило нормально.

Ответ тех. поддержки не отличался оригинальностью «По Вашему обращению СК-1031133 , поступил ответ от сотрудника поддержки: Уточнил информацию у инженеров инфраструктуры облака. Скорректировать настройки FTP сервера не представляется возможным.» Что ж криворукосnь scloud уже притча во языцех, по этому подстраиваемся под новые изменённые втихаря правила игры.

Подготовим директории куда сохранять

В D:\backup-1c будем сохранять базы, в C:\src — скрипты

mkdir D:\backup-1c
mkdir D:\backup-1c\mounts
mkdir D:\backup-1c\weeks
mkdir C:\src

WinScp

Так как сервера работают только с клиентом то будем использовать winscp.

  1. Устанавливаем winscp в C:\winscp (отключаем обновление при установке).
  2. Пишем скрипт ftp-scloud.txt
# Connect
open ftp://%1%:%2%@terminal.scloud.ru:2121/

# Download file to the local directory 
get "%3%" %4%
# Disconnect
close
# Exit WinSCP
exit

Powershell

Пишем скрипт backup-1c-scloud.ps1

param(
  [string]$usr, 
  [string]$pwd,
  [string]$dir,
  $arrName
)
ForEach($el in $arrName){
try{
	$DT  = $(Get-Date -Format "MM_dd_yyyy_HH_mm_ss_ddd")
	$out = "${dir}\$($el.pre)_${DT}_1Cv8.1CD"
	$in  = "/Базы 1С/base$($el.base)/1Cv8.1CD"
	C:\winscp\winscp.com /ini=nul /script=C:\src\ftp-scloud.txt /parameter // $usr $pwd `"$in`" `"$out`"
}catch{
   	Write-Output $_
}
}
#перенос воскресных
Get-ChildItem -Path $dir -filter *1Cv8.1CD | Where-Object  { $_.lastwritetime.DayOfWeek -eq 0}| Copy-Item -Destination $dir\weeks
#удаление воскресных кроме 10ти последних
ForEach($el in $array){
  $files = Get-ChildItem $dir/weeks | where {$_.name -like "$($el.pre)_*1Cv8.1CD"}|Sort-Object CreationTime
  $files|select -First ($files.Count -10)|Remove-Item -Force
}
#перенос месячных
Get-ChildItem -Path $dir -filter *1Cv8.1CD | Where-Object  { $_.lastwritetime.Day -eq 1 -OR $_.lastwritetime.Day -eq 17}| Copy-Item -Destination $dir\mounts
#удаление месячных кроме 15ти последних
ForEach($el in $array){
  $files = Get-ChildItem $dir/mounts | where {$_.name -like "$($el.pre)_*1Cv8.1CD"}|Sort-Object CreationTime
  $files|select -First ($files.Count -15)|Remove-Item -Force
}
#удаление всех кроме 7ми последних
ForEach($el in $array){
  $files = Get-ChildItem $dir|where {$_.name -like "$($el.pre)_*1Cv8.1CD"}|Sort-Object CreationTime
  $files|select -First ($files.Count -7)|Remove-Item -Force
}

Cmd

Пишем скрипт backup-1c-scloud.cmd и запихиваем его в шедулер.

powershell -executionpolicy RemoteSigned -command "C:\src\backup-1c-scloud.ps1 -arrName @(@{pre='префикс-сохраненной-базы-1';base='номер-базы-на-сервере-scloud'},(@{pre='префикс-сохраненной-базы-2';base='номер-базы-на-сервере-scloud'}) -usr Имя-пользователя-scloud -pwd Пароль-пользователя-scloud -dir 'E:\backup-1c'"

префикс-сохраненной-базы — это чтобы ориентироваться в сохраненках

номер-базы-на-сервере-scloud — это цифры которые идут в пути баз в scloud

Теперь можно, запихнуть папку E:\backup-1c в синхронизацию на яндекс диск или гугле диск.

  • 17.07.2023