feat(deploy): inject OBJECTIVE_API_KEY into backend/.env.runtime #311

Merged
lekss361 merged 1 commit from feat/obj-key-prod-env into main 2026-05-17 16:05:14 +00:00
Owner

Цель

Активировать live Objective scraper в production — сейчас OBJECTIVE_API_KEY отсутствует в env прод-контейнеров (backend, worker, beat), из-за чего:

  • POST /api/v1/admin/scrape/objective/sync-ourHTTP 503 (OBJECTIVE_API_KEY не задан)
  • Celery beat task tasks.scrape_objective.sync_all_groups каждый вторник 06:00 UTC early-returns с {"skipped": true, "reason": "no_api_key"}
  • objective_scrape_runs = 0 строк (никогда не запускался)
  • objective_raw_reports = 0 строк
  • objective_lots (303k) — это разовый импорт SQLite (May 10), не live

Что меняет

.forgejo/workflows/deploy.yml — 3 hunks в job deploy:

  1. В блоке env:OBJECTIVE_API_KEY: ${{ secrets.OBJECTIVE_API_KEY }}
  2. В envs: whitelist (passthrough в ssh-action) — добавлен OBJECTIVE_API_KEY
  3. Новый sed-блок в backend/.env.runtime — тот же паттерн что используется для GLITCHTIP_DSN / SENTRY_RELEASE

Acceptance

После merge + deploy:

  • docker compose -p gendesign exec backend env | grep OBJECTIVE_API_KEY показывает ключ
  • curl -X POST -H "X-Admin-Token: $TOK" https://gendsgn.ru/api/v1/admin/scrape/objective/sync-our → 200 + task_id (не 503)
  • objective_scrape_runs получит первую строку, через ~12-15 мин — objective_lots.raw_id IS NOT NULL для свежих строк

References

  • vault code/patterns/Objective_Data_Source_May17.md — single source of truth
  • vault code/patterns/DomRF_Scraper_Roadmap_May17.md § Objective goldmine
  • Issue #307 — OBJ activation roadmap (10d total)
  • vault events/Objective_Integration_May07_2026.md — confirmed prod env missed key с самого начала integration
  • Live API verification сегодня: schema 1:1 с парсером, 324k rows / 43 keys для группы "Свердловская область"

Risk

Минимальный:

  • Пустой secret = no-op (early-return сохраняется как раньше)
  • --force-recreate --no-deps backend worker beat уже в workflow — env подхватится без manual restart
  • Schema стабильна (3 фикстуры за 10 дней + live = identical 43 keys)
  • DKP по нашему тарифу: проверил вживую — UseDkp=true без ComplexName работает на "Свердловская область" (200, 324k rows)

Forgejo secret OBJECTIVE_API_KEY уже добавлен.

