Технологический стек Disban
Disban работает на едином современном стеке: веб-клиент и PWA на React, production backend полностью на Rust, данные в PostgreSQL, голос через WebRTC. Ниже — то, что реально используется в продукте сегодня.
Мы перешли с Python FastAPI на один Rust-процесс (Axum + Tokio): REST API и WebSocket realtime живут в одном бинарнике — быстрее, проще в эксплуатации и без разделения auth/gateway.
Сервер: Rust-монолит
Production backend — один процесс disban-server на Rust. Он обслуживает авторизацию, профили, сообщества, друзей, личные сообщения, ICE/TURN для голоса и WebSocket-шлюз для чата и голосового realtime.
- Rust + Tokio — асинхронный runtime;
- Axum — HTTP API и WebSocket;
- SQLx — доступ к PostgreSQL;
- Tower / Tower-HTTP — CORS, таймауты, трассировка;
- Argon2id для паролей (с поддержкой legacy bcrypt);
- единый бинарник вместо отдельных Python auth + gateway.
Python FastAPI и отдельный realtime-gateway сняты с production: api.disban.ru и gateway.disban.ru проксируют один Rust-сервис.
Web-интерфейс
Клиент в браузере — React и TypeScript. Компонентная архитектура и строгая типизация помогают быстро развивать интерфейс без потери стабильности.
- React 18;
- TypeScript;
- Vite — сборка и hot reload;
- Zustand — состояние клиента;
- Tailwind CSS — стили;
- lucide-react — иконки.
PWA и установка
Disban поставляется как веб-приложение и устанавливаемый PWA: manifest, service worker и проверка обновлений через version.json и boot-update.js — без отдельного desktop installer.
Один React-интерфейс в браузере и в установленном PWA: меньше дублирования, единый UX. При необходимости тонкая native-оболочка появится в отдельном репозитории и будет загружать тот же web-клиент.
Realtime и протокол
Чат, присутствие в голосовых каналах и события сообществ идут через WebSocket на gateway.disban.ru. Клиент и сервер используют плоский JSON-протокол (type + payload) с устойчивыми идентификаторами вида user:{id}.
- auth → join → chat_message / signal / voice_state;
- ping/pong для keepalive;
- guild meta events: каналы, роли, voice snapshot;
- bounded in-memory hub с backpressure.
База данных
PostgreSQL — единственное хранилище пользователей, сессий, сообществ, каналов, ролей, друзей и личных сообщений. Схема развивается через SQL-миграции; API не меняет контракт БД без нужды.
- доступ из Rust через SQLx;
- сессии с UUID session_token;
- RPC для друзей и социальные таблицы;
- файлы аватаров на диске, URL в БД.
Голос
Голосовые каналы — peer-to-peer WebRTC с серверной сигнализацией. Для NAT используется coturn (TURN) с ephemeral HMAC-учётками, которые выдаёт API.
- WebRTC + Opus в браузерном SDP;
- GET /webrtc/ice-config — STUN/TURN;
- voice presence snapshot для сайдбара;
- mute / deafen / speaking через voice_state.
Авторизация
Вход по логину и паролю, Google, Mail.ru и Telegram (виджет и OIDC), плюс одноразовые коды через Telegram-бота. Сессии серверные: X-Session-Token / Bearer UUID, не JWT приложения.
- Argon2id + rehash старых bcrypt-паролей;
- OAuth start/callback в том же Rust-сервисе;
- защита login/register rate-limit на nginx;
- Turnstile / progressive lockout при настройке.
Инфраструктура
- Nginx — reverse proxy, TLS, rate limits;
- api.disban.ru — REST;
- gateway.disban.ru — WebSocket (+ voice REST snapshot);
- systemd unit disban-server;
- coturn для TURN;
- Cloudflare на краю (DNS / защита).
Disban — для полного интерфейса включите JavaScript.