Skip to content

feat(phase-17): hardening and refactors (pipeline and gateway) - #79

Merged
SlavaKuntsov merged 11 commits into
mainfrom
feat/phase-17-hardening-refactors
Sep 19, 2026
Merged

SlavaKuntsov merged 11 commits into
mainfrom
feat/phase-17-hardening-refactors

Conversation

@SlavaKuntsov

Copy link
Copy Markdown
Owner

Phase 17 — hardening and refactors (pipeline and gateway), P1 scope

Closes #63
Closes #52
Closes #54
Closes #51

Implemented

  • P2 infra: extract shared Go module with go.work and graceful shutdown #63 — shared Go module + graceful shutdown: новый общий модуль pkg/ (go.work): AuthMiddleware/OptionalAuth, логгер, метрики, WriteJSON с http.Flusher, bootstrap http.Server с таймаутами и graceful shutdown по SIGTERM (SHUTDOWN_GRACE), таймауты у исходящих клиентов; версии Go-сервисов выровнены (go 1.25.0, jwt v5.3.1, minio v7.3.0); Dockerfiles/compose-контексты пересобраны под общий модуль; gateway/upload не рвут in-flight загрузки (stop_grace_period: 5m).
  • P1 gateway: replace wildcard CORS and XFF-trusting rate limit #52 — CORS allowlist + Redis rate-limit: wildcard * + credentials убраны — явный allowlist из CORS_ALLOWED_ORIGINS (чужой origin не получает ACAO); rate-limit переведён на Redis (атомарный Lua fixed-window), ключ — проверенный client IP; XFF/X-Real-IP доверяются только от TRUSTED_PROXY_CIDRS (дефолт пустой — gateway является edge, ревью M1); auth slowapi ключует по X-Real-IP от gateway, но только от доверенного пира + порт auth публикуется только на 127.0.0.1 (ревью H1).
  • P1 gateway: add metadata cache and shared http client to HLSAuth #54 — HLSAuth cache: один общий http.Client с пулом вместо клиента на каждый сегмент; LRU-кеш video_id→meta (TTL 10s) + negative-cache 404/403 (TTL 5s), 4096 записей; 200 сегментов → ~1 запрос в metadata, смена visibility видна ≤15s.
  • P1 transcoder: kill and reap ffmpeg on pipe failure or timeout #51 — transcoder ffmpeg lifecycle: _kill_and_reap (SIGKILL + wait) по try/finally при ошибке стрима/таймауте — зомби не копятся; _HeartbeatKeeper держит pika-соединение во время длинных транскодов (600s heartbeat vs 900s×3 ffmpeg); ack/publish только после гарантированной остановки heartbeat-потока (ревью M2).
  • Бонус: fix(metadata) — GET /api/v1/videos отдавал 500 всем (uuid = text, SQLSTATE 42883) с коммита 3a1a5bc; $3::uuid + шаг video list 200 в e2e.
  • chore(go) — strict golangci (.golangci.strict.yaml) чист: package comments, shadow.

Вне скоупа (не в PR)

P2-задачи фазы не реализованы и остались в Backlog: #55 (redis requirepass), #57 (atomic UPDATE), #58 (validate before insert), #59 (upload JSON errors), #62 (argv builder). #50 был закрыт ранее (PR #78).

Acceptance criteria

Verification

  • make lint-go — 0 issues (4 модуля), make lint-py, make lint-front — чисто
  • make -f Makefile lint-report (strict) — 0 issues
  • make test-go — 12 пакетов ok; make test-py — auth 22, transcoder 32 passed
  • make up — все сервисы healthy; make e2e — PASS (включая новый list-check)

Review

  • Независимое ревью фазы: 1 High + 2 Medium найдены и исправлены (H1/M1/M2), Low-находки задокументированы (singleflight на HLS-кеш, Flusher в hlsCacheWriter и др. — кандидаты в отдельные тикеты).

Remaining risks

  • Redis rate-limit fail-open при недоступности Redis (осознанно, availability over strictness).
  • Fixed-window допускает burst ×2 на границе окна (свойство подхода).
  • e2e WARN «private HLS without token 200» внутри 10s TTL-окна кеша P1 gateway: add metadata cache and shared http client to HLSAuth #54 — документированная семантика.

@SlavaKuntsov SlavaKuntsov self-assigned this Sep 19, 2026
@SlavaKuntsov
SlavaKuntsov merged commit 1cfe431 into main Sep 19, 2026
4 checks passed
@SlavaKuntsov
SlavaKuntsov deleted the feat/phase-17-hardening-refactors branch September 19, 2026 18:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant