Схемы Что нового

Настройки системы

Общие настройки биллинга и шаблоны печати. Отдельными страницами: фискализация, платёжные системы, банковские выписки, обмен с 1С, почта и домены.

Содержание раздела

Настройки

Раздел меню «Настройки» объединяет все параметры биллинга, интеграции, шаблоны печати, управление персоналом и обслуживание базы данных.

Настройки системы

Содержание раздела

Единая страница системных параметров (/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;
Обучающий ролик по разделу «Настройки системы» (2:54, с озвучкой). Он же открывается в онбординге раздела — кнопкой с шапочкой в строке вкладок.
Настройки системы — вкладка «Блокировки», masonry-раскладка
Вкладка «Блокировки»: карточки раскладываются masonry (по высоте), плоский стиль, панель вкладок вверху

Вкладка «Брендинг» — фирменное оформление по умолчанию

Открывается по умолчанию. Название продукта, логотип, favicon, акцентный цвет, контактные данные. Применяется в админке, в личном кабинете, в шаблонах печати и для записей без привязки к организации. Модуль «Свой бренд» (Whitelabel) снимает ограничения на замену названия продукта.

Настройки системы — вкладка «Брендинг»
Вкладка «Брендинг» — акцентный цвет, Whitelabel, логотипы и фоны

Вкладка «EBS-виджет» — синхронизация с EBS

Управление переносом данных из внешней системы EBS: платежи (задача каждые 10 минут), счета/абоненты, обещанные платежи и сверка балансов (reconcile) раз в час. Фильтр «какие типы операций переносить» не даёт задвоить то, что биллинг принимает сам (модуль выписок, ЮKassa). Кнопки на единых компонентах: «Сохранить» неактивна без изменений, быстрые действия выбора типов — на SmitButton.

Вкладки «Параметры» больше нет. После чисток VpnConst на ней оставались лишь «сиротские» ключи. Последний живой — сверка балансов EBS (EBS_RECONCILE_ENABLED) — перенесён тумблером на вкладку «EBS-виджет», мёртвый дубль kill-switch скрыт. Вкладка авто-скрывается при нуле настроек, а старый адрес /admin/settings/system/params/ редиректит на «Логи».
Настройки системы — вкладка «EBS-виджет» со сверкой балансов
Вкладка «EBS-виджет»: переносы платежей/счетов/ОП + тумблер «Сверка балансов (reconcile)», перенесённый из «Параметров»

Вкладка «Безопасность» — политика финансовых операций

На Безопасности — глобальные ограничения для ручных финансовых операций (создание/редактирование/удаление через 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 блока управления безопасностью входа.

Вкладка «Безопасность»: политики паролей, 2FA, блокировка входа, сессии
Блоки безопасности: FIDO2, reCAPTCHA, блокировка, сессия
БлокЧто делает
Авторизация через FIDO2/WebAuthn
SECURITY_WEBAUTHN_ENABLED
Вход по passkey (YubiKey, Touch ID/Face ID, Windows Hello). После включения сотрудники привязывают ключ в Профиле (любой сотрудник, не только su; модель StaffWebAuthnCredential), клиенты — в ЛК. На странице входа в биллинг появляется кнопка «Войти по ключу (passkey)».
Google reCAPTCHA v3
RECAPTCHA_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.

Вкладка «Аудит» — параметры журнала действий по клиентам
Настройки аудита — форма с 4 параметрами
ПараметрДиапазон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.

Toolbar вкладки Аудит клиента с шестерёнкой настроек
Toolbar вкладки Аудит клиента с шестерёнкой настроек

Вкладка «Логи» — хранение и уровень логирования

Управление файлами журналов в /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 на хосте.
Уровень логирования Django
LOG_LEVEL
DEBUG / INFO / WARNING / ERROR INFO Влияет на error.log и celery_*.log. Применяется после перезапуска контейнеров.
Verbosity FreeRADIUS
FREERADIUS_DEBUG_LEVEL
info / debug / trace info info — только Accept/Reject (~10 MB/сутки). debug (флаг -X) — детально (~100 MB/сутки). trace (флаг -xx) — полная трассировка (~800 MB/сутки, не использовать в проде).
Сжимать ротированные файлы gzip
LOG_COMPRESS
bool true Архивы прошлых дней сжимаются (≈ ×10 экономия места). Чтение через zcat имя.gz.

Справа на вкладке — таблица текущего размера всех файлов в /var/log/django/ с подсветкой больших (≥100 МБ оранжевый, ≥1 ГБ красный). Клик по имени файла → переход в просмотр содержимого (/admin/reports/dev/logs/).

Вкладка «Логи» — уровни логирования и текущий размер журналов
Вкладка «Логи»: срок хранения, уровни Django / FreeRADIUS, размеры файлов
Просмотрщик логов с подсветкой (/admin/reports/dev/logs/) и ротация журналов на сервере (logrotate, нативный freeradius.log) — соседние с вкладкой темы, а не её настройки; их описание перенесено в Отчёты → Разработка и логи.

Вкладка «Скорость» — Gunicorn / Celery / БД / Throttling (переименована)

Параметры процессов и ресурсов. Изменения требуют перезапуска контейнеров (web, celery). 4 группы настроек раскладываются masonry + статус-блок снизу.

Вкладка «Скорость» — Gunicorn, Celery, БД, лимиты Mobile API
Вкладка «Скорость»: Gunicorn / Celery / БД / Mobile API — 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, без привязки к фиксированному часу).

Вкладка «RADIUS» — сессии, хранение истории, авто-замена NAS, CoA
Вкладка «RADIUS»: активные сессии, хранение истории, авто-замена NAS, CoA — masonry-раскладка
ГруппаПараметры
Активные сессии 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 + статистика снизу.

Вкладка «Сообщения» — тихий час, низкий баланс, каналы доставки
Вкладка «Сообщения»: тихий час, пороги, каналы доставки (Email/SMS/Push/Telegram/VK) — 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 + смена пароля).

