diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index a679736..444864c 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -48,7 +48,7 @@ jobs: steps: - name: Install tools - run: apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates git curl php-cli + run: apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates git curl lftp php-cli # На production runner образ задания не содержит Node.js, поэтому # actions/checkout не запускается. Клонируем тот же main напрямую: @@ -91,29 +91,30 @@ 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); verify=$(mktemp) - trap 'rm -f "$netrc" "$verify"' EXIT - printf 'machine %s login %s password %s\n' "$FTP_HOST" "$FTP_USER" "$FTP_PASS" > "$netrc" + script=$(mktemp) + trap 'rm -f "$script"' EXIT git ls-files | grep -vE '^(\.gitea/|README\.md$|AGENTS\.md$|CLAUDE\.md$|\.gitignore$|requisites\.html$|config\.json$)' > files.txt # имя уходит в адрес ftp:// как есть — пробелы и прочее экранирование не поддерживаем if grep -q '[^A-Za-z0-9._/-]' files.txt; then echo "имена с недопустимыми символами:"; grep '[^A-Za-z0-9._/-]' files.txt; exit 1; fi - # Legacy FTP разрывает многокомандную сессию кодом 426. Загружаем - # файлы отдельными FTPS-командами: при ошибке в журнале останется - # конкретный путь, а повторная отправка безопасна. + { + echo 'set cmd:fail-exit yes' + echo 'set ftp:ssl-force true' + echo 'set ftp:ssl-protect-data true' + echo 'set ssl:verify-certificate yes' + echo 'set net:max-retries 3' + echo 'set net:timeout 30' + } > "$script" + # Сервер legacy обрывает бинарные загрузки curl с 426. lftp ведёт + # каждую передачу отдельной FTPS-командой, не ослабляя TLS. while read -r f; do echo "загрузка: $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" + remote_dir=${f%/*} + [ "$remote_dir" = "$f" ] && remote_dir='.' + printf 'mkdir -p %s%s\nput -O %s%s %s\n' \ + "${dir:+$dir/}" "$remote_dir" "${dir:+$dir/}" "$remote_dir" "$f" >> "$script" done < files.txt + printf 'bye\n' >> "$script" + lftp -u "$FTP_USER","$FTP_PASS" "ftp://$FTP_HOST" -f "$script" echo "залито файлов: $(wc -l < files.txt)" - name: Check the page