Документ № AXTO-CRM-TZ-001 v. 1.0 · Конфиденциально

Техническое задание
на разработку CRM

Система управления клиентами для проекта axto.ru — русификация автомобилей, импорт под заказ, оформление и сопровождение китайских транзитных номеров. Веб-приложение + мобильный клиент с офлайн-режимом и шифрованием чувствительных данных.

Заказчик
axto.ru, Москва
Тип системы
CRM · Web + Mobile
Класс защиты
К2 (ПДн + секреты)
Срок MVP
≈ 10–12 недель
Раздел 01

Общие положения

Настоящий документ определяет полный объём работ по проектированию, разработке, развёртыванию и сопровождению CRM-системы для проекта axto.ru. Документ обязателен для исполнения подрядчиком и является основанием для приёмки результата.

Назначение системы

Система предназначена для централизованного учёта клиентов, автомобилей, китайских транзитных номеров с контролем сроков их действия, проводимых работ по русификации, выставленных счетов, выданных доступов (логины/пароли/почтовые ящики), а также для оперативного управления напоминаниями и календарём владельца.

Бизнес-контекст

Заказчик ведёт оказание услуг по русификации автомобилей, оформлению китайских транзитных номеров (срок действия — ограничен, требует контроля), а также организации поставок автомобилей из Китая через партнёров. Часть клиентов — VIP, для них предусмотрена персональная коммуникация и выдача персональных почтовых ящиков на собственном домене.

Ключевая особенность

Система оперирует особо чувствительными данными: персональные данные клиентов (ФИО, телефоны, паспорта), VIN-номера ТС, китайские номера, пароли и доступы. Утечка любой из этих категорий — критичный инцидент. Требования к защите данных в разделе 06 — обязательны к исполнению без исключений.

Источники требований

  • Бизнес-процессы заказчика (описаны в разделе 04).
  • Федеральный закон № 152-ФЗ «О персональных данных».
  • Приказ ФСТЭК России № 21 (требования к защите ПДн).
  • Рекомендации OWASP ASVS v4.0 (уровень L2).
Раздел 02

Цели и задачи

Бизнес-цели

  1. Не упустить ни одного срока китайского номера. Все номера, у которых до истечения осталось ≤ 30/14/7/3/1 дней — автоматически попадают в дашборд и пуш-уведомления.
  2. Единая карточка клиента. Вся история работ, авто, номеров, доступов и счетов — в одной карточке с поиском по VIN, телефону, номеру или ФИО за ≤ 1 секунду.
  3. Защищённое хранение секретов клиентов. Логины, пароли и реквизиты ящиков — шифрованно, с журналом доступа и невозможностью извлечь массово.
  4. Работа в дороге. Мобильный клиент в офлайн-режиме на встречах и в салоне — без зависимости от сети.
  5. Масштабирование. Возможность подключать сотрудников и партнёров с ограничением прав без переписывания системы.

Технические задачи

  • Спроектировать и реализовать backend на FastAPI + PostgreSQL.
  • Реализовать веб-админку (адаптивная, для ПК).
  • Реализовать мобильное приложение на Flutter (Android + iOS) с офлайн-БД и фоновой синхронизацией.
  • Реализовать сервис генерации почтовых ящиков на собственном домене.
  • Реализовать подсистему напоминаний, iCal-фидов и push-уведомлений.
  • Внедрить полный комплекс мер защиты данных (раздел 06).
  • Развернуть на инфраструктуре заказчика, передать документацию и обучить.
Раздел 03

Пользователи и роли

Система реализует ролевую модель доступа (RBAC). Все действия журналируются (см. раздел 06).

Роль Описание Ключевые права
Owner Владелец бизнеса. Полный доступ. Все права, включая управление пользователями, экспорт, удаление, доступ к журналу аудита, расшифровка секретов.
Manager Менеджер по работе с клиентами. CRUD клиентов, работ, номеров. Доступ к секретам — только с журналом. Экспорт — запрещён.
Operator Линейный сотрудник, исполнитель работ. Только просмотр своих клиентов и работ. Изменение статуса работы. Без доступа к паролям и финансам.
Partner Партнёр (импорт, салон). Доступ только к назначенным сделкам. Без доступа к клиентской базе целиком.
Auditor Внешний/внутренний аудитор (по запросу). Read-only доступ к журналу аудита. Без доступа к содержимому секретов.
Принцип минимальных привилегий

