food-market/docs/public-test-url-progress.md
nns 4296236206
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
feat(public): :test ↔ test.admin, :latest ↔ admin; HTTPS-safe redirects
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

5.1 KiB
Raw Permalink Blame History

Public test URL — прогресс (5/5 ✓)

Фикс: https://test.food-market.kz (публичный сайт) должен вести на https://test.admin.food-market.kz (стенд-админку), а не на прод admin.food-market.kz.

Координатор уже вручную пересобрал образ food-market-public:test с правильным PUBLIC_APP_URL и переключил контейнер (PUBLIC_TAG=test в ~/food-market/deploy/.env на prod-vm). Теперь это закреплено в репе, автосборка CI не откатит.

Контекст (prod-vm 192.168.1.190)

  • ~/food-market/deploy/ — публичный сайт test.food-market.kz раздаёт контейнер food-market-public:test. API/web тоже тут, но на отдельных портах; prod-API 2 месяца Exited.
  • ~/food-market-stage/deploy/ — stage-стек (admin API/web) с тегом :stage.

Чек-лист

  • 1. .forgejo/workflows/docker-public.yml: сборка :test-тега с PUBLIC_APP_URL=https://test.admin.food-market.kz, деплой апдейтит именно его. Прод-сборка :latest → admin.food-market.kz собирается и пушится, но job deploy_prod ОТСУТСТВУЕТ (food-market.kz закрыт решением владельца; включать когда разрешат). Smoke в CI: curl .../signup/ | grep test.admin должен найти, grep -E 'href="https://admin\.food-market\.kz' НЕ должен найти.
  • 2. Нет захардкоженных admin.food-market.kz в src/food-market.public кроме env-fallback'ов в Header.astro и SignupForm.tsx (?? 'https://admin.food-market.kz'). Fallback активен только когда env-переменная не задана — для автосборки через workflow она ЕСТЬ всегда. .env.example обновлён с явным комментарием про test vs prod.
  • 3. Smoke выполнил:
    • curl https://test.food-market.kz/ → ссылка «Войти» ведёт на https://test.admin.food-market.kz/login.
    • curl https://test.food-market.kz/signup/ → все href/action указывают на test.admin.food-market.kz. Нет ни одного admin.food- market.kz (без test. префикса).
    • POST /api/auth/signup c Origin: https://test.food-market.kz: юзер publicsmoke-1791116018@food-market.local создан в food-market-stage-postgres-1 (STAGE-БД). В food-market-postgres (прод-adjacent) этого юзера НЕТ.
  • 4. docs/RUNBOOK.md — добавлен раздел «Публичный сайт: какой образ ↔ какой домен» с таблицей :test ↔ test.food-market.kz / test.admin.food-market.kz и :latest ↔ food-market.kz / admin. food-market.kz, и note'ом про absolute_redirect off.
  • 5. src/food-market.public/deploy/nginx.conf:
    • absolute_redirect off; — Location в 301 становится относительным (/signup/ вместо http://test.food-market.kz/signup/); браузер использует текущий scheme → https сохраняется.
    • port_in_redirect off; — на случай cross-port сценариев. Проверено: curl -sI https://test.food-market.kz/signup → теперь location: /signup/ без схемы. Отбились от скатывания на http.

Что в коде

Что Где
Workflow (два build + один deploy) .forgejo/workflows/docker-public.yml
nginx-config публичного образа src/food-market.public/deploy/nginx.conf
Dockerfile с ARG src/food-market.public/Dockerfile
Env-fallback'и к admin-URL src/food-market.public/src/components/{Header.astro,SignupForm.tsx} (без изменений — работают через PUBLIC_APP_URL)
Env-пример src/food-market.public/.env.example (комментарий про test vs prod)
RUNBOOK раздел docs/RUNBOOK.md «Публичный сайт: какой образ ↔ какой домен»

Проверка после деплоя

curl -sI https://test.food-market.kz/signup | grep -i location
# location: /signup/     ← без http://; значит absolute_redirect off работает

curl -s https://test.food-market.kz/signup/ | grep -oE 'href="[^"]*login[^"]*"' | sort -u
# href="https://test.admin.food-market.kz/login"
# href="/signup"

curl -s https://test.food-market.kz/signup/ | grep -oE 'admin\.food-market\.kz'
# (пусто — ни одного вхождения прод-admin)

Прод (admin.food-market.kz) и food-market.kz НЕ ТРОНУТЫ. Прод-API по-прежнему остановлен ~2 месяца (это пре-существующий outage, отдельная задача). Prod-БД food-market-postgres не получила ни одного запроса от публичного сайта.