diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 32dd60b..a679736 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -91,8 +91,8 @@ jobs: dir=$(printf '%s' "$REMOTE_DIR" | sed 's#^/*##; s#/*$##') case "$dir" in *[!A-Za-z0-9._/-]*) echo "недопустимый dir: $dir"; exit 1 ;; esac umask 077 - netrc=$(mktemp) - trap 'rm -f "$netrc"' EXIT + netrc=$(mktemp); verify=$(mktemp) + trap 'rm -f "$netrc" "$verify"' EXIT printf 'machine %s login %s password %s\n' "$FTP_HOST" "$FTP_USER" "$FTP_PASS" > "$netrc" git ls-files | grep -vE '^(\.gitea/|README\.md$|AGENTS\.md$|CLAUDE\.md$|\.gitignore$|requisites\.html$|config\.json$)' > files.txt # имя уходит в адрес ftp:// как есть — пробелы и прочее экранирование не поддерживаем @@ -102,8 +102,17 @@ jobs: # конкретный путь, а повторная отправка безопасна. while read -r f; do echo "загрузка: $f" - curl -sS --ssl-reqd --netrc-file "$netrc" --ftp-create-dirs --retry 3 --fail \ - -T "$f" "ftp://$FTP_HOST/${dir:+$dir/}$f" + if curl -sS --ssl-reqd --netrc-file "$netrc" --ftp-create-dirs --retry 3 --fail \ + -T "$f" "ftp://$FTP_HOST/${dir:+$dir/}$f"; then + continue + fi + # Этот FTP-сервер иногда возвращает 426 уже после успешной записи + # бинарного файла. Не считаем передачу успешной вслепую: скачиваем + # объект обратно и сверяем байты с исходным файлом. + curl -sS --ssl-reqd --netrc-file "$netrc" --fail --retry 3 \ + "ftp://$FTP_HOST/${dir:+$dir/}$f" -o "$verify" + cmp -s "$f" "$verify" || { echo "файл не совпал после FTP-ошибки: $f"; exit 1; } + echo "FTP 426 подтверждён сверкой: $f" done < files.txt echo "залито файлов: $(wc -l < files.txt)"