Commit graph

3 commits

Author SHA1 Message Date
nns 4296236206 feat(public): :test ↔ test.admin, :latest ↔ admin; HTTPS-safe redirects
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
Workflow (.forgejo/workflows/docker-public.yml):
- Собирает ДВА тега: :test с PUBLIC_APP_URL=https://test.admin.food-market.kz
  (для test.food-market.kz) и :latest с PUBLIC_APP_URL=https://admin.food-
  market.kz (для будущего food-market.kz). deploy_prod отключён
  намеренно: прод-public закрыт владельцем.
- deploy_test: SSH на prod-vm, идемпотентно устанавливает PUBLIC_TAG=test
  в ~/food-market/deploy/.env, pull + up -d public. Smoke проверяет что
  /signup/ ссылается на test.admin и НЕ содержит admin.food-market.kz.

nginx.conf (src/food-market.public/deploy/):
- absolute_redirect off; port_in_redirect off;
  Было: curl -sI https://test.food-market.kz/signup → location: http://...
  (schema терялась на 301 /signup → /signup/).
  Стало: location: /signup/ (относительный, браузер держит https).

Env-пример (.env.example) — комментарий, что для test-билда ставить
test.admin и прод в коде оставить дефолтом в source-коде (SignupForm/
Header), но в билде всегда задавать явно через PUBLIC_APP_URL build-arg.

RUNBOOK — новый раздел «Публичный сайт: какой образ ↔ какой домен» с
таблицей и smoke-командой.

Smoke проверил:
- https://test.food-market.kz/signup → 301 на /signup/ (без схемы, https
  сохраняется).
- https://test.food-market.kz/signup/ → ссылается на test.admin.food-
  market.kz; ни одного вхождения admin.food-market.kz (без test.).
- POST /api/auth/signup с Origin test.food-market.kz → user создан в
  food-market-stage-postgres-1 (STAGE), не в food-market-postgres (прод-
  adjacent).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-04 17:14:55 +05:00
nns a54315bd6e fix(ci): docker-public — актуализировать PUBLIC_*_URL под новые домены
Some checks are pending
CI / POS (WPF, Windows) (push) Waiting to run
CI / Backend (.NET 8) (push) Successful in 1m8s
CI / Web (React + Vite) (push) Successful in 40s
Docker Public / Build + push Public (push) Successful in 28s
Docker Public / Deploy Public on stage (push) Successful in 11s
Корень бага «кнопка Войти ведёт на zat.kz/410-Gone»:
.forgejo/workflows/docker-public.yml хардкодил PUBLIC_SITE_URL и
PUBLIC_APP_URL на zat.kz. На каждый git push CI собирал docker-image
с zat.kz и пушил под :latest, перетирая мои локальные пересборки.
Контейнер вечно крутил stale-бандл с href Войти=zat.kz/login.

Чиню env workflow:
- PUBLIC_SITE_URL → https://test.food-market.kz
- PUBLIC_APP_URL  → https://admin.food-market.kz
- TG-нотификация о деплое — ссылка на test.food-market.kz.

Локально форсировал свежий image (--no-cache), push под :latest,
compose pull --force-recreate. Smoke на проде:
- href Войти → https://admin.food-market.kz/login
- Никаких zat.kz в /usr/share/nginx/html (grep пуст).
2026-05-02 22:27:26 +05:00
nns 4ac7dc585c feat(deploy): Phase 6 — публичный сайт на food-market.zat.kz, админка на app.
Доменная схема (по решению юзера):
  food-market.zat.kz → новый Astro public-сайт (порт 8082, контейнер food-market-public)
  app.food-market.zat.kz → существующая админка (food-market.web, порт 8081)
  API остаётся на app.* под /api/*.

Изменения:
- docker-compose: добавлен сервис public (image food-market-public:latest,
  127.0.0.1:8082:80). На стенде .env дополнен PUBLIC_TAG=latest, контейнер
  поднят, smoke на / и /pricing проходит.
- Forgejo workflow .forgejo/workflows/docker-public.yml — отдельный билд
  при изменениях в src/food-market.public/**: docker build с
  --build-arg PUBLIC_SITE_URL=https://food-market.zat.kz и
  --build-arg PUBLIC_APP_URL=https://app.food-market.zat.kz, push в
  локальный registry, deploy через docker compose pull+up. TG-пинг.
- Nginx (на стенде вручную, не через репо):
  - Новый блок food-market-app.conf для app.food-market.zat.kz —
    проксирует на :8081 (web), вместе с /api/admin/import/ и
    /tg-webhook путями. Certbot --nginx выпустил SSL.
  - Старый food-market-stage.conf переписан на public — проксирует на
    :8082, использует существующий SSL для food-market.zat.kz.
- API CORS: добавлены food-market.zat.kz, app.food-market.zat.kz,
  food-market.kz, app.food-market.kz в AllowedOrigins (publicу нужен
  food-market.zat.kz для signup-запросов, админке нужен app.*).
- JWT cookie domain не настраиваем — проект использует localStorage,
  cross-domain auth-bridge через URL fragment (см. AuthBridgePage),
  что безопаснее cookie с .food-market.zat.kz.
- Хардкодов food-market.zat.kz в food-market.web/src не нашлось —
  всё через относительные URL.

Существующие админ-сессии: токены в localStorage привязаны к
food-market.zat.kz origin. После переезда юзеры увидят на этом
домене публичный сайт без своих токенов — нужно перелогиниться
на app.food-market.zat.kz.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 19:17:48 +05:00