593030271b
Имя согласовывает ОПЕРАТОР, и у каждого оно своё. Клиентская рассылка несла одно имя всем каналам, а умолчанием ему служило `services.sms.mts.naming` — то есть имя, согласованное с МТС, подставлялось Теле2 и подставилось бы Мегафону и Билайну. Живой отказ Теле2 `invalid_source_address` 04.08.2026 — ровно этот механизм. На бою у клиентов заведено НОЛЬ своих имён, значит это касалось каждой отправки. Появился ClientSmsSenderResolver: спрашивает имя у той сети, чей номер. Пустая строка на выходе — не «имени нет», а «своего имени для этой сети нет, канал подпишется собственным согласованным именем из настроек». Переведены на него оба места отправки: рассылка (SendClientSmsCampaignJob) и авто-СМС по сделке (SendAutoSmsForDealJob). Универсальный СМС-центр передавал имя КАК ЕСТЬ — теперь тоже падает на своё (SMSC_NAMING). Раньше пустое имя туда не приходило никогда, с этой правкой стало бы приходить: ушли бы СМС без отправителя. Заплатка внутри канала Теле2 (приведение написания к своему регистру) остаётся, но больше не несущая: она чинила следствие в одном канале, а причина была общая. Экранное имя (ResolvesClientSmsSenderName) НЕ трогали — это запись намерения, а не то, чем подпишется сеть; в его шапке теперь написано почему, чтобы не «починили» обратно. 🪤 Урок по дороге: авто-СМС ловит любую ошибку и молча выходит. Справочник имён был передан не в ту функцию — вместо падения получилась ТИШИНА, не уходило ничего. Поймали три чужих теста, до того зелёных. Проверено: 4614 тестов, упал один чужой (ExampleTest — в этой папке не собран фронтенд). Статанализ 0. Стиль правленых файлов чист. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
153 lines
6.2 KiB
Bash
153 lines
6.2 KiB
Bash
APP_NAME=Liderra
|
|
APP_ENV=local
|
|
APP_KEY=
|
|
APP_DEBUG=true
|
|
APP_URL=http://localhost
|
|
|
|
APP_LOCALE=ru
|
|
APP_FALLBACK_LOCALE=ru
|
|
APP_FAKER_LOCALE=ru_RU
|
|
APP_TIMEZONE=Europe/Moscow
|
|
|
|
APP_MAINTENANCE_DRIVER=file
|
|
# APP_MAINTENANCE_STORE=database
|
|
|
|
# PHP_CLI_SERVER_WORKERS=4
|
|
|
|
BCRYPT_ROUNDS=12
|
|
|
|
LOG_CHANNEL=stack
|
|
LOG_STACK=single
|
|
LOG_DEPRECATIONS_CHANNEL=null
|
|
LOG_LEVEL=debug
|
|
|
|
DB_CONNECTION=pgsql
|
|
DB_HOST=127.0.0.1
|
|
DB_PORT=5432
|
|
DB_DATABASE=liderra
|
|
DB_USERNAME=postgres
|
|
DB_PASSWORD=
|
|
|
|
# Supplier Sync (Plan 3 Task 3) — crm_supplier_worker BYPASSRLS connection.
|
|
# На production указывают на роль crm_supplier_worker (создана db/00_create_roles.sql v1.1).
|
|
# Если не заданы — fallback на DB_USERNAME / DB_PASSWORD (dev: postgres superuser, BYPASSRLS implicit).
|
|
DB_SUPPLIER_USERNAME=crm_supplier_worker
|
|
DB_SUPPLIER_PASSWORD=
|
|
|
|
# Supplier Portal credentials (Playwright login — Task 5)
|
|
SUPPLIER_LOGIN=
|
|
SUPPLIER_PASSWORD=
|
|
SUPPLIER_PORTAL_URL=https://crm.bp-gr.ru
|
|
|
|
# Supplier alerts (email через Unisender Go relay)
|
|
SUPPLIER_ALERT_EMAIL=
|
|
|
|
# SaaS-admin fail-closed гейт (M-1). Логины nginx basic-auth (.htpasswd-admin),
|
|
# допущенные в /api/admin/*. CSV; дефолт совпадает с прод-.htpasswd.
|
|
ADMIN_ALLOWED_USERS=admin
|
|
# ADMIN_GATE_ENFORCED=true # авто: true вне local/testing; задать явно для override
|
|
# Системный admin-id для audit-trail (FK saas_admin_audit_log). На проде crm_app_user
|
|
# не имеет прав на saas_admin_users → задать id сид-стаба. dev/test — оставить пустым.
|
|
ADMIN_AUDIT_SYSTEM_USER_ID=
|
|
|
|
# Капча самозаписи (M-2). driver=null (dev) | yandex (prod). Для yandex нужен server-key.
|
|
CAPTCHA_DRIVER=null
|
|
YANDEX_SMARTCAPTCHA_SERVER_KEY=
|
|
|
|
SESSION_DRIVER=database
|
|
SESSION_LIFETIME=120
|
|
SESSION_ENCRYPT=false
|
|
SESSION_PATH=/
|
|
SESSION_DOMAIN=null
|
|
|
|
BROADCAST_CONNECTION=log
|
|
FILESYSTEM_DISK=local
|
|
QUEUE_CONNECTION=redis
|
|
|
|
CACHE_STORE=database
|
|
# CACHE_PREFIX=
|
|
|
|
MEMCACHED_HOST=127.0.0.1
|
|
|
|
REDIS_CLIENT=predis
|
|
REDIS_HOST=127.0.0.1
|
|
REDIS_PASSWORD=null
|
|
REDIS_PORT=6379
|
|
|
|
MAIL_MAILER=log
|
|
MAIL_SCHEME=null
|
|
MAIL_HOST=127.0.0.1
|
|
MAIL_PORT=2525
|
|
MAIL_USERNAME=null
|
|
MAIL_PASSWORD=null
|
|
MAIL_FROM_ADDRESS="hello@example.com"
|
|
MAIL_FROM_NAME="${APP_NAME}"
|
|
SUPPORT_EMAIL=support@liderra.ru
|
|
BOT_TOURS_ENABLED=false
|
|
YANDEX_GPT_API_KEY=
|
|
YANDEX_GPT_FOLDER_ID=
|
|
|
|
AWS_ACCESS_KEY_ID=
|
|
AWS_SECRET_ACCESS_KEY=
|
|
AWS_DEFAULT_REGION=us-east-1
|
|
AWS_BUCKET=
|
|
AWS_USE_PATH_STYLE_ENDPOINT=false
|
|
|
|
VITE_APP_NAME="${APP_NAME}"
|
|
|
|
# Клиентский ключ Yandex SmartCaptcha (M-2). Пусто → fallback-чекбокс (dev).
|
|
# На проде — клиентский ключ ysc1_… (для виджета на странице регистрации).
|
|
VITE_YANDEX_SMARTCAPTCHA_SITEKEY=
|
|
|
|
# Автоподбор шаг2: обход антибота справочников (2ГИС/Яндекс). Ключ — в .env, не в гите.
|
|
XFETCH_API_KEY=
|
|
|
|
# Автоподбор шаг1: модель ИИ-фильтра «поставщик или площадка-агрегатор».
|
|
# ОБЯЗАТЕЛЬНО gpt-4o (сильная): слабая gpt-4o-mini наугад штампует живые
|
|
# федеральные МФО (Екапуста/Webbankir/СрочноДеньги…) как «агрегаторы» и режет
|
|
# их из подбора. Пусто → фолбэк на gpt-4o-mini (баг «режет федералов», 07.07.2026).
|
|
AITUNNEL_AGGREGATOR_MODEL=gpt-4o
|
|
|
|
# Счётчик «полного пути» — тот же, что стоит на лендинге liderra.ru.
|
|
# Без него путь клиента в Вебвизоре рвётся между лендингом и кабинетом.
|
|
METRIKA_PATH_COUNTER_ID=
|
|
|
|
# СМС-маршрутизация по операторам (реестр — config/services.php services.sms.providers).
|
|
# Песочница по умолчанию ВКЛ — живые каналы не вызываются, деньги не уходят.
|
|
SMS_SANDBOX=true
|
|
SMS_FAILOVER_TO_UNIVERSAL=false
|
|
SMS_SMSC_ENABLED=false
|
|
SMS_SMSC_PRICE_KOP=0
|
|
# Имя отправителя универсального канала — им подписываемся, когда своего имени
|
|
# у клиента для сети получателя нет. Пусто = уйдёт без имени.
|
|
SMSC_NAMING=
|
|
SMS_MTS_ENABLED=false
|
|
SMS_MTS_TOKEN=
|
|
SMS_MTS_PRICE_KOP=0
|
|
# Канал Теле2 («SMS-Таргет», target.t2.ru). Логин и пароль берутся в кабинете:
|
|
# Профиль → API-рассылки → Настроить подключение. Там же заявляется IP боевого
|
|
# сервера — без этого t2 отвечает 403 wrong_ip. Имя отправителя — согласованное.
|
|
SMS_T2_ENABLED=false
|
|
SMS_T2_LOGIN=
|
|
SMS_T2_PASSWORD=
|
|
SMS_T2_NAMING=
|
|
SMS_T2_PRICE_KOP=0
|
|
# Обратный звонок t2 о судьбе: /api/webhook/t2-delivery/{секрет}?id=&status=&parts=
|
|
# Секрет — не короче 32 знаков; пустой = приёмник ЗАКРЫТ (судьбу доберёт опрос).
|
|
# 🪤 t2 ответа не проверяет и повторов не делает: пропущенный звонок потерян.
|
|
# Адреса отправителя — через запятую, можно подсетями; пусто = не проверяем.
|
|
SMS_T2_WEBHOOK_SECRET=
|
|
SMS_T2_WEBHOOK_IPS=
|
|
|
|
# Реклама в Телеграме по своей базе (клиентский модуль, робот-в-браузере — у МТС нет API).
|
|
# Песочница по умолчанию ВКЛ — робот доводит только до черновика, деньги не списываются.
|
|
# TG_SANDBOX=false открывается осознанно (Сессия 6) после проверки в песочнице.
|
|
TG_SANDBOX=true
|
|
# Node-робот кабинета МТС (bots/mts-telegram-ads). Воркер живёт на Windows-машине с сессией МТС.
|
|
TG_ROBOT_NODE=node
|
|
TG_ROBOT_SCRIPT=
|
|
TG_ROBOT_CWD=
|
|
TG_ROBOT_TIMEOUT=300
|
|
# Канал робота-грузчика креативов в веб-кабинет Яндекса. Пусто → канал закрыт.
|
|
CREATIVE_ROBOT_TOKEN=
|