Продукт студии · 2026
RussiaOnline.wiki
Энциклопедия игрового мира: справочник с фасетными фильтрами, интерактивная карта, реестр номеров, настольный помощник и своя CMS.
- просмотров за первый месяц
- 143,7 тыс
- посетителей
- 25,0 тыс
- трафика из поиска
- 92%

Энциклопедия игрового мира «Россия Онлайн» — ролевого проекта о жизни в современной Москве. Не «ещё одна вики», а база данных с инструментами: типизированные характеристики, фасетные фильтры, табличный режим, сравнение объектов, интерактивная карта и полноценная админка.
Сегодня на сайте 790 материалов, 170 меток на карте и 11 разделов.
Три дня до открытия
Ограничение было не в бюджете и не в объёме, а в дате: проект открывался, и вики должна была работать к открытию. На первую рабочую версию было три дня. Всё, что описано ниже, выросло из архитектурных решений, принятых в эти три дня, — потому что переделывать потом было бы нечем.
Одна сущность вместо десяти таблиц
Ключевое решение, которое сделало три дня возможными. Вместо параллельных таблиц «транспорт»,
«предметы», «работы» и так далее — одна модель Entry с полем типа и типизированным
JSON-полем характеристик.
Отсюда следует всё остальное: один поисковый индекс на весь сайт, а не десять разных запросов; один редактор в админке вместо десяти форм с дублирующейся логикой; одна история правок и один SEO-слой. Новый тип контента добавляется описанием схемы, а не миграцией базы.
То, по чему реально фильтруют и сортируют, продублировано в индексированные колонки — база отсекает большую часть строк ещё до приложения.
Одно описание поля управляет пятью частями интерфейса
Схема характеристик — единственный источник правды. Описание поля задаёт сразу: форму в админке, инфопанель статьи, панель фасетных фильтров, колонку в табличном режиме и направление «лучше» в режиме сравнения.
Поставили полю признак «фильтруемое» — оно само появилось в панели фильтров раздела. Указали, что меньшее значение лучше, — режим сравнения начал подсвечивать лучшее в строке. Ручной вёрстки под каждый тип нет вообще.
Что показала Метрика за первый месяц

143,7 тысячи просмотров, 48,7 тысячи визитов, 25 тысяч посетителей за чуть больше месяца. Время на сайте — 2 минуты 58 секунд, глубина просмотра — 2,95 страницы, отказы — 13,8%.
Самое важное здесь не общая цифра, а её состав: 131,9 тысячи просмотров из 143,7 пришли из поисковых систем. Это 92%. Прямых заходов — 8 113, переходов по ссылкам — 1 232, из социальных сетей — 269.
Так выглядит справочник, который поиск считает полезным: серверный рендеринг, предрассчитанный индекс, разметка и структура URL заложены с первого дня, а не прикручены потом.
Дизайн, иконки и наполнение — наши
Проект пришёл без макетов. Дизайн-система, палитра, типографика, иконки и содержимое сделаны нами целиком.
Палитра выведена из фирменного стиля самого проекта: тёплый графит вместо чистого чёрного, тёплый off-white вместо белого, фирменный красный как акцент. Обе темы — тёмная и светлая — описаны токенами: ни один компонент не знает конкретных значений цвета.
Типографика — три гарнитуры с разными ролями: дисплейная с полной кириллицей, интерфейсная и моноширинная для числовых данных. Всё самохостится, без внешних запросов и сдвига макета.
Отдельно — 47 трёхмерных иконок разделов, нарисованных под проект, и тысячи изображений материалов, приведённых к единому виду.
Интерактивная карта
Карта Москвы на Leaflet в плоской системе координат: не географические широты и долготы, а координаты игрового мира. 170 меток по категориям, фильтры и поиск, состояние в адресе страницы — ссылкой на конкретный вид можно поделиться.
Номерограм
Реестр игровых автомобильных номеров. Человек загружает снимок и говорит, какой номер на нём, — сервис проверяет, встречается ли эта строка в распознанном тексте.
Задача поставлена наоборот обычной. Найти на фотографии «какой-нибудь номер» трудно: нужно выделить область, выправить перспективу, отличить знак от вывески. Здесь этого не нужно — номер уже назван, остаётся сравнить подстроки.
Два решения, которые стоили отдельной работы:
- Нормализация. Формат взят из нашей же статьи про игровые номера, а не из общих знаний о российских знаках. Человек вводит номер как придётся: латиницей, строчными, с пробелами и дефисами. В индекс кладётся только приведённая форма — иначе поиск не находит ничего, и сервис выглядит сломанным при полностью исправном коде.
- «Почти» — отдельный исход, а не разновидность «найдено». Настоящие снимки показали, что когда распознавание ошибается, оно ошибается ровно в одном знаке. Отбрасывать такое молча значит выбрасывать почти всю пользу проверки. А ложное «найдено» усыпляет модератора: он привыкает доверять пометке и однажды пропустит подделку.
Помощник
Настольное приложение для государственных структур проекта: найти статью закона по номеру, увидеть состав и санкцию, скопировать формулировку. 5 680 статей 82 действующих законов трёх серверов, плюс отменённые с пометкой «утратил силу».
Два решения, которые определяют всё поведение:
- Сервер — часть запроса. Одна и та же статья на разных серверах проекта означает разные составы и разные санкции. Поэтому выбор сервера стоит в шапке, виден всегда и запоминается между запусками.
- Устаревший справочник честно называет себя устаревшим. При запуске помощник тянет свежий разбор законов с сайта. Нет сети — открывает последнюю сохранённую копию и говорит об этом в шапке. Справочник по наказаниям, выдающий себя за свежий, хуже отсутствующего.
В игру помощник не лезет и ничего в неё не печатает — это отдельное окно, формулировку вставляет человек.
Контент приходит сам
Новости проекта разбирает служба опроса: забирает посты из канала, классифицирует их и публикует в ленту обновлений вики. Редактировать можно прямо из чата — это отдельный бот со своей службой.
Опрос выбран вместо вебхука сознательно: вебхук требует, чтобы Telegram достучался до нашего адреса — отдельный маршрут, секрет, зависимость от того, поднято ли приложение и в порядке ли сертификат. Опрос с длинным ожиданием держит одно исходящее соединение и не зависит ни от чего, кроме сети.
Как это стоит на сервере
nginx с TLS, сжатием и ограничением частоты запросов, приложение под systemd от отдельного
системного пользователя без права входа, с NoNewPrivileges и ProtectSystem.
Выкладка автоматическая: пуш в основную ветку → проверки в CI → сервер сам забирает код своим ключом на чтение. Ключ выкладки в GitHub ограничен на стороне сервера: sshd выполняет только обёртку выкатки и игнорирует то, что просит клиент. Утёкший ключ не даёт ни оболочки, ни копирования файлов, ни проброса портов — только тот же деплой, который и так идёт на каждый пуш.
TypeScript · Next.js 16 · React 19 · Prisma 7 · SQLite · Tailwind CSS 4 · Leaflet · TipTap · Tesseract · Electron · Python · nginx · systemd