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 без деплоя.