Skip to content

Repository files navigation

BusLine — міжміські автобусні квитки

Навчальний проєкт з дисципліни «Високонавантажені web-системи», варіант №15. Система демонструє продаж квитків за динамічним розкладом, вибір місця та його транзакційне блокування під час оформлення.

Можливості

  • пошук рейсів за маршрутом і датою;
  • схема салону з трьома шаблонами автобусів: mini, standard і large;
  • тимчасове утримання місця, оплата та скасування квитка;
  • кабінети пасажира й перевізника з розмежуванням ролей;
  • захист від подвійного продажу місця на рівні PostgreSQL;
  • окремі sandbox і production конфігурації та бази даних.

Технології

Python 3.12, FastAPI, SQLAlchemy 2, Alembic, PostgreSQL 17, Jinja2, JWT, Nginx, Docker Compose, pytest, Ruff, Black і GitHub Actions. У Docker Compose Nginx працює окремим frontend-сервісом: він віддає статичні файли та приймає HTTP-запити, а FastAPI працює окремим backend-сервісом і обробляє сторінки та API.

Запуск sandbox

Sandbox — середовище для демонстрації та розробки. Воно використовує окрему PostgreSQL базу, тестові облікові записи й автоматично наповнюється демоданими.

Copy-Item config\env.sandbox.example .env.sandbox
docker compose up --build

Після запуску сайт доступний на http://localhost:8000/. Frontend і backend працюють у різних контейнерах; порт backend напряму на хост не відкритий. Конфігурація зберігається в .env.sandbox, а дані — у volume sandbox_pgdata. Кореневий compose.yaml підключає sandbox Compose-файл і його змінні оточення, тому повторний запуск виконується однією командою docker compose up --build. Dockerfile збирається у два етапи, а bind mounts у sandbox вмикають hot reload.

Запуск production-конфігурації

Цей локальний профіль призначений для демонстрації production-параметрів у межах лабораторної: DEBUG=false, автоматичний seed і reload вимкнені, база даних та volume відокремлені від sandbox. Значення в прикладі — навчальні й не призначені для розгортання реального сервісу.

Copy-Item config\env.production.example .env.production
docker compose --env-file .env.production -f deploy/docker-compose.production.yml up --build -d

Сайт доступний на http://localhost:8001/. Frontend і backend працюють окремо, а backend доступний тільки всередині Compose-мережі. Production база не отримує sandbox демодані; адміністратор створюється окремо:

docker compose --env-file .env.production -f deploy/docker-compose.production.yml exec backend python -m scripts.create_admin admin@busline.ua

Команда запросить пароль у терміналі. Обидва профілі мають власні Compose project та PostgreSQL volumes; production база не публікує порт на хост.

Тести та перевірка коду

Інтеграційні тести використовують окрему PostgreSQL базу з адресою TEST_DATABASE_URL; під час тестів змінюється лише її схема.

pre-commit install
ruff check .
black --check .
pytest -q

GitHub Actions автоматично запускає Ruff, Black і pytest при push у гілки та Pull Request до main. Workflow також можна запустити вручну через Actions → CI → Run workflow.

Лабораторна робота №4: навантажувальне тестування

Для сценарію використовується Grafana k6 у Docker; окремо встановлювати k6 не потрібно. Після створення .env.sandbox запустіть із кореня репозиторію:

python -m pip install -e ".[report]"
python loadtest/run.py

Скрипт підніме sandbox, запустить сценарій із 10 VUsers, збере CPU/RAM через docker stats і створить звіт із графіками. Для зміни профілю задайте перед запуском LOADTEST_VUS, LOADTEST_RAMP_UP, LOADTEST_HOLD_DURATION або LOADTEST_RAMP_DOWN. Звіт: docs/lab4-load-test-report.md.

Структура

app/                      FastAPI, HTML сторінки, моделі та бізнес-логіка
config/                   приклади sandbox і production конфігурацій
compose.yaml              стандартний вхід для запуску sandbox
deploy/                   multi-stage Dockerfile і Compose профілі
migrations/               міграції PostgreSQL через Alembic
scripts/                  seed і створення адміністратора
tests/                    інтеграційні та модульні тести
docs/                     архітектура та матеріали лабораторних
loadtest/                 сценарій k6, збір ресурсів і вихідні метрики ЛР4

Файли .env.sandbox і .env.production локальні та виключені з git і Docker build context. У репозиторії зберігаються лише приклади конфігурацій.

Матеріали

About

University project for labs python web system

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages