Region-aware pricing: GeoIP + VPN-детект + публичный /plans + бот
Build & Push Image / Build and push Caddy (Cloudflare DNS) image (push) Successful in 26s
Build & Push Image / Build and push to Gitea Registry (push) Successful in 9m36s
CI / fmt + clippy + test (push) Failing after 24m37s

- modules::geoip — DB-IP Lite (.mmdb, без регистрации/ключа, в отличие от
  MaxMind) для страны по IP, X4BNet lists_vpn для грубой VPN/датацентр-
  эвристики. Обе базы скачиваются в рантайме, обновление — фоновая
  задача в tasks.rs (раз в сутки по умолчанию, GEOIP_REFRESH_INTERVAL).
- GET /api/v1/billing/plans (public_router, без auth_guard) — цены в
  валюте, определённой по IP посетителя (X-Real-IP/X-Forwarded-For,
  см. nginx-конфиги). VPN/датацентр IP -> всегда базовый USD, чтобы
  обход региона через любой публичный VPN не обесценивал скидки.
- Бот: Bot API не отдаёт IP пользователя вообще — валюта определяется по
  Telegram language_code. Показ цены — в валюте региона, САМА оплата
  через CryptoBot остаётся в USD/USDT (провайдер биллит 1:1 к USD-цене
  тарифа, менять валюту списания нельзя, не меняя сам провайдер).
This commit is contained in:
2026-07-11 00:55:03 +07:00
parent a89721fbee
commit d91aef012e
15 changed files with 557 additions and 13 deletions
+15
View File
@@ -0,0 +1,15 @@
//! Определение страны по IP (self-hosted DB-IP Lite, формат `.mmdb` — тот же,
//! что у MaxMind, но без регистрации/лицензионного ключа, см. README ниже) и
//! грубая эвристика "это VPN/датацентр?" по открытому списку CIDR-диапазонов
//! (X4BNet `lists_vpn`, тоже без ключей/оплаты).
//!
//! Обе базы скачиваются в рантайме (см. `service::GeoipService::refresh_*`),
//! не коммитятся в репозиторий — только пути/URL в конфиге. Периодическое
//! обновление — фоновая задача в `tasks.rs`, не здесь.
//!
//! Region-based pricing работает только там, где есть IP посетителя (сайт,
//! `GET /plans` — см. `modules::billing::controller`) — у Telegram-бота IP
//! юзера не видно вообще (ограничение самого Bot API), поэтому там валюта
//! определяется по `language_code` (см. `currency::currency_for_telegram_lang`).
pub mod currency;
pub mod service;