По умолчанию у новой учётной записи — нулевой набор прав. Все права выдаются явно владельцем. Запрещено выдавать роль Owner кому-либо, кроме одного лица. Запрещено хранить пароли пользователей в восстановимом виде.

Раздел 04

Функциональные требования

4.1 Управление клиентами

  • Создание, редактирование, архивация клиента. Удаление — только мягкое (soft delete) с записью в журнал.
  • Поля: ФИО, телефон (+ доп.), e-mail, мессенджеры (TG, WeChat, WhatsApp), город, флаг VIP, теги, источник, заметки, дата создания.
  • Привязка нескольких авто, номеров, работ, доступов и счетов.
  • Поиск по любому полю, в т.ч. по VIN и фрагменту телефона/номера, время отклика ≤ 1 с при базе до 50 000 клиентов.
  • Дедупликация: при создании — проверка на похожие записи по телефону и VIN.
  • История изменений (кто, когда, что изменил).

4.2 Управление автомобилями

  • Поля: VIN (уникально, валидация контрольной суммы), марка, модель, год, цвет, дата ввоза, страна происхождения, фотографии (до 20 шт.), статус (на работах / выдан / в пути).
  • Привязка к клиенту. История перехода между клиентами (если авто перепродавалось).

4.3 Управление китайскими номерами

  • Поля: номер, тип, провайдер/поставщик, дата выдачи, дата истечения, привязка к авто и/или клиенту, статус (активен / истёк / продлён / аннулирован), стоимость, комментарий.
  • Цветовая индикация по сроку: зелёный (> 30 дн.), жёлтый (≤ 30), оранжевый (≤ 14), красный (≤ 7), чёрный (истёк).
  • Автоматические напоминания (см. 4.7) — за 30, 14, 7, 3, 1 день.
  • Журнал продлений: каждое продление — новая запись со ссылкой на предыдущую.
  • Массовый импорт из Excel/CSV для миграции существующей базы.

4.4 Журнал работ и стоимость

  • Поля: клиент, авто, тип работы (русификация ГБО / магнитола / приборка / прочее — справочник), дата начала, дата завершения, исполнитель, статус, стоимость работ, стоимость материалов, предоплата, остаток, комментарий.
  • Возможность прикрепить файлы (акты, фото до/после).
  • Сводка по доходам: за день / неделю / месяц / квартал / год.

4.5 Хранилище доступов (Vault)

Критичная подсистема

Все секреты (логины, пароли, ответы на контрольные вопросы, токены) хранятся только в зашифрованном виде с использованием envelope encryption: данные шифруются полевым ключом DEK, который сам зашифрован мастер-ключом KEK, хранящимся в отдельном KMS (HashiCorp Vault или эквивалент).

  • Расшифровка возможна только при явном запросе пользователя в UI с указанием причины — каждый запрос записывается в журнал аудита.
  • Массовый экспорт паролей запрещён на уровне API.
  • Пароли отображаются скрытыми (••••••), кнопка «Показать» — с TTL 30 секунд.
  • Запрещено логирование расшифрованных значений в любые логи.

4.6 Генерация почтовых ящиков для VIP

  • Создание ящика вида имя@домен-клиента.ru на собственном почтовом сервере (Mailcow / iRedMail) через API.
  • Автогенерация стойкого пароля (длина ≥ 16, символы из 4 классов).
  • Сохранение реквизитов в Vault (см. 4.5).
  • Передача клиенту через защищённый одноразовый канал (см. ниже).
  • Отзыв ящика, смена пароля, форвардинг.

Передача доступов клиенту

Для безопасной передачи реквизитов клиенту реализовать механизм one-time link: система генерирует ссылку, по которой реквизиты можно открыть один раз в течение ограниченного времени (по умолчанию 24 часа), после чего они уничтожаются. Никаких реквизитов в открытом виде в Telegram/SMS/e-mail.

4.7 Напоминания и календарь

  • Ручные напоминания (на дату/время, с привязкой к клиенту/делу).
  • Автоматические напоминания по правилам (срок номера, срок гарантии работы, день рождения клиента и т.д.).
  • Push-уведомления (FCM/APNs), e-mail-уведомления, опционально — Telegram-бот.
  • Экспорт в iCal: персональный URL-фид для подписки в Google/Apple/Yandex-календарь. URL подписан HMAC и содержит секретный токен, отзываемый при компрометации.

