Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

511 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Value Bet Finder - Система поиска валуйных ставок

Система для автоматического поиска валуйных ставок (value bets) в букмекерских конторах с использованием микросервисной архитектуры на Go.

🏗️ Архитектура

Высокоуровневая схема

┌─────────────┐    ┌─────────────┐
│   Parser    │    │ Value       │
│  Service    │───▶│ Calculator  │
│  (Memory)   │    │             │
└─────────────┘    └─────────────┘
       │                   │
       │ (HTTP API)        │
       │                   ▼
       │            ┌─────────────┐
       │            │ PostgreSQL  │
       │            │ (Value      │
       │            │  Bets)     │
       │            └─────────────┘
       │
       ▼
┌─────────────┐
│ In-Memory   │
│ Store       │
│ (Fast API)  │
└─────────────┘

Компоненты системы

1. Parser Service (internal/parser/)

  • Назначение: Парсинг коэффициентов с сайтов букмекеров
  • Технологии: Go, HTTP клиенты, JSON API парсинг
  • Хранилище: In-memory хранилище для быстрого доступа через HTTP API
  • Реализованные парсеры:
    • Fonbet - Полностью рабочий парсер с реальным API
    • Pinnacle - Guest API для получения коэффициентов
  • Особенности:
    • Модульная архитектура компонентов (EventFetcher, OddsParser, MatchBuilder, EventProcessor)
    • Обработка gzip сжатия ответов
    • Асинхронный парсинг с интервалами
    • Обработка ошибок и retry логика
    • Config-driven выбор парсеров - запуск нужных парсеров через конфиг
    • Поддержка параллельного запуска множественных парсеров
    • Валидация и санитизация данных

2. Value Calculator Service (internal/calculator/)

  • Назначение: Поиск валуйных ставок (value bets)
  • Алгоритм: Сравнение коэффициентов с референсными (среднее по топ-5 БК)
  • Критерии: Минимальная разница в процентах, настраиваемые фильтры
  • Результат: Список найденных value bet с расчетами

3. Storage Layer (internal/pkg/storage/)

  • In-Memory Store: Данные хранятся в памяти парсера и доступны через HTTP API
  • PostgreSQL: История валуйных ставок и метаданные
  • Интерфейсы: Унифицированные интерфейсы для легкого переключения хранилищ
  • Иерархическая структура: Данные хранятся в виде Match → Events → Outcomes
  • Валидация: Автоматическая валидация и санитизация данных

🛠️ Технологический стек

Backend

  • Язык: Go 1.22+
  • Фреймворки: Стандартная библиотека Go
  • Базы данных:
    • In-Memory Store - для коэффициентов (быстрый доступ через HTTP API)
    • PostgreSQL - для истории валуйных ставок
  • Контейнеризация: Docker, Docker Compose

Frontend

  • Планируется: 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   # Локальная инфраструктура

🚀 Быстрый старт

1. Настройка окружения

# Клонирование репозитория
git clone <repository-url>
cd vodeneevbet

# Установка зависимостей
go mod tidy

2. Запуск инфраструктуры

# Запуск PostgreSQL и Adminer
docker-compose up -d

# Проверка статуса
docker ps

3. Запуск парсера

# Запуск Fonbet парсера
go run ./cmd/parser -config configs/production.yaml

# Или сборка и запуск
go build -o ./bin/parser ./cmd/parser
./bin/parser -config configs/production.yaml

4. Запуск калькулятора

go run ./cmd/calculator -config configs/production.yaml

5. Тестирование Fonbet парсера

# Парсер получает реальные данные с Fonbet API
# - Обрабатывает ~10,000 событий
# - Хранит коэффициенты в памяти (доступны через HTTP API)
# - Поддерживает gzip сжатие
# - Модульная архитектура для легкого расширения

⚙️ Конфигурация

Основные параметры (configs/production.yaml)

# 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: []  # пустой массив = запустить все

Запустить только Fonbet

parser:
  enabled_parsers: ["fonbet"]

Запустить только Pinnacle

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"

Match (Матч)

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"`
}

Event (Событие)

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"`
}

Outcome (Исход)

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"`
}

ValueBet (Валуйная ставка)

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"`      // Время истечения
}

🔄 Workflow

  1. Парсинг: Парсеры собирают коэффициенты с БК каждые 30 секунд
  2. Хранение: Данные сохраняются в памяти парсера и доступны через HTTP API
  3. Анализ: Value Calculator получает данные через HTTP API от парсера и сравнивает коэффициенты с референсными (среднее по топ-5 БК)
  4. Фильтрация: Отбираются только ставки с разницей выше порога (настраиваемо)
  5. Сохранение: Найденные value bet сохраняются в PostgreSQL
  6. (опционально) дальнейшая выдача результатов (API/Frontend) — отдельным этапом

Взаимодействие сервисов:

  • ParserIn-Memory Store: Сохраняет коэффициенты в памяти
  • CalculatorParser HTTP API: Получает коэффициенты для анализа
  • CalculatorPostgreSQL: Сохраняет найденные 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;

🚧 Roadmap

Этап 1: MVP ✅

  • Базовая структура проекта
  • Парсер с тестовыми данными
  • In-Memory хранилище для быстрого доступа
  • Docker инфраструктура
  • Fonbet парсер - Реальный парсер для Fonbet API
  • Модульная архитектура - Компонентная архитектура (EventFetcher, OddsParser, MatchBuilder, EventProcessor)
  • Иерархическая структура данных - Match → Events → Outcomes
  • HTTP API - Доступ к данным через HTTP endpoint
  • Валидация данных - Автоматическая валидация и санитизация
  • Унифицированные интерфейсы - Единые интерфейсы для всех компонентов

Этап 2: Value Calculator (В процессе)

  • Алгоритм поиска валуйных ставок
  • Сравнение с референсными коэффициентами
  • Настраиваемые фильтры
  • Оптимизация производительности

Этап 3: API и Frontend

  • REST API сервер
  • Веб-интерфейс
  • Real-time уведомления

Этап 4: Продакшен

  • Мониторинг и логирование
  • Масштабирование
  • Безопасность

🚀 Деплой на виртуальные машины

Система автоматического деплоя обеспечивает, что актуальная версия сервисов всегда запущена на VM.

Автоматический деплой через CI/CD

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

🤝 Вклад в проект

  1. Fork репозитория
  2. Создайте feature branch
  3. Внесите изменения
  4. Создайте Pull Request

📞 Поддержка

Для вопросов и предложений создавайте Issues в репозитории.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages