Перейти к содержанию

Task card: ручной deploy exact candidate в STAGE

Access-часть G9 ниже отражает исходный deploy. Решение 0030 позднее сняло Basic Auth со всех test origins; текущий skuaro.top доступен публично, а защищённые Product API по-прежнему требуют SKUARO session/permissions.

  • Дата: 2026-08-26.
  • Статус: ACCEPTED_FOR_HANDOFF.
  • Исполнитель: основной агент.
  • Независимый verifier: project reviewer до mutation и после deploy.
  • Candidate: 4f9d7153fb8346cc8088f551d330b44c5dbdae0f из приватной origin/DEV; GitHub CI run 32893511115 завершён успешно.
  • Server image: sha256:af1bc31c4e0798d7077bebe11870d2b2c54a7e62030375c465f6f08f3f24867e.
  • Web image: sha256:48daa0719d3010bf27e1ca13112c54cd5b11297ac58e873e4ceb5cb6bfc762dd.
  • Связанные решения: 0013, 0016, 0017, 0019, 0020, 0025, 0026.

Цель

Развернуть проверенный exact candidate только в существующем ручном STAGE-контуре на тестовом сервере, сохранив DEV и PROD неизменными, и доказать состояние по обязательным gate G1-G12.

Scope

Включено

  • read-only snapshot STAGE/DEV/edge, ресурсов, image IDs, restart counters и Compose;
  • отдельный STAGE logical dump с mode 600 и pg_restore --list;
  • restore dump в одноразовую изолированную PostgreSQL-БД и применение migration candidate до изменения постоянной STAGE-БД;
  • защищённая rollback-копия STAGE env и точные предыдущие image IDs;
  • отдельный новый STAGE Auth secret;
  • отдельный STAGE Resend sending-only credential для подтверждённого домена mail.skuaro.top; DEV credential не переносится и не переиспользуется;
  • ручной deploy exact server/web images только в Compose project skuaro-stage;
  • legacy STAGE App origin https://skuaro.top до отдельной миграции решения 0019;
  • migration, health, HTTPS, Basic Auth, security headers, negative access, log-marker и restart-loop проверки;
  • один полностью синтетический STAGE Auth flow, только если тестовое письмо можно получить без раскрытия секретов или персональных данных;
  • restore smoke на отдельной временной БД после deploy;
  • документирование доказательств без secret values.

Исключено

  • deploy или переключение DEV; DEV остаётся на прежнем runtime artifact;
  • PROD, merge, PR, создание/продвижение Git-ветки STAGE, pipeline и GitHub Environment;
  • DNS/domain migration skuaro.top -> lk.skuaro.top;
  • реальные пользователи, клиентские данные и массовая отправка;
  • удаление volumes, старых images/releases/backups или schema downgrade;
  • публикация developer-site: она выполняется отдельным task contract и gate.

Критерии приёмки

  1. G1 Scope: этот task card фиксирует exact SHA/images, границы, stop conditions, rollback и G9-G12; dirty рабочее дерево не входит в release.
  2. G2 Static: exact SHA совпадает с origin/DEV, remote CI успешен.
  3. G3 Unit: unit/coverage exact candidate успешны в remote CI.
  4. G4 Database: STAGE schema/count snapshot снят без значений данных; dump восстановлен в отдельную БД; migration candidate там завершилась 0.
  5. G5 Build: image labels содержат полный exact SHA; server/web image IDs совпадают с зафиксированными в card.
  6. G6 Security: STAGE использует отдельные Auth/Resend credentials; активный env не смешивает Gmail и Resend; значения не попадают в вывод, Git и документы.
  7. G7 Local E2E: обязательные exact-candidate E2E и затронутые visual проверки подтверждены CI/closeout evidence без runtime code drift.
  8. G8 Deploy: до migration сохранены валидный dump, предыдущие images/env и recovery path; миграция и запуск STAGE завершены успешно либо выполнен rollback.
  9. G9 Stage Smoke: liveness/readiness, HTTPS, Basic Auth, same-origin API, HSTS/noindex/no-referrer, containers и логи проходят обязательный smoke.
  10. G10 Role E2E: фактически реализованные Auth/access negatives проходят; нереализованные роли явно получают NOT_APPLICABLE.
  11. G11 Cross-domain: для фактического legacy STAGE проверяются origin isolation, Basic Auth и отсутствие общей cookie; целевые Site/Docs origins получают NOT_APPLICABLE до отдельного deploy решения 0019.
  12. G12 Restore: свежий STAGE dump повторно восстанавливается в отдельную временную БД, schema/data counts сверяются, постоянный volume не изменяется.
  13. DEV image IDs/start/restart/config и PROD остаются неизменными.

