food-market/.forgejo/workflows/docker-public.yml
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

132 lines
5.9 KiB
YAML
Raw Permalink 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.

name: Docker Public
on:
push:
branches: [main]
paths:
- 'src/food-market.public/**'
- 'deploy/docker-compose.yml'
- '.forgejo/workflows/docker-public.yml'
workflow_dispatch:
env:
LOCAL_REGISTRY: 127.0.0.1:5001
# Два целевых домена:
# test.food-market.kz → test.admin.food-market.kz (стенд-админка) → tag :test
# food-market.kz → admin.food-market.kz (прод-админка) → tag :latest
# Публичный сайт — Astro static; PUBLIC_APP_URL инжектится в бандл при
# pnpm build и используется в SignupForm/Header для ссылок на login+signup.
# Прод-деплой пока ОТКЛЮЧЁН (food-market.kz закрыт владельцем до окончания
# приёмки стенда). Собираем оба тега, но деплоим ТОЛЬКО :test.
STAGE_SITE_URL: https://test.food-market.kz
STAGE_APP_URL: https://test.admin.food-market.kz
PROD_SITE_URL: https://food-market.kz
PROD_APP_URL: https://admin.food-market.kz
jobs:
build:
name: Build + push Public (test + latest)
runs-on: [self-hosted, linux]
steps:
- uses: actions/checkout@v4
- name: Build + push :test (test.food-market.kz)
env:
SHA: ${{ github.sha }}
DOCKER_BUILDKIT: '1'
run: |
docker build \
--build-arg PUBLIC_SITE_URL=$STAGE_SITE_URL \
--build-arg PUBLIC_APP_URL=$STAGE_APP_URL \
-f src/food-market.public/Dockerfile \
-t $LOCAL_REGISTRY/food-market-public:test \
-t $LOCAL_REGISTRY/food-market-public:test-$SHA \
src/food-market.public
docker push $LOCAL_REGISTRY/food-market-public:test
docker push $LOCAL_REGISTRY/food-market-public:test-$SHA
- name: Build + push :latest (food-market.kz, пока не деплоится)
env:
SHA: ${{ github.sha }}
DOCKER_BUILDKIT: '1'
run: |
docker build \
--build-arg PUBLIC_SITE_URL=$PROD_SITE_URL \
--build-arg PUBLIC_APP_URL=$PROD_APP_URL \
-f src/food-market.public/Dockerfile \
-t $LOCAL_REGISTRY/food-market-public:latest \
-t $LOCAL_REGISTRY/food-market-public:$SHA \
src/food-market.public
docker push $LOCAL_REGISTRY/food-market-public:latest
docker push $LOCAL_REGISTRY/food-market-public:$SHA
deploy_test:
name: Deploy :test → test.food-market.kz
needs: build
runs-on: [self-hosted, linux]
steps:
- uses: actions/checkout@v4
# Compose + .env на prod-vm живёт в ~/food-market/deploy/. Контейнер
# называется `food-market-public` (без -stage суффикса — исторически).
# Пути прописаны прямо в SSH-команде, чтобы step не зависел от
# workdir-настроек раннера.
- name: Pull + recreate public (prod-vm)
env:
SSH: nns@192.168.1.190
run: |
ssh "$SSH" "cd ~/food-market/deploy \
&& grep -q '^PUBLIC_TAG=test$' .env || sed -i 's/^PUBLIC_TAG=.*/PUBLIC_TAG=test/' .env \
&& docker compose pull public \
&& docker compose up -d --no-deps --force-recreate public"
- name: Smoke — внешний домен отдаёт нужные ссылки
run: |
set -e
for i in 1 2 3 4 5 6; do
sleep 4
if curl -fsSI https://test.food-market.kz/ -o /dev/null; then
break
fi
done
# Главная проверка: /signup и главная содержат ссылку на
# test.admin.food-market.kz, а НЕ на admin.food-market.kz.
body=$(curl -fsS https://test.food-market.kz/signup/)
echo "$body" | grep -q 'test\.admin\.food-market\.kz/login' \
|| { echo "signup не ссылается на test.admin — PUBLIC_APP_URL не прошёл в билд"; exit 1; }
! echo "$body" | grep -qE 'href="https://admin\.food-market\.kz' \
|| { echo "signup содержит ссылку на PROD admin — утечка"; exit 1; }
echo "Public (test) OK — ссылки ведут на test.admin.food-market.kz"
- name: Notify Telegram on success
if: success()
env:
BOT: ${{ secrets.TELEGRAM_BOT_TOKEN }}
CHAT: ${{ secrets.TELEGRAM_CHAT_ID }}
SHA: ${{ github.sha }}
run: |
curl -sS -X POST "https://api.telegram.org/bot$BOT/sendMessage" \
--data-urlencode "chat_id=$CHAT" \
--data-urlencode "text=✅ public:test deployed — ${SHA:0:7} → https://test.food-market.kz (links → test.admin)" \
> /dev/null
- name: Notify Telegram on failure
if: failure()
env:
BOT: ${{ secrets.TELEGRAM_BOT_TOKEN }}
CHAT: ${{ secrets.TELEGRAM_CHAT_ID }}
SHA: ${{ github.sha }}
run: |
curl -sS -X POST "https://api.telegram.org/bot$BOT/sendMessage" \
--data-urlencode "chat_id=$CHAT" \
--data-urlencode "text=❌ public:test deploy FAILED — ${SHA:0:7}" \
> /dev/null
# Прод-деплой :latest на food-market.kz — ОТКЛЮЧЁН намеренно.
# Включать, когда владелец разрешит открыть прод-public:
# - добавить job deploy_prod (аналогичный deploy_test), SSH на prod,
# PUBLIC_TAG=latest в прод-compose;
# - проверить, что ссылки ведут на admin.food-market.kz;
# - смотреть DNS: food-market.kz должен указывать на prod-vm.
# До тех пор build:latest есть, но висит в registry без деплоя.