ROBO-OPS — личный кабинет оператора робота
Веб-приложение для управления роботами и ведения профиля оператора.
Стек: Python, FastAPI, SQLite, HTML, CSS, JavaScript.
Запуск приложения
Единственный способ запуска — скрипт start.sh.
Другие команды (python run.py, uvicorn, python -m http.server и т.п.) не поддерживаются — приложение откажется стартовать без переменной окружения, которую выставляет только start.sh.
Требования
- Python 3.10 или новее
- Bash (Linux, macOS, Git Bash или WSL на Windows)
Первый запуск
cd путь/к/ПРАКТИКА
chmod +x start.sh # один раз, если скрипт не исполняемый
./start.sh
Что делает start.sh
- Определяет каталог проекта
- Создаёт виртуальное окружение
.venv(если его нет) и устанавливает зависимости изrequirements.txt - Создаёт папку
data/и файл базы SQLite (если их нет) - Запускает сервер FastAPI на порту 8000
Для проверяющего: в архив сдаётся только исходный код (16 файлов). Папки
.venv,data/и__pycache__/не нужны — они создаются автоматически при первом запуске./start.sh.
После запуска
| Адрес | Назначение |
|---|---|
| http://localhost:8000 | Главная (панель роботов) |
| http://localhost:8000/register | Регистрация |
| http://localhost:8000/login | Вход |
| http://localhost:8000/docs | Документация API (Swagger) |
Остановка сервера: Ctrl+C в терминале.
Переменные окружения (необязательно)
| Переменная | По умолчанию | Описание |
|---|---|---|
PORT |
8000 |
Порт сервера |
EXTERNAL_API_KEY |
robo-ops-external-demo-key-2026 |
Ключ для внешнего API |
DATABASE_PATH |
./data/robo_ops.db |
Путь к файлу БД |
Пример:
PORT=9000 ./start.sh
Принцип работы приложения
Общая схема
Браузер (HTML/CSS/JS)
│
▼ HTTP + cookie-сессия
FastAPI (app/main.py)
│
▼
SQLite (data/robo_ops.db)
▲
│ X-API-Key
Внешние приложения
Фронтенд — статические страницы в папке static/.
Бэкенд — REST API на FastAPI.
Данные хранятся в SQLite.
Регистрация и авторизация
- Пользователь регистрируется на
/register(email + пароль от 6 символов). - Пароль хешируется через bcrypt и сохраняется в таблице
users. - При регистрации или входе создаётся сессия в таблице
sessions. - В браузер отправляется HttpOnly-cookie
robo_ops_session(срок — 24 часа). - Токен сессии в БД хранится в виде SHA-256 хеша, не в открытом виде.
Без активной сессии доступ к главной странице и API закрыт — браузер перенаправляется на /login.
Личный кабинет
В профиле оператора хранятся и редактируются:
- электронная почта (только чтение после регистрации)
- имя, фамилия, отчество
- возраст
- номер телефона
- рейтинг и баллы (обновляются также через внешнее API)
На странице профиля отображаются активные сессии текущего пользователя.
Панель управления роботами
У каждого пользователя — свой набор из 4 роботов (настройки в таблице robot_settings).
При изменении параметров (режим, скорость, чувствительность, аварийная остановка, ночной режим):
- пересчитываются характеристики робота (скорость, температура, статус, датчики);
- данные сохраняются в SQLite через API;
- при переходе между страницами настройки не теряются.
Безопасность
| Мера | Реализация |
|---|---|
| Пароли | bcrypt-хеширование |
| Сессии | HttpOnly cookie, хеш токена в БД, срок жизни 24 ч |
| Внешний API | Заголовок X-API-Key |
| Валидация | Pydantic-схемы для всех входных данных |
| SQL | Параметризованные запросы |
API
Для веб-приложения (нужна cookie-сессия)
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/auth/register |
Регистрация |
| POST | /api/auth/login |
Вход |
| POST | /api/auth/logout |
Выход |
| GET | /api/auth/me |
Текущий пользователь |
| GET/PUT | /api/profile |
Профиль |
| GET | /api/sessions |
Активные сессии |
| GET/PUT | /api/robots |
Настройки роботов |
Для внешних приложений (заголовок X-API-Key)
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/external/users |
Список пользователей |
| GET | /api/external/users/{id} |
Пользователь по ID |
| GET | /api/external/users/by-email/{email} |
Пользователь по email |
| GET | /api/external/sessions |
Активные сессии |
| POST | /api/external/data |
Запись данных |
| GET | /api/external/data |
Чтение записей |
Пример записи баллов из внешней системы:
curl -X POST http://localhost:8000/api/external/data \
-H "X-API-Key: robo-ops-external-demo-key-2026" \
-H "Content-Type: application/json" \
-d '{
"user_id": 1,
"source_app": "mission-tracker",
"data_key": "mission_complete",
"data_value": {"points": 50, "rating": 4.5}
}'
Поля points и rating в data_value автоматически обновляют профиль пользователя.
Структура проекта
ПРАКТИКА/
├── start.sh ← единственная точка запуска
├── README.md ← эта инструкция
├── requirements.txt ← зависимости Python
├── app/
│ ├── __init__.py
│ ├── main.py ← FastAPI, маршруты, API
│ ├── database.py ← SQLite, модели данных
│ ├── security.py ← bcrypt, токены сессий
│ ├── schemas.py ← валидация запросов
│ └── config.py ← настройки
└── static/
├── index.html ← главная страница
├── login.html ← вход
├── register.html ← регистрация
├── css/styles.css ← стили
└── js/ ← api.js, app.js, auth.js
После первого запуска ./start.sh рядом появятся служебные каталоги (их не нужно сдавать):
.venv/— виртуальное окружение Pythondata/— файл базыrobo_ops.db
Типичные проблемы
«Приложение запускается только через ./start.sh»
Вы запустили сервер в обход скрипта. Используйте ./start.sh.
На Windows не работает ./start.sh
Запускайте через Git Bash или WSL, не через обычный PowerShell.
Порт 8000 занят
PORT=9000 ./start.sh
Нет Python
Установите Python 3.10+ с https://python.org и повторите ./start.sh.
Перед отправкой архива
Не включайте папки .venv, data/ и __pycache__/. Если .venv не удаляется (файлы заняты процессом Python), закройте терминалы и IDE, затем удалите папку вручную.