Вкладка Безопасность: финансовые операции + доступ суперпользователя + Web-консоль
Вкладка Безопасность: финансовые операции + доступ суперпользователя + Web-консоль

Вкладка «Блокировки и финансы» — 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):

Запрос к Telegram / Нейросети → 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 / Только Нейросеть / Обе), Удалить.

Таблица прокси с открытым kebab-меню действий
Таблица прокси с открытым kebab-меню действий

«Проверить все» — проверяет все прокси и расставляет приоритеты: живые по возрастанию задержки (быстрый = приоритет 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/).

Шаблоны печати: где печатается документ, для какой операции, формат и лист
Шаблоны печати: где печатается документ, для какой операции, формат и лист

Три вкладки: Шаблон, Предпросмотр и Параметры.

Вкладка «Шаблон»: редактор с подсветкой тегов и подстановки справа
Вкладка «Шаблон»: редактор с подсветкой тегов и подстановки справа
Вкладка «Параметры»
Вкладка «Параметры»
Визуального редактора больше нет. Он разбирал HTML браузером и переставлял теги {% for %} между строками таблицы — сохранение из него могло молча сломать шаблон. Результат смотрите на вкладке «Предпросмотр».

Помощник раздела (кнопка в правом нижнем углу или «AI» в редакторе) знает фирменный стиль организации — цвет, шрифт, логотип, печать, реквизиты — и все подстановки шаблонов.

flowchart LR
  A["Создать новый шаблон"] --> Q["До трёх вопросов:
какой документ,
где печатать, что в нём"] Q --> D["Шаблон в фирменном
стиле организации"] D --> OK{"Открыть в окне?"} OK -->|"да"| W["Окно «Новый шаблон»:
поля заполнены,
открыт предпросмотр"] W --> S["Сотрудник проверяет
и сохраняет"]
Заготовки помощника
Заготовки помощника
Черновик шаблона — открыть в окне
Черновик шаблона — открыть в окне