Навчальний проєкт з дисципліни «Високонавантажені 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 — середовище для демонстрації та розробки. Воно використовує окрему 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-параметрів у межах
лабораторної: 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 -qGitHub Actions автоматично запускає Ruff, Black і pytest при push у гілки та
Pull Request до main. Workflow також можна запустити вручну через
Actions → CI → Run workflow.
Для сценарію використовується 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. У репозиторії зберігаються лише приклади конфігурацій.