food-market/docs/24x7.md
nurdotnet fa2fae9503 ci: move POS (Windows, 2x multiplier) to tag/manual only; document budget
Each push previously burned ~21 billable GitHub Actions minutes because the
Windows POS build cost 10 (5 real × 2x Windows multiplier). That gives us
~95 pushes/month on the 2000-minute free tier — too tight for active dev.

- POS job now gates on `startsWith(github.ref, 'refs/tags/v')` OR
  workflow_dispatch. Every-commit CI stays Linux-only.
- CI trigger adds `tags: ['v*']` and workflow_dispatch so releases can build
  the .exe on demand.
- docs/24x7.md: new table with per-job minute/multiplier breakdown and the
  break-even point where a self-hosted runner becomes cheaper (~200 commits/mo).

Post-change estimate: ~11 billable min/commit → fits 180 commits/month in
the free tier. Windows minutes only spent when tagging a release.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 11:36:29 +05:00

7.5 KiB
Raw Blame History

24/7 автономный workflow

Картина: твой Mac/iPhone даёт команду → Claude работает → всё запускается в облаке независимо от твоего устройства.

        ┌──────────────┐        ┌──────────────┐
        │   Mac / iPhone │        │  Твой Proxmox │
        │ (даёшь команду)│        │  VM (будущее) │
        └───────┬──────┘        └───────┬──────┘
                │                       │
                │  Claude Code          │  Claude Code 24/7
                │  (когда открыт)       │  (когда поднимем VM)
                ▼                       ▼
        ┌──────────────────────────────────────┐
        │            GitHub (main branch)       │
        └──────┬──────────────────────────┬────┘
               │ push                     │
               ▼                          ▼
        ┌──────────────┐          ┌──────────────┐
        │ CI workflow  │          │Docker workflow│
        │ (backend+web │          │(api+web images│
        │ +POS builds) │          │ на ghcr.io)   │
        └──────┬──────┘          └──────┬──────┘
               │                         │
               │ artifacts:              │ images pulled by
               │ web-dist, POS .exe      │ stage / prod compose
               ▼                         ▼
        ┌──────────────┐          ┌──────────────┐
        │ GitHub        │          │ Proxmox-VM    │
        │ Releases      │          │ stage/prod    │
        │ (.exe, APK)   │          │ (docker-compose)│
        └──────────────┘          └──────────────┘

Что где живёт

Компонент Где Когда работает Зависит от Mac?
Claude Code (текущая сессия) твой Mac пока открыта app + Mac не спит Да
Claude Code (будущее 24/7) Proxmox VM всегда Нет
GitHub (код) github.com всегда Нет
GitHub Actions CI github.com срабатывает на push / cron Нет
Docker images ghcr.io всегда Нет
Тестовый стенд (stage) Proxmox VM всегда Нет
DB бэкапы Proxmox VM → локальный диск + S3 (опц.) cron nightly Нет

Сценарии

Ты заказал фичу → уснул

  1. (Днём) запустил Claude, дал команду «сделай X», Claude работает
  2. Перед сном Claude коммитит и пушит то что успел
  3. GitHub Actions автоматически собирает backend+web+POS, прогоняет тесты
  4. Docker-образы уходят в ghcr.io
  5. (Если stage настроен) — stage автопулит образ → перезапускается → готов к тесту
  6. Telegram-бот шлёт тебе «готово, проверь stage.food-market.xxx»
  7. Утром ты смотришь, ревьюишь, делаешь merge/revert

Ты дал команду с iPhone

  1. Открыл Claude на iPhone, сказал «обнови UI страницы X»
  2. Claude работает, пушит
  3. GitHub Actions → ghcr.io → stage → Telegram → ты проверяешь прямо с iPhone

Что-то пошло не так

  • Каждый коммит = одна точка отката. git revert <sha> за 10 секунд.
  • БД: ежедневный pg_dump .sql.gz, 30 дней ротации, скрипт deploy/backup.sh.
  • Критические операции (миграции с удалением данных, force-push на main) — всегда спрошу тебя.

GitHub Actions бюджет (free: 2000 мин/мес на приватный репо)

Job Runner Мин/запуск Множитель Биллинговых мин Когда
backend Linux 3 1× 3 каждый push/PR
web Linux 2 1× 2 каждый push/PR
pos Windows 5 2× 10 только на теги v* + ручной запуск
docker-api Linux 3 1× 3 только push в main (с изм. кода)
docker-web Linux 3 1× 3 только push в main (с изм. кода)

Оценка: ~11 бил.мин на обычный коммит. Лимит 2000 мин ≈ 180 коммитов в месяц или 6 в день. На теге релиза +10 за POS.

Когда упрёмся (ориентир: 200+ коммитов/мес): поднимем self-hosted runner на Proxmox-VM (Ubuntu, 2 CPU/2 GB). В workflow: runs-on: [self-hosted, linux] вместо ubuntu-latest. Безлимит по времени.

Что нужно для полноценного 24/7 (ещё не сделано)

  • GitHub Actions для CI (backend/web/POS) — готов .github/workflows/ci.yml
  • Docker workflow — готов .github/workflows/docker.yml
  • docker-compose для стенда — готов deploy/docker-compose.yml
  • DB backup скрипт — готов deploy/backup.sh
  • Proxmox-VM food-market-stage — ждёт кредов от тебя
  • Proxmox-VM claude-runner (чтобы я не жил на твоём Mac) — ждёт кредов
  • SSH-ключ для деплоя в GitHub Secrets
  • Telegram bot + chat_id в GitHub Secrets
  • FTP для APK (если нужен) в GitHub Secrets
  • Домен + SSL для stage (опц., Cloudflare)

Секреты: безопасно передать мне

Пока твой Mac — единственное место, куда Claude Code имеет доступ. Безопасный путь:

  1. Создай папку: mkdir -p ~/.food-market-secrets && chmod 700 ~/.food-market-secrets
  2. Положи туда файлы (я буду читать только по твоей команде и не буду вставлять значения в чат):
    • ~/.food-market-secrets/proxmox.env — ssh creds для Proxmox API/VM
    • ~/.food-market-secrets/ftp.env — FTP для APK
    • ~/.food-market-secrets/telegram.envBOT_TOKEN=... + CHAT_ID=...
  3. Пришли в чат: "Секреты в ~/.food-market-secrets/"
  4. Я прочитаю, прокину в GitHub Secrets через gh secret set, больше нигде не сохраню.

Настройка Mac чтобы не засыпал ночью (временно, пока нет remote runner)

# Заблокировать sleep на время работы Claude (Ctrl+C чтобы отменить)
caffeinate -i -d

Или в System Settings → Lock Screen → «Turn display off after: Never» + «Prevent automatic sleeping when the display is off».

После того как поднимем claude-runner VM — этот обход больше не нужен.