Настройки системы
Общие настройки биллинга и шаблоны печати. Отдельными страницами: фискализация, платёжные системы, банковские выписки, обмен с 1С, почта и домены.
Содержание раздела
Тот же механизм, но нарисованный: узлы можно подсвечивать, связи — разбирать по шагам. Открывается в новой вкладке.
Все схемы системыНастройки
Раздел меню «Настройки» объединяет все параметры биллинга, интеграции, шаблоны печати, управление персоналом и обслуживание базы данных.
Настройки системы
Содержание раздела
- Вкладка «Брендинг» — фирменное оформление
- Вкладка «Безопасность» — политика финансовых операций
- Вкладка «Безопасность» — авторизация (FIDO2, reCAPTCHA, блокировка, сессии)
- Доступ суперпользователя — 2FA, IP-ограничение, политики паролей
- Вкладка «Блокировки и финансы» — captive-portal + бизнес-правила
- Вкладка «Прокси» — пул прокси для Telegram и Нейросети
- Вкладка «Сообщения клиентам» — политика уведомлений
- Вкладка «RADIUS» — таймауты, retention, NAS auto-assign
- Вкладка «Аудит» — журнал действий по клиентам
- Вкладка «Логи» — хранение и уровень логирования
- Вкладка «Скорость» — Gunicorn / Celery / БД / Throttling
- Вкладка «EBS-виджет» — синхронизация с EBS
Единая страница системных параметров (/admin/settings/system/).
Вкладки идут по частоте использования — первой открывается «Брендинг»,
диагностические (Аудит, Логи, Скорость, EBS-виджет)
уходят в конец; не поместившиеся сворачиваются в пункт «Ещё N» (компонент SmitChipBar),
справа — строка поиска настройки (Ctrl+K). Все параметры страницы
общесистемные — общие для всех организаций; фирменный стиль конкретной
компании (логотип, цвета, название) задаётся отдельно, в её карточке в разделе
Справочники → Организации.
12 вкладок: Брендинг · Безопасность · Блокировки · Прокси ·
Сообщения · RADIUS · Профиль · Маркетинг · Аудит · Логи · Скорость · EBS-виджет.
Карточки внутри вкладки раскладываются masonry — пакуются по
фактической высоте, без пустот от равновысоких рядов, плоскими (без теней) и на всю
ширину экрана. Кнопки «Сохранить» неактивны, пока нет изменений
(js-dirty-save); тёмная тема оформлена полностью, включая поля ввода.
flowchart LR P["⚙ Настройки системы"]:::root P --> G1["Оформление
и доступ"]:::g P --> G2["Сеть, биллинг,
связь"]:::g P --> G3["Диагностика"]:::g G1 --> Brand["Брендинг
по умолчанию"] G1 --> Sec["Безопасность"] G1 --> Prof["Профиль клиента"] G2 --> Blk["Блокировки"] G2 --> Rad["RADIUS"] G2 --> Prx["Прокси"] G2 --> Msg["Сообщения"] G2 --> Mkt["Маркетинг"] G2 --> Ebs["EBS-виджет"] G3 --> Aud["Аудит"] G3 --> Log["Логи"] G3 --> Perf["Скорость"] classDef root fill:#2b8455,stroke:#256a47,color:#fff; classDef g fill:#e8f5e9,stroke:#43b77a,color:#14532d;
Вкладка «Брендинг» — фирменное оформление по умолчанию
Открывается по умолчанию. Название продукта, логотип, favicon, акцентный цвет, контактные данные. Применяется в админке, в личном кабинете, в шаблонах печати и для записей без привязки к организации. Модуль «Свой бренд» (Whitelabel) снимает ограничения на замену названия продукта.
Вкладка «EBS-виджет» — синхронизация с EBS
Управление переносом данных из внешней системы EBS: платежи (задача каждые
10 минут), счета/абоненты, обещанные платежи и сверка балансов
(reconcile) раз в час. Фильтр «какие типы операций переносить» не даёт
задвоить то, что биллинг принимает сам (модуль выписок, ЮKassa). Кнопки на
единых компонентах: «Сохранить» неактивна без изменений, быстрые действия
выбора типов — на SmitButton.
EBS_RECONCILE_ENABLED) — перенесён тумблером на вкладку
«EBS-виджет», мёртвый дубль kill-switch скрыт. Вкладка
авто-скрывается при нуле настроек, а старый адрес
/admin/settings/system/params/ редиректит на «Логи».
Вкладка «Безопасность» — политика финансовых операций
На Безопасности — глобальные ограничения для ручных
финансовых операций (создание/редактирование/удаление через UI). Доступна
только пользователям группы root или is_superuser=True.
5 настроек (все по умолчанию выключены — стандартное поведение Django admin):
| Toggle | Что меняет |
|---|---|
| Только суперпользователь может проводить ручные операции | Скрывает кнопки «Приход»/«Расход», иконки редактирования и удаления
для всех кроме is_superuser или членов группы root.
Backend возвращает HTTP 403 при попытке POST. Просмотр истории операций
остаётся доступен всем. |
| Разрешить выбор услуги при ручной операции «Расход» | Показывает ссылку «+ Добавить услугу» в модалке Расхода. По умолчанию
выключено — большинству провайдеров привязка не нужна, операция остаётся
без FinanceOperations.usluga_id. |
| Максимальная сумма ручной операции (₽) | Защита от опечаток («9000» вместо «900») и фрода. Если задана —
backend отклоняет операции выше указанной суммы. 0 = без
ограничения. Не действует на автоматические процессы (Celery worker,
ЮKassa webhook, ОП). |
| Обязательное описание операции | Запрещает пустое поле «Описание». Полезно для аудита — при разборе спорных операций ясно за что списали. Backend возвращает HTTP 400 если описание пусто. |
| Разрешить удаление финопераций | Если выключено — иконка корзины скрыта в UI,
backend возвращает 403 на DELETE-запросы. Для отмены неправильной
операции остаётся только сторнирование (создание
парной обратной операции с пометкой storno=True) —
обе строки видны зачёркнутыми, что даёт полный аудит-trail для
бухгалтерии. |
Все ограничения проверяются и в backend (HTTP 403/400 на
endpoints finops_ajax, finops_crud_ajax,
FinOpChangeView) и в frontend (кнопки/ссылки/поля
скрыты в HTML).
Важно: ограничения касаются только ручных операций
через UI. Автоматические процессы — Celery worker
billing_worker для абонплаты, webhook ЮKassa, обещанный платёж,
auto-block по отрицательному балансу — работают как обычно, без проверок.
Это нужно чтобы политика «только суперюзер» не сломала автоматическое начисление.
Вкладка «Безопасность» — авторизация: FIDO2, reCAPTCHA, блокировка, сессии
Ниже блока «Финансовые операции» на странице /admin/settings/system/security/ расположены 4 блока управления безопасностью входа.
| Блок | Что делает |
|---|---|
Авторизация через FIDO2/WebAuthnSECURITY_WEBAUTHN_ENABLED |
Вход по passkey (YubiKey, Touch ID/Face ID, Windows Hello). После включения сотрудники привязывают ключ в Профиле (любой сотрудник, не только su; модель StaffWebAuthnCredential), клиенты — в ЛК. На странице входа в биллинг появляется кнопка «Войти по ключу (passkey)». |
Google reCAPTCHA v3RECAPTCHA_SITE_KEY / RECAPTCHA_SECRET_KEY |
После ввода обоих ключей появляются тумблеры «Авторизация в биллинге» (RECAPTCHA_ON_ADMIN_LOGIN) и «Авторизация в ЛК» (RECAPTCHA_ON_LK_LOGIN). |
Блокировка аккаунтаLOCKOUT_ENABLED |
Блокировка после неудачных попыток входа: число попыток (3/5/10), событие — «блокировать попытки на 1 час» или «блокировать аккаунт» (с настраиваемым сообщением). |
Сохранение сессииSESSION_PERSIST_ENABLED |
Срок хранения сессии (1ч … бессрочно) + чекбоксы «Для клиентов» / «Для персонала (кроме su)». При активации в формах входа появляется чекбокс «Запомнить меня». |
Все настройки в категории security, по умолчанию выключены. Миграция 0230 добавляет модель StaffWebAuthnCredential (passkey сотрудников).
Вкладка «Аудит» — настройки журнала действий по клиентам
Управление параметрами вкладки Аудит в карточке клиента и общим поведением логирования. Доступна по адресу /admin/settings/system/?tab=audit только пользователям группы root или с is_superuser=True.
| Параметр | Диапазон | Default | Что меняет |
|---|---|---|---|
Период по умолчанию (месяцев)AUDIT_TAB_DEFAULT_PERIOD_MONTHS |
1–60 | 12 | При первом открытии вкладки «Аудит» в карточке клиента сервер ставит диапазон [now − N мес .. now]. Пользователь может расширить вручную через datepicker. |
Записей на страницеAUDIT_TAB_PER_PAGE |
10–500 | 50 | Количество строк в таблице вкладки. Больше = меньше переключений страниц, но дольше первая загрузка. |
Максимум строк в CSV-экспортеAUDIT_CSV_EXPORT_LIMIT |
1 000 – 500 000 | 50 000 | Защита от перегрузки сервера при выгрузке. При превышении выгружаются последние N записей по дате (хвост обрезается). |
Скрывать системные событияAUDIT_TAB_HIDE_SYSTEM_EVENTS |
bool | off | Не показывать строки без оператора (Celery, billing_worker, авто-блокировки) во вкладке Аудит и в KPI-плитках. Полезно для операторов 1-й линии — меньше шума, легче найти действия людей. |
Все 4 настройки хранятся в таблице system_settings (category = audit), читаются через хелперы в billing/services/settings_service.py (get_audit_default_period_months(), get_audit_per_page(), get_audit_csv_export_limit(), is_audit_hide_system_events()) с clamp в коде на случай некорректного значения в БД.
Срок хранения записей аудита (по умолчанию 365 дней) настраивается отдельно в разделе Очистка БД — параметр DB_CLEANUP_AUDIT_DAYS. Это сделано чтобы retention-политика управлялась рядом с другими параметрами очистки (MSG_STACK, RADIUS_SESSIONS), а не дублировалась.
Быстрый переход в настройки: для пользователей с is_superuser=True в toolbar вкладки «Аудит» карточки клиента появляется иконка-шестерёнка справа от кнопки CSV-экспорта — клик ведёт прямо в /admin/settings/system/?tab=audit.
Вкладка «Логи» — хранение и уровень логирования
Управление файлами журналов в /var/log/django/: ротация, сжатие, уровень логирования Django и FreeRADIUS. Без ограничения по сроку хранения журнал FreeRADIUS на уровне trace вырастает до десятков гигабайт за месяц.
Параметры:
| Параметр | Диапазон | Default | Что меняет |
|---|---|---|---|
Срок хранения логов (дней)LOG_RETENTION_DAYS |
1–90 | 14 | Сколько дней logrotate хранит файлы. Применяется к error.log, freeradius.log, celery_*.log, gunicorn_*.log и др. Ротация раз в сутки в 00:00 на хосте. |
Уровень логирования DjangoLOG_LEVEL |
DEBUG / INFO / WARNING / ERROR | INFO | Влияет на error.log и celery_*.log. Применяется после перезапуска контейнеров. |
Verbosity FreeRADIUSFREERADIUS_DEBUG_LEVEL |
info / debug / trace | info | info — только Accept/Reject (~10 MB/сутки). debug (флаг -X) — детально (~100 MB/сутки). trace (флаг -xx) — полная трассировка (~800 MB/сутки, не использовать в проде). |
Сжимать ротированные файлы gzipLOG_COMPRESS |
bool | true | Архивы прошлых дней сжимаются (≈ ×10 экономия места). Чтение через zcat имя.gz. |
Справа на вкладке — таблица текущего размера всех файлов в /var/log/django/ с подсветкой больших (≥100 МБ оранжевый, ≥1 ГБ красный). Клик по имени файла → переход в просмотр содержимого (/admin/reports/dev/logs/).
/admin/reports/dev/logs/) и ротация журналов
на сервере (logrotate, нативный freeradius.log) — соседние с вкладкой темы, а не
её настройки; их описание перенесено в
Отчёты → Разработка и логи.
Вкладка «Скорость» — Gunicorn / Celery / БД / Throttling (переименована)
Параметры процессов и ресурсов. Изменения требуют перезапуска контейнеров (web, celery). 4 группы настроек раскладываются masonry + статус-блок снизу.
| Группа | Параметры |
|---|---|
| Веб-сервер (Gunicorn) | GUNICORN_WORKERS (1–16, default 1), GUNICORN_THREADS (1–32, default 8), GUNICORN_TIMEOUT (30–600 сек, default 120). |
| Фоновые задачи (Celery) | CELERY_WORKER_CONCURRENCY (1–16, default 8 — не ставьте 16), CELERY_TASK_TIME_LIMIT (30–3600 сек, default 600). |
| База данных и кеш | DB_CONN_MAX_AGE (0–3600, default 0 — закрывать после каждого запроса; — фикс утечки соединений), REDIS_CACHE_TTL_DEFAULT (10–86400 сек, default 300), IP_POOL_STATS_CACHE_SECONDS (5–600, default 60). |
| Лимиты Mobile API | MOBILE_API_THROTTLE_RATE_USER (5–300 запросов/мин, default 30), MOBILE_API_THROTTLE_RATE_ANON (1–60 логинов/мин, default 5). |
Статус-блок снизу (read-only метрики, обновляется при загрузке страницы): CPU, RAM, Load average, PostgreSQL соединений (с алертом если >80%), размер БД, Celery очередь, Redis память.
Вкладка «RADIUS» — таймауты, retention, NAS auto-assign (переименована)
Параметры RADIUS-сессий, NAS-мониторинга и хранения истории. Применяются при следующей авторизации или ближайшем прогоне Celery beat (cleanup-stale-sessions — каждую минуту, db-cleanup-daily — раз в сутки по интервалу 86400 с от старта Celery beat, без привязки к фиксированному часу).
| Группа | Параметры |
|---|---|
| Активные сессии | SESSION_STALE_MINUTES (10–360, default 60) — после скольких минут без Update сессия считается зомби и LOGGED сбрасывается. ACCT_INTERIM_INTERVAL (60–3600 сек, default 600) — раз в сколько секунд NAS должен слать Accounting-Update. |
| Хранение истории | SESSIONS_RETENTION_DAYS (7–365, default 90), MSG_STACK_RETENTION_DAYS (7–365, default 30), AUDIT_RETENTION_DAYS (30–1825, default 365). Целевая task — db-cleanup-daily, чистка батчами по 5000 с паузой 100мс. |
| Авто-замена NAS | DEFAULT_NAS_ID (dropdown enabled NAS) — приёмник для новых клиентов. AUTO_ASSIGN_NAS_MINUTES (1–1440, default 3) — через сколько минут после первой авторизации перевешивать на реальный NAS. NAS_RESYNC_MINUTES (5–120, default 15) — окно для beat-задачи nas-resync-recent которая реагирует на ручную правку оператора. |
| CoA / Disconnect | COA_TIMEOUT_SECONDS (1–60, default 10) — timeout для radclient при CoA Disconnect. |
Статус-блок снизу: NAS всего / UP / DOWN (если есть), Сейчас онлайн (LOGGED), Активных RADIUS-сессий, Расхождение, размер таблиц RADIUS_SESSIONS / AUDIT_OPERATIONS / MSG_STACK.
Вкладка «Сообщения клиентам» — политика уведомлений
Единая страница для управления всеми каналами доставки сообщений: Email, SMS, Push, Telegram, VK. Объединяет настройки из 4 разных мест в одну ментальную модель оператора («Сообщения»). 4 группы раскладываются masonry + статистика снизу.
| Группа | Параметры и эффект |
|---|---|
| Тихий час | NOTIFY_QUIET_HOURS_START / NOTIFY_QUIET_HOURS_END (HH:MM). В заданное окно SMS и push не отправляются (Email и Telegram приходят молча). Окно может пересекать полночь (например 22:00–08:00). Fallback на старые MOBILE_PUSH_QUIET_HOURS_* для совместимости. |
| Низкий баланс | LOW_BALANCE_NOTIFY_DAYS_BEFORE (1–14, default 3) — за сколько дней до окончания баланса предупреждать. LOW_BALANCE_NOTIFY_THRESHOLD_RUB (0–10000 руб, default 100) — дополнительный триггер по сумме. |
| Каналы (kill-switch'и) | 5 toggle: NOTIFY_EMAIL_ENABLED, NOTIFY_SMS_ENABLED, NOTIFY_PUSH_ENABLED, NOTIFY_TELEGRAM_ENABLED, NOTIFY_VK_ENABLED. Внимание: выключение канала останавливает ВСЕ сообщения через него, включая восстановление пароля и OAuth. |
| Стоп-лист | Рекламное сообщение (флажок «Рекламная рассылка» в массовой рассылке раздела «Сообщения», поздравления) не уходит, если телефон или клиент в стоп-листе с областью «без рекламы» или «не связываться вовсе». Служебные — о долге, блокировке, аварии — режет только «не связываться вовсе». Список и области — «Стоп-лист». |
| Антидубль / шаблоны | NOTIFY_DUPLICATE_WINDOW_MIN (0–1440, default 60) — не слать одинаковое сообщение чаще раза в N минут (дедуп через Redis по md5 head_txt). EMAIL_DEFAULT_SUBJECT (строка до 200 симв.) — подставляется в письма без явного subject. MSG_RETRY_COUNT (1–10, default 4) — попыток отправки при ошибках шлюза. |
Подключение: billing/services/notification_policy.py::should_send(channel, abonent_id, head_txt, kind, phone) вызывается в billing/tasks/messaging.py:_dispatch_message для каждого канала. Порядок проверок: общий выключатель → канал → стоп-лист → тихий час → антидубль (стоп-лист раньше антидубля, чтобы запрещённое сообщение не ставило отметку «уже отправлено»). SMS из очереди повторно не уходит: у каждого сообщения своя запись в журнале отправок, и перезапуск задачи после сбоя его пропускает. Пропущенные сообщения логируются в MsgStack.sms_status='skipped' с sms_error=причина — оператор видит почему сообщение не доставлено.
Шлюзы каждого канала настраиваются в отдельных разделах: Email /admin/settings/email/, SMS /admin/settings/sms/, Push /admin/settings/firebase/. Здесь — общая политика на уровне всей системы.
Статистика снизу: отправлено сегодня по каналам, в очереди, SMS-ошибки, SMS-пропуски (тихий час / дубль), бейдж «Тихий час сейчас».
Доступ суперпользователя — 2FA, IP-ограничение, политики паролей
В правой колонке вкладки Безопасность — карточка
«Доступ суперпользователя». Все политики применяются
только к is_superuser и по умолчанию выключены
(поведение входа не меняется, пока администратор не включит их осознанно).
Управление доступно только суперпользователю.
| Политика | Настройка | Что делает |
|---|---|---|
| Доступ su только с разрешённых IP | SU_RESTRICT_BY_IP + SU_ALLOWED_IPS |
Вход su разрешён только с IP из списка (через запятую, CIDR). Кнопка «мой IP» подставляет текущий адрес. С недоверенного IP — HTTP 403. Fail-open при пустом списке (защита от self-lockout). |
| Обязательная 2FA для su | SU_REQUIRE_2FA |
TOTP (Google Authenticator / Authy). Подключается в профиле
(/admin/settings/profile/) — QR-код + 10 одноразовых
backup-кодов. Без 2FA вход блокируется до её настройки. |
| Спрашивать 2FA, если IP вне списка | SU_2FA_IF_IP_OUTSIDE |
С доверенного IP — вход без кода; с прочих — запрос TOTP. Удобно для быстрого входа из офиса и защищённого — извне. |
| Требовать сложный пароль | SU_REQUIRE_STRONG_PASSWORD |
При смене пароля su: 8+ символов, буква + цифра + спецсимвол. Слабый пароль отклоняется с пояснением. |
| Смена пароля при первом входе | SU_FORCE_PASSWORD_CHANGE_FIRST |
Если у su стоит флаг «требуется смена» — при входе принудительный редирект в профиль на смену пароля. |
| Смена пароля каждые X дней | SU_PASSWORD_MAX_AGE_DAYS |
Отслеживается дата последней смены. Если пароль старше X дней — при
входе принудительная смена. 0 = без ограничения. |
Двухфакторная аутентификация (TOTP). Подключение в профиле:
сканируете QR-код приложением-аутентификатором, подтверждаете кодом — 2FA
активна. При активации выдаются 10 резервных кодов (формат
XXXX-XXXX, показываются один раз) — на случай потери телефона.
При входе после логина/пароля запрашивается 6-значный код (можно ввести
backup-код). Отключить 2FA нельзя, пока включена политика «Обязательная 2FA».
Защита от self-lockout: все политики выключены по умолчанию;
backup-коды 2FA; IP-список fail-open при пустоте; аварийный сброс через консоль
сервера (set_setting('SU_REQUIRE_2FA', False)). Каждое изменение
политик пишется в AuditOperations.
Подключение: billing/services/su_security.py (логика IP/2FA/паролей),
billing/views/auth.py (вход), billing/views/profile.py
(2FA + смена пароля).
Вкладка «Блокировки и финансы» — captive-portal + бизнес-правила
Управление блокировкой клиентов за долг и базовыми правилами биллинга. 4 группы 2×2 + статус блокировок. Закрывает давнюю боль «Не авторизовать по RADIUS при отрицательном балансе» и задачу №4 Марии (captive-portal).
| Группа | Параметры и эффект |
|---|---|
| Captive Portal (мягкая блокировка) | BLOCK_POOL_ID (dropdown пулов) — IP-пул для walled-garden (обычно отдельный private-диапазон типа 10.88.0.0/24). BLOCK_FILTER_ID (default walled_garden) — атрибут Filter-Id в RADIUS-ответе, привязан к firewall-правилу на NAS. BLOCK_PORTAL_URL — справочный URL nginx-заглушки (для копирования в nginx config). |
| Правила блокировок | 🚨 Аварийный kill-switch «Разрешить интернет всем клиентам» — игнорирует ВСЕ блокировки в RADIUS (даже b_admin). «Разрывать сессию при переходе в b_negbal» (default ON) — сразу CoA Disconnect, иначе текущая сессия доживает до Acct-Interim. «Не авторизовать по RADIUS при отрицательном балансе» — hard REJECT vs soft walled-garden. |
| Биллинг | BILLING_CHARGES_HOUR (0–23, default 9) — час суток для ежедневных списаний billing_worker. Рекомендация: 3 (ночь) — клиенты не будут видеть «минус» во время пользования. «Списывать у отключённых» (default ON) — копит долг даже у enabled=False; OFF — не списываем. «Отсрочка блокировки юр.лиц» LEGAL_BLOCK_DELAY_DAYS (0–365, default 0) — через сколько дней блокировать юридическое лицо при отрицательном балансе. 0 = блокировать сразу (как физлиц). При значении >0 клиент с признаком «Юр. лицо» блокируется только если баланс держится в минусе указанное число дней подряд; физлица отсрочкой не затронуты. Дата ухода в минус хранится в AdminAccounts.NEGATIVE_SINCE, сбрасывается при пополнении до неотрицательного баланса. |
| Отображение FinanceOperations | «Скрыть операции с нулевой суммой» — фильтрует op_summa=0 в /admin/Abonents/FinanceOperations/ и карточке клиента. Не влияет на хранение в БД. |
Подключение: billing/services/block_policy.py в 4 точках кода — radius_python/internet.py:authorize() (kill-switch ДО soft-block), billing/models/abonents.py:block() (пропуск CoA), billing/tasks/billing_worker.py:_process_service() (skip списания), billing/views/finops_list.py (queryset filter).
Статус-блок снизу: Активных / Заблокированных клиентов, по b_negbal / b_admin / b_own, активных Обещанных Платежей, заблокировано/разблокировано сегодня. Большой красный alert над формой если включён аварийный kill-switch.
Вкладка «Прокси» — пул прокси для Telegram и Нейросети
Из России api.telegram.org и внешние API AI-провайдеров недоступны — биллинг ходит к ним через прокси. Раздел Настройки системы → Прокси (/admin/settings/system/proxy/) — единый пул прокси с ролями, авто-проверкой и журналом. Заменил прежний блок «Прокси для Telegram» из Интеграций (старые плоские ключи остаются как fallback).
Управление прокси — на сервере лицензий. Пул прокси теперь ведётся централизованно на сервере лицензий (один пул на все инсталляции — прокси меняются в одном месте, все биллинги подхватывают). Биллинг получает пул по лицензионному ключу (GET /api/gw/proxies/) и зеркалит его в свою таблицу. На странице «Прокси» такие прокси помечены значком облака ☁ и редактируются только на сервере лицензий; кнопка «Синхронизировать» подтягивает изменения сразу. При недоступности сервера лицензий биллинг продолжает работать с последним полученным пулом (offline-safety). Локально добавленные прокси (без облака) остаются как аварийный fallback.
Как работает выбор прокси (fallback):
get_api_proxies(role)
→
Первый живой прокси пула с нужной ролью (по приоритету)
→ если пул пуст →
старые ключи TELEGRAM_PROXY_*
→ если выкл →
прямое подключение (None)
Переключатель «Использовать прокси»
Глобальный тоггл сверху. Выключен → get_api_proxies() возвращает None, Telegram/Нейросеть подключаются напрямую (настройка PROXY_ENABLED в БД). При выключении форма/таблица/журнал скрываются.
Добавление прокси
Список прокси по одному на строку. Поддерживаемые форматы: ip:port:login:password, login:password@ip:port, ip:port (без авторизации). Тип — Авто-определение (по умолчанию; живая проба HTTP→SOCKS5), HTTP или SOCKS5. Роли — «для Telegram» / «для Нейросети» (можно обе). При добавлении параллельно определяется тип и геолокация по IP (ip-api.com). Прокси добавляется всегда, даже если автопроверка не достучалась — со статусом 🔴 и подсказкой (например провайдер отвечает 407 при неверных кредах / IP-binding).
Таблица «Прокси-серверы»
Колонки: Тип (бейдж HTTP/SOCKS5), Адрес (ip:port, иконка-ключ + тултип логин/пароль), Гео (флаг страны + город), Роли (TG / Нейросеть), Статус (🟢 доступен · 🔴 недоступен · ⚪ не проверялся, с латентностью в тултипе), Приоритет, Ред (kebab-меню действий). Действия в kebab: Проверить, Включить/Выключить, Назначить роль (Только Telegram / Только Нейросеть / Обе), Удалить.
«Проверить все» — проверяет все прокси и расставляет приоритеты: живые по возрастанию задержки (быстрый = приоритет 1), мёртвые в конец. Если есть нерабочие — кнопка превращается в «Удалить нерабочие (N)».
Автопроверка и уведомления
Celery beat proxy-pool-check проверяет пул каждые PROXY_CHECK_INTERVAL_MIN минут (default 60). При переходе прокси в недоступное состояние и при полном отсутствии живых прокси для роли — Telegram-алерт (тоггл PROXY_ALERTS_ENABLED). События пишутся в Аудит (добавление/удаление — с указанием кто, системное «нет доступных прокси»).
Журнал событий
Правая колонка — последние 50 событий (проверки, переходы up/down, добавление/удаление) с авто-обновлением каждые 30с. Кнопка «Скачать» выгружает журнал в CSV (до 1000 записей).
Тёмная тема и работа с телефона поддержаны. Потребители прокси (Telegram-рассылки, AI-чаты ЛК/мобильного, геокодер и др., ~18 точек) используют пул автоматически через get_api_proxies().
Шаблоны печати
Документы, которые сотрудник печатает из карточки клиента, финансовой операции или
заявки: договор, счёт, акт, кассовый ордер, счёт-фактура. Шаблон — HTML с подстановками
языка шаблонов Django ({{ org.legal_name }}, {{ abonent.name }},
{{ summa_due|floatformat:2 }}, {% if … %}). Реквизиты, логотип,
печать и цвет берутся из брендинга организации записи. Раздел:
Настройки → Шаблоны печати (/admin/settings/print_forms/).
- Сводка — сколько шаблонов и чей фирменный стиль подставляется: организация из шапки, цвет, есть ли логотип. Если реквизиты организации заполнены не все, рядом ссылка на брендинг.
- Срезы по разделу, где печатается документ, и поиск по названию и файлу.
- Для операции — у какого типа финансовой операции появится кнопка печати: акт — 1, оплата — 2, счёт — 5, договор — 6, счёт на предоплату — 9, счёт-фактура — 14, расторжение — 15.
- Меню строки: открыть, предпросмотр, сделать копию, удалить.
Окно шаблона
Три вкладки: Шаблон, Предпросмотр и Параметры.
- Шаблон — редактор кода с подсветкой подстановок и тегов. Справа — подстановки по группам (организация, документ, клиент, суммы): нажатие вставляет её в место курсора, «Логотип» и «Печать» вставляются сразу с условием, чтобы при пустом брендинге не было битой картинки.
- Предпросмотр — шаблон на последней подходящей записи. Если операций нужного типа ещё нет (так бывает со счетами и договорами), берётся последняя операция любого типа. Предпросмотр ничего не сохраняет и не создаёт.
- Параметры — название, где печатается, для какой операции, формат (HTML или DOCX), размер и ориентация листа, файл шаблона.
- Сохранение проверяет, что шаблон разбирается: незакрытый
{% if %}или{% for %}останавливает сохранение с номером строки. Раньше такая ошибка всплывала только при печати документа клиенту. - Перед сохранением — окно со списком изменений, в журнал действий (
PRINT_FORMS) пишется то же словами; сохранение без изменений ничего не пишет. - Создавать, менять и удалять шаблоны может сотрудник с правом «Настройки · Финансы»; остальные видят шаблоны только на чтение.
{% for %} между строками таблицы — сохранение из него могло молча сломать
шаблон. Результат смотрите на вкладке «Предпросмотр».
AI-помощник: создать шаблон в фирменном стиле
Помощник раздела (кнопка в правом нижнем углу или «AI» в редакторе) знает фирменный стиль организации — цвет, шрифт, логотип, печать, реквизиты — и все подстановки шаблонов.
flowchart LR A["Создать новый шаблон"] --> Q["До трёх вопросов:
какой документ,
где печатать, что в нём"] Q --> D["Шаблон в фирменном
стиле организации"] D --> OK{"Открыть в окне?"} OK -->|"да"| W["Окно «Новый шаблон»:
поля заполнены,
открыт предпросмотр"] W --> S["Сотрудник проверяет
и сохраняет"]
- Создать новый шаблон — помощник задаёт уточняющие вопросы с готовыми вариантами ответа (можно ответить своими словами), собирает шаблон и открывает окно «Новый шаблон» с заполненными названием, разделом, типом операции и листом.
- Оформить в фирменном стиле и Проверить шаблон — для открытого шаблона. Помощник видит и несохранённый текст из редактора; исправленный шаблон заменяет текст в окне только после подтверждения.
- Помощник ничего не сохраняет: сохраняет сотрудник, как при ручной правке. Разговор и расход попадают в общий журнал AI.