4.8 Дашборд владельца

  • Виджеты: истекающие номера, ожидающие оплаты, активные работы, выручка за месяц, новые клиенты, задачи на сегодня.
  • Быстрые действия (добавить клиента, авто, номер, работу).

4.9 Поиск и фильтры

  • Глобальный поиск (Ctrl/Cmd+K) по всей системе.
  • Фильтры на каждом списке (по статусу, исполнителю, источнику, тегам, периоду).
  • Сохранение пользовательских фильтров.

4.10 Уведомления и журналы

  • Лента уведомлений в системе.
  • Журнал аудита (см. 6.7) — доступ только Owner/Auditor.
Раздел 05

Модель данных

Ниже приведены ключевые сущности. Все таблицы содержат обязательные служебные поля: id (UUID v7), created_at, updated_at, version (для optimistic locking), deleted_at (soft delete), created_by, updated_by.

Client (Клиент)

table clients { id uuid // первичный ключ full_name text // шифруется (pgcrypto) phone_primary text // шифруется + индекс по hash phone_extra text[] email citext messengers jsonb // {telegram, wechat, whatsapp} city text is_vip bool // default false source text // VK/TG/YT/IG/Дзен/Макс/Rutube/... tags text[] notes text // шифруется status enum // active|archived }

Vehicle (Автомобиль)

table vehicles { id uuid client_id uuid → clients.id vin text // unique, валидация ISO 3779 make text model text year int color text country_origin text // CN/JP/KR/... import_date date status enum // in_work|delivered|in_transit photos text[] // пути в S3 }

ChinesePlate (Китайский номер)

table chinese_plates { id uuid client_id uuid → clients.id vehicle_id uuid → vehicles.id (nullable) plate_number text provider text issued_at date expires_at date // КРИТИЧНОЕ ПОЛЕ, индекс status enum // active|expiring|expired|renewed|revoked cost numeric(12,2) renewed_from_id uuid (nullable) // история продлений comment text }

WorkOrder (Заказ-наряд / работа)

table work_orders { id uuid client_id uuid → clients.id vehicle_id uuid → vehicles.id work_type_id uuid → work_types.id started_at timestamptz finished_at timestamptz (nullable) executor_id uuid → users.id status enum // new|in_progress|done|cancelled cost_work numeric(12,2) cost_parts numeric(12,2) paid numeric(12,2) files text[] comment text }

VaultEntry (Защищённая запись доступов)

table vault_entries { id uuid client_id uuid → clients.id service text // WeChat/Email/Госуслуги/... login text // шифруется DEK password_enc bytea // AES-256-GCM, DEK обёрнут KEK password_nonce bytea notes_enc bytea dek_wrapped bytea // зашифрованный DEK access_count int // счётчик расшифровок last_access_at timestamptz }

Reminder, AuditLog, User

Дополнительные таблицы: reminders (напоминания и правила), audit_log (журнал аудита, append-only), users (учётные записи), roles, permissions, sessions, sync_queue (очередь синхронизации).

Все поля с персональными данными и секретами шифруются на уровне приложения. База, даже извлечённая физически, не должна раскрывать содержимое.
Раздел 06 · Главный

Защита данных

Данные клиентов (особенно — китайские номера, VIN, паспорта, пароли, реквизиты ящиков) являются критически чувствительными. Любая утечка нанесёт прямой репутационный и юридический ущерб. Этот раздел — обязательный к буквальному исполнению.

6.1 Классификация данных

Категория Примеры Приоритет
СекретыПароли, токены, ключи API, реквизиты ящиковCritical
ПДн особой категорииПаспорта, СНИЛСCritical
ПДн обычныеФИО, телефон, e-mail, адресHigh
Чувствительные бизнес-данныеVIN, китайские номера, финансыHigh
Прочие данныеСправочники, теги, статусыMedium
ПубличныеМаркетинговые текстыLow

6.2 Шифрование

Транспортное шифрование (in transit)

  • TLS 1.3 обязательно. TLS 1.2 — допустим как fallback. Всё ниже — запрещено.
  • Сертификаты от Let's Encrypt с автоматическим продлением (acme.sh / certbot).
  • HSTS включён (max-age=31536000; includeSubDomains; preload).
  • Запрещены слабые шифры (RC4, 3DES, CBC без AEAD).
  • Certificate pinning в мобильном приложении (с возможностью обновления через kill-switch).

Шифрование при хранении (at rest)

  • Шифрование диска сервера (LUKS / dm-crypt).
  • Шифрование базы данных на уровне приложения для чувствительных полей (см. 5).
  • Алгоритм: AES-256-GCM для симметричного шифрования, X25519 + ChaCha20-Poly1305 для асимметричного (при необходимости).
  • Хеширование паролей пользователей системы: Argon2id (m=64MB, t=3, p=2) или bcrypt cost=12 (резервный вариант).
  • Запрещён MD5 и SHA-1 для любых целей, кроме контрольных сумм файлов.

Управление ключами (KMS)

  • Мастер-ключ (KEK) хранится в HashiCorp Vault (или AWS KMS / YC KMS — на выбор заказчика). Запрещено хранить KEK в коде, .env, репозитории.
  • Полевые ключи (DEK) генерируются на каждую чувствительную запись и шифруются KEK (envelope encryption).
  • Ротация KEK — раз в 12 месяцев или по инциденту. Процедура ротации — документирована.
  • Доступ к KMS — только через сервисный аккаунт backend, с логированием каждого обращения.

6.3 Аутентификация

  • Логин по e-mail + пароль (Argon2id).
  • Обязательная 2FA для всех ролей с правом записи. TOTP (Google Authenticator / Authy) — обязательно. SMS — запрещено (уязвимо к SIM-swap).
  • Резервные коды (10 одноразовых) — выдаются при включении 2FA.
  • WebAuthn / Passkeys — рекомендуется для Owner.
  • Защита от brute-force: rate-limit, экспоненциальная задержка, CAPTCHA после 3 неудач, временная блокировка после 10 неудач.
  • Сессии: JWT access token (TTL 15 мин) + refresh token (TTL 30 дней, ротация при каждом использовании, отзыв при logout/смене пароля).
  • Refresh tokens хранятся в БД с возможностью отзыва (revocation list).

6.4 Авторизация

  • RBAC + проверка прав на каждом эндпоинте.
  • Принцип «запрещено всё, что не разрешено явно» (default deny).
  • Многоуровневая проверка: middleware + декоратор на роутере + проверка в сервисе (defense in depth).
  • IDOR-защита: на каждом запросе — проверка, что запрашиваемый ресурс принадлежит scope пользователя.

6.5 Защита от уязвимостей (OWASP Top-10)

УгрозаМера
Injection (SQL/NoSQL/CMD)Только параметризованные запросы (SQLAlchemy ORM), валидация Pydantic, sanitize пользовательского ввода. Запрещено формирование SQL строкой.
XSSAuto-escape в шаблонах. CSP с nonce. Запрещён inline JS. Sanitize HTML через bleach при выводе пользовательского контента.
CSRFSameSite=Lax cookie + double-submit token для веб-формы. Mobile — Bearer token (CSRF неактуален).
Broken AuthСм. 6.3.
SSRFВсе исходящие HTTP — через белый список доменов. Запрещены запросы на 169.254.169.254, 127.0.0.1, RFC1918 из backend.
Insecure DeserializationТолько JSON через Pydantic. Запрещён pickle.
File uploadВалидация MIME + magic bytes + расширение. Сканирование ClamAV. Файлы хранятся в S3-bucket без публичного доступа, отдаются через подписанные URL с TTL.
Mass AssignmentPydantic-схемы Create/Update отдельные, без служебных полей.

6.6 Сетевая безопасность

  • Backend и БД — в приватной подсети. БД недоступна из интернета. Доступ к ней — только из backend и через SSH-туннель администратора.
  • Firewall: открыты только 80/443 (web), 22 (SSH с ограничением по IP / fail2ban).
  • WAF на уровне reverse proxy (Nginx + ModSecurity / Caddy + плагин).
  • Rate-limiting на каждом эндпоинте API: общий лимит + персональный лимит на эндпоинты логина/смены пароля/расшифровки секретов.
  • Защита от DDoS: Cloudflare / Selectel DDoS Protection.
  • SSH: только по ключам, root-вход запрещён, MFA для администратора.

6.7 Журнал аудита

Append-only журнал

Журнал аудита — отдельная таблица с запретом UPDATE/DELETE на уровне БД (триггер или права роли). Каждая запись содержит: время (UTC, мс), пользователь, IP, user-agent, действие, ресурс (тип + id), результат (успех/ошибка), diff (для изменений).

Обязательно журналируется:

  • Все события аутентификации (успех/неудача, выход, смена пароля, включение/отключение 2FA).
  • Любое обращение к Vault (расшифровка пароля/секрета) — с причиной.
  • Все CRUD-операции над клиентами, авто, номерами, работами.
  • Изменение прав, создание/удаление пользователей.
  • Экспорт данных (любой).
  • Изменения настроек системы.

Срок хранения журнала — не менее 3 лет. Журнал реплицируется на отдельный «холодный» носитель раз в сутки.

6.8 Защита мобильного приложения

  • Локальная БД (Drift / Isar) — зашифрована (SQLCipher / встроенное шифрование Isar). Ключ хранится в Keychain (iOS) / Keystore (Android), привязан к биометрии устройства.
  • Биометрический вход (Face ID / Touch ID / отпечаток) — обязателен для приложения.
  • Автолок: после 2 минут неактивности — экран блокировки, биометрия.
  • Запрет скриншотов на экранах с секретами (FLAG_SECURE на Android, экраны-плейсхолдеры на iOS).
  • Запрет работы на rooted/jailbroken устройствах (с предупреждением).
  • Certificate pinning, обнаружение MITM.
  • Обфускация кода (R8 на Android, --obfuscate на Flutter iOS).
  • При удалении сессии / разлогине — wipe локальной БД.

6.9 Защита от внутренних угроз

  • Принцип «двух глаз» для критичных операций (массовое удаление, экспорт > 100 записей) — подтверждение второго аккаунта Owner.
  • Запрет массового экспорта Vault на уровне API (rate-limit 1 секрет / 10 сек, не более 50 в час).
  • Журнал доступа к секретам показывается в карточке клиента (прозрачность для менеджеров).
  • Регулярная ревизия активных учётных записей (раз в 3 месяца) — отчёт Owner.

6.10 Реакция на инциденты

  • Документированная процедура: обнаружение → изоляция → анализ → восстановление → уведомление.
  • Контакты ответственных, шаблоны уведомлений (Роскомнадзор — 24 часа на уведомление при утечке ПДн по 152-ФЗ).
  • Kill-switch: возможность одной командой отозвать все сессии и refresh-токены.
  • Мониторинг: алерты в Telegram на: 10+ неудачных входов, аномальное число расшифровок, доступ с нового IP/устройства Owner.

6.11 Типовые угрозы и контрмеры

T-01 · Утечка БДHIGH

Сценарий: Злоумышленник получил dump БД (через SQLi, кражу бэкапа, инсайдера).

Защита: Шифрование чувствительных полей AES-256-GCM. KEK хранится отдельно в KMS. Без KEK дамп бесполезен.

T-02 · Компрометация аккаунта менеджераHIGH

Сценарий: Украдены логин/пароль менеджера (фишинг).

Защита: Обязательная 2FA. Ограничение прав менеджера (нет массового экспорта). Алерт Owner при входе с нового устройства. Журнал расшифровок Vault.

T-03 · Потеря/кража телефонаHIGH

Сценарий: Сотрудник потерял телефон с установленным приложением.

Защита: Биометрия + шифрование локальной БД. Удалённый wipe через kill-switch. Refresh-токен отзывается мгновенно.

T-04 · Инсайдер с правами OwnerCRITICAL

Сценарий: Доверенное лицо злоупотребляет правами.

Защита: Журнал аудита, недоступный для изменения. Backup журнала на холодный носитель. Принцип «двух глаз» для массовых операций. Один Owner — критично; в случае передачи бизнеса — процедура ротации ключей.

T-05 · MITM в недоверенной сетиMEDIUM

Сценарий: Перехват трафика в Wi-Fi кафе.

Защита: TLS 1.3, HSTS, certificate pinning в мобильном клиенте.

T-06 · Утечка через скриншоты / шарингMEDIUM

Сценарий: Менеджер делает скриншот пароля и пересылает в Telegram.

Защита: Запрет скриншотов на экранах Vault. Реквизиты передаются клиенту только через one-time link, не через мессенджеры.

Раздел 07

Архитектура и стек

Технологический стек

СлойТехнологияВерсия
BackendPython + FastAPI3.12+ / 0.115+
ORMSQLAlchemy 2.x + Alembic2.0+
База данныхPostgreSQL16+
Кэш / очередиRedis7+
Очередь задачCelery / Dramatiq
ФайлыMinIO (S3-совместимое)
KMSHashiCorp Vault1.15+
Web-админкаReact + TanStack Query + TailwindReact 19
Мобильное приложениеFlutter3.27+
Локальная БД мобильногоDrift + SQLCipher
Reverse proxyNginx (или Caddy)
КонтейнеризацияDocker + docker-compose
МониторингGrafana + Loki + Prometheus
ОшибкиSentry (self-hosted)
PushFCM (Android) + APNs (iOS)
Почтовый серверMailcow или iRedMail

Развёртывание

  • VPS у российского хостера (Selectel / Yandex Cloud / Timeweb) — данные ПДн обязаны размещаться на территории РФ (152-ФЗ, ст. 18 п. 5).
  • Конфигурация: 2 виртуальных сервера для отказоустойчивости (production + резерв) или один с регулярными снапшотами на старте, с миграцией на HA-конфигурацию при росте.
  • Минимальная конфигурация production: 4 vCPU, 8 GB RAM, 100 GB NVMe (SSD).
  • Отдельное окружение dev/staging — на меньшей конфигурации.
  • Все секреты — в Vault / переменных окружения, никогда в коде.
  • CI/CD: GitLab CI или GitHub Actions с self-hosted runner.

Принципы архитектуры

  • Layered: API → Service → Repository → DB.
  • Dependency Injection через FastAPI Depends.
  • Идемпотентность POST-эндпоинтов (через ключ Idempotency-Key).
  • Все ошибки — единый формат (RFC 7807 Problem Details).
  • Все даты — UTC, отдаются в ISO 8601.
Раздел 08

API и синхронизация

Общие правила API

  • REST + JSON. Версионирование через префикс /api/v1/.
  • Документация: OpenAPI (Swagger UI на dev/staging, скрыт на проде).
  • Все GET-эндпоинты отдают ETag (weak), поддерживают If-None-Match → 304.
  • Все PUT/PATCH требуют If-Match (strong ETag) — для optimistic locking. При несоответствии — 412 Precondition Failed.
  • POST с Idempotency-Key — для всех создающих эндпоинтов.
  • Пагинация: cursor-based для больших списков.
  • Фильтрация: query-параметры по whitelist полей.

Синхронизация мобильного клиента

  • Pull (server → client): Эндпоинт GET /api/v1/sync?since=<timestamp> отдаёт изменения с указанной отметки. Курсорная пагинация.
  • Push (client → server): Очередь sync_queue на устройстве, фоновая отправка через WorkManager (Android) / Background Tasks (iOS).
  • Конфликты: Optimistic locking через ETag. Для большинства полей — Last Write Wins по серверной отметке времени. Для критичных полей (VIN, expires_at номера) — Server Wins с уведомлением пользователя и UI разрешения конфликта.
  • Soft delete: Удалённые на устройстве записи помечаются deleted_at, отправляются на сервер, физическое удаление — отложенное (через 30 дней).

Ключевые эндпоинты (фрагмент)

POST /api/v1/auth/login POST /api/v1/auth/refresh POST /api/v1/auth/logout GET /api/v1/clients?q=&tag=&is_vip= POST /api/v1/clients GET /api/v1/clients/{id} PATCH /api/v1/clients/{id} // требует If-Match DELETE /api/v1/clients/{id} // soft delete GET /api/v1/plates/expiring?days=30 POST /api/v1/plates/{id}/renew POST /api/v1/vault/{id}/reveal // + журналирование причины POST /api/v1/vault/share // one-time link GET /api/v1/calendar/ical?token=<hmac> GET /api/v1/sync?since=<ts>&cursor=<c> POST /api/v1/sync/push // batch upload GET /api/v1/audit?from=&to= // только Owner/Auditor
Раздел 09

Мобильное приложение

Платформы

  • Android 9.0+ (API 28+).
  • iOS 15.0+.
  • Размер APK / IPA — не более 60 MB.

Ключевые экраны

  1. Вход (e-mail + пароль + 2FA + биометрия).
  2. Дашборд (виджеты, как в вебе).
  3. Список клиентов (поиск, фильтры, инфинит-скролл).
  4. Карточка клиента (вкладки: Авто, Номера, Работы, Vault, История).
  5. Календарь и напоминания.
  6. Vault — отдельный экран с биометрической проверкой при входе.
  7. Настройки и профиль.
  8. Экран разрешения конфликтов синхронизации.

Офлайн-режим

  • Все операции — сначала локально, затем синхронизация.
  • Локальная БД — Drift с SQLCipher.
  • State: Riverpod 2 + AsyncNotifier.
  • Connectivity: connectivity_plus + индикатор офлайн.
  • Очередь синхронизации видна пользователю (счётчик «X несинхронизированных изменений»).

Защита мобильного приложения

См. подробно раздел 6.8.

Раздел 10

Интеграции

Обязательные интеграции

  • Почтовый сервер (Mailcow API) — создание/удаление ящиков для VIP.
  • FCM + APNs — push-уведомления.
  • iCal-фид — экспорт календаря (HMAC-токен).
  • SMTP (через свой почтовый сервер) — отправка системных писем.

Опциональные (вторая очередь)

  • Telegram-бот для уведомлений Owner и опционально менеджеров.
  • Экспорт в Excel/CSV для бухгалтерии (с журналированием).
  • Интеграция с онлайн-кассой / эквайрингом (Тинькофф, ЮКасса) — если планируется приём платежей через систему.
  • Webhooks для подключения партнёров.
  • Интеграция с социальными платформами (ВКонтакте, Дзен, Rutube) для трекинга источников лидов — на будущее.

Принципы интеграций

  • Все исходящие запросы — через белый список доменов.
  • Ключи API сторонних сервисов — в Vault / KMS.
  • Retry с экспоненциальной задержкой, dead-letter очередь.
  • Журналирование всех внешних вызовов (без логирования токенов).
Раздел 11

Нефункциональные требования

Производительность

  • P95 времени ответа GET — ≤ 200 мс при нагрузке до 100 RPS.
  • P95 поиска по 50 000 клиентам — ≤ 1 с.
  • Загрузка дашборда — ≤ 1.5 с на 4G.
  • Холодный старт мобильного — ≤ 2 с.

Надёжность

  • Uptime — ≥ 99.5% в месяц (≤ 3.6 ч простоя).
  • Health-check эндпоинт + автоматический рестарт при падении.
  • Graceful shutdown при деплое.

Масштабируемость

  • Архитектура поддерживает горизонтальное масштабирование backend (stateless API).
  • До 50 одновременных пользователей и 200 000 клиентов в БД — без деградации производительности.

Доступность интерфейса

  • Все интерфейсы — на русском языке.
  • Адаптивный веб (от 1280px до 1920px+ для админок, оптимизация под десктоп).
  • WCAG 2.1 AA — рекомендуемый ориентир (контраст, фокус-стейты, клавиатурная навигация).

Совместимость

  • Браузеры: Chrome / Edge / Yandex / Firefox / Safari — последние 2 версии.
  • Мобильные: см. раздел 9.
Раздел 12

Резервное копирование

Бэкап — отдельная критичная подсистема. Сам бэкап — потенциальная точка утечки, поэтому шифрование обязательно.

Стратегия 3-2-1

  • 3 копии данных (оригинал + 2 бэкапа).
  • 2 разных носителя (например, локальный диск + объектное хранилище).
  • 1 копия — offsite (другой провайдер / физически другой ЦОД).

Расписание

  • Полный бэкап БД — ежедневно в ночное время.
  • Инкрементальный бэкап WAL — каждый час.
  • Бэкап файлового хранилища — ежедневно.
  • Бэкап журнала аудита — ежедневно на «холодный» носитель (write-only S3 / Glacier).
  • Сроки хранения: ежедневные — 30 дней, еженедельные — 12 недель, ежемесячные — 12 месяцев.

Защита бэкапов

  • Все бэкапы шифруются GPG / age перед загрузкой в offsite-хранилище.
  • Ключ дешифрования бэкапов хранится отдельно от бэкапов (в Vault и у Owner).
  • Доступ к бэкапам — только сервисный аккаунт + Owner.
  • Регулярная проверка восстановления — раз в квартал (DR drill).

RTO / RPO

  • RPO (допустимая потеря данных): ≤ 1 час.
  • RTO (время восстановления): ≤ 4 часа.
Раздел 13

Юридические требования

Соответствие 152-ФЗ «О персональных данных»

  • Хранение ПДн граждан РФ — только на серверах в РФ (ст. 18 п. 5).
  • Подача уведомления в Роскомнадзор о начале обработки ПДн (форма на pd.rkn.gov.ru).
  • Назначение ответственного за обработку ПДн (приказ внутри компании).
  • Разработка локальных актов: Политика обработки ПДн, Положение об обработке ПДн, Согласие на обработку ПДн.
  • Согласие клиента на обработку ПДн — обязательно при заключении договора оказания услуг.
  • Уведомление об утечке — в Роскомнадзор в течение 24 часов с момента обнаружения, подробный отчёт — в течение 72 часов (242-ФЗ от 2022 года, поправки).
  • Право клиента на удаление своих ПДн — реализовано в системе (Owner может удалить клиента полностью, с журналированием).

Документация

  • Политика конфиденциальности — публикуется на axto.ru.
  • Пользовательское соглашение для клиентов CRM (если будет клиентский портал — на будущее).
  • Внутренний регламент обращения с ПДн для сотрудников.
  • NDA с подрядчиком на разработку и сопровождение.
Важно

Информация о китайских номерах, VIN и операциях по импорту — может являться чувствительной с точки зрения таможенного и налогового законодательства. Рекомендуется отдельная консультация с юристом по вопросу хранения такой информации, в том числе на предмет коммерческой тайны.

Раздел 14

Этапы и приёмка

Этап 01
Проектирование
2 недели
  • Финальное согласование ТЗ
  • Схема БД, ER-диаграмма
  • Дизайн ключевых экранов
  • Согласование стека
Этап 02
MVP Backend + Веб
4 недели
  • Auth + 2FA
  • CRUD клиентов, авто, номеров, работ
  • Vault (базовый)
  • Дашборд
Этап 03
Мобильное приложение
3 недели
  • Flutter base + Drift+SQLCipher
  • Синхронизация (pull/push)
  • Push, биометрия
  • UI конфликтов
Этап 04
Доп. функции
2 недели
  • Напоминания + iCal
  • Генерация почт + Mailcow
  • Журнал аудита (UI)
  • One-time link
Этап 05
Аудит безопасности
1 неделя
  • Внешний пентест
  • Чек-лист OWASP ASVS L2
  • DR drill (восстановление)
  • Устранение замечаний
Этап 06
Запуск и сопровождение
1+ нед.
  • Деплой production
  • Обучение пользователей
  • Документация
  • 3 мес. поддержки

Критерии приёмки

  • Все требования разделов 4–13 реализованы и приняты по чек-листу.
  • Покрытие unit-тестами — не менее 70% для бизнес-логики.
  • Покрытие интеграционными тестами — все эндпоинты API.
  • Пройден внешний аудит безопасности с устранением всех критичных и высоких замечаний.
  • Произведено успешное восстановление из бэкапа (DR drill).
  • Подготовлена документация: README, API (Swagger), руководство администратора, руководство пользователя, журнал миграций.
  • Передан исходный код в репозиторий заказчика. Все права на код — у заказчика.

Гарантия

  • Подрядчик предоставляет гарантию 12 месяцев с момента ввода в эксплуатацию.
  • В гарантию входит устранение ошибок, не входит — реализация новых функций.
  • Время реакции на критичный инцидент — 4 часа, устранение — 24 часа.
Раздел 15

Глоссарий

ТерминРасшифровка
CRMCustomer Relationship Management — система управления отношениями с клиентами.
VINVehicle Identification Number — уникальный идентификатор ТС.
RBACRole-Based Access Control — модель управления доступом на основе ролей.
2FATwo-Factor Authentication — двухфакторная аутентификация.
TOTPTime-based One-Time Password — одноразовый пароль на основе времени.
KMSKey Management Service — сервис управления ключами шифрования.
KEK / DEKKey Encryption Key / Data Encryption Key — мастер-ключ и ключ данных в схеме envelope encryption.
ETagEntity Tag — идентификатор версии ресурса в HTTP, используется для optimistic locking и кэширования.
RPO / RTORecovery Point / Time Objective — допустимая потеря данных / время восстановления.
WAFWeb Application Firewall — фаервол приложений уровня L7.
MITMMan-in-the-Middle — атака с перехватом трафика.
IDORInsecure Direct Object Reference — уязвимость прямого доступа к чужим объектам.
ПДнПерсональные данные.
FCM / APNsFirebase Cloud Messaging / Apple Push Notification Service.
Заказчик
Подпись, дата
Подрядчик
Подпись, дата