## Цель Активировать live Objective scraper в production — сейчас `OBJECTIVE_API_KEY` отсутствует в env прод-контейнеров (backend, worker, beat), из-за чего: - `POST /api/v1/admin/scrape/objective/sync-our` → **HTTP 503** (`OBJECTIVE_API_KEY не задан`) - Celery beat task `tasks.scrape_objective.sync_all_groups` каждый вторник 06:00 UTC early-returns с `{"skipped": true, "reason": "no_api_key"}` - `objective_scrape_runs` = **0 строк** (никогда не запускался) - `objective_raw_reports` = **0 строк** - `objective_lots` (303k) — это разовый импорт SQLite (May 10), не live ## Что меняет `.forgejo/workflows/deploy.yml` — 3 hunks в job `deploy`: 1. В блоке `env:` — `OBJECTIVE_API_KEY: ${{ secrets.OBJECTIVE_API_KEY }}` 2. В `envs:` whitelist (passthrough в ssh-action) — добавлен `OBJECTIVE_API_KEY` 3. Новый sed-блок в `backend/.env.runtime` — тот же паттерн что используется для `GLITCHTIP_DSN` / `SENTRY_RELEASE` ## Acceptance После merge + deploy: - [ ] `docker compose -p gendesign exec backend env | grep OBJECTIVE_API_KEY` показывает ключ - [ ] `curl -X POST -H "X-Admin-Token: $TOK" https://gendsgn.ru/api/v1/admin/scrape/objective/sync-our` → 200 + task_id (не 503) - [ ] `objective_scrape_runs` получит первую строку, через ~12-15 мин — `objective_lots.raw_id IS NOT NULL` для свежих строк ## References - vault `code/patterns/Objective_Data_Source_May17.md` — single source of truth - vault `code/patterns/DomRF_Scraper_Roadmap_May17.md` § Objective goldmine - Issue #307 — OBJ activation roadmap (10d total) - vault `events/Objective_Integration_May07_2026.md` — confirmed prod env missed key с самого начала integration - Live API verification сегодня: schema 1:1 с парсером, 324k rows / 43 keys для группы "Свердловская область" ## Risk Минимальный: - Пустой secret = no-op (early-return сохраняется как раньше) - `--force-recreate --no-deps backend worker beat` уже в workflow — env подхватится без manual restart - Schema стабильна (3 фикстуры за 10 дней + live = identical 43 keys) - DKP по нашему тарифу: проверил вживую — `UseDkp=true` без ComplexName работает на "Свердловская область" (200, 324k rows) Forgejo secret `OBJECTIVE_API_KEY` уже добавлен.
lekss361 added 1 commit 2026-05-17 16:03:41 +00:00
Без ключа Celery beat task sync_all_groups early-returns со
skipped=no_api_key, admin trigger /scrape/objective/sync-our -> 503.
Используется тот же sed-pattern что и GLITCHTIP_DSN.

Требует Forgejo Actions secret OBJECTIVE_API_KEY (см. issue #307 OBJ).
lekss361 merged commit a93bef4147 into main 2026-05-17 16:05:14 +00:00
Author
Owner

Merged via deep-code-reviewer — verdict APPROVE.

Squash merge: a93bef4147af36e4e3fbee70512ad98a4813056a. Forgejo Actions deploy job триггерится автоматически (push в main). Через ~5-8 мин --force-recreate --no-deps backend worker beat подхватит новый env из backend/.env.runtime.

Verification checklist (post-deploy ~5-8 min)

  1. docker compose -p gendesign exec backend env | grep OBJECTIVE_API_KEY → должен показать OBJECTIVE_API_KEY=623f...
  2. curl -X POST -H "X-Admin-Token: $TOK" https://gendsgn.ru/api/v1/admin/scrape/objective/sync-our → 200 + task_id (не 503)
  3. SELECT COUNT(*) FROM objective_scrape_runs → должен стать >0 после первого manual / scheduled триггера
  4. Через ~12-15 мин после трига: SELECT COUNT(*) FROM objective_raw_reports WHERE created_at >= NOW() - interval '1 hour' → >0
  5. Beat task tasks.scrape_objective.sync_all_groups (вторник 06:00 UTC) — следующий запуск проверить что не early-returns no_api_key
Merged via deep-code-reviewer — verdict APPROVE. Squash merge: `a93bef4147af36e4e3fbee70512ad98a4813056a`. Forgejo Actions deploy job триггерится автоматически (push в main). Через ~5-8 мин `--force-recreate --no-deps backend worker beat` подхватит новый env из `backend/.env.runtime`. ### Verification checklist (post-deploy ~5-8 min) 1. `docker compose -p gendesign exec backend env | grep OBJECTIVE_API_KEY` → должен показать `OBJECTIVE_API_KEY=623f...` 2. `curl -X POST -H "X-Admin-Token: $TOK" https://gendsgn.ru/api/v1/admin/scrape/objective/sync-our` → 200 + task_id (не 503) 3. `SELECT COUNT(*) FROM objective_scrape_runs` → должен стать >0 после первого manual / scheduled триггера 4. Через ~12-15 мин после трига: `SELECT COUNT(*) FROM objective_raw_reports WHERE created_at >= NOW() - interval '1 hour'` → >0 5. Beat task `tasks.scrape_objective.sync_all_groups` (вторник 06:00 UTC) — следующий запуск проверить что не early-returns `no_api_key`
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#311
No description provided.