- 1. О проекте
- 2. Архитектура
- 3. Технологический стек
- 4. Структура репозитория
- 5. Микросервисы
- 6. Общие пакеты и инструменты
- 7. Быстрый старт
- 8. Разработка
RealTimeMap — backend геосоциальной платформы, позволяющей создавать временные метки на карте и взаимодействовать с происходящим вокруг в режиме реального времени.
Платформа позволяет оставить «цифровой след» в любом месте — отметить событие, встречу, находку или предупреждение, видимое другим пользователям поблизости:
- Спонтанные мероприятия и встречи
- Интересные места и находки
- Важные уведомления для района
- Точки для общения с людьми рядом
Каждая метка существует ограниченное время, что делает платформу живой и актуальной.
- Откройте карту и посмотрите, что происходит вокруг
- Создайте метку с фото, категорией и длительностью
- Общайтесь через комментарии и реакции
- Зарабатывайте опыт и достижения за активность
- Получайте обновления о новых метках в реальном времени
| Модуль | Описание |
|---|---|
| Метки | Геолокационные метки с фото, категориями, пространственной фильтрацией и автоудалением |
| Социальный профиль | Профили, друзья, блокировки, агрегированная статистика |
| Real-time | Мгновенные обновления карты через Socket.IO |
| Комментарии | Вложенные ответы и реакции к меткам |
| Геймификация | Опыт, уровни, достижения за активность |
| Уведомления | Доставка уведомлений пользователям |
| Аутентификация | Регистрация, вход, валидация токенов (ForwardAuth) |
| Подписки | Премиум-возможности, платежи |
| Документация | Внутренний веб-портал с описанием API всех сервисов |
Проект построен на микросервисной архитектуре с применением принципов Domain-Driven Design (DDD). Каждый сервис автономен: имеет собственную БД, конфигурацию и свой Dockerfile.
┌─────────────────────────────────────────────────────────────┐
│ Clients │
│ (Web, Mobile, Admin) │
└──────────────────────────┬──────────────────────────────────┘
│ HTTPS / WebSocket
▼
┌─────────────────────────────────────────────────────────────┐
│ Traefik │
│ (reverse proxy, TLS, CORS, ForwardAuth) │
│ маршрутизация по PathPrefix → нужный сервис, проверка │
│ Bearer-токена через auth-service (X-User-* заголовки) │
└───────┬───────────────┬───────────────┬──────────────┬───────┘
│ HTTP/Socket.IO│ │ │
▼ ▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ mark-service │ │social-service│ │ gamification │ │ comment │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ gRPC ◄───────┘ │ │
│ между сервисами │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────────────────────┐
│ PostgreSQL │ │ Kafka │
│ + PostGIS │ ◄── Redis ──► │ (событийная интеграция: │
│ (на сервис) │ │ xp-начисления, статистика) │
└──────────────┘ └──────────────────────────────┘
- Независимость сервисов — у каждого микросервиса своя БД, конфиг и независимый деплой
- DDD-слои — внутри сервиса:
domain→app→infrastructure→transport - Traefik как точка входа — TLS, CORS и аутентификация (ForwardAuth) вынесены на прокси; сервисы не дублируют эту логику
- gRPC для внутренней коммуникации — типизированные контракты между сервисами (например, mark-service запрашивает профиль у social-service)
- Event-driven через Kafka — асинхронная интеграция (начисление опыта, обновление статистики) на базе
segmentio/kafka-go - Real-time через Socket.IO — обновления карты доставляются клиентам в реальном времени
| Категория | Технологии |
|---|---|
| Язык | Go 1.25 |
| HTTP Framework | Gin |
| Межсервисная связь | gRPC + Protocol Buffers |
| База данных | PostgreSQL 16 + PostGIS, доступ через pgx и GORM |
| Кеширование | Redis 7 |
| Событийная шина | Kafka (segmentio/kafka-go) |
| Real-time | Socket.IO (doquangtan/socketio) |
| Reverse Proxy / Gateway | Traefik 3.6 (TLS, CORS, ForwardAuth) |
| Логирование | zap |
| Обработка изображений | disintegration/imaging |
| Контейнеризация | Docker, Docker Compose |
RealTimeMap-services/
├── proto/ # gRPC контракты (.proto)
│ ├── user/
│ ├── profile/
│ ├── mark/
│ ├── comment/
│ └── gamification/
│
├── pkg/ # Общие переиспользуемые пакеты
│ ├── pb/ # Сгенерированный protobuf-код
│ ├── logger/ # Структурированное логирование (zap)
│ ├── config/ # Загрузка конфигурации
│ ├── database/ # Подключение к PostgreSQL
│ ├── redis/ # Redis-клиент
│ ├── transport/ # Общие транспортные хелперы
│ ├── middleware/ # Общие middleware
│ ├── apperror/ # Стандартизированные ошибки приложения
│ ├── clients/ # gRPC-клиенты к другим сервисам
│ ├── storage/ # Абстракция хранилища файлов
│ ├── imageprocessor/ # Обработка/ресайз изображений
│ ├── mediavalidator/ # Валидация загружаемых медиа
│ ├── pagination/ # Пагинация
│ ├── validation/ # Валидация входных данных
│ ├── helpers/ utils/ date/ types/ runner/ # Прочие утилиты
│
├── services/
│ ├── auth-service/ # Аутентификация (переносится извне)
│ ├── mark-service/ # Метки на карте (ядро платформы)
│ ├── social-service/ # Профили, друзья, блокировки, статистика
│ ├── gamification-service/ # Опыт, уровни, достижения
│ ├── comment-service/ # Комментарии и реакции
│ ├── notification-service/ # Уведомления (в разработке)
│ ├── subsriptions-service/ # Подписки и платежи (в планах)
│ └── docs-service/ # Веб-портал документации API (Vue)
│
├── tools/
│ ├── docgen/ # Генератор документации из YAML-описаний
│ └── profile-stub/ # Заглушка profile gRPC для локальной разработки
│
├── traefik/
│ ├── traefik.yml # Статическая конфигурация прокси
│ └── dynamic.yml # Роутеры, middleware (CORS, auth), TLS
│
├── scripts/ # Общие и сервис-специфичные скрипты
├── docker-compose.yml # Инфраструктура: Traefik, Postgres, Redis
├── docker-compose.kafka.yml # Kafka-стек
├── Dockerfile # Базовый образ
├── go.mod
└── README.md
Каждый сервис содержит собственный
docker-compose.yml(с label-конфигурацией Traefik),Dockerfileиconfig/. Корневойdocker-compose.ymlотвечает за общую инфраструктуру.
Ядро платформы — управление метками на карте.
- CRUD операций с метками и категориями
- Пространственная фильтрация и работа с геоданными (PostGIS)
- Загрузка и хранение фотографий
- Автоудаление меток по истечении срока жизни
- Real-time обновления карты через Socket.IO
- gRPC-клиент к профилям пользователей
Социальный слой платформы.
- Профили пользователей
- Друзья и связи между пользователями
- Блокировки пользователей
- Агрегированная статистика и прогресс
- gRPC-сервер профилей для других сервисов
Система геймификации.
- Начисление опыта (XP) по правилам событий
- Уровни пользователей
- Достижения
- Интеграция через Kafka (потребление событий активности)
Комментарии и реакции.
- Комментарии к меткам (с поддержкой вложенности)
- Реакции (лайки/эмодзи)
- Фильтрация контента
- Опциональная интеграция через Kafka
Доставка уведомлений пользователям.
Статус: в разработке — каркас сервиса (
cmd/) создан, доменная логика переносится.
Аутентификация и авторизация: регистрация, вход, валидация токенов. Используется Traefik через ForwardAuth — прокси обращается к /api/v2/auth/token-validate и прокидывает заголовки X-User-Id, X-User-Name, X-User-Ban, X-User-Admin в нижестоящие сервисы.
Статус: существует и работает как отдельный сервис, ещё не перенесён в этот монорепозиторий.
Подписки и платежи: тарифные планы, премиум-возможности, история платежей.
Статус: в планах — директория зарезервирована.
Внутренний веб-портал документации API (Vue + Vite). Документация ведётся вручную в YAML-файлах внутри каждого сервиса (docs/) и поддерживает описание четырёх типов протоколов: HTTP/REST, Kafka, gRPC и Socket.IO. Также отображает статус доступности сервисов.
Переиспользуемые между сервисами пакеты: логирование (logger), конфигурация (config), доступ к БД (database) и Redis (redis), gRPC-клиенты (clients), обработка ошибок (apperror), хранилище и обработка медиа (storage, imageprocessor, mediavalidator), пагинация, валидация и прочие утилиты. Сгенерированный protobuf-код лежит в pkg/pb.
- docgen — генерирует документацию из YAML-описаний сервисов для docs-service.
- profile-stub — лёгкая gRPC-заглушка профилей, чтобы поднимать сервисы локально без полного social-service.
- Клонируйте репозиторий
git clone <repo-url>
cd RealTimeMap-services- Создайте
.envв корне с переменными инфраструктуры:
POSTGRES_DB=realtimemap
POSTGRES_USER=postgres
POSTGRES_PASSWORD=your_secure_password
⚠️ Никогда не коммитьте.envс реальными секретами.
- Создайте внешние Docker-сети (используются всеми сервисами):
docker network create web
docker network create service-network
docker network create kafka-network # если используете Kafka# Инфраструктура (Traefik, Postgres, Redis)
docker-compose up -d
# Kafka (при необходимости)
docker-compose -f docker-compose.kafka.yml up -d
# Запуск конкретного сервиса (на примере mark_action-service)
docker-compose -f services/mark_action-service/docker-compose.yml up -d --buildКаждый сервис маршрутизируется Traefik по своему PathPrefix (см. traefik/dynamic.yml и label'ы в docker-compose.yml сервиса).
Настройте config/config.yaml сервиса (хосты БД/Redis/Kafka, gRPC-адреса) и запустите:
cd services/mark_action-service && go run ./cmdservice-name/
├── cmd/ # Точка входа
├── config/ # config.yaml + загрузка конфигурации
├── internal/
│ ├── app/ # Сборка зависимостей, use-cases, DTO приложения
│ ├── domain/
│ │ ├── model/ # Доменные сущности
│ │ ├── valueobject/ # Value objects
│ │ ├── repository/ # Интерфейсы репозиториев
│ │ ├── service/ # Доменные сервисы
│ │ ├── events/ # Доменные события
│ │ └── domainerrors/ # Доменные ошибки
│ ├── infrastructure/
│ │ ├── persistence/ # Реализация репозиториев (БД)
│ │ ├── grpc/ # gRPC-клиенты к другим сервисам
│ │ └── kafka/ # Kafka producer/consumer
│ ├── transport/
│ │ ├── http/ # HTTP-хендлеры (Gin) + DTO + роуты
│ │ ├── grpc/ # gRPC-сервер
│ │ ├── socket/ # Socket.IO-хендлеры
│ │ └── kafka/ # Обработчики Kafka-сообщений
│ └── mocks/ # Сгенерированные моки (mockery)
├── docs/ # YAML-описания API для docs-service
├── config.yaml
├── Dockerfile
└── docker-compose.yml # Traefik-роутеры через labels
.proto-файлы лежат в proto/, сгенерированный код — в pkg/pb/. После изменения контрактов перегенерируйте код через protoc.
Моки генерируются через mockery (конфигурация — .mockery.yaml). Тесты — рядом с тестируемым кодом:
# Тесты конкретного сервиса
cd services/mark_action-service && go test ./...Описания endpoints ведутся вручную в docs/*.yaml каждого сервиса, собираются tools/docgen и отображаются в docs-service.
См. LICENSE.