Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker Public / Build + push Public (test + latest) (push) Waiting to run
Docker Public / Deploy :test → test.food-market.kz (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
Причина: SW веб-админки прекэшировал /logo.svg и отдавал stale, CACHE_VERSION не менялся при ребрендинге; публичный сайт отдавал лого/favicon без Cache-Control. - sw.js: CACHE_VERSION fm-v2 → am-v3 (+ASSET_VERSION am3); activate чистит старые кэши, skipWaiting+clients.claim; прекэш бренд-ассетов версионирован; бренд в комментариях → ALL MARKET. - ?v=am3 на нехэшированных бренд-ассетах: index.html, manifest, Logo.tsx, публичный Logo.astro + BaseLayout favicon. - nginx web: index.html + бренд-ассеты + manifest → no-cache; /assets/* → immutable. - nginx public: html + лого/favicon → no-cache; /_astro/* → immutable. Проверено Playwright: старый клиент (SW fm-v2 + лого Food Market) → после выкладки + 1 перезагрузки кэш am-v3, fm-v2 удалён, лого ALL MARKET. Заметка на будущее про очистку API_CACHE при logout — в прогресс-доке. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
106 lines
11 KiB
Markdown
106 lines
11 KiB
Markdown
# Ребрендинг Food Market → ALL MARKET — прогресс
|
||
|
||
Решение владельца 08.10.2026. Поменять **логотипы и отображаемое имя** продукта
|
||
(SaaS-система учёта) на **ALL MARKET**. Цвета UI и шрифт интерфейса (Inter) — НЕ менять.
|
||
Обязательна возможность быстрого отката.
|
||
|
||
Брендбук: `~/.fm-watchdog/brand/all-market/` (README + svg/pdf/png). Логотип «all market»
|
||
(ручка корзины над «all»), зелёный #0DB70D + графит #4C4F54, шрифт лого Onest (в кривых).
|
||
Охранное поле ≥ высоты «a», минимум 120 px по ширине на экране. Файлы НЕ перерисовывать.
|
||
|
||
## Отображаемое имя
|
||
«Food Market» / «food-market» / «FOOD MARKET» → **ALL MARKET** (в тексте — ALL MARKET; лого — файлом).
|
||
|
||
## План / статус
|
||
0. [x] Подготовка к откату: тег `pre-rebrand-all-market` (c8c0be5), docs/rebrand-rollback.md,
|
||
deploy/rebrand-rollback.sh (dry-run по умолчанию), проверка отката в worktree (ниже).
|
||
1. [x] Ассеты бренда в репозитории (web/public/pos): логотипы, иконки, favicon.
|
||
2. [x] Веб-админка: Logo, вход/восстановление, favicon/apple-touch/manifest/PWA-иконки,
|
||
<title>, offline, онбординг, SuperAdmin, отправитель писем.
|
||
3. [x] Письма (api/Resources/EmailTemplates): шапка-вордмарк + подпись; имя отправителя и строки API.
|
||
4. [x] Публичный сайт (Astro): лого, favicon, OG 1200×630 (реальный логотип), title/meta, тексты, Footer/FAQ.
|
||
5. [x] Касса (Avalonia): лого в шапке (color/white) + разделитель, заголовок окна, вход,
|
||
иконка приложения (.ico), подвал чека «ALL MARKET — система учёта торговли», pos-mockup.
|
||
6. [x] Документация docs/*.md пользовательская (imports, simple-mode).
|
||
7. [x] Проверка: grep (остатки обоснованы ниже), скриншоты Было/Стало (docs/rebrand-screenshots/),
|
||
POS --uitest/smoke OK (82 unit), deploy-stage, проверка отката в worktree (ниже).
|
||
full-chain C + menu-walk — против стенда после финального деплоя.
|
||
|
||
## Безопасность (ревью Mac-Claude) — закрыто
|
||
- **Пароль dev-админа утекал в UI.** `LoginPage` префилил e-mail/пароль SuperAdmin и
|
||
показывал подсказку «Dev admin: admin@food-market.local / Admin12345!» безусловно.
|
||
→ показывается только в `import.meta.env.DEV` на localhost; на стенде/проде поля пустые.
|
||
- **Сидер создавал SuperAdmin с известным паролем во ВСЕХ средах.** `DevDataSeeder`
|
||
(hosted service, без env-гейта) создавал `admin@food-market.local` с хардкодом
|
||
`Admin12345!` — т.е. и на Production. → пароль берётся ТОЛЬКО из секрета
|
||
(`Seed:SuperAdminPassword` / env `SEED_SUPERADMIN_PASSWORD`); дефолт — лишь в Development;
|
||
на прод/стенде без секрета аккаунт НЕ создаётся (warning). Проброшено в stage-compose.
|
||
- **Существующий пароль на стенде** (`Admin12345!`, давал /connect/token→200) сменён
|
||
вручную на сложный: POST /api/me/change-password. Новый пароль — в
|
||
`~/.fm-watchdog/stage-superadmin-password` (chmod 600). Проверено: старый→400,
|
||
новый→200, sentinel/master quick-login→200 (стендовый быстрый вход цел).
|
||
- **Другие хардкод-пароли:** `docs/DEVELOPER-GUIDE.md` и `docs/quick-login.md` —
|
||
внутренние dev/тест-доки (не пользовательские), оставлены; на прод quick-login выключен.
|
||
- **Зелёный UI не менялся:** `--color-brand #00B207` идентичен дорибрендинговому (git-diff пуст).
|
||
- **Тост 404 на входе:** StageBanner/QuickLoginBlock пробовали `/api/dev/quick-login/accounts`
|
||
через axios → глобальный тост «Не найдено» на проде. → raw fetch, тостов на входе нет.
|
||
|
||
## Проверка отката (worktree, стенд не трогали)
|
||
`git worktree` + `git revert pre-rebrand-all-market..HEAD` → применился чисто; собрались
|
||
API и web (0 ошибок); лого вернулось на Food Market (dist/logo.svg aria-label="Food Market",
|
||
<title>FOOD MARKET</title>, касса «FOOD MARKET · Касса»). Worktree удалён. Скрин —
|
||
`docs/rebrand-screenshots/rollback-logo-foodmarket.png`.
|
||
|
||
## Что НЕ трогаем (обоснование остаточных «food-market»)
|
||
- Домены `*.food-market.kz`, nginx, сертификаты — allmarket.kz ещё не куплен (отдельная задача).
|
||
- C#-namespaces `foodmarket.*`, имена csproj/проектов/репо/docker-образов/БД/контейнеров.
|
||
- `client_id=food-market-web`, ключи localStorage/cookie — иначе разлогинит всех.
|
||
- Бонус-приложение магазина (food-market-app/-ios, back.food-market.kz) — бренд магазина, не продукта.
|
||
- Данные организаций («Демо-магазин» и т.п.), в т.ч. демо-орг «FOOD MARKET» в маркетинг-скриншотах.
|
||
- Цвета UI, шрифт интерфейса (Inter).
|
||
- Имена артефактов кассы (`food-market-pos-*.zip/.AppImage`, exe `foodmarket.Pos`) — завязаны на
|
||
AssemblyName (инфраструктура); у кассы ребрендировано видимое: заголовок окна, Name в .desktop, иконка.
|
||
- Встроенные продуктовые скриншоты маркетинг-сайта (`public/screenshots/*.png`) — генерируются
|
||
`scripts/screenshots.mjs` против ЖИВОЙ админки (сейчас прод); обновятся при выкатке ребрендинга
|
||
на прод (прод в этой задаче не трогаем). На стенде ребренд виден вживую.
|
||
|
||
## Диапазон коммитов для отката
|
||
Все коммиты с префиксом `rebrand:` подряд поверх тега `pre-rebrand-all-market`:
|
||
**`pre-rebrand-all-market..HEAD`** = `ec7d2dc` … `af00f04` (11 коммитов, см.
|
||
`git log --oneline pre-rebrand-all-market..HEAD`). Откат: `deploy/rebrand-rollback.sh --apply`
|
||
(или `git revert --no-edit pre-rebrand-all-market..HEAD` + `~/deploy-stage.sh`).
|
||
|
||
## Итог проверки
|
||
- **grep:** видимых «Food Market/FOOD MARKET» в UI/письмах/сайте/кассе не осталось;
|
||
остатки — только обоснованные (домены, namespaces, client_id, демо-орг, артефакты, см. выше).
|
||
- **Скриншоты Было/Стало:** `docs/rebrand-screenshots/` + index.html (лого, favicon, письмо,
|
||
OG, касса вход/продажа, веб-вход, публичная главная; «Было» из тега, «Стало» live).
|
||
- **POS:** `--uitest` OK, `--smoke` OK (старт 157мс), 82 unit зелёные.
|
||
- **Стенд:** `~/deploy-stage.sh` → OK (test.admin.food-market.kz). Реальный вход: лого ALL MARKET,
|
||
без тостов, без префилла/подсказки пароля.
|
||
- **menu-walk:** 3/3 passed (demo-admin/keeper/cashier, каждый пункт меню, 0 ошибок/тостов).
|
||
- **full-chain C:** 16 ✓ / 0 ✗ — ЗЕЛЁНЫЙ.
|
||
- **Откат:** проверен в worktree (revert собрался, лого Food Market вернулось), стенд не трогали.
|
||
|
||
## Журнал
|
||
- 08.10 — старт: прочитан брендбук, составлен план, зафиксированы границы.
|
||
- 08.10 — ребрендинг web/api/public/pos/docs (коммиты ec7d2dc…89c5c6d); галерея Было/Стало.
|
||
- 08.10 — ревью Mac-Claude: безопасность входа (префилл/подсказка/сидер/ротация пароля стенда),
|
||
тост 404 (StageBanner/QuickLoginBlock → fetch), касса (лого крупнее + разделитель, бейдж внутри).
|
||
- 08.10 — deploy-stage OK; menu-walk 3/3; full-chain 16/16 ЗЕЛЁНЫЙ; откат проверен в worktree.
|
||
- 08.10 — **кэш-бастинг лого** (у владельца в браузере оставалось старое лого из SW/кэша):
|
||
- `sw.js`: `CACHE_VERSION fm-v2 → am-v3` + `ASSET_VERSION=am3`; activate удаляет старые кэши,
|
||
skipWaiting+clients.claim есть; прекэш бренд-ассетов версионирован; бренд в комментариях → ALL MARKET.
|
||
- `?v=am3` на нехэшированных бренд-ассетах во всех ссылках: `index.html`, `manifest.webmanifest`,
|
||
`Logo.tsx`, публичный `Logo.astro` + `BaseLayout.astro` favicon.
|
||
- nginx web (`deploy/nginx.conf`): `index.html` + бренд-ассеты + `manifest` → `no-cache`; `/assets/*` → immutable.
|
||
- nginx public (`src/food-market.public/deploy/nginx.conf`): html + лого/favicon → `no-cache`; `/_astro/*` → immutable.
|
||
- Проверка Playwright: старый клиент (SW fm-v2 + лого Food Market) → после выкладки + 1 перезагрузки
|
||
кэш `am-v3`, `fm-v2` удалён, лого ALL MARKET. PASS.
|
||
- При будущей смене логотипа: bump `CACHE_VERSION` (sw.js) + `?v=` в ссылках (index.html, manifest, Logo.tsx/.astro).
|
||
|
||
### Заметка на будущее (НЕ в этой задаче)
|
||
SW кэширует ответы `GET /api/*` (`API_CACHE`). На ОБЩЕМ компьютере после выхода из аккаунта данные
|
||
прошлого пользователя могут остаться в кэше. Предложение: при logout чистить `API_CACHE`
|
||
(`caches.delete('am-v3-api')` или через `postMessage` к SW) — отдельной задачей.
|