Правки от GPT

This commit is contained in:
mi
2026-07-10 10:49:58 +03:00
parent 8835677860
commit 50fc053979
7 changed files with 190 additions and 35 deletions
+25 -7
View File
@@ -85,7 +85,7 @@ Managed PostgreSQL **поднимается до** развёртывания п
| Группа | Ключи |
|---|---|
| Auth | `auth.phone.enabled`, `auth.password.enabled` |
| OTP (продукт; потребитель — Keycloak SPI, не api-backend) | `otp.phone.max_send_attempts_per_24h`, `otp.phone.min_seconds_between_attempts` |
| OTP (продукт; потребитель — Keycloak SPI через settings bridge api-backend) | `otp.phone.max_send_attempts_per_24h`, `otp.phone.min_seconds_between_attempts` |
| Оператор | `operator.call.phone` |
| Consent | `consent.personal_data.*`, `consent.user_agreement.*`, `consent.marketing.*` |
| Файлы чата | `chat.attachments.*` |
@@ -120,6 +120,7 @@ chat.attachments.max_size_mb=5
chat.attachments.storage=selectel_s3
chat.attachments.upload_mode=presigned_put
chat.attachments.safety_scan_required=true
chat.attachments.presigned_upload_ttl_seconds=600
rate_limit.message_send.per_user=30/minute
rate_limit.message_send.per_dialog=20/minute
@@ -129,7 +130,7 @@ rate_limit.login.per_ip=10/minute
ux.session.idle_timeout_minutes=30
security.cors.allowed_origins=https://tohin.ru,https://app.example.ru
security.cors.allowed_origins=https://tohin.ru
security.public_cache.max_age_seconds=3600
```
@@ -165,9 +166,9 @@ KC_DB_URL_PROPERTIES=currentSchema=keycloak
# =============================================================================
# Публичные URL (HTTPS)
# =============================================================================
PUBLIC_WEB_URL=https://app.example.ru
PUBLIC_API_URL=https://app.example.ru/api
PUBLIC_AUTH_URL=https://app.example.ru/auth
PUBLIC_WEB_URL=https://tohin.ru
PUBLIC_API_URL=https://tohin.ru/api
PUBLIC_AUTH_URL=https://tohin.ru/auth
# =============================================================================
# nginx (edge, TLS, rate limits)
@@ -188,7 +189,7 @@ NGINX_RATE_LIMIT_POLLING=60r/m
# =============================================================================
# Keycloak (infra; OTP-заглушка — dev/MVP)
# =============================================================================
KEYCLOAK_PUBLIC_URL=https://app.example.ru/auth
KEYCLOAK_PUBLIC_URL=https://tohin.ru/auth
KEYCLOAK_INTERNAL_URL=http://keycloak:8080
KEYCLOAK_REALM=han-chat
KEYCLOAK_AUDIENCE=han-chat-api
@@ -214,6 +215,7 @@ BITRIX_API_INBOX_TOKEN=change-me
BITRIX_INTERNAL_API_TOKEN=change-me
BITRIX_API_FORWARD_TOKEN=change-me
BITRIX_SYNC_SERVICE_TOKEN=change-me
KEYCLOAK_SETTINGS_BRIDGE_TOKEN=change-me
# =============================================================================
# api-backend (интеграции + resilience I2)
@@ -258,6 +260,7 @@ BITRIX_APPLICATION_TOKEN=change-me
MESSAGE_SAFETY_POST_TIMEOUT_SEC=5
MESSAGE_SAFETY_TASK_POLL_INTERVAL_SEC=2
MESSAGE_SAFETY_TASK_POLL_MAX_SEC=300
MESSAGE_SAFETY_FILE_SCAN_TIMEOUT_SEC=60
MESSAGE_SAFETY_RULES_VERSION=2026-01-01
# =============================================================================
@@ -301,7 +304,22 @@ OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
| Значение | Поведение |
|---|---|
| `true` (default) | `bitrix-sync` обрабатывает `sync_queue` и принимает CRM webhook |
| `false` | синхронизация с Bitrix24 CRM не выполняется (сервис не стартует или no-op); чат Open Lines через `bitrix-local-app` **не** затрагивается |
| `false` | синхронизация с Bitrix24 CRM не выполняется; сервис стартует в no-op/degraded режиме; чат Open Lines через `bitrix-local-app` **не** затрагивается |
В MVP выбран режим **no-op service**: контейнер `bitrix-sync` стартует, `/health/live` отвечает успешно, `/health/ready` возвращает degraded/not-ready с явной причиной `sync_disabled`, worker не обрабатывает `sync_queue`, webhook CRM возвращает безопасный `503` или `202 ignored` по контракту модуля. Это сохраняет единый compose-контур и не влияет на чат Open Lines.
## Keycloak settings bridge для OTP
Product limits OTP (`otp.phone.*`) хранятся в `app_settings`, но Keycloak не получает прямой доступ к схеме `han_app`.
MVP-механизм:
1. `api-backend` читает публичные/служебные настройки из `app_settings` и кэширует их.
2. Для Keycloak SPI доступен internal endpoint `GET /internal/settings/v1/otp` в Docker/VPC-сети, защищённый service token.
3. Keycloak SPI читает `otp.phone.max_send_attempts_per_24h` и `otp.phone.min_seconds_between_attempts` через этот endpoint с локальным cache TTL.
4. При недоступности settings bridge SPI использует последнее валидное cache-значение; если cache пустой — fail-closed и не выдаёт OTP.
Счётчики попыток OTP остаются в зоне Keycloak/SPI, не в `api-backend`.
## Разрешённые типы файлов чата (MVP)