Асинхронный микросервис на базе FastAPI для сбора, хранения и управления данными о погоде. Сервис получает данные из OpenWeatherMap, сохраняет их в PostgreSQL и предоставляет REST API.
- Backend: Python 3.11, FastAPI, Pydantic
- Database: PostgreSQL (Asyncpg + SQLAlchemy 2.0)
- Migrations: Alembic
- Async Tasks: Celery + Redis
- Testing: Pytest, Pytest-Asyncio
- Infra: Docker, Docker Compose
REST API:
- POST /weather/ : Создание записи вручную.
- GET /weather/{city} : Получение актуальной погоды для города.
- PATCH /weather/{id} : Частичное обновление записи.
- DELETE /weather/{id} : Удаление записи.
Фоновые задачи:
- Периодический сбор данных (Celery Beat) для списка городов, указанных в конфиге.
Убедитесь, что установлен Docker и Docker Compose. Также требуется API ключ от OpenWeatherMap.
-
Создайте файл .env на основе примера: cp .env.example .env
-
Укажите ваш WEATHER_API_KEY в файле .env.
Выполните команду в корне проекта: docker-compose up --build -d
Сервис будет доступен по адресу: http://localhost:8000 Документация (Swagger): http://localhost:8000/docs
Если требуется запуск на хосте (нужен локальный Postgres и Redis):
-
Установка зависимостей: python -m venv .venv source .venv/bin/activate pip install -r requirements.txt
-
Применение миграций: alembic upgrade head
-
Запуск веб-сервера: uvicorn src.main:app --reload
-
Запуск воркеров (в отдельных терминалах): celery -A src.celery_app worker --loglevel=info celery -A src.celery_app beat --loglevel=info
Тесты используют изолированную базу данных, которая создается автоматически перед запуском и удаляется после.
Запуск тестов: pytest
Запуск с подробным выводом: pytest -v