Relic Chat.
Мессенджер в реальном времени.
Полнофункциональный мессенджер уровня Telegram, доведённый до боевого продакшна на домене relic-chat.ru. Личные и групповые чаты в реальном времени, файлы и голосовые, аудио- и видеозвонки на WebRTC с демонстрацией экрана. Два клиента поверх единого backend: устанавливаемое веб-приложение (PWA) и нативное приложение для iOS и Android.
Мессенджер уровня
Telegram — в проде.
Relic Chat закрывает полный сценарий современного общения: личные и групповые чаты в реальном времени, обмен файлами и фотографиями, голосовые сообщения, аудио- и видеозвонки на WebRTC с демонстрацией экрана, установку как приложения (PWA) с push-уведомлениями. Проект развёрнут на собственной инфраструктуре и работает с реальными пользователями.
Это не макет и не прототип: продукт доведён от идеи до боевого продакшна в роли full-stack-разработчика — от модели данных и WebSocket-шлюза до WebRTC-звонков, нативного приложения и деплоя. Отдельно выполнен перенос всей исторической переписки со старой платформы без потери данных.
Что за этим стоит.
Полный сценарий
общения.
Сообщения и чаты
- Личные и групповые чаты в реальном времени через WebSocket
- Статусы доставки: часы → галочка → две зелёные (прочитано) → ошибка с повтором
- Ответы, редактирование, удаление, пересылка, закрепление, копирование
- Индикаторы «печатает…», онлайн-статусы и «был(а) в сети»
- Поиск по переписке с подсветкой и навигацией по совпадениям
Медиа и вложения
- Загрузка фото и файлов с выбором «сжать или оригинал», предпросмотр в ленте
- Голосовые с записью и визуализацией звуковой волны
- Галерея чата: вкладки «Медиа / Файлы / Ссылки / Голос» в профиле
Звонки (WebRTC)
- Peer-to-peer аудио и видео со своим окном (picture-in-picture)
- Демонстрация экрана без переустановки соединения (replaceTrack)
- Собственный TURN-сервер (coturn), буферизация ICE, авто-перезапуск при обрыве
- Дозвон до оффлайн-собеседника через push и буферизацию вызова
Группы и профили
- Роли участников: участник / администратор / создатель
- Инвайт-ссылки для вступления в группу
- Профили пользователя и группы, переключатель уведомлений на каждый чат
Платформа и UX
- PWA: установка как приложение, офлайн-режим, Service Worker с авто-обновлением
- Web push (VAPID), native push (Expo) и email-уведомления
- Светлая и тёмная темы, адаптив от телефона до десктопа, safe-area на iOS
Где было по-настоящему сложно.
1. Надёжные WebRTC-звонки в реальных сетях
Буферизация ICE-кандидатов, приходящих до установки удалённого описания (иначе они терялись во время запроса доступа к камере), автоматический перезапуск ICE при обрыве с «тихой» пересборкой соединения, демонстрация экрана через замену видеодорожки без новой сигнализации и собственный TURN-сервер для обхода сложных NAT. Дозвон до оффлайн-собеседника: вызов буферизуется в Redis и доставляется push-уведомлением.
2. Доставка сообщений с подтверждением и фолбэком
Каждое исходящее сообщение уходит оптимистично со статусом «отправляется», подтверждается ack-колбэком сокета, а при недоступности сокета — через REST-фолбэк. При полном сбое сообщение помечается «не доставлено» с повтором по тапу. Дедупликация защищает от дублей при гонке сокета и REST.
3. PWA с бесшовным авто-обновлением
Service Worker обновляет приложение без ручной перезагрузки: новая версия активируется через skipWaiting + clients.claim, клиент перезагружается один раз по смене контроллера. Офлайн-режим, корректная iOS-клавиатура через visualViewport и безопасные зоны для установленного приложения.
4. Миграция данных без потерь
Вся историческая переписка перенесена со старой PHP/MySQL-платформы на PostgreSQL: 190 пользователей, 649 чатов, 1433 участника, 2141 сообщение, 187 вложений и закреплённые сообщения. Идентификаторы сохранены, последовательности сброшены, ссылки на файлы и аватары — корректны.
Единый backend
на два клиента.
Backend на Fastify и Socket.io обслуживает оба клиента поверх общего HTTP-сервера: REST отвечает за данные (чаты, сообщения, профили, файлы), Socket.io — за реальное время (доставку, статусы прочтения, набор текста, присутствие и сигналинг звонков). Всё развёрнуто в Docker Compose за Nginx с SSL.
Backend и данные
- Node.js 22 · Fastify 5 · Socket.io 4.8 (общий HTTP-сервер)
- PostgreSQL 16 · Prisma 6 — 14+ моделей, мягкое удаление сообщений
- Redis 7 (ioredis): присутствие, rate-limit, буфер звонков
- JWT + refresh-токены, SSO-мост на HMAC-SHA256
Реалтайм, звонки, клиенты
- Socket.io с тикет-авторизацией: сообщения, набор, присутствие
- WebRTC (P2P) · coturn TURN-сервер · ICE restart · screen sharing
- Web Push (VAPID) · Expo Push · SMTP (nodemailer)
- Веб: SPA + PWA + Service Worker; мобайл: Expo 54 · React Native 0.81 · TypeScript · Zustand · SQLite
- Docker Compose · Nginx · Let's Encrypt (SSL)
Экраны проекта.
Full-stack:
от идеи до прода.
Relic Chat сделан в одиночку в роли full-stack-разработчика — от модели данных до деплоя и миграции legacy-платформы. Зоны ответственности:
- Backend — REST API и WebSocket-шлюз на Fastify/Socket.io, модель данных на Prisma/PostgreSQL, Redis
- Frontend — веб-SPA и PWA, нативное приложение на React Native/Expo
- WebRTC — сигналинг, P2P-соединение, TURN-сервер, перезапуск ICE, дозвон оффлайн
- Инфраструктура — Docker, Nginx, SSL, развёртывание, миграция данных с legacy
- Уведомления — web push, native push, email
- Продакшн — живой трафик, переписка и звонки на собственной инфраструктуре
Нужен сложный
продукт под ключ?
Реалтайм, звонки, мобильное приложение, интеграции — берём проекты, где много инженерии. Разберём задачу и оценим за 30 минут.