diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index c20c578..6f67b73 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -170,7 +170,10 @@ jobs: dirs=$(mktemp) trap 'rm -f "$known_hosts" "$batch" "$files" "$dirs"' EXIT printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts" - git ls-files | grep -vE '^(\.gitea/|README\.md$|AGENTS\.md$|CLAUDE\.md$|\.gitignore$|requisites\.html$|config\.json$)' > "$files" + # Наборы `/N/` на stage — редактируемый контент. Кодовая доставка их + # намеренно не перезаписывает: актуальное содержимое stage фиксируют в Git + # отдельной синхронизацией по задаче. + git ls-files | grep -vE '^(\.gitea/|README\.md$|AGENTS\.md$|CLAUDE\.md$|\.gitignore$|requisites\.html$|config\.json$|[0-9]+/)' > "$files" if grep -q '[^A-Za-z0-9._/-]' "$files"; then echo "имена с недопустимыми символами:"; grep '[^A-Za-z0-9._/-]' "$files"; exit 1; fi printf '%s\n' "-mkdir $REMOTE_DIR" > "$batch" while read -r file; do diff --git a/2/01_desk_1-source.avif b/2/01_desk_1-source.avif index c5766bb..1dc5083 100644 Binary files a/2/01_desk_1-source.avif and b/2/01_desk_1-source.avif differ diff --git a/2/01_desk_1-source.jpg b/2/01_desk_1-source.jpg index 70af0fd..9bfecc1 100644 Binary files a/2/01_desk_1-source.jpg and b/2/01_desk_1-source.jpg differ diff --git a/2/01_desk_1-source.webp b/2/01_desk_1-source.webp index ebbc364..4983a62 100644 Binary files a/2/01_desk_1-source.webp and b/2/01_desk_1-source.webp differ diff --git a/2/01_desk_2-result.avif b/2/01_desk_2-result.avif index d2c27d0..7aefe86 100644 Binary files a/2/01_desk_2-result.avif and b/2/01_desk_2-result.avif differ diff --git a/2/01_desk_2-result.jpg b/2/01_desk_2-result.jpg index b229193..14a9ffa 100644 Binary files a/2/01_desk_2-result.jpg and b/2/01_desk_2-result.jpg differ diff --git a/2/01_desk_2-result.webp b/2/01_desk_2-result.webp index c38ae5a..0612af5 100644 Binary files a/2/01_desk_2-result.webp and b/2/01_desk_2-result.webp differ diff --git a/2/01_desk_3-thumb.avif b/2/01_desk_3-thumb.avif index 778af1e..8ec51f5 100644 Binary files a/2/01_desk_3-thumb.avif and b/2/01_desk_3-thumb.avif differ diff --git a/2/01_desk_3-thumb.jpg b/2/01_desk_3-thumb.jpg index ec0a57b..377fc72 100644 Binary files a/2/01_desk_3-thumb.jpg and b/2/01_desk_3-thumb.jpg differ diff --git a/2/01_desk_3-thumb.webp b/2/01_desk_3-thumb.webp index 2be9cfd..860be35 100644 Binary files a/2/01_desk_3-thumb.webp and b/2/01_desk_3-thumb.webp differ diff --git a/2/01_mob_1-source.avif b/2/01_mob_1-source.avif index d4a36d5..14c9b7a 100644 Binary files a/2/01_mob_1-source.avif and b/2/01_mob_1-source.avif differ diff --git a/2/01_mob_2-result.avif b/2/01_mob_2-result.avif index 8bc9109..a85ea1d 100644 Binary files a/2/01_mob_2-result.avif and b/2/01_mob_2-result.avif differ diff --git a/2/01_mob_3-thumb.avif b/2/01_mob_3-thumb.avif index 6b77835..5bab69b 100644 Binary files a/2/01_mob_3-thumb.avif and b/2/01_mob_3-thumb.avif differ diff --git a/2/02_desk_1-source.avif b/2/02_desk_1-source.avif index 53d142c..b1bb561 100644 Binary files a/2/02_desk_1-source.avif and b/2/02_desk_1-source.avif differ diff --git a/2/02_desk_1-source.jpg b/2/02_desk_1-source.jpg index 1f229f7..c8b886e 100644 Binary files a/2/02_desk_1-source.jpg and b/2/02_desk_1-source.jpg differ diff --git a/2/02_desk_1-source.webp b/2/02_desk_1-source.webp index f1181cd..943a48c 100644 Binary files a/2/02_desk_1-source.webp and b/2/02_desk_1-source.webp differ diff --git a/2/02_desk_2-result.avif b/2/02_desk_2-result.avif index 5aff98a..ae977cc 100644 Binary files a/2/02_desk_2-result.avif and b/2/02_desk_2-result.avif differ diff --git a/2/02_desk_2-result.jpg b/2/02_desk_2-result.jpg index 422d45a..ef29037 100644 Binary files a/2/02_desk_2-result.jpg and b/2/02_desk_2-result.jpg differ diff --git a/2/02_desk_2-result.webp b/2/02_desk_2-result.webp index 8064dbd..1e00d0f 100644 Binary files a/2/02_desk_2-result.webp and b/2/02_desk_2-result.webp differ diff --git a/2/02_desk_3-thumb.avif b/2/02_desk_3-thumb.avif index 6486458..86af77a 100644 Binary files a/2/02_desk_3-thumb.avif and b/2/02_desk_3-thumb.avif differ diff --git a/2/02_desk_3-thumb.jpg b/2/02_desk_3-thumb.jpg index f73acbe..52f0048 100644 Binary files a/2/02_desk_3-thumb.jpg and b/2/02_desk_3-thumb.jpg differ diff --git a/2/02_desk_3-thumb.webp b/2/02_desk_3-thumb.webp index 6fcc27d..5b6d4c2 100644 Binary files a/2/02_desk_3-thumb.webp and b/2/02_desk_3-thumb.webp differ diff --git a/2/02_mob_1-source.avif b/2/02_mob_1-source.avif index 8c30b85..4cfa5cb 100644 Binary files a/2/02_mob_1-source.avif and b/2/02_mob_1-source.avif differ diff --git a/2/02_mob_2-result.avif b/2/02_mob_2-result.avif index 13d1c98..1ad2726 100644 Binary files a/2/02_mob_2-result.avif and b/2/02_mob_2-result.avif differ diff --git a/2/02_mob_3-thumb.avif b/2/02_mob_3-thumb.avif index fc34afe..bdb79e9 100644 Binary files a/2/02_mob_3-thumb.avif and b/2/02_mob_3-thumb.avif differ diff --git a/2/03_desk_1-source.avif b/2/03_desk_1-source.avif index 9cdb612..7b4546d 100644 Binary files a/2/03_desk_1-source.avif and b/2/03_desk_1-source.avif differ diff --git a/2/03_desk_1-source.jpg b/2/03_desk_1-source.jpg index 43b335d..a393171 100644 Binary files a/2/03_desk_1-source.jpg and b/2/03_desk_1-source.jpg differ diff --git a/2/03_desk_1-source.webp b/2/03_desk_1-source.webp index 5cfdc3b..eb44db9 100644 Binary files a/2/03_desk_1-source.webp and b/2/03_desk_1-source.webp differ diff --git a/2/03_desk_2-result.avif b/2/03_desk_2-result.avif index 6db27fc..d689ba0 100644 Binary files a/2/03_desk_2-result.avif and b/2/03_desk_2-result.avif differ diff --git a/2/03_desk_2-result.jpg b/2/03_desk_2-result.jpg index 2b61cfc..3603756 100644 Binary files a/2/03_desk_2-result.jpg and b/2/03_desk_2-result.jpg differ diff --git a/2/03_desk_2-result.webp b/2/03_desk_2-result.webp index 3ec12c9..d0a2f5e 100644 Binary files a/2/03_desk_2-result.webp and b/2/03_desk_2-result.webp differ diff --git a/2/03_desk_3-thumb.avif b/2/03_desk_3-thumb.avif index 87b79aa..14ce0e8 100644 Binary files a/2/03_desk_3-thumb.avif and b/2/03_desk_3-thumb.avif differ diff --git a/2/03_desk_3-thumb.jpg b/2/03_desk_3-thumb.jpg index 58d528f..9765703 100644 Binary files a/2/03_desk_3-thumb.jpg and b/2/03_desk_3-thumb.jpg differ diff --git a/2/03_desk_3-thumb.webp b/2/03_desk_3-thumb.webp index fe94662..55adfe9 100644 Binary files a/2/03_desk_3-thumb.webp and b/2/03_desk_3-thumb.webp differ diff --git a/2/03_mob_1-source.avif b/2/03_mob_1-source.avif index a1309aa..5ff7ff2 100644 Binary files a/2/03_mob_1-source.avif and b/2/03_mob_1-source.avif differ diff --git a/2/03_mob_2-result.avif b/2/03_mob_2-result.avif index f5931f4..44313a3 100644 Binary files a/2/03_mob_2-result.avif and b/2/03_mob_2-result.avif differ diff --git a/2/03_mob_3-thumb.avif b/2/03_mob_3-thumb.avif index 302f2fc..2c44e56 100644 Binary files a/2/03_mob_3-thumb.avif and b/2/03_mob_3-thumb.avif differ diff --git a/2/04_desk_1-source.avif b/2/04_desk_1-source.avif index da5d1d0..b57f571 100644 Binary files a/2/04_desk_1-source.avif and b/2/04_desk_1-source.avif differ diff --git a/2/04_desk_1-source.jpg b/2/04_desk_1-source.jpg index 216da26..27c3573 100644 Binary files a/2/04_desk_1-source.jpg and b/2/04_desk_1-source.jpg differ diff --git a/2/04_desk_1-source.webp b/2/04_desk_1-source.webp index 250eb71..663c984 100644 Binary files a/2/04_desk_1-source.webp and b/2/04_desk_1-source.webp differ diff --git a/2/04_desk_2-result.avif b/2/04_desk_2-result.avif index 2f6a605..177c5fe 100644 Binary files a/2/04_desk_2-result.avif and b/2/04_desk_2-result.avif differ diff --git a/2/04_desk_2-result.jpg b/2/04_desk_2-result.jpg index 1788ec8..16f7eed 100644 Binary files a/2/04_desk_2-result.jpg and b/2/04_desk_2-result.jpg differ diff --git a/2/04_desk_2-result.webp b/2/04_desk_2-result.webp index ef1ee08..3b533f7 100644 Binary files a/2/04_desk_2-result.webp and b/2/04_desk_2-result.webp differ diff --git a/2/04_desk_3-thumb.avif b/2/04_desk_3-thumb.avif index 99bfc3e..3bb15dd 100644 Binary files a/2/04_desk_3-thumb.avif and b/2/04_desk_3-thumb.avif differ diff --git a/2/04_desk_3-thumb.jpg b/2/04_desk_3-thumb.jpg index 2af62bd..4e23217 100644 Binary files a/2/04_desk_3-thumb.jpg and b/2/04_desk_3-thumb.jpg differ diff --git a/2/04_desk_3-thumb.webp b/2/04_desk_3-thumb.webp index 87e6934..7470002 100644 Binary files a/2/04_desk_3-thumb.webp and b/2/04_desk_3-thumb.webp differ diff --git a/2/04_mob_1-source.avif b/2/04_mob_1-source.avif index 3d9140e..816988a 100644 Binary files a/2/04_mob_1-source.avif and b/2/04_mob_1-source.avif differ diff --git a/2/04_mob_2-result.avif b/2/04_mob_2-result.avif index ecef905..df922db 100644 Binary files a/2/04_mob_2-result.avif and b/2/04_mob_2-result.avif differ diff --git a/2/04_mob_3-thumb.avif b/2/04_mob_3-thumb.avif index 1ba9fbb..7fbfa10 100644 Binary files a/2/04_mob_3-thumb.avif and b/2/04_mob_3-thumb.avif differ diff --git a/2/05_desk_1-source.avif b/2/05_desk_1-source.avif index 30603a2..1f81364 100644 Binary files a/2/05_desk_1-source.avif and b/2/05_desk_1-source.avif differ diff --git a/2/05_desk_1-source.jpg b/2/05_desk_1-source.jpg index ec5def1..931cc0e 100644 Binary files a/2/05_desk_1-source.jpg and b/2/05_desk_1-source.jpg differ diff --git a/2/05_desk_1-source.webp b/2/05_desk_1-source.webp index 0ee59c0..8456775 100644 Binary files a/2/05_desk_1-source.webp and b/2/05_desk_1-source.webp differ diff --git a/2/05_desk_2-result.avif b/2/05_desk_2-result.avif index 1f69663..03de0c2 100644 Binary files a/2/05_desk_2-result.avif and b/2/05_desk_2-result.avif differ diff --git a/2/05_desk_2-result.jpg b/2/05_desk_2-result.jpg index 42fd4f3..ee9349b 100644 Binary files a/2/05_desk_2-result.jpg and b/2/05_desk_2-result.jpg differ diff --git a/2/05_desk_2-result.webp b/2/05_desk_2-result.webp index c303afc..ae0ec23 100644 Binary files a/2/05_desk_2-result.webp and b/2/05_desk_2-result.webp differ diff --git a/2/05_desk_3-thumb.avif b/2/05_desk_3-thumb.avif index 00a2325..d2a3bcb 100644 Binary files a/2/05_desk_3-thumb.avif and b/2/05_desk_3-thumb.avif differ diff --git a/2/05_desk_3-thumb.jpg b/2/05_desk_3-thumb.jpg index e44fc27..edb6a95 100644 Binary files a/2/05_desk_3-thumb.jpg and b/2/05_desk_3-thumb.jpg differ diff --git a/2/05_desk_3-thumb.webp b/2/05_desk_3-thumb.webp index b4883d0..dbb2190 100644 Binary files a/2/05_desk_3-thumb.webp and b/2/05_desk_3-thumb.webp differ diff --git a/2/05_mob_1-source.avif b/2/05_mob_1-source.avif index 628a2bc..06c1a8d 100644 Binary files a/2/05_mob_1-source.avif and b/2/05_mob_1-source.avif differ diff --git a/2/05_mob_2-result.avif b/2/05_mob_2-result.avif index 741b7d9..ff7e885 100644 Binary files a/2/05_mob_2-result.avif and b/2/05_mob_2-result.avif differ diff --git a/2/05_mob_3-thumb.avif b/2/05_mob_3-thumb.avif index 6bba050..f619675 100644 Binary files a/2/05_mob_3-thumb.avif and b/2/05_mob_3-thumb.avif differ diff --git a/AGENTS.md b/AGENTS.md index f7b25f9..07a7714 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -30,6 +30,10 @@ такого выпуска фактический stage-config следует забрать и зафиксировать в Git. `requisites.html` также живёт только на хостинге и не перезаписывается. Не создавать target-specific конфиги или `config.json.example`. +- Корневые числовые наборы примеров `/N/` на `zoomstage.online` — редактируемый + контент stage. Обычный push в `staging` должен исключать `[0-9]+/` из SFTP-заливки: + актуальные примеры нельзя перезаписывать Git-версией. Снимок stage фиксируется в + Git отдельной синхронизацией по задаче. - Коммит в `main` запускает FTP-автодеплой на все цели workflow; откат через `git revert` также запускает выкат. Коммит, push и изменения хостинга — только по прямому поручению. - Проверки кода и браузера проводить в Docker без установки ПО на хост. diff --git a/CLAUDE.md b/CLAUDE.md index 9bf5ebf..07a7714 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,7 +3,7 @@ Область действия — репозиторий `preland/`. Общие правила рабочей области находятся в [AGENTS.md](../AGENTS.md) и [CLAUDE.md](../CLAUDE.md); канонический процесс и каталог ролей — [в общей политике](../.known-base/Соглашения/Процесс%20командной%20разработки%20и%20каталог%20ролей.md). -Этот файл и [AGENTS.md](AGENTS.md) содержат одинаковые локальные правила; обновлять их вместе. +Этот файл и [CLAUDE.md](CLAUDE.md) содержат одинаковые локальные правила; обновлять их вместе. ## Перед работой @@ -21,10 +21,19 @@ переход напрямую на `/public/upscale` не заменяет передачу владельца через claim. - `host` задаёт сайт назначения; HTTPS необходим для `crypto.randomUUID()`. Не обходить серверные правила доступа к загрузке и результату обработки. -- Рабочий `config.json` единственный для всех прилендов: это точная проверенная - конфигурация `zoomstage.online`, и каждый FTP/SFTP-deploy обязан доставлять её на - stage и production. `requisites.html` по-прежнему живёт только на хостинге и не - перезаписывается. Не создавать target-specific конфиги или `config.json.example`. +- Рабочий `config.json` на каждом хостинге настраивает владелец. Деплой не имеет + права перезаписывать его значений. При появлении новой обязательной UTM workflow + получает текущий хостовый конфиг и меняет только ключи, которые прямо + согласованы в задаче. Иные значения, включая уже настроенные UTM, остаются + байт-в-байт прежними. Для #274 `bin/ensure-focus-config.php` — явное + исключение: он задаёт только новый `focus=face` (default и rnd). После каждого + такого выпуска фактический stage-config следует забрать и зафиксировать в Git. + `requisites.html` также живёт только на хостинге и не перезаписывается. Не + создавать target-specific конфиги или `config.json.example`. +- Корневые числовые наборы примеров `/N/` на `zoomstage.online` — редактируемый + контент stage. Обычный push в `staging` должен исключать `[0-9]+/` из SFTP-заливки: + актуальные примеры нельзя перезаписывать Git-версией. Снимок stage фиксируется в + Git отдельной синхронизацией по задаче. - Коммит в `main` запускает FTP-автодеплой на все цели workflow; откат через `git revert` также запускает выкат. Коммит, push и изменения хостинга — только по прямому поручению. - Проверки кода и браузера проводить в Docker без установки ПО на хост. diff --git a/README.md b/README.md index 05e704b..0d7e559 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,12 @@ N/05_... домена целиком: без переименования, вложения в `images/` и промежуточных каталогов. Устаревшие `images/demo*` не являются частью поставки. +Для `zoomstage.online` обычный deploy ветки `staging` намеренно **не загружает** +корневые числовые каталоги `/N/`: это редактируемый контент stage, а не артефакт +кодовой доставки. Workflow продолжает проверять их доступность HTTP-smoke. Чтобы +зафиксировать обновлённый набор, сначала синхронизируйте его со stage в Git по +отдельной задаче; следующая заливка не перетрёт его старой ревизией. + ## Деплой на произвольный домен **Требования.** PHP 8.0+ (боевой хостинг — 8.2), веб-сервер с `index.php` в роли индексного файла и **HTTPS**: diff --git a/tests/check-demo-layout.php b/tests/check-demo-layout.php index 56f88e0..14e4975 100644 --- a/tests/check-demo-layout.php +++ b/tests/check-demo-layout.php @@ -60,6 +60,10 @@ foreach ([ } } +if (!str_contains($workflow, '|[0-9]+/)')) { + $failures[] = 'Stage-деплой не должен перезаписывать корневые наборы /N/: stage владеет их содержимым.'; +} + if (substr_count($workflow, 'while [ -n "$dir" ]; do') < 2) { $failures[] = 'SFTP-деплой должен создавать все родительские каталоги для новых наборов assets.'; }