Регистрация открытая (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
3.3 KiB
3.3 KiB
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.