Эта установка нужна для запуска бэкенда локально и запуска форматеров, линтеров и тайп чекеров перед каждым коммитом. Для корректной работы требуется Python 3.12
pip install poetry==2.1.3
poetry install
pre-commit install --install-hooks
Сначала нужно запустить зависимости (нужен настроенный docker):
docker compose up -d --wait
Запуск бэкенда локально:
uvicorn app.main:app --port 5000 --reload
Остановить зависимости:
docker compose down
После запуска приложения становятся доступны следующие порты и ссылки:
5432
: порт для подключения к базе данных PostgreSQLhttp://localhost:5000/docs
: автоматическая OpenAPI-документация основного приложения
Этот раздел для тех, кто хочет запустить одного (или обоих) из наших телеграм-ботов локально. В целом можно использовать стейджинг для тестирования бота, но тогда тестирование станет последним этапом, после миграций и тестов. API можно запускать и без бота, тесты (в том числе тесты бота) будут работать локально даже без настроек ниже
Итак, настроить себе тестовое окружение локально просто:
- Создать себе бота через @BotFather
- Добавить в окружение (файл
.env
, не заливать в git!) токен бота, в переменнуюsupbot__token
илиnotifications_bot__token
в зависимости от нужного бота
Пример .env
-файла для notifications bot:
notifications_bot__token=0000000000:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Для supbot-а требуется дополнительная настройка:
- Создать приватную группу в телеграмме для тестирования (добавлять туда никого не нужно пока)
- В настройках группы включить "Темы" ("Topics") и сохранить
- Разрешить добавлять бота в группы, если не разрешено (BotFather > /mybots > BOT > Bot Settings > Allow Groups? > Turn on)
- Выключить у бота "Group Privacy", если включена (BotFather > /mybots > BOT > Bot Settings > Group Privacy > Turn off)
- Добавить бота в группу (важно сделать это именно после шагов 3-4, иначе нужно выгнать бота и добавить заново)
- Если хочется, можно теперь запретить добавлять бота в группы, т.е. отменить шаг 3 (шаг 4 отменять нельзя)
- Сделать бота администратором в группе (важно выдать доступ к "управлению темами")
- Добавить в окружение (файл
.env
, не заливать в git!) переменнуюsupbot__group_id
с id группы, в которую добавлен supbot (для получения id можно переслать сообщение из группы боту (начинается с -100))
Пример .env
-файла для supbot:
supbot__token=0000000000:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
supbot__group_id=-100123456
После всех настроек можно запускать приложение, как сказано в инструкции выше. Важно использовать --port 5000
, а если хочется использовать иной порт, то его нужно указать в переменной bridge_base_url
в .env
, например, так:
bridge_base_url=http://localhost:{port}
Для локального запуска сервиса можно использовать Gmail:
- Заходим в управление аккаунтом Google
- Включаем двухэтапную аутентификацию в разделе безопасность (если еще не включена)
- Находим в строке поиска "пароли приложений" или "app pass"
- Называем как угодно и копируем полученный пароль
- Добавляем в .env файл необходимые переменные:
email__username=your_email@gmail.com
email__password=your_password
email__hostname=smtp.gmail.com
Запуск тестов локально (в виртуальном окружении):
pytest tests
С проверкой покрытия:
pytest tests --cov=.
- Создать новую конфигурацию: Edit Configurations > + > pytest
- Настроить путь: Script Path > Выбор папки (выбрать папку tests)
- Настроить рабочую директорию: Environment > Working directory > Выбор папки (выбрать корень проекта)
- (опционально) В Additional Arguments добавить
--cov=.
для проверки покрытия
Отчёт о покрытии кода можно получить командой:
coverage report
После аппрува задачи, в которой были изменения в БД, нужно написать миграцию. В этом поможет автоматическая генерация миграций через alembic, описанная ниже
Для начала нужно выключить приложение и отчистить базу данных:
docker compose down
Затем можно сбилдить и запустить контейнер для миграций:
docker compose run --build --rm -ti alembic
Должен открыться терминал (sh), в котором уже будет можно запускать команды alembic-а:
alembic upgrade head
alembic revision --autogenerate -m "<message>" --rev-id "<issue>"
- Python 3.12
- FastAPI
- SQLAlchemy 2.0 (async)
- Poetry
- Linters (flake8, wemake-style-guide, mypy)
- Formatters (black, autoflake)
- Pre-commit
- Pytest
Версии можно найти в pyproject.toml
mq
: локальный брокер RabbitMQ, сбрасывается при рестартеdb
: локальная база данных PostgreSQL для тестов и проверок, сбрасывается при рестартеalembic
: специальный контейнер для работы с миграциями, работает только с--profile migration
app
: докеризированное приложение основного API сервиса, сделано для полных проверок и работает только с--profile app
# запустить все вспомогательные сервисы для локальной разработки
docker compose up -d
# выключить обратно
docker compose down
# тоже самое, но вместе с докеризированным приложением
docker compose --profile app up -d
docker compose --profile app down
# смотреть логи в реальном времени
docker compose logs --follow <сервис>
docker compose logs --follow mq # пример
# проверить статусы сервисов
docker compose ps -a
# зайти в какой-то контейнер
docker compose exec -ti <сервис> <shell-команда>
docker compose exec -ti db psql -U test -d test # пример