feat(tradein): persistent infra для backfill scripts (PR F) #592

Merged
Light1YT merged 1 commit from feat/tradein-scripts-persistent-infra into main 2026-05-27 06:59:55 +00:00
Owner

Summary

После PR E (#591) backfill работал только через manual docker cp + docker exec -e. Этот PR делает infra persistent.

3 fixes

  1. Dockerfile: COPY scripts ./scripts в builder + runner stage
  2. docker-compose.prod.yml: env_file: ./backend/.env.runtime (required: false) — pattern из main backend. Убран дубль из environment: block.
  3. Env-var rename: pydantic field yandex_geocoder_key → yandex_geocoder_api_key. 5 call sites в geocoder.py updated.

Real findings из backfill

  • Backfill 4170 houses: updated=3840 (92.1%), imprecise=321, no_match=10
  • Audit-only 8292: ok=7594 (91.6%), mismatch >50m=681 (8.2%)
  • DB state: 96% houses с coords (было 52%)

681 mismatch — «Малышева 125»-type problem. Phase 4 UPDATE — отдельный PR.

Verified

  • 56 tests pass (backfill + audit + cadastral_reverse)
  • docker compose config → valid
  • code-reviewer LGTM, 1 nit applied inline
## Summary После PR E (#591) backfill работал только через manual docker cp + docker exec -e. Этот PR делает infra persistent. ## 3 fixes 1. **Dockerfile**: COPY scripts ./scripts в builder + runner stage 2. **docker-compose.prod.yml**: env_file: ./backend/.env.runtime (required: false) — pattern из main backend. Убран дубль из environment: block. 3. **Env-var rename**: pydantic field yandex_geocoder_key → yandex_geocoder_api_key. 5 call sites в geocoder.py updated. ## Real findings из backfill - Backfill 4170 houses: updated=3840 (92.1%), imprecise=321, no_match=10 - Audit-only 8292: ok=7594 (91.6%), mismatch >50m=**681 (8.2%)** - DB state: 96% houses с coords (было 52%) 681 mismatch — «Малышева 125»-type problem. Phase 4 UPDATE — отдельный PR. ## Verified - 56 tests pass (backfill + audit + cadastral_reverse) - docker compose config → valid - code-reviewer LGTM, 1 nit applied inline
Light1YT added 1 commit 2026-05-27 06:59:53 +00:00
3 проблемы фиксятся:
1. tradein-mvp/backend/Dockerfile копировал только COPY app — scripts/
   слетал при каждом deploy, требовал manual docker cp.
2. docker-compose.prod.yml без env_file — .env.runtime не читался
   контейнером, переменные приходили только через host env.
3. Env-var name mismatch: compose YANDEX_GEOCODER_KEY vs script
   YANDEX_GEOCODER_API_KEY — script всегда видел None.

Изменения:
- backend/Dockerfile: COPY scripts ./scripts в builder + runner stage
- docker-compose.prod.yml:
  * env_file: ./backend/.env.runtime (required: false) — pattern из
    main backend (PR #585)
  * убран дубль `YANDEX_GEOCODER_API_KEY: ${...}` из environment:
    block — он бы overrideal env_file пустым значением. Reviewer nit
    applied inline.
- pydantic Settings (app/core/config.py): rename yandex_geocoder_key
  → yandex_geocoder_api_key. Case-insensitive env binding автоматически
  подхватывает `YANDEX_GEOCODER_API_KEY` (no Field alias нужен).
- All 5 call sites в app/services/geocoder.py обновлены.
- app/tasks/geocode_missing.py docstring + test mock обновлены.
- backend/scripts/README.md: canonical `docker exec` commands без
  manual `docker cp` workflow.
- DEPLOY.md + .env.example обновлены с новым именем переменной.

Verified:
- pytest tests/test_backfill_house_coords.py + test_audit_address_mismatch.py
  + test_cadastral_reverse.py → 56 pass
- docker compose -f docker-compose.prod.yml config → valid syntax
- pydantic binding: YANDEX_GEOCODER_API_KEY=foo → settings.yandex_geocoder_api_key=='foo'
- code-reviewer LGTM (nit applied inline)

После merge — на VPS уже создан /opt/gendesign/tradein-mvp/backend/.env.runtime
с YANDEX_GEOCODER_API_KEY (см. PR #591 deploy). deploy.yml triggers
force-recreate из-за нового image hash → env_file pick up автоматически.
Light1YT merged commit 1ce9e10012 into main 2026-05-27 06:59:55 +00:00
Light1YT deleted branch feat/tradein-scripts-persistent-infra 2026-05-27 06:59:55 +00:00
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#592
No description provided.