Правки от GPT
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user