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>
5.1 KiB
5.1 KiB
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собирается и пушится, но jobdeploy_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/signupcOrigin: 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 не получила ни одного запроса
от публичного сайта.