Сервис на FastAPI для сбора индекса цен btc_usd и eth_usd c биржи Deribit и отдачи сохранённых данных через API. Цены сохраняются в PostgreSQL, фоновые задачи выполняет Celery + Redis, данные берутся каждые 60 секунд.
- Скопируйте env-шаблон и при необходимости поправьте значения:
cp .env.example .env
- Запустите инфраструктуру и приложение:
docker compose up --build
- Откройте 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, чтобы не плодить сложностей конфигом для тестового).
Все методы — 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.
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- Простая синхронная 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ускоряют установку и дают воспроизводимость.