257 lines
6.8 KiB
Markdown
257 lines
6.8 KiB
Markdown
# 🚗 Система мониторинга транспорта
|
||
|
||
Веб-система для мониторинга местоположения транспортных средств в реальном времени.
|
||
|
||
## 🛠 Технологии
|
||
|
||
- **Backend**: FastAPI, SQLAlchemy, PostgreSQL
|
||
- **Frontend**: Vue 3, Leaflet, Naive UI
|
||
- **Инфраструктура**: Docker, Nginx
|
||
|
||
## 🚀 Быстрый старт
|
||
|
||
### Требования
|
||
- Docker 20.10+
|
||
- Docker Compose 2.0+
|
||
|
||
### Запуск (пошагово)
|
||
|
||
```bash
|
||
# 1. Перейти в папку проекта
|
||
cd transport
|
||
|
||
# 2. Собрать и запустить все сервисы
|
||
docker-compose up --build -d
|
||
|
||
# 3. Проверить что все сервисы запущены
|
||
docker-compose ps
|
||
|
||
# Должно быть 4 сервиса в статусе "Up":
|
||
# - transport-nginx-1
|
||
# - transport-backend-1
|
||
# - transport-frontend-1
|
||
# - transport-postgres-1
|
||
|
||
# 4. Проверить что API работает
|
||
curl http://localhost/api/vehicles
|
||
|
||
# Должен вернуть JSON со списком транспорта
|
||
|
||
# 5. Открыть приложение в браузере
|
||
open http://localhost
|
||
```
|
||
|
||
### Запуск симулятора
|
||
|
||
В **отдельном терминале** запустить симулятор данных:
|
||
|
||
```bash
|
||
docker-compose exec backend python -m simulator.run
|
||
```
|
||
|
||
Симулятор будет:
|
||
- Генерировать координаты для 5 транспортных средств
|
||
- Отправлять данные каждые 2 секунды
|
||
- Имитировать движение, остановки, изменение скорости
|
||
|
||
Для остановки: `Ctrl+C`
|
||
|
||
### Доступ
|
||
|
||
| Сервис | URL |
|
||
|--------|-----|
|
||
| Приложение | http://localhost |
|
||
| API | http://localhost/api/ |
|
||
| API Docs (Swagger) | http://localhost/api/docs |
|
||
| WebSocket | ws://localhost/ws/positions |
|
||
|
||
## 🔧 Полезные команды
|
||
|
||
```bash
|
||
# Посмотреть логи всех сервисов
|
||
docker-compose logs -f
|
||
|
||
# Посмотреть логи только backend
|
||
docker-compose logs -f backend
|
||
|
||
# Перезапустить сервис
|
||
docker-compose restart backend
|
||
|
||
# Остановить все сервисы
|
||
docker-compose down
|
||
|
||
# Остановить и удалить данные (включая БД)
|
||
docker-compose down -v
|
||
|
||
# Пересобрать конкретный сервис
|
||
docker-compose up --build backend -d
|
||
```
|
||
|
||
## 📡 Работа с API
|
||
|
||
### Создать транспорт
|
||
```bash
|
||
curl -X POST http://localhost/api/vehicles \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"name": "Автобус А-999", "type": "bus"}'
|
||
```
|
||
|
||
### Отправить позицию
|
||
```bash
|
||
curl -X POST http://localhost/api/ingest/position \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"vehicle_id": 1,
|
||
"lat": 55.0304,
|
||
"lon": 82.9204,
|
||
"speed": 45.5,
|
||
"heading": 180
|
||
}'
|
||
```
|
||
|
||
### Получить список транспорта
|
||
```bash
|
||
curl http://localhost/api/vehicles
|
||
```
|
||
|
||
### Получить историю позиций
|
||
```bash
|
||
curl "http://localhost/api/vehicles/1/positions?from=2025-12-18T00:00:00"
|
||
```
|
||
|
||
### Получить события
|
||
```bash
|
||
curl http://localhost/api/events
|
||
```
|
||
|
||
## 📁 Структура проекта
|
||
|
||
```
|
||
transport/
|
||
├── docker-compose.yml # Конфигурация Docker
|
||
├── nginx/ # Nginx конфигурация
|
||
│ ├── nginx.conf
|
||
│ └── conf.d/default.conf
|
||
├── backend/
|
||
│ ├── Dockerfile
|
||
│ ├── requirements.txt
|
||
│ ├── app/ # FastAPI приложение
|
||
│ │ ├── main.py # Точка входа
|
||
│ │ ├── models/ # SQLAlchemy модели
|
||
│ │ ├── schemas/ # Pydantic схемы
|
||
│ │ ├── routers/ # API эндпоинты
|
||
│ │ └── services/ # Бизнес-логика
|
||
│ ├── alembic/ # Миграции БД
|
||
│ └── simulator/ # Симулятор данных
|
||
│ └── run.py
|
||
└── frontend/
|
||
├── Dockerfile
|
||
├── package.json
|
||
└── src/
|
||
├── main.js
|
||
├── App.vue # Главный компонент
|
||
└── components/ # Vue компоненты
|
||
├── MapView.vue
|
||
├── VehicleList.vue
|
||
├── VehicleCard.vue
|
||
├── TrackHistory.vue
|
||
└── EventFeed.vue
|
||
```
|
||
|
||
## 🔌 REST API
|
||
|
||
| Метод | URL | Описание |
|
||
|-------|-----|----------|
|
||
| GET | /api/vehicles | Список транспорта с последними позициями |
|
||
| GET | /api/vehicles/{id} | Информация о конкретном ТС |
|
||
| POST | /api/vehicles | Создать новое ТС |
|
||
| PUT | /api/vehicles/{id} | Обновить ТС |
|
||
| DELETE | /api/vehicles/{id} | Удалить ТС |
|
||
| GET | /api/vehicles/{id}/positions | История позиций ТС |
|
||
| POST | /api/ingest/position | Принять новую позицию |
|
||
| GET | /api/events | Список событий |
|
||
|
||
### Типы транспорта
|
||
|
||
| type | Иконка |
|
||
|------|--------|
|
||
| `bus` | 🚌 |
|
||
| `truck` | 🚚 |
|
||
| `car` | 🚗 |
|
||
|
||
## 📨 WebSocket API
|
||
|
||
Подключение: `ws://localhost/ws/positions`
|
||
|
||
### Формат сообщений
|
||
|
||
**Обновление позиции:**
|
||
```json
|
||
{
|
||
"type": "position_update",
|
||
"data": {
|
||
"vehicle_id": 1,
|
||
"lat": 55.0304,
|
||
"lon": 82.9204,
|
||
"speed": 45.5,
|
||
"heading": 180,
|
||
"timestamp": "2025-12-18T12:00:00Z"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Событие:**
|
||
```json
|
||
{
|
||
"type": "event",
|
||
"data": {
|
||
"id": 1,
|
||
"vehicle_id": 1,
|
||
"type": "OVERSPEED",
|
||
"payload": {"speed": 95, "limit": 60},
|
||
"timestamp": "2025-12-18T12:00:00Z"
|
||
}
|
||
}
|
||
```
|
||
|
||
### Типы событий
|
||
|
||
| Тип | Описание |
|
||
|-----|----------|
|
||
| `OVERSPEED` | Превышение скорости (> 60 км/ч) |
|
||
| `LONG_STOP` | Остановка более 5 минут |
|
||
| `CONNECTION_LOST` | Нет данных более 5 минут |
|
||
|
||
## 🐛 Troubleshooting
|
||
|
||
### API возвращает 404
|
||
```bash
|
||
# Проверить что backend запущен
|
||
docker-compose ps
|
||
|
||
# Перезапустить nginx
|
||
docker-compose restart nginx
|
||
```
|
||
|
||
### Нет данных на карте
|
||
```bash
|
||
# Проверить что симулятор запущен
|
||
docker-compose exec backend python -m simulator.run
|
||
|
||
# Проверить логи backend
|
||
docker-compose logs -f backend
|
||
```
|
||
|
||
### Ошибка подключения к БД
|
||
```bash
|
||
# Проверить что postgres запущен
|
||
docker-compose ps postgres
|
||
|
||
# Посмотреть логи postgres
|
||
docker-compose logs postgres
|
||
```
|
||
|
||
## 📝 Лицензия
|
||
|
||
MIT
|