Fix: Overpass-Fallback auf kumi.systems — overpass-api.de gibt 406 zurück

overpass-api.de und lz4.overpass-api.de blockieren die Server-IP mit 406.
OVERPASS_URLS-Liste mit Fallback: kumi → lz4 → overpass-api.de.
_fetch_overpass probiert jede Instanz, springt bei 4xx-Fehler zur nächsten.
This commit is contained in:
rene 2026-04-25 22:00:26 +02:00
parent 8d3a620275
commit 91389b9a3f

View file

@ -16,9 +16,13 @@ from auth import get_current_user, get_current_user_optional as get_optional_use
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
router = APIRouter() router = APIRouter()
CACHE_ZOOM = 12 CACHE_ZOOM = 12
CACHE_DAYS = 14 CACHE_DAYS = 14
OVERPASS_URL = 'https://overpass-api.de/api/interpreter' OVERPASS_URLS = [
'https://overpass.kumi.systems/api/interpreter',
'https://lz4.overpass-api.de/api/interpreter',
'https://overpass-api.de/api/interpreter',
]
# Globales Limit: max 2 gleichzeitige Overpass-Anfragen (Prewarm + User geteilt) # Globales Limit: max 2 gleichzeitige Overpass-Anfragen (Prewarm + User geteilt)
_overpass_sem = asyncio.Semaphore(2) _overpass_sem = asyncio.Semaphore(2)
@ -64,17 +68,24 @@ def _covering_tiles(south, west, north, east, zoom):
# Overpass-Fetch + Cache # Overpass-Fetch + Cache
# ------------------------------------------------------------------ # ------------------------------------------------------------------
async def _fetch_overpass(query): async def _fetch_overpass(query):
for attempt in range(3): for url in OVERPASS_URLS:
async with _overpass_sem: for attempt in range(2):
async with httpx.AsyncClient(timeout=40) as client: try:
r = await client.post(OVERPASS_URL, data={'data': query}) async with _overpass_sem:
if r.status_code != 429: async with httpx.AsyncClient(timeout=40) as client:
r.raise_for_status() r = await client.post(url, data={'data': query})
if r.status_code == 200:
return r.json().get('elements', []) return r.json().get('elements', [])
logger.warning(f"Overpass 429 (Versuch {attempt + 1}/3)") if r.status_code == 429:
# Semaphore freigeben, dann warten logger.warning(f"Overpass 429 {url} (Versuch {attempt + 1}/2)")
await asyncio.sleep(45 * (attempt + 1)) await asyncio.sleep(30 * (attempt + 1))
raise Exception("Overpass 429 nach 3 Versuchen") continue # gleiche URL nochmal
logger.warning(f"Overpass {r.status_code} {url} — nächste Instanz")
break # nächste URL
except Exception as exc:
logger.warning(f"Overpass Verbindungsfehler {url}: {exc}")
break # nächste URL
raise Exception("Alle Overpass-Instanzen fehlgeschlagen")
def _stale_tiles(poi_type, tiles): def _stale_tiles(poi_type, tiles):
stale = [] stale = []