From b19ca1ed41c54fca574088d6d87cc9cd40d2268b Mon Sep 17 00:00:00 2001 From: lekss361 Date: Mon, 11 May 2026 14:22:11 +0300 Subject: [PATCH] fix(nspd-geo): rosreestr2coord cache permission in non-root worker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rosreestr2coord.Area() by default creates ./tmp/ media cache relative to CWD. In our worker container CWD=/app (owned by root), runs as non-root user `app` → PermissionError: '/app/tmp' on every target. Fix: pass explicit kwargs to Area(): - use_cache=False (we don't need cache — each cad_num is unique) - media_path='/tmp/rosreestr2coord' (world-writable in container) Vault: fixes/Bug_Nspd_Geo_Tmp_Permission_Fixed.md --- backend/app/services/scrapers/nspd_lite.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backend/app/services/scrapers/nspd_lite.py b/backend/app/services/scrapers/nspd_lite.py index bd47e76b..b8a8cafa 100644 --- a/backend/app/services/scrapers/nspd_lite.py +++ b/backend/app/services/scrapers/nspd_lite.py @@ -165,11 +165,18 @@ def fetch_via_rosreestr2coord( except ImportError as e: raise NspdLiteError(f"rosreestr2coord не установлен (uv add rosreestr2coord): {e}") from e + # rosreestr2coord по дефолту пишет media-cache в `./tmp/` (относительно CWD). + # У нас CWD = /app, контейнер worker'а запущен под non-root user → Permission + # denied при первом fetch. + # Фикс: use_cache=False + media_path=/tmp/rosreestr2coord (writable для всех). + # Кеш нам не нужен — каждый cad_num уникален, обращаемся раз. a = Area( code=cad_num, area_type=area_type, timeout=timeout, with_log=False, + use_cache=False, + media_path="/tmp/rosreestr2coord", ) try: return a.to_geojson_poly()