name: deploy-preland # После коммита в main — заливка преленда на хостинги всех целей (FTP с TLS) и проверка страницы каждой цели. # Цель — домен со своим хостингом (список — matrix ниже): реквизиты — секреты репозитория _FTP_HOST, # _FTP_USER, _FTP_PASS (порт 21). Цели независимы: сбой одного хостинга остальные не останавливает. # Заливаются файлы репозитория (git ls-files), кроме служебных (.gitea/, README.md, .gitignore) и тех, что живут # только на хостинге: config.json (в git его нет) и requisites.html (реквизиты заполняют на месте — пустой файл # из git их бы затёр). На хостинге ничего не удаляется: удалённое из репозитория убирать вручную. on: push: branches: - main jobs: deploy: name: deploy ${{ matrix.name }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: # name — имя цели, url — адрес преленда (для проверки), prefix — префикс секретов _FTP_*, # dir — каталог сайта на FTP ("" — корень FTP, как на beget). Новый домен — новая запись и три секрета; # config.json (и requisites.html) создают на хостинге цели — без него проверка страницы не пройдёт. - name: barbariskatest url: https://preland.anton.barbariskatest.ru prefix: PRELAND dir: "" defaults: run: shell: sh env: PRELAND_URL: ${{ matrix.url }} REMOTE_DIR: ${{ matrix.dir }} steps: - name: Install tools (Alpine) run: apk add --no-cache git curl - name: Checkout repository uses: actions/checkout@v4 - name: Upload over FTP (TLS) env: FTP_HOST: ${{ secrets[format('{0}_FTP_HOST', matrix.prefix)] }} FTP_USER: ${{ secrets[format('{0}_FTP_USER', matrix.prefix)] }} FTP_PASS: ${{ secrets[format('{0}_FTP_PASS', matrix.prefix)] }} run: | set -eu [ -n "$FTP_HOST" ] && [ -n "$FTP_USER" ] && [ -n "$FTP_PASS" ] || { echo "нет секретов ${{ matrix.prefix }}_FTP_*"; exit 1; } 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); list=$(mktemp) trap 'rm -f "$netrc" "$list"' EXIT printf 'machine %s login %s password %s\n' "$FTP_HOST" "$FTP_USER" "$FTP_PASS" > "$netrc" git ls-files | grep -vE '^(\.gitea/|README\.md$|\.gitignore$|config\.json$|requisites\.html$)' > files.txt # имя уходит в адрес ftp:// как есть — пробелы и прочее экранирование не поддерживаем if grep -q '[^A-Za-z0-9._/-]' files.txt; then echo "имена с недопустимыми символами:"; grep '[^A-Za-z0-9._/-]' files.txt; exit 1; fi # один curl на все файлы — одно соединение FTP+TLS вместо соединения на файл while read -r f; do printf 'upload-file = "%s"\nurl = "ftp://%s/%s%s"\n' "$f" "$FTP_HOST" "${dir:+$dir/}" "$f"; done < files.txt > "$list" curl -sS --ssl-reqd --netrc-file "$netrc" --ftp-create-dirs --retry 3 --fail-early -K "$list" echo "залито файлов: $(wc -l < files.txt)" - name: Check the page run: | set -eu page=$(curl -fsS --max-time 30 "$PRELAND_URL/?nc=$(date +%s)") api=$(printf '%s' "$page" | grep -o 'const createApiUrl = "[^"]*"' || true) echo "$api" case "$api" in *'\/api\/images\/public\/create'*) ;; *) echo "на странице нет адреса загрузки"; exit 1 ;; esac own=$(printf '%s' "$PRELAND_URL" | sed -E 's#^https?://([^/]+).*#\1#') case "$api" in *"$own"*) echo "загрузка уходит на сам преленд: на хостинге нет config.json с host"; exit 1 ;; esac printf '%s' "$page" | grep -q 'claim?key=' || { echo "переход не на claim — залит старый код?"; exit 1; } echo "страница в порядке"