Habbr — это современная система для создания и управления постами с иерархическими комментариями, построенная на GraphQL API. Проект реализует функциональность, аналогичную комментариям на популярных платформах, таких как Хабр или Reddit.
Проект был создан для изучения и демонстрации современных подходов к разработке на Go:
- GraphQL как альтернатива REST API с возможностями real-time подписок
- Clean Architecture для создания поддерживаемого и тестируемого кода
- Микросервисные паттерны с dependency injection и repository pattern
- Production-ready решения с Docker, мониторингом и observability
- Иерархические комментарии с неограниченной глубиной вложенности
- Real-time уведомления о новых комментариях через WebSocket subscriptions
- Эффективная пагинация с cursor-based подходом для больших объемов данных
- Гибкое хранение данных с поддержкой PostgreSQL и in-memory режимов
- Высокая производительность с оптимизированными запросами и индексами
- Backend: Go 1.23+, GraphQL (gqlgen)
- База данных: PostgreSQL 15+ с pgx драйвером
- Кэширование: Redis 7+
- Контейнеризация: Docker & Docker Compose
- Тестирование: testify, table-driven тесты
- Логирование: Zap structured logging
- Архитектура: Clean Architecture, Repository Pattern
- Docker 20.10+
- Docker Compose 2.0+
- Git для клонирования репозитория
- Клонируйте репозиторий:
git clone https://github.com/NarthurN/habbr.git
cd habbr- Запустите все сервисы:
# Базовый запуск (API + PostgreSQL + Redis)
docker compose up -d
# Запуск с инструментами разработки (+ pgAdmin + Redis Insight)
docker compose --profile tools up -d- Проверьте статус сервисов:
docker compose psПосле успешного запуска вы можете проверить работу системы:
- GraphQL Playground: http://localhost:8080/ - интерактивная среда для тестирования API
- GraphQL API: http://localhost:8080/query - основной endpoint для запросов
- Health Check: http://localhost:8080/health - проверка состояния сервиса
- pgAdmin: http://localhost:5050 - веб-интерфейс для PostgreSQL
- Email:
admin@habbr.local - Password:
admin
- Email:
- Redis Insight: http://localhost:8001 - интерфейс для мониторинга Redis
Откройте GraphQL Playground (http://localhost:8080/) и выполните тестовые запросы:
1. Создание поста:
mutation {
createPost(input: {
title: "Мой первый пост"
content: "Это содержимое моего первого поста в Habbr"
authorID: "user-123"
commentsEnabled: true
}) {
success
post {
id
title
createdAt
}
error
}
}2. Получение списка постов:
query {
posts(first: 10) {
edges {
node {
id
title
content
authorID
commentsEnabled
createdAt
}
}
pageInfo {
hasNextPage
endCursor
}
}
}3. Создание комментария:
mutation {
createComment(input: {
postID: "YOUR_POST_ID" # Замените на ID созданного поста
content: "Отличный пост!"
authorID: "user-456"
}) {
success
comment {
id
content
depth
createdAt
}
error
}
}# Остановка всех сервисов
docker compose down
# Остановка с удалением данных
docker compose down -vПроект следует принципам Clean Architecture с четким разделением ответственности:
cmd/server/ # Точка входа приложения
internal/
├── api/graphql/ # GraphQL слой (схемы, резолверы, конвертеры)
│ ├── schema/ # GraphQL схемы
│ ├── resolver/ # Резолверы для queries, mutations, subscriptions
│ └── converter/ # Конвертеры между GraphQL и domain типами
├── service/ # Бизнес-логика
│ ├── post/ # Сервис работы с постами
│ ├── comment/ # Сервис работы с комментариями
│ └── subscription/ # Сервис real-time подписок
├── repository/ # Слой доступа к данным
│ ├── postgres/ # PostgreSQL реализация
│ ├── memory/ # In-memory реализация
│ └── model/ # Модели репозитория
├── model/ # Доменные модели
└── config/ # Управление конфигурацией
- Dependency Injection через интерфейсы
- Repository Pattern для абстракции хранения данных
- Publisher-Subscriber для real-time уведомлений
- Cursor-based pagination для эффективной навигации
- Graceful shutdown с корректной обработкой сигналов
Основные настройки можно изменить через переменные окружения:
# Тип хранилища данных
DATABASE_TYPE=postgres # или "memory" для in-memory режима
# Настройки PostgreSQL
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_NAME=habbr
DATABASE_USER=habbr_user
DATABASE_PASSWORD=habbr_password
# Настройки сервера
SERVER_HOST=0.0.0.0
SERVER_PORT=8080
SERVER_ENABLE_PLAYGROUND=true # Включить GraphQL Playground
# Логирование
LOGGER_LEVEL=info # debug, info, warn, error
LOGGER_FORMAT=json # json или consoleДля быстрого тестирования без PostgreSQL:
# Создайте файл .env
echo "DATABASE_TYPE=memory" > .env
# Запустите только API сервис
docker compose up habbr-api# Unit тесты
docker compose exec habbr-api go test ./internal/...
# Интеграционные тесты (требует PostgreSQL)
docker compose exec habbr-api go test -tags=integration ./...
# Покрытие кода
docker compose exec habbr-api go test -cover ./...- Unit тесты: Изолированное тестирование компонентов с моками
- Integration тесты: Тестирование с реальной базой данных
- Table-driven тесты: Полное покрытие edge cases
- GraphQL тесты: Тестирование API через GraphQL queries
# Просмотр логов API
docker compose logs -f habbr-api
# Логи PostgreSQL
docker compose logs -f postgres
# Логи всех сервисов
docker compose logs -f- Health Check: http://localhost:8080/health
- Database connections: Мониторинг через pgAdmin
- Redis metrics: Мониторинг через Redis Insight
- Проверьте статус сервисов:
docker compose ps - Просмотрите логи:
docker compose logs habbr-api - Проверьте health check:
curl http://localhost:8080/health - Убедитесь в доступности БД: через pgAdmin или прямое подключение
-
Аутентификация и авторизация
- Интеграция с JWT токенами
- Ролевая модель доступа
- Защита GraphQL endpoints
-
Оптимизация производительности
- Добавление Redis кэширования для частых запросов
- Реализация DataLoader для решения N+1 проблемы в GraphQL
- Добавление индексов для полнотекстового поиска
-
Расширение API
- Поддержка файловых вложений в постах и комментариях
- Система лайков и рейтингов
- Уведомления пользователей
-
Микросервисная архитектура
- Выделение сервиса уведомлений
- Сервис управления пользователями
- Event-driven архитектура с Apache Kafka
-
Масштабирование
- Горизонтальное масштабирование API
- Шардинг базы данных
- CDN для статических ресурсов
-
DevOps и мониторинг
- CI/CD pipeline с GitHub Actions
- Kubernetes deployment
- Prometheus + Grafana для мониторинга
- Distributed tracing с Jaeger
Полная документация API доступна в GraphQL Playground. Основные типы:
- Post: Представляет пост с заголовком, содержимым и настройками комментариев
- Comment: Иерархический комментарий с поддержкой вложенности
- Connections: Cursor-based пагинация для списков
- Subscriptions: Real-time уведомления о новых комментариях
В директории docs/ находятся:
- API_EXAMPLES.md: Подробные примеры GraphQL запросов
- ARCHITECTURE.md: Детальное описание архитектуры
- CONTRIBUTING.md: Руководство для разработчиков
- Миграции: Автоматически применяются при запуске
- Индексы: Оптимизированы для иерархических запросов
- Constraints: Обеспечивают целостность данных
- Triggers: Автоматическое обновление метаданных
Система оптимизирована для работы с большими объемами данных:
- Эффективные SQL запросы с минимальным количеством обращений к БД
- Индексы производительности для быстрого поиска комментариев
- Connection pooling для оптимального использования ресурсов
- Cursor-based пагинация для стабильной навигации
Habbr - создавайте контент, обсуждайте идеи, строите сообщества! 🚀