diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..3ea14ba --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,67 @@ +name: deploy-preland + +# После коммита в main — заливка на хостинг преленда (beget, FTP с TLS) и проверка страницы. +# Реквизиты — секреты репозитория PRELAND_FTP_HOST, PRELAND_FTP_USER, PRELAND_FTP_PASS (порт 21). +# Заливаются файлы репозитория (git ls-files), кроме служебных (.gitea/, README.md, .gitignore) и тех, что живут +# только на хостинге: config.json (в git его нет) и requisites.html (реквизиты заполняют на месте — пустой файл +# из git их бы затёр). На хостинге ничего не удаляется: удалённое из репозитория убирать вручную. + +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + + defaults: + run: + shell: sh + + env: + PRELAND_URL: https://preland.anton.barbariskatest.ru + + 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.PRELAND_FTP_HOST }} + FTP_USER: ${{ secrets.PRELAND_FTP_USER }} + FTP_PASS: ${{ secrets.PRELAND_FTP_PASS }} + run: | + set -eu + [ -n "$FTP_HOST" ] && [ -n "$FTP_USER" ] && [ -n "$FTP_PASS" ] || { echo "нет секретов PRELAND_FTP_*"; exit 1; } + 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"\n' "$f" "$FTP_HOST" "$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 "страница в порядке" diff --git a/README.md b/README.md index b8b6b7a..9fcce66 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,21 @@ `https:///public/upscale?id=…&indpic=1&theme=dark&subid=TEST…` (без `key=`), пойдёт обработка. Это настоящая загрузка и обработка на сайте. -**Откат.** Перед заменой файлов — копия изменяемых файлов (`index.php`, `components/*`) с хостинга; вернуть их той же +## Автодеплой (Gitea Actions) + +`.gitea/workflows/deploy.yml`: после каждого коммита в `main` раннер заливает файлы репозитория на хостинг +`https://preland.anton.barbariskatest.ru` по FTP с TLS и проверяет страницу. + +- **Реквизиты** — секреты репозитория `PRELAND_FTP_HOST`, `PRELAND_FTP_USER`, `PRELAND_FTP_PASS` (Gitea → настройки + репозитория → Actions → секреты; порт 21). В коде их нет. +- **Не заливаются** служебные `.gitea/`, `README.md`, `.gitignore` и то, что живёт только на хостинге: `config.json` + и `requisites.html`. Реквизиты заполняют на хостинге, а пустой файл из git их бы затёр. Удалённые из репозитория + файлы на хостинге не стираются — их убирают вручную. +- **Проверка после заливки.** На странице должен быть адрес загрузки на сайте, а не на самом преленде (иначе нет + `config.json` с `host`), и переход на `claim`. Иначе прогон падает. +- **Другой домен.** Скопировать workflow, поменять `PRELAND_URL` и завести свои секреты. +- **Откат** — `git revert` проблемного коммита в `main`: автодеплой зальёт прежнюю версию. + +**Откат вручную.** Перед заменой файлов — копия изменяемых файлов (`index.php`, `components/*`) с хостинга; вернуть их той же загрузкой. Новый преленд требует на сайте `/api/images/public/claim` (api с 2026-10-05): со старым api переход по ключу отдаст 404.