bug(#104): ekburg_permits_sync SSL CERTIFICATE_VERIFY_FAILED для xn--80acgfbsl1azdqr.xn--p1ai (екатеринбург.рф) #242

Closed
opened 2026-05-17 05:39:17 +00:00 by lekss361 · 0 comments
Owner

Симптом

После merge PR #239 (admin endpoint) запустили refresh_all через POST /api/v1/admin/scrape/ekburg-permits — все 5 годов (2022-2026) упали с:

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1010)

GlitchTip issues BACKEND-Q .. BACKEND-V (6 events, все одинаковые).

Контейнер celery-worker (release 6f565c19, 2026-05-17 05:36 UTC) не может верифицировать TLS сертификат xn--80acgfbsl1azdqr.xn--p1ai (екатеринбург.рф в punycode).

Воспроизведение

curl -X POST https://gendsgn.ru/api/v1/admin/scrape/ekburg-permits \
  -H "X-Admin-Token: $TOKEN" -d '{"year": 2026}'
# Через 5-10 сек в GlitchTip: ConnectError SSL_CERTIFICATE_VERIFY_FAILED

Из breadcrumbs event'а 33:

GET https://xn--80acgfbsl1azdqr.xn--p1ai/file/70bf01bf31538ee9dd82dadfc47192a0
→ ConnectError('[SSL: CERTIFICATE_VERIFY_FAILED] ...')

Прод env: certifi==2026.4.22, httpx==0.28.1. Скорее всего екатеринбург.рф использует промежуточный российский CA (Минцифры) которого нет в дефолтном CA bundle.

Hypothesis / fix options

  1. httpx verify=False (быстро, insecure) — backend/app/services/scrapers/ekburg_permits.py создать AsyncClient с verify=False. Acceptable для public open-data, но не best-practice.
  2. Российский CA bundle — установить пакет russian-trusted-bundle или скачать russian_trusted_root_ca.cer от Минцифры в /etc/ssl/certs/ контейнера, передать verify="/path/to/bundle.pem" в httpx.
  3. Per-host CA overrideSSL_CERT_FILE env var или httpx verify argument только для xn--80acgfbsl1azdqr.

Рекомендуется #2 (правильное решение для долгосрочного scraper'а росс. ресурсов). #1 как hotfix.

Acceptance

  • POST /admin/scrape/ekburg-permits {"year": 2026} завершается без SSL ошибки
  • SELECT count(*) FROM ekburg_construction_permits > 0 после refresh_all
  • Beat schedule (1-го числа 02:00 UTC) тоже работает

Severity

🟠 P1 — блокирует #104 + ВСЕ scraper'ы которые ходят к госресурсам с Минцифры CA (вероятно скоро NSPD/Росреестр тоже)

(QA discovery 2026-05-17 после deploy PR #239)

## Симптом После merge PR #239 (admin endpoint) запустили `refresh_all` через `POST /api/v1/admin/scrape/ekburg-permits` — все 5 годов (2022-2026) упали с: ``` [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1010) ``` GlitchTip issues BACKEND-Q .. BACKEND-V (6 events, все одинаковые). Контейнер `celery-worker` (release `6f565c19`, 2026-05-17 05:36 UTC) не может верифицировать TLS сертификат `xn--80acgfbsl1azdqr.xn--p1ai` (екатеринбург.рф в punycode). ## Воспроизведение ```bash curl -X POST https://gendsgn.ru/api/v1/admin/scrape/ekburg-permits \ -H "X-Admin-Token: $TOKEN" -d '{"year": 2026}' # Через 5-10 сек в GlitchTip: ConnectError SSL_CERTIFICATE_VERIFY_FAILED ``` Из breadcrumbs event'а 33: ``` GET https://xn--80acgfbsl1azdqr.xn--p1ai/file/70bf01bf31538ee9dd82dadfc47192a0 → ConnectError('[SSL: CERTIFICATE_VERIFY_FAILED] ...') ``` Прод env: `certifi==2026.4.22`, `httpx==0.28.1`. Скорее всего екатеринбург.рф использует промежуточный российский CA (Минцифры) которого нет в дефолтном CA bundle. ## Hypothesis / fix options 1. **httpx `verify=False`** (быстро, insecure) — `backend/app/services/scrapers/ekburg_permits.py` создать AsyncClient с `verify=False`. Acceptable для public open-data, но не best-practice. 2. **Российский CA bundle** — установить пакет `russian-trusted-bundle` или скачать `russian_trusted_root_ca.cer` от Минцифры в `/etc/ssl/certs/` контейнера, передать `verify="/path/to/bundle.pem"` в httpx. 3. **Per-host CA override** — `SSL_CERT_FILE` env var или httpx `verify` argument только для xn--80acgfbsl1azdqr. Рекомендуется #2 (правильное решение для долгосрочного scraper'а росс. ресурсов). #1 как hotfix. ## Acceptance - [ ] `POST /admin/scrape/ekburg-permits` `{"year": 2026}` завершается без SSL ошибки - [ ] `SELECT count(*) FROM ekburg_construction_permits` > 0 после refresh_all - [ ] Beat schedule (1-го числа 02:00 UTC) тоже работает ## Severity 🟠 P1 — блокирует #104 + ВСЕ scraper'ы которые ходят к госресурсам с Минцифры CA (вероятно скоро NSPD/Росреестр тоже) (QA discovery 2026-05-17 после deploy PR #239)
Sign in to join this conversation.
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#242
No description provided.