YooKassa → api.xzip.app (A→159.195.54.89, не через CDN)
→ Caddy: reverse_proxy webhook-relay:3003
→ webhook-relay: bullmq очередь (Redis)
→ telegram-bot:3003/v1/webhook/payment/yookassa/internal
(Bearer YOOKASSA_WEBHOOK_INTERNAL_TOKEN)
→ handleYooKassaWebhook()
→ provisions subscription + записи в operations
⚠️
api.xzip.app— прямо A→IP, не через CDN. YooKassa проверяет cert chain.
Три стадии: due (дедлайн), 6h (через 6ч), 12h (через 12ч).
Маркер попытки пишется в поле note подписки. Идемпотентный ключ YooKassa = subscriptionId + planId + endDate + stage. При failure на due — auto_renew=false + уведомление.
Запрос банков api.yookassa.ru/v3/sbp_banks возвращает 401 — незначительный non-blocking баг, основной процессинг не затрагивает.
YooKassa bullmq worker инстанциируется при импорте в telegram-bot. До фикса loadPlanPrices() не вызывался в startBotServer.ts → findPlan() возвращал null → jobs падали "Plan BASIC-X not found". Фикс: добавлен loadPlanPrices() + refresh каждые 5 мин в startBotServer.ts main().