- 📌 О проекте
- 🚀 Начало работы
- 💾 Работа с базой данных
- 👨💻 Разработка
- 🔄 CI/CD и деплой
▶️ Запуск приложения- 📋 Справочник команд Makefile
- 🧪 Тестирование
- ❓ Часто встречающиеся ошибки
Tabit — онлайн-сервис для HR-специалистов и собственников компаний, который помогает:
- 📊 Измерять эмоциональный климат в компании
- 🔍 Выявлять выгорающих сотрудников
- 💡 Обнаруживать внутренние проблемы компании
- 📈 Отслеживать ключевые показатели (текучесть кадров, уровень конфликтности и доверия)
Требования к окружению: Python 3.12 или выше.
Poetry — это инструмент для управления зависимостями и виртуальными окружениями Python. В проекте Poetry является обязательным для разработки.
🔽 Установка Poetry
Следуйте официальной инструкции или используйте один из способов:
Через pip:
pip install poetry==1.7.1 # Последняя стабильная версия 1.xДля UNIX-систем и WSL:
curl -sSL https://install.python-poetry.org | python - --version 1.7.1Для Windows PowerShell:
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python - --version 1.7.1
⚠️ Примечание: Рекомендуется использовать версию 1.x, так как версия 2.x может иметь отличия в командах и работе.
poetry --version
⚠️ Примечание: Если poetry не найден, добавьте путь установки в переменную PATH вашей системы.
-
Настройте создание виртуального окружения в папке проекта:
poetry config virtualenvs.in-project true -
Установите зависимости проекта:
poetry install
🔽 Работа с Poetry
В Poetry 1.x:
poetry shellВ Poetry 2.x:
В версии 2.0.0 и выше команда poetry shell не доступна по умолчанию. Используйте один из следующих методов:
# Рекомендуемый способ: активация окружения
poetry env activate
# Альтернатива: установка плагина shell
poetry self add poetry-plugin-shell
poetry shell
# Или напрямую активируйте окружение
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate.bat # Windows cmd
.venv\Scripts\Activate.ps1 # Windows PowerShell📘 Подробнее в документации: Poetry: Activating the environment
poetry run <команда>Примеры:
poetry run python src/main.py
poetry run pytest
poetry run ruff formatДобавление основной зависимости:
poetry add <имя_пакета>Добавление зависимости для разработки:
poetry add <имя_пакета> --devОбновление зависимостей:
poetry update🔽 Настройка pre-commit
-
Проверьте, что pre-commit установлен:
pre-commit --version
-
Настройте git hook:
pre-commit install
После настройки при каждом коммите будет автоматически запускаться проверка линтером и форматирование кода.
🔽 Способ 1: Установка с использованием WSL (рекомендуется)
-
Откройте PowerShell от имени администратора и выполните:
wsl --install -
Перезагрузите компьютер и завершите настройку Ubuntu.
-
Подробная инструкция доступна по ссылке: Установка и настройка WSL
-
Установите Docker Desktop:
# Скачайте и установите с официального сайта: https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe -
Установите VS Code с расширением Remote - WSL.
-
Установите Make в WSL:
sudo apt update sudo apt install make
-
Установите Poetry в WSL:
curl -sSL https://install.python-poetry.org | python3 - --version 1.7.1Альтернативные способы установки Poetry:
Через pip:
pip install poetry==1.7.1
Через apt (если pip недоступен):
sudo apt update sudo apt install python3-pip pip install poetry==1.7.1
Проверка установки:
poetry --version
Настройка Poetry:
poetry config virtualenvs.in-project true
-
Клонируйте репозиторий:
git clone git@github.com:Studio-Yandex-Practicum/Tabit.git cd Tabit -
Настройте Poetry:
poetry config virtualenvs.in-project true poetry install
-
Активируйте виртуальное окружение:
source .venv/bin/activate # или poetry shell
-
Запустите приложение:
make up # Запуск контейнера с БД # Если миграции уже существуют: make migration-apply # Применение существующих миграций # Если это первая инициализация: make db-init # Создание и применение начальных миграций make create-superuser # Создание суперпользователя make fill-db # Заполнение тестовыми данными make run # Запуск приложения
🔽 Способ 2: Установка на чистом Windows
-
Установите Chocolatey (менеджер пакетов для Windows):
Set-ExecutionPolicy Bypass -Scope Process -Force [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
-
Установите Make:
choco install make
-
Установите Docker Desktop:
# Скачайте и установите с официального сайта: https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe -
Установите Python:
# Скачайте и установите с официального сайта: https://www.python.org/downloads/ -
Установите Poetry: Выберите один из способов:
Через pip:
pip install poetry==1.7.1
Через PowerShell:
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python - --version 1.7.1
Проверка установки:
poetry --version
Настройка Poetry:
poetry config virtualenvs.in-project true
-
Клонируйте репозиторий:
git clone git@github.com:Studio-Yandex-Practicum/Tabit.git cd Tabit
-
Настройте Poetry:
poetry config virtualenvs.in-project true poetry install
-
Активируйте виртуальное окружение:
.venv\Scripts\activate.bat # для cmd .venv\Scripts\Activate.ps1 # для PowerShell
-
Запустите приложение:
make up # Запуск контейнера с БД # Если миграции уже существуют: make migration-apply # Применение существующих миграций # Если это первая инициализация: make db-init # Создание и применение начальных миграций make create-superuser # Создание суперпользователя make fill-db # Заполнение тестовыми данными make run # Запуск приложения
⚠️ Примечание: На чистом Windows могут возникнуть проблемы совместимости. Если столкнетесь с ошибками, рекомендуется перейти на WSL.
Для работы с базой данных создайте файл .env в корне проекта на уровне с директорией src.
Пример всех необходимых параметров можно найти в файле
.env.example.
# Настройки БД
POSTGRES_USER=warlock # Имя пользователя БД
POSTGRES_PASSWORD=zTudS8LBSquBMwvS3ky5 # Пароль к БД
POSTGRES_DB=tabit # Название БД
DB_PORT=5432 # Порт для подключения к БД
DB_TYPE=postgresql # Тип базы данных
DB_API=asyncpg # API для работы с БД
DB_HOST=localhost # Хост для подключения к БДАктуальная ER-диаграмма базы данных доступна по ссылке
🔽 Подключение к БД через DBeaver
- Скачайте и установите DBeaver
- Создайте новое подключение (
Ctrl+Shift+N) - Выберите PostgreSQL
- Введите параметры подключения:
- Хост: localhost
- Порт: 5433 (или порт, указанный в
.env) - База данных: tabit (или имя, указанное в
.env) - Пользователь: warlock (или имя, указанное в
.env) - Пароль: (указанный в
.env)
- Нажмите "Тест соединения", затем "Готово"
🔽 Работа с pgAdmin
pgAdmin — веб-интерфейс для управления PostgreSQL. В проекте доступен через контейнер Docker по адресу http://localhost:5600/
-
Добавьте в
.envфайл переменные:PGADMIN_DEFAULT_EMAIL=admin@email.com PGADMIN_DEFAULT_PASSWORD=admin
-
Запустите контейнер с pgAdmin:
make up-pgadmin
или
docker compose -f infra/local/docker-compose.local.yaml --profile pgadmin up -d
-
Откройте в браузере http://localhost:5600/
⚠️ Важно: Инициализация pgAdmin может занять до 8 минут (особенно на HDD).
Остановка контейнеров:
make down-pgadminили
docker compose -f infra/local/docker-compose.local.yaml --profile '*' downУдаление контейнеров и томов:
make down-pgadmin-volumesили
docker compose -f infra/local/docker-compose.local.yaml --profile '*' down -vИнструмент для взаимодействия с БД PostgreSQL, альтернатива DBeaver. Вариация в данном проекте работает через Docker-контейнер и доступна в браузере по ссылке http://localhost:5600/ или http://127.0.0.1:5600/. Полная документация доступна по ссылке: https://www.pgadmin.org/docs/pgadmin4/8.14/index.html
В контейнер монтируются:
servers.json- файл с данными для подключения к БД;config_local.py- настройки для pgAdmin. Заменяют параметры, описанные вconfig.pyвнутри контейнера (подробнее: https://www.pgadmin.org/docs/pgadmin4/latest/config_py.html#config-py);.pgpass- файл-пароль для подключения к БД;create-admin-folder.sh- bash-скрипт для создания внутри контейнера необходимой папки и переноса туда.pgpass.
Достаточно в файл с переменными окружения .env добавить две переменных: PGADMIN_DEFAULT_EMAIL и PGADMIN_DEFAULT_PASSWORD, почта и пароль автоматически создаваемого админа соответственно (см. .env.example).
- Полная инициализация pgAdmin может занимать много времени. На ноутбуке с HDD процесс занимал 8 минут. С SSD должно быть быстрее.
- В процессе инициализации для первого админа создаётся автоматическое подключение к БД, данные для подключения описаны в файле
servers.json. Благодаря файлу.pgpassпропадает необходимость вводить пароль для подключения. - Первый админ может создавать других пользователей с помощью User Management (меню в правом верхнем углу). Однако для таких пользователей подключение к БД нужно настраивать отдельно уже в интерфейсе системы.
🔽 Git-процесс в проекте
master— production-ready код, используется для CI/CDdev— предрелизная ветка с рабочим и выверенным кодом
- Новые ветки всегда создаются от ветки
dev - Названия веток:
feature/название-функционала— для нового функционалаbugfix/название-багфикса— для исправления ошибок
- Создайте новую ветку от
dev - Внесите необходимые изменения
- Отправьте ветку в репозиторий
- Откройте Pull Request в ветку
dev - Добавьте ссылку на PR в соответствующую задачу в Kaiten
🔽 Система логирования
В проекте доступны два типа логирования:
- Автоматическое логирование запросов через middleware
- Ручное логирование через функцию
logger
-
Импортируйте логгер:
from src.core.config.logging import logger
-
Добавьте логи нужного уровня:
logger.trace('Трассировочное сообщение') logger.debug('Отладочное сообщение') logger.info('Информационное сообщение') logger.success('Сообщение об успехе') logger.warning('Предупреждение') logger.error('Сообщение об ошибке') logger.critical('Критическая ошибка')
Уровень логирования задается в .env переменной LOG_LEVEL. Доступные уровни:
- TRACE
- DEBUG
- INFO
- SUCCESS
- WARNING
- ERROR
- CRITICAL
🔽 Проверка качества кода
В проекте используется Ruff для форматирования и проверки кода.
- Максимальная длина строки: 99 символов
- Исключены из проверки: директории "alembic"
- Проверки: "E" (ошибки), "F" (предупреждения), "I" (импорты)
- Стиль строк: одинарные кавычки
- Импорты: с учетом внутренних модулей
src
poetry run ruff check .poetry run ruff format .В проекте настроены следующие автоматизированные процессы:
| Workflow | Описание | Триггер |
|---|---|---|
| build_and_push.yaml | Сборка и публикация образа Docker | При необходимости |
| pytest.yaml | Запуск тестов | Push в репозиторий |
| ruff.yml | Проверка кода линтерами | Push, Pull Request |
| stage_deploy.yaml | Деплой на Stage-окружение | Push в определенную ветку |
🔽 Конфигурации Docker
-
Только база данных
make up # Запуск -
База данных с pgAdmin
make up-pgadmin # Запуск -
Полное окружение
make up-dc # Запуск -
Общие команды
make logs # Просмотр логов make down # Остановка make clean-volumes # Остановка и полный сброс данных
Конфигурация для Stage расположена в директории infra/stage:
docker-compose.stage.yaml— конфигурация Docker Composestage.Dockerfile— Dockerfile для сборки образаtabit.service— Systemd-сервис для запуска на сервере
🔽 Процесс деплоя
Деплой на Stage-окружение выполняется через GitHub Action workflow stage_deploy.yaml:
- Сборка Docker-образа
- Публикация образа в GitHub Container Registry
- Подключение к stage-серверу по SSH
- Загрузка конфигурационных файлов
- Запуск/перезапуск приложения через Systemd
Для работы деплоя необходимы следующие секреты в репозитории GitHub:
STAGE_HOST— хост stage-сервераSTAGE_SSH_KEY— приватный SSH-ключSTAGE_SSH_USER— пользователь для SSHSTAGE_SSH_PASSWORD— пароль для SSH (если используется)
python src/main.py [опции]--reloadили-r— отслеживание изменений в коде--hostили-h— указание хоста (по умолчанию 127.0.0.1)--portили-p— указание порта (по умолчанию 8000)--create-superuserили-c— создание суперпользователя
python src/main.py -r -h 127.0.0.1 -p 1234- Заполните
.envпараметрами (примеры из .env.example):
FIRST_SUPERUSER_EMAIL=yandex@yandex.ru # Почта
FIRST_SUPERUSER_PASSWORD=Password123 # Пароль (Латинские символов в обоих регистрах, числа, минимальная длина 8 символов)
FIRST_SUPERUSER_NAME=Ип # Имя
FIRST_SUPERUSER_SURNAME=Ман # Фамилия- Запустите:
python src/main.py -cили
make create-superuser🔽 Локальное тестирование CI/CD
Создайте файл .env в корне проекта с необходимыми переменными (см. .env.example)
make up-dcmake logsmake migration-apply-dcmake fill-db-dcmake create-superuser-dcmake downmake clean-volumes- Корректно завершает работу всех сервисов.
- Очищает используемые контейнеры, но сохраняет данные в volume-ах.
После этих шагов можно быть уверенным, что CI/CD собирает проект корректно.
🔽 Docker Compose команды
| Команда | Описание |
|---|---|
make up |
Запуск контейнера с БД |
make up-pgadmin |
Запуск контейнеров с БД и pgAdmin |
make up-dc |
Запуск полного окружения в контейнерах |
make logs |
Вывод логов всех контейнеров |
make down |
Остановка и удаление контейнеров |
make clean-volumes |
Остановка контейнеров и удаление томов |
🔽 Миграции и база данных
| Команда | Описание |
|---|---|
make migration-init |
Создание первичной миграции с автогенерацией |
make migration-auto m='commit' |
Создание миграции с указанным именем |
make migration-empty m='commit' |
Создание пустой миграции |
make migration-apply |
Применение всех миграций |
make migration-apply-dc |
Выполнение миграций в контейнере |
make migration-rollback |
Откат последней миграции |
make db-reset |
Сброс базы и применение миграций |
make db-init |
Запуск контейнеров и создание структуры БД |
🔽 Запуск и тестовые данные
| Команда | Описание |
|---|---|
make run |
Запуск приложения с Uvicorn на порту 8000 |
make create-superuser |
Создание суперпользователя |
make fill-db |
Заполнение БД всеми тестовыми данными |
make fill-companies |
Создание тестовых компаний |
make fill-company-users |
Создание тестовых пользователей компаний |
make fill-tabit-admin-users |
Создание тестовых администраторов |
make fill-company-departments |
Создание тестовых отделов |
make fill-license-type |
Создание тестовых типов лицензий |
make fill-problems |
Создание тестовых проблем |
make fill-message-feeds |
Создание тестовых лент сообщений |
make fill-voting-feeds |
Создание тестовых вариантов голосования |
make fill-voting-by-user |
Создание тестовых голосований |
make fill-tasks |
Создание тестовых задач |
make fill-comments |
Создание тестовых комментариев |
make fill-tags |
Создание тестовых тэгов |
Тесты используют базу данных PostgreSQL, которая автоматически разворачивается в контейнере перед запуском тестов и удаляется после их выполнения. Не нужно запускать контейнер вручную — pytest сделает это сам!
🔽 Как запустить тесты?
-
Добавьте переменные тестовой базы данных в
.env(если их нет):TEST_POSTGRES_USER=test_user TEST_POSTGRES_PASSWORD=test_password TEST_POSTGRES_HOST=localhost TEST_POSTGRES_PORT=5433 TEST_POSTGRES_DB=test_db
📌 Эти переменные используются для автоматического подключения к тестовой БД в контейнере.
-
Убедитесь, что у вас установлен
pytest:poetry add pytest --dev
-
Запустите тесты:
pytest -v
-
Если хотите остановить тестирование при первой ошибке, используйте флаг
-x:pytest -x -v
Это ускоряет отладку, останавливая тесты сразу при первой неудаче.
-
Запуск только последних упавших тестов (
--lf):pytest --lf -v
📌 Эта команда запустит только тесты, которые упали в последнем запуске.
-
Запуск тестов в том же порядке, начиная с упавших (
--ff):pytest --ff -v
📌 Эта команда запустит тесты в том же порядке, что и в предыдущем запуске, начиная с упавших.
🔽 Что делать, если контейнер завис?
Если тесты не запускаются из-за проблем с контейнером, удалите его вручную:
docker-compose -f infra/docker-compose.test-db.yaml down -vЭта команда остановит и полностью удалит контейнер с тестовой базой, включая все его данные. После этого можно запустить тесты заново.
🔽 Как работают тесты?
-
Перед запуском тестов
pytestсам поднимает контейнер с PostgreSQL:- Контейнер создаёт отдельную тестовую БД, чтобы не затронуть основную.
- После поднятия контейнера происходит ожидание готовности БД.
-
При запуске тестов
pytestзагружает переменные окружения изpytest.ini, включая параметры подключения к тестовой БД. -
После завершения тестов контейнер с БД автоматически удаляется.
📌 Важно: тестовая БД создаётся в отдельном контейнере и не влияет на основную базу данных. Теперь тесты полностью автоматизированы и изолированы! 🚀
🔽 Конфликт портов PostgreSQL в WSL и Docker
При использовании PostgreSQL одновременно в WSL и Docker-контейнерах может возникнуть конфликт портов, если оба сервиса пытаются использовать порт 5432 (по умолчанию для PostgreSQL).
- Ошибка при запуске контейнера:
Bind for 0.0.0.0:5432 failed: port is already allocated - Невозможно подключиться к базе данных
- Невозможно применить миграции в контейнере с БД
- Сервис PostgreSQL в WSL или Docker не запускается
-
Проверка занятых портов:
sudo netstat -tuln | grep 5432 -
Вариант 1: Остановить PostgreSQL в WSL Если PostgreSQL в WSL не нужен, остановите его:
sudo service postgresql stop
-
Вариант 2: Изменить порт в Docker Если нужно использовать оба сервиса, измените порт для Docker-контейнера:
- В файле
.envизмените значениеDB_PORTна свободный порт (например, 5433) - Перезапустите контейнеры
- В файле
-
Вариант 3: Изменить порт в WSL Если нужно использовать PostgreSQL в WSL, измените его порт:
- Откройте конфигурационный файл PostgreSQL:
sudo nano /etc/postgresql/<версия>/main/postgresql.conf
- Найдите строку
port = 5432и измените на свободный порт - Перезапустите PostgreSQL:
sudo service postgresql restart
- Откройте конфигурационный файл PostgreSQL:
- Всегда проверяйте занятые порты перед запуском контейнеров
- Используйте разные порты для WSL и Docker, если оба сервиса нужны одновременно
- Убедитесь, что в
.envуказан правильный порт для подключения к базе данных
🔽 Конфликт имён контейнеров Docker
При обновлени репозитория или работе с несколькими его копиями может возникнуть пересечение имён контейнеров при запуске
Сообщение в консоли:
Error response from daemon: Conflict. The container name "/postgres_local" is already in use by container...- Прорерить запущенные контейнеры
docker ps- Если обнаружены лишние контейнеры - остановить и удалить их вручную Пример:
docker stop postgres_local
docker remove postgres_local- Если обнаруженные контейнеры нужны - изменить название контейнеров в текущем локальном запуске чепез .env Пример:
APP_CONTAINER_NAME=tabit_new
DB_CONTAINER_NAME=postgres_new
PGADMIN_CONTAINER_NAME=pgadmin_new- Предпринять новую попытку запуска