food-market/docs/24x7.md
nurdotnet 5bcbff66de ci/deploy: GitHub Actions + Docker images + DB backup + 24x7 plan
.github/workflows/ci.yml — on push/PR:
  - backend job: dotnet restore/build/test with a live postgres service
  - web job: pnpm install + vite build + tsc, uploads dist artifact
  - pos job: windows-latest, dotnet publish self-contained win-x64
    single-file exe as artifact

.github/workflows/docker.yml — on push to main (if src changed) or manual:
  - api image → ghcr.io/nurdotnet/food-market-api:{latest,sha}
  - web image → ghcr.io/nurdotnet/food-market-web:{latest,sha}
  - uses buildx + GHA cache

deploy/Dockerfile.api — multi-stage (.NET 8 sdk → aspnet runtime),
  healthcheck on /health, App_Data + logs volumes mounted.

deploy/Dockerfile.web — node20 build → nginx 1.27 runtime; ships the
  Vite dist + nginx.conf that proxies /api, /connect, /health to api
  service and serves the SPA with fallback to index.html.

deploy/nginx.conf — SPA + API reverse-proxy configuration.

deploy/docker-compose.yml — production-shape stack: postgres 16 +
  api (from ghcr image) + web (from ghcr image), named volumes, env-
  driven tags so stage/prod can pin specific SHAs.

deploy/backup.sh — pg_dump wrapper with 3 modes: local (brew
  postgres), --docker (compose container), --remote HOST:PORT. Writes
  gzipped dumps to ~/food-market-backups, 30-day retention.

docs/24x7.md — explains where Claude/CI/stage live, which pieces
  depend on the Mac, and the exact steps to hand off secrets via
  ~/.food-market-secrets/ so I can push them into GitHub Secrets.

Next, once user supplies Proxmox + FTP + Telegram creds: stage deploy
workflow, notification workflow, and (optional) claude-runner VM so
I no longer depend on the Mac being awake.

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

106 lines
6.5 KiB
Markdown
Raw 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.

# 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) — всегда спрошу тебя.
## Что нужно для полноценного 24/7 (ещё не сделано)
- [x] GitHub Actions для CI (backend/web/POS) — готов `.github/workflows/ci.yml`
- [x] Docker workflow — готов `.github/workflows/docker.yml`
- [x] docker-compose для стенда — готов `deploy/docker-compose.yml`
- [x] 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.env``BOT_TOKEN=...` + `CHAT_ID=...`
3. Пришли в чат: "Секреты в ~/.food-market-secrets/"
4. Я прочитаю, прокину в GitHub Secrets через `gh secret set`, больше нигде не сохраню.
## Настройка Mac чтобы не засыпал ночью (временно, пока нет remote runner)
```bash
# Заблокировать 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 — этот обход больше не нужен.