Регистрация открытая (015), контакты и приглашения по нику с закреплением ключа и блокировкой (016), лимиты (017), идентификация устройства через случайный deviceId в IndexedDB и серверный fan-out (018), отказ от серверного перца (019), смена пароля не в v1 (020), интерфейс ru/en (021), айдентика «Скобы» по turn 2 канваса (022). Архитектура, модель угроз и README обновлены. В открытых вопросах остались два: моногарнитура с кириллицей (Fragment Mono её не содержит) и удаление аккаунта. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R2pCJkWyG2aYu48u1Vp1A1
35 lines
3.3 KiB
Markdown
35 lines
3.3 KiB
Markdown
# ADR-017: Лимиты
|
||
|
||
Закрывает открытый вопрос о лимитах и антиспаме.
|
||
|
||
## Контекст
|
||
|
||
Открытая регистрация (ADR-015) и реле с очередями (ADR-008) требуют потолков: на размер сообщения, на частоту действий, на объём хранимого. Сервер не видит содержимого, поэтому антиспам может быть только структурным и количественным — фильтрации по тексту не существует.
|
||
|
||
## Решение
|
||
|
||
**Размеры.**
|
||
- Сообщение — до 4 096 символов плейнтекста; проверяет клиент до шифрования.
|
||
- Тело любого запроса к серверу — до 32 КиБ. Это единственная проверка размера на сервере.
|
||
- Ник — 3–32 символа: латиница в нижнем регистре, цифры, `_`, `-`. Регистр не различается.
|
||
|
||
**Частота.** Token bucket в памяти сервера, без внешних хранилищ. Превышение — `429` с `Retry-After`.
|
||
- Отправка сообщений: 60 в минуту на аккаунт.
|
||
- Запросы контакта: 20 в сутки на аккаунт.
|
||
- Регистрация: 5 в час с одного IP.
|
||
- Вход: 10 попыток за 15 минут на ник, 30 — с одного IP. Argon2 дорогой; это защита процессора сервера в той же мере, что и аккаунтов.
|
||
- Прочие запросы: 120 в минуту на аккаунт.
|
||
|
||
**Объёмы.**
|
||
- Очередь устройства — до 10 000 сообщений; при переполнении старейшие удаляются. Плюс 30-дневный TTL из ADR-008.
|
||
- Контактов у аккаунта — до 500. Участников в комнате — до 100. Устройств у аккаунта — до 10.
|
||
|
||
**Антиспам.** Сводится к трём вещам: писать можно только взаимным контактам (ADR-016), блокировка ника (ADR-016), лимиты выше. Жалоб и модерации нет: серверу нечего модерировать.
|
||
|
||
## Следствия
|
||
|
||
- Все числа — константы в одном файле сервера. Клиент дублирует только длину сообщения и формат ника — для подсказок до отправки. Конфигурации нет: поменять лимит — поменять константу и пересобрать.
|
||
- Перезапуск сервера сбрасывает счётчики. Для маленького инструмента это приемлемо.
|
||
- Лимит по IP не различает людей за одним NAT. Осознанная грубость: цифры взяты с запасом.
|
||
- Переполнение очереди теряет сообщения, как и TTL. Устройство, не выходившее на связь, получает не всё — это уже зафиксировано в ADR-008.
|