Ожидаемые артефакты

  • pre/post snapshot без секретов;
  • mode-600 STAGE dump и успешный pg_restore --list;
  • isolated restore/migration evidence;
  • rollback env copy и точные previous image IDs;
  • отдельный STAGE credential status только как SET/EMPTY;
  • migration/health/HTTPS/access/log/restore evidence;
  • итоговая матрица G1-G12 -> evidence -> PASS/FAIL/BLOCKED/N/A;
  • обновлённые docs/STATUS.md и session log без автоматического Product commit/push.

Permissions

  • владелец 2026-08-26 явно потребовал: «размести Stage на тестовом сервере, не надо размещать DEV»;
  • разрешение охватывает обязательные backup, migration rehearsal, отдельные STAGE runtime credentials, ручное переключение STAGE и проверочные синтетические действия;
  • разрешение не охватывает DEV/PROD deploy, merge/PR/pipeline, Git push и удаление данных или recovery artifacts.

Stop conditions

  • exact SHA/CI/image labels не совпадают;
  • не удаётся создать отдельный STAGE Resend credential или provider config смешан;
  • свежий dump, pg_restore --list, isolated restore/migration либо rollback point отсутствуют;
  • недостаточно disk/memory, Compose/Caddy invalid или isolation DEV/STAGE не доказана;
  • migration/health/security/access fail;
  • для продолжения требуется раскрыть secret/PII, удалить данные, изменить DEV/PROD, активировать pipeline или выполнить неразрешённую domain migration.

Rollback

  1. Остановить дальнейшие post-deploy действия при первом обязательном FAIL.
  2. Вернуть только STAGE env и предыдущие server/web image IDs из защищённой копии.
  3. Выполнить docker compose up -d --wait только для skuaro-stage.
  4. Не выполнять автоматический schema downgrade и не удалять STAGE volume/backups.
  5. Проверить health, legacy HTTPS, прежние image IDs и неизменность DEV.
  6. Зафиксировать STAGE FAILED; новый deploy требует отдельного исправления и review.

Pre-mutation review 1

Независимый reviewer выдал BLOCKED: отсутствовали этот STAGE task contract, отдельный STAGE Resend credential, rehearsal migration legacy schema и полный G8 recovery package. Разрешена только подготовка card, backup, isolated restore/migration и resource/config snapshots; переключение STAGE запрещено до повторного review.

Pre-mutation review 2

После создания отдельного domain-scoped STAGE Resend credential, восстановления dump в изолированной PostgreSQL, rehearsal migration и проверки rollback package независимый reviewer выдал VERIFIED и разрешил ограниченную server mutation.

Фактическое выполнение

  • Exact candidate 4f9d7153fb8346cc8088f551d330b44c5dbdae0f развёрнут только в skuaro-stage; API и web используют зафиксированные content-addressed images, PostgreSQL/API/web healthy, worker running, restart counters 0.
  • Активный STAGE env использует отдельные SKUARO_AUTH_SECRET и domain-scoped SKUARO_RESEND_API_KEY; Gmail credentials EMPTY. DEV images, start times, restart counters и Gmail runtime не изменены.
  • До первого deploy, после него и перед повторным переключением созданы mode-600 logical dumps; pg_restore --list, изолированный restore и candidate API smoke прошли.
  • Синтетический flow прошёл: sign-up 200, вход до verify 403 EMAIL_NOT_VERIFIED, Resend delivered, verify 302, replay 302 без создания сессии, login/access 200; effective access: settings true, today/admin false, startPath=/home.
  • Первый post-check ошибочно считал любое token= утечкой, включая безопасное token=[REDACTED], поэтому был выполнен предусмотренный rollback. Rollback выявил и доказал необходимость возвращать вместе старые images, env и Compose: новый Compose несовместим со старым расположением entrypoint и migrator.
  • Изолированная runtime-проверка candidate и повторный live gate различили raw и redacted значения: literal/encoded raw markers 0/0, [REDACTED]2, edge raw markers 0/0, API error markers 0. После этого тот же exact candidate повторно развёрнут с новым dump и полным rollback package.
  • External smoke: guest/wrong Basic Auth 401, authenticated home 200, session access 200, HSTS/noindex/no-referrer присутствуют.
  • Product commit/push, merge, pipeline, DEV и PROD не выполнялись.

Независимый post-deploy verdict

Project reviewer независимо сверил Git identity, CI evidence, runtime package, external headers и Auth artifacts и выдал VERIFIED: G1–G12, corrected raw-marker gate и DEV invariant — PASS, блокирующих STAGE findings нет. Прямой SSH-снимок verifier не повторял из-за отсутствия отдельной SSH-auth; серверные image/restore доказательства сверены по переданному package, а внешние проверки повторены независимо. Координатор присвоил ACCEPTED_FOR_HANDOFF.