💸 Google Cloud — за что списываются деньги и как поставить лимит
О чём это
Расходы GCP-проекта
dice-chess-lab, снятые по фактическим метрикам Cloud Monitoring, а не по прайс-листу. Отвечает на три вопроса: за что именно списываются деньги, сколько это будет стоить настоящими деньгами после бонусного периода, и как поставить лимит, который реально останавливает трату, а не просто присылает письмо. Проверено 29.07.2026.
Связанные: Oracle Cloud: что бесплатно, а что стоит денег · Hunter на Cloud Run: развёртывание и подводные камни · Oracle Cloud: раннбук · Рейтинг ботов и webhook: план выполнения
1. Что вообще есть в GCP
К биллинг-аккаунту привязаны три проекта, но ресурсы есть только в одном — dice-chess-lab:
| Ресурс | Что это | Регион |
|---|---|---|
Cloud Run dicechess-bot-gcp | бот gcp/scala-monte-carlo | us-central1 |
Cloud Run dicechess-bot-gcp-onnx | бот gcp/expectimax-onnx-3 | us-central1 |
Cloud Run dicechess-bot-gcp-onnx-4 | бот gcp/expectimax-onnx-4 | us-central1 |
Cloud Run hunter | приватный бот lab/hunter | europe-west3 |
| Vertex AI (Gemini) | автоматическое ревью PR в 7 репозиториях | global |
GCS dice-chess-lab-models | ONNX-модели, 2.19 МБ | us-central1 |
Artifact Registry dicechess | образы ботов, единицы тегов | 2 локации |
Ни GCE-инстансов, ни Cloud SQL, ни Vertex-эндпоинтов, ни BigQuery-датасетов нет.
Четвёртый канал: AI Studio отдельно от Vertex
Важно не спутать два разных API к одним и тем же моделям Gemini:
| Проект | API | Тариф | Расход за 30 дней |
|---|---|---|---|
dice-chess-lab | Vertex AI (aiplatform) | по токенам | €135 — ревью PR, см. §4 |
gen-lang-client-0206785287 «Dice Chess» | AI Studio (generativelanguage) | Tier 1, платный | 86k output-токенов, < €1 |
gen-lang-client-0149628627 «Pulse Project» | AI Studio | Free tier | 680k output-токенов, €0 |
project-06267eb3-… | — | — | пусто |
Латентная дыра в проекте «Dice Chess»
Он на Tier 1, то есть платном тарифе с потолком 10 000 RPD. Сегодня расход меньше €1/мес и в счёте отдельной строки не даёт — но предохранителя там нет: неаккуратный скрипт может нарастить расход на два порядка, оставаясь в пределах квоты. Метрики этого API живут под
generativelanguage.googleapis.com/…, а не подaiplatform.…, поэтому в мониторинге Vertex его не видно — искать надо отдельно (см. §9).
2. Ран-рейт: ~€430 в месяц
Счёт за июль на 29-е число выглядит обманчиво скромным, потому что оба крупных расхода начались посреди месяца:
| Сервис | Июль (на 29.07) | Расход идёт с | €/день | Проекция на полный месяц |
|---|---|---|---|---|
| Vertex AI | €135.53 | 12.07 (18 дней) | €7.53 | ≈ €226 |
| Cloud Run | €41.45 | 22.07 (8 дней) | €7.00 | ≈ €210 |
| Cloud Storage | €0.03 | — | — | €0.4 |
| Artifact Registry | €0.00 | — | — | ~€0 |
| ≈ €435/мес |
€177 — это не «месяц вышел дешёвым»
Это неполный месяц по обеим статьям. При неизменной конфигурации первый полный месяц выйдет примерно в 2.5 раза дороже. И кривая Cloud Run ещё растёт — каждый новый бот на лестнице добавляет ~€45/мес.
3. Cloud Run — €210/мес: почему «функции бесплатно» не сработало
Бесплатная квота Cloud Run существует, но она равна 180 000 vCPU-секунд в месяц = 50 vCPU-часов. Боты жгут ~90 instance-часов в день — квота выгорает за первые ~13 часов месяца, дальше всё платное.
Динамика по дням (billable instance time)
| День | monte-carlo | onnx-3 | onnx-4 | hunter | Всего |
|---|---|---|---|---|---|
| 22.07 | 3.4h | — | — | — | 3.4h |
| 23.07 | 36.6h | 20.5h | — | — | 57.1h |
| 26.07 | 33.5h | 20.4h | 18.6h | — | 72.5h |
| 27.07 | 41.0h | 24.4h | 25.5h | — | 90.9h |
| 29.07 | 51.5h | 20.5h | 21.9h | 0.7h | 94.6h |
До 22.07 расхода не было вообще — совпадает с датой первого пуша образов в Artifact Registry. Эмпирическая цена, выведенная из счёта: €41.45 за 526 instance-часов ⇒ €0.079 за instance-час.
Причина — не баг, а конструкция
Проверено на всякий случай, нет ли утечки: 99.9% ответов 2xx, ноль таймаутов (при timeoutSeconds=300 p99 = 15 s), minScale не задан (простой не тарифицируется), cpu-throttling включён (request-based billing). Расход честно рабочий. Цепочка такая:
LadderSchedulerв play-api круглосуточно держит 4 одновременные mirrored-пары с таймконтролем Fischer 300+3. Таймконтроль захардкожен вLadderScheduler.Config.DefaultTimeControl— env-ручки нет.- Тяжёлые боты используют wall-clock как регулятор силы: у Monte-Carlo
rollouts ∝ время, у expectimaxкандидаты ∝ время.TimeManagerвыдаёт им ломоть от 300 секунд — они его съедают. - Cloud Run тарифицирует каждую секунду длительности запроса. «Думать дольше = играть сильнее» на этом рантайме буквально означает «думать дольше = платить больше», один к одному.
Цена силы, по ботам
| Бот | p50 на ход | h/день | ≈ €/мес | Место в лестнице | concurrency |
|---|---|---|---|---|---|
gcp/scala-monte-carlo | 13.0 s | 48 | ≈ €113 | #7 (1670) | 80 |
gcp/expectimax-onnx-3 | 4.8 s | 20 | ≈ €48 | #2 (1769) | 1 |
gcp/expectimax-onnx-4 | 4.5 s | 22 | ≈ €52 | #3 (1716) | 1 |
lab/hunter | 0.1 s | 0.7 | ≈ €3 | #1 (1814) | 1 |
Главное наблюдение
Самый сильный бот лестницы — самый дешёвый в 130 раз по цене хода. В живой партии hunter vs monte-carlo на 10-м ходу у monte-carlo на часах 217 s из 300, а у hunter — 326 s: он тратит 0.1 s и складывает в карман инкремент +3 s. Часы hunter растут, часы monte-carlo убывают, и Cloud Run выставляет счёт ровно за эту разницу. Оценщик KCP по факту доминирует по обеим осям — и по силе, и по цене (см. KCP: фича-тактика против глубины поиска).
У обоих ONNX-ботов
containerConcurrency=1— каждая партия из пары поднимает свой оплачиваемый инстанс. У monte-carlo стоит 80 (обе партии делят инстанс), и он всё равно дороже в 2.3 раза: просто думает в 3 раза дольше.
4. Vertex AI — €226/мес: одно ревью PR стоит €0.35
Это не обучение моделей — обучающих джобов в проекте нет вообще. Это run-gemini-cli, автоматическое ревью pull request’ов через Vertex AI по Workload Identity Federation. Так задумано намеренно: в комментарии workflow прямо написано, что путь через AI Studio API-key не умеет тратить кредиты, поэтому выбран Vertex.
Факты за 18 дней (с 12.07, когда workflow раскатали):
| Метрика | Значение |
|---|---|
Прогонов gemini-review в 7 репозиториях | 393 |
| Вызовов модели | 4 855 |
| Вызовов на одно ревью | ≈ 12 |
| Input-токенов на ревью | ≈ 486 000 |
| Output-токенов на ревью | ≈ 9 200 |
| Соотношение input:output | 53 : 1 |
| Смешанная цена | ≈ €0.70 за млн токенов |
| Цена одного ревью | ≈ €0.35 |
Откуда 486k токенов на один PR
Агентная петля пересылает контекст заново на каждом витке. В .gemini/settings.json стоит maxSessionTurns: 50, а промпт требует вызывать add_comment_to_pending_review отдельно на каждую находку. Значит витков = 4 + число находок, и на каждом витке заново уезжают: AGENTS.md (в play-api это ~9k токенов), полный diff, схемы инструментов GitHub MCP и вся предыдущая переписка. Отсюда квадратичный рост: .
Плюс триггер synchronize: ревью запускается на каждый push в PR. Пять коммитов в одну ветку — пять полных ревью по €0.35.
Пин модели не работает
В repo-переменных стоит
GEMINI_MODEL=gemini-2.5-flash, и лог прогона это подтверждает. Но Vertex тарифицируетgemini-3.5-flash(4 684 вызова) иgemini-3-flash-preview(171). Вызововgemini-2.5-flash— ноль. CLI молча игнорирует пин и берёт свою модель по умолчанию. То есть платим не за ту модель, которую выбрали.
5. Где границы бесплатного
| Сервис | Бесплатно в месяц | Сколько это в наших единицах | Как быстро выгорает |
|---|---|---|---|
| Cloud Run vCPU | 180 000 vCPU-с | 50 vCPU-часов | ~13 часов |
| Cloud Run память | 360 000 ГиБ-с | 100 ГиБ-часов | ~1.5 дня |
| Cloud Run запросы | 2 млн | — | не достигаем (≈1 млн/мес) |
| Vertex AI (Gemini) | нет free tier | — | с первого токена |
| Cloud Storage | 5 ГБ | у нас 2.19 МБ | не достигаем |
| Artifact Registry | 0.5 ГБ | единицы тегов | не достигаем |
Ключевое: у Vertex AI бесплатного тарифа нет вообще. Бесплатный Flash живёт только в AI Studio по API-ключу — а именно от этого пути мы отказались ради кредитов.
6. Рычаги
| Рычаг | Эффект | Усилие | Где |
|---|---|---|---|
Снять monte-carlo с лестницы | −€113/мес | POST /bot/ladder/leave | play-api |
LADDER_MAX_CONCURRENT_PAIRS=1 | −75% Cloud Run | одна env-переменная | Oracle-хост |
| Ladder на 30+1 вместо 300+3 | −90% Cloud Run | маленький PR (нужна env-ручка) | play-api |
| Кэширование контекста в Gemini | −60…80% Vertex | настройка CLI | workflows |
| Одна MCP-заявка на все находки | −65% Vertex | правка промпта | workflows |
Ревью только на opened/ready_for_review | −40…60% Vertex | правка триггера | workflows |
| Починить пин модели | неизвестно, но платим не за то | разобраться с run-gemini-cli | workflows |
| Убрать дубль с CodeRabbit | −€226/мес | выключить один из двух ревьюеров | workflows |
| Перевезти ботов на Oracle A1 | −€210/мес | развернуть по образцу oracle/v1-v3 | infra |
Про снятие monte-carlo с лестницы
Он седьмой из одиннадцати, у него 11 204 партии и RD упёрлось в 62.8 — новые партии почти не добавляют информации. Прецедент уже есть:
oracle/v1-v3,cloudflare/*,azure/*все стоятonLadder: falseпосле 10–13k партий. И сам вопрос о силе модели решается не Glicko, а аппаратом SPRT + Bradley-Terry наGET /strength.
7. Жёсткий рубеж: план на конец кредита
Ограничение — деньги, а не дата
Окно кредита: 12.07.2026 — 11.10.2026, остаток на 29.07 — €87.54. При ран-рейте €14.5/день этого хватит на 6 дней, то есть кредит кончится около 4 августа — на 68 дней раньше формального срока. Это противоположность ситуации с Oracle (Oracle Cloud: что бесплатно, а что стоит денег §5), где кредит гарантированно сгорал и экономить было бессмысленно: здесь кредит слишком мал, чтобы дожить до своей даты, поэтому экономия покупает реальное время.
Чтобы дожить до 11 октября, бюджет равен €1.18/день. Что покупает каждый шаг:
| Сценарий | €/день | Хватит на | Кредит кончится |
|---|---|---|---|
| Как сейчас | €14.5 | 6 дней | ~4 августа |
| Выключить ревью PR | €7.0 | 12.5 дней | ~10 августа |
+ снять monte-carlo с лестницы | €3.4 | 26 дней | ~24 августа |
+ LADDER_MAX_CONCURRENT_PAIRS=1 | €0.9 | 97 дней | доживёт до 11.10 ✓ |
Что уже сделано (29.07.2026)
Решение: ревью PR выключено полностью, остаток кредита доедают боты. CodeRabbit ревьюит те же PR, поэтому второй ИИ-ревьюер давал дубль находок за €226/мес. Перенос на AI Studio Free отклонён: наши ~260 вызовов/день заведомо не влезают в урезанный free tier (см. врезку в §7 ниже).
# Выполнено во всех 7 репозиториях; состояние стало disabled_manually
gh workflow disable gemini-review.yml -R rabestro/<repo>
# Обратно, если понадобится
gh workflow enable gemini-review.yml -R rabestro/<repo>Репозитории: dicechess-engine-scala, dicechess-analytics, dicechess-play-api, dicechess-analytics-ui, dicechess-play, home-genie, paperless-genie.
Почему
gh workflow disable, а не правка файловВыключение через API мгновенно, обратимо одной командой и не требует 7 отдельных PR. Цена решения — состояние живёт не в git, поэтому по репозиторию не видно, почему ревью перестали приходить. Этот раздел и есть компенсация: если Gemini-ревью загадочно молчит, причина здесь.
Осталось сделать руками (нужен Bearer-токен бота, который показывается один раз при регистрации — в БД только хэш, достать его из системы нельзя):
curl -X POST https://play-api.jc.id.lv/bot/ladder/leave \
-H "Authorization: Bearer <токен gcp/scala-monte-carlo>"Если токен утерян — ротация (POST /bot/token/rotate) тоже требует текущий токен, так что остаётся либо правка bot_ratings в БД play-api на Oracle-хосте, либо дать лестнице авто-запарковать бота по таймаутам (LADDER_TIMEOUT_PARK_PAIRS) — но второй путь сначала сольёт ему рейтинг.
Триал или уже платный аккаунт?
Через API это не видно —
gcloud billing accounts describeотдаёт толькоopen: true. Разница принципиальная: у триала в момент исчерпания кредита ресурсы останавливаются, у платного аккаунта — продолжаются списания с карты. Проверить в консоли до 4 августа обязательно.
Пока кредит жив, экономить бессмысленно — недоиспользованный кредит просто сгорает (та же логика, что в Oracle Cloud: что бесплатно, а что стоит денег §5). Но рубеж надо пройти подготовленным, а не обнаружить его по списанию с карты.
Порядок действий за неделю до конца бонуса:
- Vertex AI → выключить или увести на free-tier. Ревью PR за €226/мес не стоит своих денег, тем более что CodeRabbit ревьюит те же PR параллельно. Варианты по возрастанию усилий: (а) отключить workflow совсем, (б) вернуться на AI Studio API-key с бесплатным Flash, (в) оставить Vertex, но с кэшированием, батчингом комментариев и триггером только на открытие PR.
Путь (б) в free tier не влезает — проверено
Наше потребление — ~260 вызовов модели в день (22 ревью × 12 вызовов). Фактические лимиты, снятые с дашборда AI Studio 29.07.2026 (страница лимитов больше не публикует таблицу, они стали per-project и видны только в
aistudio.google.com/rate-limit):
Тариф RPM TPM RPD Free tier 5 250K 20 Tier 1 (платный) 1 000 2M 10 000 20 RPD против 260 вызовов/день — это разрыв в 13 раз, никакими оптимизациями не закрывается. Для справки: проект
Pulse Projectна free tier уже стоит в лимите (26/20 RPD, 9/5 RPM) от куда более скромного использования. Tier 1 объём переварил бы с запасом, но он платный по токенам — то есть те же деньги, просто через другой API.Теоретический минимум, который в 20 RPD влез бы: батчинг комментариев в один вызов (12 → 3-4 вызова на ревью) плюс триггер только
openedвместоsynchronizeдаёт ~5 ревью в день на один-два репозитория. Это малая доля прежнего покрытия, и RPM 5 запрещает два параллельных ревью. Как бесплатная замена CodeRabbit не годится, но как точечное ревью одного важного репозитория — вариант.Все 7 репозиториев публичные, так что вопрос с использованием данных на free tier не стоит.
- Cloud Run → снять всех ботов с лестницы, кроме hunter. Hunter стоит €3/мес и остаётся первым в лестнице — его можно не трогать. Три остальных дают −€210/мес.
- Проверить, что расход упал, прежде чем кредит кончится: сутки наблюдения по метрикам из §9. Не по счёту — счёт отстаёт на часы.
- Поставить бюджет с алертами и жёсткий cap (§8) — как страховку от того, что что-то забыли.
Структурный вывод на будущее: боты, у которых сила измеряется потраченным CPU, не должны жить на посекундной тарификации. Правильное место для них — Oracle A1 из Always Free: oracle/v1-v3 играют оттуда за €0 и держат 1459–1678, ровно в полосе GCP-ботов. Cloud Run хорош ровно для таких ботов, как hunter — те, что отвечают за 0.1 s.
8. Как поставить лимит (и почему алерт ≠ лимит)
Сейчас нет ни одного ограничителя
Бюджетов в биллинг-аккаунте не создано вообще —
billingbudgets.googleapis.comдаже не включён. Единственная граница расхода на сегодня — размер кредита.
Слой 1 — бюджет с алертами (5 минут, обязательный минимум)
Бюджет сам по себе ничего не останавливает — он присылает письмо. Но без него ты не узнаешь о проблеме вовремя.
BILLING=$(gcloud billing accounts list --format='value(ACCOUNT_ID)' | head -1)
gcloud services enable billingbudgets.googleapis.com --project=dice-chess-lab
gcloud billing budgets create \
--billing-account="$BILLING" \
--display-name="dice-chess-lab monthly" \
--budget-amount=20EUR \
--threshold-rule=percent=0.5 \
--threshold-rule=percent=0.9 \
--threshold-rule=percent=1.0Слой 2 — точечные kill switch (реальные лимиты)
Это то, что действительно останавливает трату, и по одному сервису, а не по всему проекту.
Vertex AI — обнулить квоту запросов к Gemini. Наши вызовы идут через location=global, поэтому нужная метрика — именно global_-вариант (проверено через Service Usage API):
метрика: aiplatform.googleapis.com/global_generate_content_requests_per_minute_per_project_per_base_model
unit : 1/min/{project}/{base_model}
Значение 0 полностью останавливает Gemini (Vertex начинает отдавать 429), Cloud Run при этом продолжает работать. Ставится либо в консоли (IAM & Admin → Quotas, фильтр по метрике), либо через gcloud alpha services quota update — но учти, что группа alpha по умолчанию не установлена и требует gcloud components install alpha. Консольный путь надёжнее.
Это лимит на скорость, не на сумму
Квота измеряется в запросах в минуту, поэтому она не «останавливает трату на €20». Полезны два режима:
0— полный стоп как kill switch, или небольшое значение — потолок скорости горения.
Cloud Run — ограничить потолок масштаба:
gcloud run services update dicechess-bot-gcp --region=us-central1 --max-instances=1Но самый чистый kill switch для ботов — на стороне лестницы, а не Cloud Run: POST /bot/ladder/leave означает, что запросы просто перестают приходить, и платить становится не за что.
Слой 3 — автоматическое отключение биллинга (крайняя мера)
Штатный google-паттерн жёсткого потолка: бюджет → Pub/Sub → функция, которая вызывает projects.updateBillingInfo с пустым billingAccountName и отвязывает проект от биллинга.
Что с этим не так
Во-первых, это выключает весь проект целиком, а не одну статью: боты перестают отвечать, лестница начинает считать им таймауты и списывать рейтинг. Во-вторых, обратно проект нужно привязывать руками. В-третьих, данные биллинга отстают на несколько часов — перебор сверх лимита всё равно возможен. Годится как последний предохранитель от катастрофы, но не как рабочий регулятор.
9. Как проверить самому
Биллинг-экспорта в BigQuery нет, поэтому суммы в € доступны только в UI консоли. Зато натуральные единицы (часы, токены, запросы) снимаются из Cloud Monitoring, и именно они — ранний индикатор: метрики видны сразу, счёт отстаёт на часы.
TOKEN=$(gcloud auth print-access-token)
START=$(date -u -v-7d +%Y-%m-%dT00:00:00Z); END=$(date -u +%Y-%m-%dT%H:%M:%SZ)
# Cloud Run: оплачиваемые instance-часы по дням и по сервисам
curl -s -G "https://monitoring.googleapis.com/v3/projects/dice-chess-lab/timeSeries" \
--data-urlencode 'filter=metric.type="run.googleapis.com/container/billable_instance_time"' \
--data-urlencode "interval.startTime=$START" --data-urlencode "interval.endTime=$END" \
--data-urlencode "aggregation.alignmentPeriod=86400s" \
--data-urlencode "aggregation.perSeriesAligner=ALIGN_SUM" \
--data-urlencode "aggregation.groupByFields=resource.labels.service_name" \
-H "Authorization: Bearer $TOKEN"
# Vertex AI: токены по моделям (ищи model_user_id в resource.labels)
curl -s -G "https://monitoring.googleapis.com/v3/projects/dice-chess-lab/timeSeries" \
--data-urlencode 'filter=metric.type="aiplatform.googleapis.com/publisher/online_serving/token_count"' \
--data-urlencode "interval.startTime=$START" --data-urlencode "interval.endTime=$END" \
--data-urlencode "aggregation.alignmentPeriod=86400s" \
--data-urlencode "aggregation.perSeriesAligner=ALIGN_SUM" \
-H "Authorization: Bearer $TOKEN"
# AI Studio — ДРУГОЙ API и другие проекты, в метриках Vertex его не видно.
# Обрати внимание: input-метрики тут нет, отдаётся только output.
curl -s -G "https://monitoring.googleapis.com/v3/projects/gen-lang-client-0206785287/timeSeries" \
--data-urlencode 'filter=metric.type="generativelanguage.googleapis.com/generate_content_usage_output_token_count"' \
--data-urlencode "interval.startTime=$START" --data-urlencode "interval.endTime=$END" \
--data-urlencode "aggregation.alignmentPeriod=86400s" \
--data-urlencode "aggregation.perSeriesAligner=ALIGN_SUM" \
-H "Authorization: Bearer $TOKEN"Тарифы и фактические лимиты по каждому проекту AI Studio — только глазами: aistudio.google.com/rate-limit, переключатель Project в шапке. Там же видно, какой проект на Free tier, а какой на Tier 1.
Два быстрых sanity-check без curl:
# сколько партий крутится прямо сейчас и с каким таймконтролем
curl -s https://play-api.jc.id.lv/games | jq 'length'
# сколько ревью прогнали за период (по каждому репозиторию)
gh run list -R rabestro/dicechess-play-api --workflow=gemini-review.yml \
--created '>=2026-07-12' --limit 200 --json databaseId -q 'length'10. Оговорки
- Суммы в € посчитаны из метрик Monitoring и наблюдаемого счёта, не из billing-экспорта. Порядок верный, точные цифры — за консолью. Если хочется точности по SKU, надо включить экспорт биллинга в BigQuery: тогда расходы станут доступны через
bqи SQL. - Остаток и дата окончания кредита через API не отдаются — только UI консоли, поэтому цифры §7 (€87.54, окно 12.07 — 11.10) сняты глазами 29.07.2026 и требуют пересмотра при каждом возврате к этой заметке.
- Проекция «€435/мес» предполагает неизменную конфигурацию. Каждый добавленный на лестницу бот на Cloud Run — это плюс ~€45/мес, а каждый новый репозиторий с
gemini-review— плюс ~€0.35 за PR-push. - Регион GCP-ботов (
us-central1) на счёт не влияет — сетевой round-trip до play-api во Франкфурте оплачивает ожидающая сторона, а не контейнер. Это вопрос латентности, не денег.