Skip to content

macalistervadim/derbit-crypto-price

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Deribit Price Service

Сервис на FastAPI для сбора индекса цен btc_usd и eth_usd c биржи Deribit и отдачи сохранённых данных через API. Цены сохраняются в PostgreSQL, фоновые задачи выполняет Celery + Redis, данные берутся каждые 60 секунд.

Быстрый старт (Docker Compose)

  1. Скопируйте env-шаблон и при необходимости поправьте значения:
    cp .env.example .env
  2. Запустите инфраструктуру и приложение:
    docker compose up --build
  3. Откройте Swagger UI: http://localhost:8000/docs

Переменные окружения

  • DATABASE_URL — строка подключения к Postgres (по умолчанию postgresql://postgres:postgres@db:5432/prices).
  • REDIS_URL — брокер/бэкенд для Celery (по умолчанию redis://redis:6379/0).
  • DERIBIT_API_BASE — базовый URL API Deribit (по умолчанию https://www.deribit.com/api/v2).
  • TICKERS — список тикеров (зафиксирован в коде btc_usd, eth_usd, чтобы не плодить сложностей конфигом для тестового).

API

Все методы — GET, обязательный query-параметр ticker.

  • GET /api/prices — все сохранённые записи по тикеру.
  • GET /api/prices/latest — последняя цена по тикеру.
  • GET /api/prices/filter?date_from=...&date_to=... — записи в диапазоне (ISO8601).
  • GET /health — проверка живости.

Пример запроса: GET /api/prices/latest?ticker=btc_usd

Планировщик

Celery beat каждые 60 секунд вызывает задачу fetch_prices, которая:

  • идёт в Deribit /public/get_index_price?index_name=<ticker> через aiohttp;
  • кладёт цену и timestamp (unix) в таблицу price_ticks.

Локальный запуск без Docker (uv)

uv sync                 # установит зависимости из pyproject.toml
cp .env.example .env
uv run uvicorn app.main:app --reload
uv run celery -A app.celery_app.celery_app worker -B -l info  # worker + beat в одном процессе

Тесты

uv run pytest

Design decisions

  • Простая синхронная ORM. SQLAlchemy в sync-режиме упрощает использование и из FastAPI, и из Celery без лишних адаптеров.
  • aiohttp для клиента. Оставляет возможность расширить на несколько запросов параллельно.
  • Unit of Work + репозиторий. UnitOfWork инкапсулирует сессию и коммит/rollback, а PriceRepository даёт чтение/запись. Это убирает ручное управление транзакциями из API/задач и исключает утечки сессий.
  • Минимум зависимостей. Только необходимые пакеты (FastAPI, Celery, aiohttp, SQLAlchemy). Никаких глобальных синглтонов — конфиг через Settings, сессии через зависимость.
  • Отказоустойчивость задач. Ошибки клиента Deribit не валят весь цикл; логируются и идут дальше по тикерам.
  • uv для управления зависимостями. pyproject.toml хранит спецификацию, uv sync/run ускоряют установку и дают воспроизводимость.

About

FastAPI service for collecting the btc_usd and eth_usd price index from the Deribit exchange and return the saved data via API. Prices are saved in PostgreSQL, background tasks are performed by Celery + Redis, data is taken every 60 seconds.

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors