MVP мессенджера с прямыми/групповыми чатами и каналами (текст/войс/анонсы), доставкой сообщений в реальном времени и медиавложениями.
Архитектура и разработка (включая AI-ассистированное кодирование) — @yngnoise. Локальный MVP: собран и протестирован в браузере и Windows-сборке, мобильная сборка не тестировалась.
Backend: Go, PostgreSQL, Redis, Centrifugo (real-time доставка через WebSocket), MinIO (S3-совместимое хранилище медиа) Frontend: Flutter
┌─────────────┐ REST API ┌───────────────┐
│ Flutter App │ ──────────────────────► │ Go Server │
│ │ │ │
│ │ WebSocket └───┬───┬───┬───┘
│ │ ◄──────────────────┐ │ │ │
└─────────────┘ │ │ │ │
┌──────┴────┐ │ │ │
│Centrifugo │ │ │ │
└───────────┘ │ │ │
┌───────┘ │ └───────────┐
┌─────┴────┐ ┌───┴────────┐ ┌────┴────┐
│PostgreSQL│ │ Redis │ │ MinIO │
└──────────┘ └────────────┘ └─────────┘
Go-сервер обслуживает REST API (аутентификация, чаты, каналы, вложения) и публикует события в Centrifugo, к которому клиент подключён напрямую по WebSocket для мгновенной доставки сообщений, индикаторов набора текста, статусов прочтения и presence (кто сейчас в сети).
- auth — регистрация/логин, JWT (access + refresh токены), сессии
- messaging — прямые и групповые чаты: сообщения, вложения, редактирование/удаление, read receipts, typing indicators
- channels — каналы с комнатами (text/voice/announcement), управление участниками
- media — загрузка файлов/изображений в MinIO с серверной валидацией размера и типа (не доверяет метаданным клиента)
- realtime — presence (онлайн-статус, last-seen), интеграция с Centrifugo
Требуется Docker, Go 1.22+, Flutter SDK.
# 1. Инфраструктура (PostgreSQL, Redis, Centrifugo, MinIO)
cp server/.env.example server/.env # заполнить своими значениями
docker compose up -d
# 2. Миграции применяются автоматически при старте сервера
# 3. Backend
cd server
go run cmd/api/main.go
# 4. Frontend
cd app
flutter pub get
flutter run -d chrome # или -d windowsПорты по умолчанию: API — уточнить в server/pkg/config, PostgreSQL — 5433, Redis — 6379, Centrifugo — 8001, MinIO — 9000.
Локальный MVP, не задеплоен. Список известных ограничений и пунктов, обязательных перед публичным репозиторием / деплоем / многопользовательским режимом — в SECURITY.md.