docs: план выполнения админки прелендингов (#22)
This commit is contained in:
1 parent
b3b14ec193
commit
5b6b2d2053
1 file changed
+118
@@ -0,0 +1,118 @@
|
|||||||
|
# preland#22 — план реализации единой админки
|
||||||
|
|
||||||
|
Спецификация: ../specs/2026-10-25-preland22-admin-design.md; основной реестр preland#22.
|
||||||
|
Владелец 25.10 поручил выполнение командой до production без повторного подтверждения.
|
||||||
|
Метод: writing-plans, dispatching-parallel-agents для независимых файловых областей,
|
||||||
|
TDD, систематическая диагностика при сбоях, независимое review и verification-before-completion.
|
||||||
|
Работа в уже изолированном wt/preland21; исходные checkout/ветки не переключаются.
|
||||||
|
|
||||||
|
**Цель:** безопасно редактировать поля runtime-конфигов и публиковать indpic на выбранных доменах.
|
||||||
|
**Архитектура:** отдельное PHP-приложение admin/, прямые local/SFTP+SSH-адаптеры,
|
||||||
|
приватный файловый реестр/очередь заданий, повторное использование CPanel indpic UI/валидатора.
|
||||||
|
**Стек:** PHP8.3, phpseclib3, Imagick/ZIP, Apache, отдельный CLI-worker, Docker, nginx/TLS.
|
||||||
|
Python используется в инструментах QA/инфраструктуры, Yii2 — источник совместимого контракта,
|
||||||
|
новые прикладные микросервисы без функциональной причины не добавляются.
|
||||||
|
|
||||||
|
## Общие ограничения и карта поверхности
|
||||||
|
|
||||||
|
- Русский интерфейс/документация, все поля config через формы, JSON-editor отсутствует.
|
||||||
|
- Четыре начальные цели, произвольный дальнейший реестр; .online кроме stage не включать.
|
||||||
|
- Изменения только выбранных полей/целей, конфликты версий, резерв вне webroot,
|
||||||
|
атомарная публикация и повторное чтение, статусы/повтор каждой цели независимо.
|
||||||
|
- Секреты только вне Git/webroot; ключ root приложению не передаётся.
|
||||||
|
- indpic1–9, ZIP и 90файлов проверяются действующим валидатором CPanel.
|
||||||
|
- Сохранить runtime config и /N/ при кодовом deploy; guard runtime проверяет контракт,
|
||||||
|
а статические ресурсы остаются привязаны к manifest Git.
|
||||||
|
- Все зависимости/тесты в Docker. Browser plugin not available: реальный UI в Docker Playwright.
|
||||||
|
- Карта UI: login, домены/подключения, настройки/доп.поля, выбор целей/полей,
|
||||||
|
задания/частичный успех/конфликт/повтор, резерв/восстановление, indpic ZIP/SFTP/default.
|
||||||
|
|
||||||
|
## Общий HTTP-контракт для независимой реализации
|
||||||
|
|
||||||
|
Все ответы JSON: {ok:true,...} либо {ok:false,error:"понятный текст"}; безопасные HTTP-коды.
|
||||||
|
POST/PUT/DELETE требуют header X-CSRF-Token после login; multipart также использует header.
|
||||||
|
- POST /api/login {username,password}; GET /api/state → {csrf,user,targets}; POST /api/logout.
|
||||||
|
- targets имеют id,name,domain,environment,type(local|sftp),host,port,user,root,host_key,
|
||||||
|
enabled,has_secret; сервер никогда не возвращает secret/private_key.
|
||||||
|
- POST /api/targets {target:{...},secret?:string}; DELETE /api/targets {id};
|
||||||
|
POST /api/targets/test {id} проверяет подключение и безопасные пути.
|
||||||
|
- GET /api/config?target=id → {config,version,warnings,sets}; version=SHA256 текущего файла.
|
||||||
|
- POST /api/apply {targets:[{id,version}],changes:[{path:[string...],value:any,delete?:bool}]}
|
||||||
|
→ {job}; версии каждой цели берутся её собственным чтением, не от исходного домена.
|
||||||
|
- GET /api/jobs?id=id → {job}; без id → {jobs}; POST /api/jobs/retry {id,targets:[id...]} → {job}.
|
||||||
|
job={id,status,results:[{target,status,message,version?}],...}; статусы queued,running,
|
||||||
|
success,error,conflict,unknown; статус задания queued,running,completed.
|
||||||
|
- GET /api/backups?target=id → {backups:[{id,created_at}]};
|
||||||
|
POST /api/restore {target,id,version} → {job}.
|
||||||
|
- GET /api/sets?target=id → {sets:[{number,name,exists,default,in_use}],version};
|
||||||
|
POST /api/sets/upload multipart file,number,name,targets(JSON-массив id) → {job};
|
||||||
|
POST /api/sets/check {targets:[id],number} → {job}; POST /api/sets/register аналогично +name;
|
||||||
|
POST /api/sets/name {target,number,name}; POST /api/sets/delete {target,number};
|
||||||
|
default задаётся /api/apply по path utm/indpic/default и текущей version.
|
||||||
|
Технические расширения контракта допустимы с синхронизацией агентов и записью в #22.
|
||||||
|
|
||||||
|
## Задача 1 (#22): серверная логика и файловый контракт
|
||||||
|
|
||||||
|
Владелец: backend (Yii2 senior/PHP senior, security/transport).
|
||||||
|
Файлы: admin/src/*, admin/public/index.php, admin/bootstrap.php,
|
||||||
|
admin/bin/*, admin/composer.json/lock, admin/tests/backend*.php; не менять UI/Docker/CI.
|
||||||
|
|
||||||
|
- [ ] RED: выбранный patch сохраняет поля/типы, чужая версия не затирается,
|
||||||
|
массовая ошибка одной цели не откатывает другие, резерв восстанавливается по версии.
|
||||||
|
- [ ] Реализовать auth/CSRF, защищённый реестр соединений, транспорт local и SFTP/SSH,
|
||||||
|
серверные задания/worker, конфиги/валидацию/историю и HTTP-контракт выше.
|
||||||
|
- [ ] Перенести IndpicSetStorage с атрибуцией; проверять ZIP до доставки, затем хеши,
|
||||||
|
публикацию/откат; регистрацию SFTP-набора, имена/default/удаление из реестра.
|
||||||
|
- [ ] GREEN в Docker, реальные подключения через локальную SFTP-цель, auth/error/race/ZIP tests.
|
||||||
|
|
||||||
|
## Задача 2 (#22): интерфейс на основе CPanel
|
||||||
|
|
||||||
|
Владелец: frontend senior, дизайнер, верстальщик.
|
||||||
|
Файлы: admin/views/dashboard.php, admin/public/assets/*, admin/tests/ui*.cjs.
|
||||||
|
Вход public/index.php рендерит dashboard.php для обычных URL; API выше.
|
||||||
|
|
||||||
|
- [ ] Форма входа, домены, редактор всех config-полей и UTM, один/несколько выбранных
|
||||||
|
доменов и только изменённые поля; версии до редактирования, без silent overwrite.
|
||||||
|
- [ ] Таблица/действия indpic копируют CPanel, включая ZIP/SFTP и понятное окно проверки.
|
||||||
|
- [ ] Подключения/история/резерв, задания/частичные ошибки/повтор, loading/error/recovery;
|
||||||
|
безопасный текстовый вывод любых серверных полей, desktop/mobile/keyboard.
|
||||||
|
- [ ] Реальные browser сценарии login→чтение→ввод→выбор2целей→применить→reload;
|
||||||
|
ошибка/восстановление/ZIP; сохранить screenshot и console evidence вне repo.
|
||||||
|
|
||||||
|
## Задача 3 (#22): runtime guard и доставка
|
||||||
|
|
||||||
|
Владелец: DevOps/QA (независимо от admin/).
|
||||||
|
Файлы: bin/release-assets.php, новый bin/check-runtime-sets.php, tests/check-runtime-sets.php,
|
||||||
|
.gitea/workflows/deploy.yml, AGENTS.md/CLAUDE.md/README.md только относящиеся части.
|
||||||
|
|
||||||
|
- [ ] RED: корректно заменённый runtime-набор не требует Git; повреждённый активный
|
||||||
|
набор/невалидный default выявляется; общая проверка статики не ослабевает.
|
||||||
|
- [ ] Изменить --stage-sets/--remote на контрактную проверку runtime /N/ и manifest
|
||||||
|
только кода/поставляемых ресурсов; admin/ и приватные файлы не входят в preland releaseFiles.
|
||||||
|
- [ ] GREEN в Docker + старые preland tests/manifest; документация обновляет #11 явно.
|
||||||
|
|
||||||
|
## Задача 4 (#22): интеграция, инфраструктура и приёмка
|
||||||
|
|
||||||
|
Владелец: ведущий агент (Senior DevOps/Linux/Windows, QA и release).
|
||||||
|
Файлы: admin/Dockerfile, admin/compose.yaml, admin/deploy/*, admin/README.md,
|
||||||
|
локальные output/preland22/*; KB Спеки/Планы/Инфраструктура и индекс.
|
||||||
|
|
||||||
|
- [ ] Создать образ/локальный стенд и SSH/SFTP fixture, запустить backend/guard тесты.
|
||||||
|
- [ ] Реальный UI-клик в Docker Playwright 1440/390: все общие состояния и контракты
|
||||||
|
из спецификации, с отдельными read/save/conflict/partial/retry/ZIP свидетельствами.
|
||||||
|
- [ ] Независимое review всего diff; исправить существенные замечания, повторить
|
||||||
|
затронутые сценарии, подготовить rollback и неизменяемую версию образа.
|
||||||
|
- [ ] Настроить admin.zoomstage.online DNS/TLS/nginx, ограниченные local mount/SFTP
|
||||||
|
доступы, секреты в приватном состоянии, отдельный worker; текущий трафик не прерывать.
|
||||||
|
- [ ] Проверить на установленной админке вход/чтение всех4целей, реальный безопасный
|
||||||
|
write/read/ZIP/error/recovery с возвратом исходных runtime; никаких ложных PASS.
|
||||||
|
- [ ] Опубликовать код и KB, занести итог/проверки/версии/ограничения в #22, закрыть
|
||||||
|
только после завершения. Неисполненные обязательные сценарии оставить открытыми.
|
||||||
|
|
||||||
|
## Особое внимание review
|
||||||
|
|
||||||
|
1. Разные версии/типы/legacy-alias четырёх файлов и потеря неизвестных полей — тест задачи1.
|
||||||
|
2. Таймаут после фактической записи/обновление страницы — задания/повтор задачи1+2.
|
||||||
|
3. Повреждённый ZIP/размер/traversal/лимит/ошибка активации — задача1 и UI задачи2.
|
||||||
|
4. Подмена пути/host key, утечка пароля, CSRF/сессия и незавершённые задания — задача1/4.
|
||||||
|
5. Runtime-изменения не должны блокировать выпуск или публиковать admin-секреты — задача3/4.
|
||||||
Reference in new issue
Block a user