Система для автоматического поиска валуйных ставок (value bets) в букмекерских конторах с использованием микросервисной архитектуры на Go.
┌─────────────┐ ┌─────────────┐
│ Parser │ │ Value │
│ Service │───▶│ Calculator │
│ (Memory) │ │ │
└─────────────┘ └─────────────┘
│ │
│ (HTTP API) │
│ ▼
│ ┌─────────────┐
│ │ PostgreSQL │
│ │ (Value │
│ │ Bets) │
│ └─────────────┘
│
▼
┌─────────────┐
│ In-Memory │
│ Store │
│ (Fast API) │
└─────────────┘
- Назначение: Парсинг коэффициентов с сайтов букмекеров
- Технологии: Go, HTTP клиенты, JSON API парсинг
- Хранилище: In-memory хранилище для быстрого доступа через HTTP API
- Реализованные парсеры:
- ✅ Fonbet - Полностью рабочий парсер с реальным API
- ✅ Pinnacle - Guest API для получения коэффициентов
- Особенности:
- Модульная архитектура компонентов (EventFetcher, OddsParser, MatchBuilder, EventProcessor)
- Обработка gzip сжатия ответов
- Асинхронный парсинг с интервалами
- Обработка ошибок и retry логика
- Config-driven выбор парсеров - запуск нужных парсеров через конфиг
- Поддержка параллельного запуска множественных парсеров
- Валидация и санитизация данных
- Назначение: Поиск валуйных ставок (value bets)
- Алгоритм: Сравнение коэффициентов с референсными (среднее по топ-5 БК)
- Критерии: Минимальная разница в процентах, настраиваемые фильтры
- Результат: Список найденных value bet с расчетами
- In-Memory Store: Данные хранятся в памяти парсера и доступны через HTTP API
- PostgreSQL: История валуйных ставок и метаданные
- Интерфейсы: Унифицированные интерфейсы для легкого переключения хранилищ
- Иерархическая структура: Данные хранятся в виде Match → Events → Outcomes
- Валидация: Автоматическая валидация и санитизация данных
- Язык: Go 1.22+
- Фреймворки: Стандартная библиотека Go
- Базы данных:
- In-Memory Store - для коэффициентов (быстрый доступ через HTTP API)
- PostgreSQL - для истории валуйных ставок
- Контейнеризация: Docker, Docker Compose
- Планируется: React/Vue.js + TypeScript
- Функции: Отображение валуйных ставок, фильтрация, уведомления
- Облако: Yandex Cloud
- База данных: PostgreSQL (Managed PostgreSQL в Yandex Cloud)
- Контейнеры: Docker
- Мониторинг: Встроенные логи Go
vodeneevbet/
├── cmd/
│ ├── parser/ # Entry-point сервиса парсера
│ ├── calculator/ # Entry-point калькулятора
│ └── tools/ # Утилиты
├── internal/
│ ├── parser/ # Парсер букмекеров
│ │ ├── parsers/
│ │ │ ├── fonbet/ # Fonbet парсер (модульная архитектура)
│ │ │ │ ├── http_client.go # HTTP клиент для API
│ │ │ │ ├── json_parser.go # JSON парсер
│ │ │ │ ├── parser.go # Основной парсер
│ │ │ │ └── models.go # Модели данных
│ ├── calculator/ # Калькулятор валуйных ставок
│ └── pkg/ # Общие библиотеки
│ ├── models/ # Модели данных
│ ├── config/ # Конфигурация
│ ├── enums/ # Перечисления (спорты, рынки)
│ └── storage/ # Слой хранения
├── configs/ # Конфигурационные файлы
├── keys/ # Ключи аутентификации
└── docker-compose.yml # Локальная инфраструктура
# Клонирование репозитория
git clone <repository-url>
cd vodeneevbet
# Установка зависимостей
go mod tidy# Запуск PostgreSQL и Adminer
docker-compose up -d
# Проверка статуса
docker ps# Запуск Fonbet парсера
go run ./cmd/parser -config configs/production.yaml
# Или сборка и запуск
go build -o ./bin/parser ./cmd/parser
./bin/parser -config configs/production.yamlgo run ./cmd/calculator -config configs/production.yaml# Парсер получает реальные данные с Fonbet API
# - Обрабатывает ~10,000 событий
# - Хранит коэффициенты в памяти (доступны через HTTP API)
# - Поддерживает gzip сжатие
# - Модульная архитектура для легкого расширения# PostgreSQL (на проде: POSTGRES_DSN в .env / GitHub Secrets; см. docs/POSTGRES_SETUP.md)
postgres:
dsn: "host=localhost user=arb_user password=arb_password dbname=arb_db port=5432 sslmode=disable"
# Настройки парсера
parser:
# Список активных парсеров (пустой массив = все зарегистрированные)
enabled_parsers: ["fonbet", "pinnacle"]
interval: 30s
user_agent: "Mozilla/5.0..."
timeout: 30s
# Специфичные настройки для каждого парсера
fonbet:
base_url: "https://line55w.bk6bba-resources.com/events/list"
lang: "ru"
pinnacle:
base_url: "https://guest.api.arcadia.pinnacle.com"
api_key: "" # или через ENV: PINNACLE_API_KEY
device_uuid: "" # или через ENV: PINNACLE_DEVICE_UUIDПараметр enabled_parsers в configs/production.yaml позволяет гибко управлять тем, какие парсеры будут запущены:
parser:
enabled_parsers: [] # пустой массив = запустить всеparser:
enabled_parsers: ["fonbet"]parser:
enabled_parsers: ["pinnacle"]parser:
enabled_parsers: ["fonbet", "pinnacle", "pinnacle888"]Преимущества:
- ✅ Одна кодовая база, разные конфигурации для разных окружений
- ✅ Безопасность на этапе компиляции (нельзя указать несуществующий парсер)
- ✅ Простое масштабирование (один сервис = один парсер, или все вместе)
- ✅ Удобное тестирование (разные конфиги для dev/staging/prod)
# Настройки Value Calculator
value_calculator:
reference_method: "average_top5" # "pinnacle" или "average_top5"
min_value_percent: 15.0 # Минимальная разница в процентах
max_risk_percent: 5.0 # Максимальный риск
min_stake: 1000 # Минимальная ставка
max_stake: 50000 # Максимальная ставка
check_interval: 5m # Интервал проверки
test_interval: 30s # Интервал для тестирования
sports: ["football"] # Только футбол
markets: ["1x2", "total", "handicap"] # Основные рынки
reference_bookmakers: ["pinnacle", "betfair", "sbobet", "bet365", "williamhill"]Система использует иерархическую структуру для хранения данных:
Match (Матч)
├── Events (События)
│ ├── Event 1 (например, "1X2")
│ │ └── Outcomes (Исходы)
│ │ ├── "1" (Победа хозяев)
│ │ ├── "X" (Ничья)
│ │ └── "2" (Победа гостей)
│ └── Event 2 (например, "Total")
│ └── Outcomes
│ ├── "Over 2.5"
│ └── "Under 2.5"
type Match struct {
ID string `json:"id"`
HomeTeam string `json:"home_team"`
AwayTeam string `json:"away_team"`
StartTime time.Time `json:"start_time"`
Sport string `json:"sport"`
Events []Event `json:"events"`
}type Event struct {
ID string `json:"id"`
MatchID string `json:"match_id"`
Type string `json:"type"` // "1x2", "total", "handicap"
Name string `json:"name"` // "Основной исход", "Тотал голов"
Outcomes []Outcome `json:"outcomes"`
}type Outcome struct {
ID string `json:"id"`
EventID string `json:"event_id"`
Name string `json:"name"` // "1", "X", "2", "Over 2.5"
Odds float64 `json:"odds"` // Коэффициент
Bookmaker string `json:"bookmaker"` // "Fonbet", "Bet365"
UpdatedAt time.Time `json:"updated_at"`
}type ValueBet struct {
ID string `json:"id"`
MatchID string `json:"match_id"`
MatchName string `json:"match_name"`
Market string `json:"market"` // "1x2", "total", "handicap"
Outcome string `json:"outcome"` // "win_home", "draw", "over_2.5"
BookmakerOdd float64 `json:"bookmaker_odd"` // Коэффициент в БК
ReferenceOdd float64 `json:"reference_odd"` // Референсный коэффициент
ValuePercent float64 `json:"value_percent"` // Процент value (15.5%)
Bookmaker string `json:"bookmaker"` // Название БК
Stake float64 `json:"stake"` // Рекомендуемая ставка
PotentialWin float64 `json:"potential_win"` // Потенциальный выигрыш
FoundAt time.Time `json:"found_at"`
ExpiresAt time.Time `json:"expires_at"` // Время истечения
}- Парсинг: Парсеры собирают коэффициенты с БК каждые 30 секунд
- Хранение: Данные сохраняются в памяти парсера и доступны через HTTP API
- Анализ: Value Calculator получает данные через HTTP API от парсера и сравнивает коэффициенты с референсными (среднее по топ-5 БК)
- Фильтрация: Отбираются только ставки с разницей выше порога (настраиваемо)
- Сохранение: Найденные value bet сохраняются в PostgreSQL
- (опционально) дальнейшая выдача результатов (API/Frontend) — отдельным этапом
- Parser → In-Memory Store: Сохраняет коэффициенты в памяти
- Calculator → Parser HTTP API: Получает коэффициенты для анализа
- Calculator → PostgreSQL: Сохраняет найденные value bet
go test ./...# Подключение к PostgreSQL
docker exec -it arb-postgres psql -U arb_user -d arb_db
# Просмотр валуйных ставок
SELECT * FROM value_bets ORDER BY found_at DESC LIMIT 10;- Базовая структура проекта
- Парсер с тестовыми данными
- In-Memory хранилище для быстрого доступа
- Docker инфраструктура
- Fonbet парсер - Реальный парсер для Fonbet API
- Модульная архитектура - Компонентная архитектура (EventFetcher, OddsParser, MatchBuilder, EventProcessor)
- Иерархическая структура данных - Match → Events → Outcomes
- HTTP API - Доступ к данным через HTTP endpoint
- Валидация данных - Автоматическая валидация и санитизация
- Унифицированные интерфейсы - Единые интерфейсы для всех компонентов
- Алгоритм поиска валуйных ставок
- Сравнение с референсными коэффициентами
- Настраиваемые фильтры
- Оптимизация производительности
- REST API сервер
- Веб-интерфейс
- Real-time уведомления
- Мониторинг и логирование
- Масштабирование
- Безопасность
Система автоматического деплоя обеспечивает, что актуальная версия сервисов всегда запущена на VM.
GitHub Actions настроен и готов к использованию!
- При пуше в
main/masterавтоматически запускается деплой - Не требует ручного вмешательства
- История деплоев доступна в интерфейсе GitHub Actions
📖 Деплой: docs/DEPLOYMENT.md
Linux/Mac:
make deploy-all
# или
./scripts/deploy/deploy-all.sh- vm-parsers (158.160.168.187): Parser Service
- vm-core-services (158.160.222.217): Calculator Service
# Проверка статуса
make status
# Просмотр логов
make logs-parser # Логи парсера
make logs-calculator # Логи калькулятора
# Остановка/Запуск
make stop-all
make start-all📖 Подробная документация: docs/DEPLOYMENT.md
MIT License
- Fork репозитория
- Создайте feature branch
- Внесите изменения
- Создайте Pull Request
Для вопросов и предложений создавайте Issues в репозитории.