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>
132 lines
5.9 KiB
YAML
132 lines
5.9 KiB
YAML
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 без деплоя.
|