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

85 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`.
## Чек-лист
- [x] 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'` НЕ должен найти.
- [x] 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.
- [x] 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) этого юзера НЕТ.
- [x] 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`.
- [x] 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` «Публичный сайт: какой образ ↔ какой домен» |
## Проверка после деплоя
```bash
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` не получила ни одного запроса
от публичного сайта.