.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>
106 lines
6.5 KiB
Markdown
106 lines
6.5 KiB
Markdown
# 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 — этот обход больше не нужен.
|