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>