Автодеплой: после коммита в main — заливка на хостинг преленда по FTP с TLS и проверка страницы
deploy-preland / deploy (push) Successful in 18s

Реквизиты — секреты репозитория PRELAND_FTP_HOST/USER/PASS. Не заливаются служебные файлы и живущие только на
хостинге config.json и requisites.html; на хостинге ничего не удаляется. После заливки страница проверяется: адрес
загрузки — на сайте, а не на самом преленде, переход — на claim. Один вызов curl на все файлы (одно соединение).
README: раздел «Автодеплой».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Panfilov KonstantinandClaude Opus 5.5 committed 2026-10-05 18:37:25 +03:00
1 parent 59e88ae964
commit 01b5a03b8e
2 files changed
+83 -1

No files matched your search

+67
View File
@@ -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 "страница в порядке"
+16 -1
View File
@@ -120,6 +120,21 @@
`https://<host>/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.